@sonicjs-cms/core 2.0.0 → 2.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 (75) hide show
  1. package/dist/chunk-3NVJ6W27.cjs +1076 -0
  2. package/dist/chunk-3NVJ6W27.cjs.map +1 -0
  3. package/dist/chunk-4BJGEGX5.cjs +236 -0
  4. package/dist/chunk-4BJGEGX5.cjs.map +1 -0
  5. package/dist/{chunk-QUMBDPNJ.cjs → chunk-7G6XT62S.cjs} +4583 -540
  6. package/dist/chunk-7G6XT62S.cjs.map +1 -0
  7. package/dist/{chunk-ET5I4GBD.cjs → chunk-ALOS2CBJ.cjs} +194 -4
  8. package/dist/chunk-ALOS2CBJ.cjs.map +1 -0
  9. package/dist/{chunk-7N3HK7ZK.js → chunk-CDBVZEWR.js} +7 -904
  10. package/dist/chunk-CDBVZEWR.js.map +1 -0
  11. package/dist/{chunk-BITQ4MFX.js → chunk-EAELJXRV.js} +93 -115
  12. package/dist/chunk-EAELJXRV.js.map +1 -0
  13. package/dist/chunk-EGFHFM4N.cjs +76 -0
  14. package/dist/chunk-EGFHFM4N.cjs.map +1 -0
  15. package/dist/chunk-FICTAGD4.js +59 -0
  16. package/dist/chunk-FICTAGD4.js.map +1 -0
  17. package/dist/{chunk-FVMV5DKA.cjs → chunk-HJZOA2O5.cjs} +93 -115
  18. package/dist/chunk-HJZOA2O5.cjs.map +1 -0
  19. package/dist/{chunk-RNR4HA23.cjs → chunk-LEG4KNFP.cjs} +6 -945
  20. package/dist/chunk-LEG4KNFP.cjs.map +1 -0
  21. package/dist/chunk-LH4Z7QID.js +1030 -0
  22. package/dist/chunk-LH4Z7QID.js.map +1 -0
  23. package/dist/chunk-M6FPVS7E.js +214 -0
  24. package/dist/chunk-M6FPVS7E.js.map +1 -0
  25. package/dist/{chunk-P3VS4DV3.js → chunk-O46XKBFM.js} +193 -5
  26. package/dist/chunk-O46XKBFM.js.map +1 -0
  27. package/dist/chunk-P2PTTBO5.js +74 -0
  28. package/dist/chunk-P2PTTBO5.js.map +1 -0
  29. package/dist/chunk-RCQ2HIQD.cjs +61 -0
  30. package/dist/chunk-RCQ2HIQD.cjs.map +1 -0
  31. package/dist/{chunk-JETM2U2D.js → chunk-SGGHTIWV.js} +4414 -374
  32. package/dist/chunk-SGGHTIWV.js.map +1 -0
  33. package/dist/{chunk-RGCQSFKC.cjs → chunk-UL32L2KV.cjs} +9 -58
  34. package/dist/chunk-UL32L2KV.cjs.map +1 -0
  35. package/dist/{chunk-JIINOD2W.js → chunk-XJETEIRU.js} +8 -58
  36. package/dist/chunk-XJETEIRU.js.map +1 -0
  37. package/dist/index.cjs +241 -218
  38. package/dist/index.cjs.map +1 -1
  39. package/dist/index.js +20 -15
  40. package/dist/index.js.map +1 -1
  41. package/dist/middleware.cjs +27 -22
  42. package/dist/middleware.js +3 -2
  43. package/dist/plugins.cjs +7 -7
  44. package/dist/plugins.js +1 -1
  45. package/dist/routes.cjs +36 -23
  46. package/dist/routes.js +7 -6
  47. package/dist/services.cjs +28 -28
  48. package/dist/services.js +2 -2
  49. package/dist/templates.cjs +24 -24
  50. package/dist/templates.js +2 -2
  51. package/dist/utils.cjs +20 -11
  52. package/dist/utils.js +2 -1
  53. package/package.json +2 -16
  54. package/dist/chunk-3MNMOLSA.js +0 -133
  55. package/dist/chunk-3MNMOLSA.js.map +0 -1
  56. package/dist/chunk-4XI3YBKU.cjs +0 -266
  57. package/dist/chunk-4XI3YBKU.cjs.map +0 -1
  58. package/dist/chunk-7N3HK7ZK.js.map +0 -1
  59. package/dist/chunk-AGOE25LF.cjs +0 -137
  60. package/dist/chunk-AGOE25LF.cjs.map +0 -1
  61. package/dist/chunk-BITQ4MFX.js.map +0 -1
  62. package/dist/chunk-BUKT6HP5.cjs +0 -776
  63. package/dist/chunk-BUKT6HP5.cjs.map +0 -1
  64. package/dist/chunk-ET5I4GBD.cjs.map +0 -1
  65. package/dist/chunk-FVMV5DKA.cjs.map +0 -1
  66. package/dist/chunk-JETM2U2D.js.map +0 -1
  67. package/dist/chunk-JIINOD2W.js.map +0 -1
  68. package/dist/chunk-LU6J53IX.js +0 -262
  69. package/dist/chunk-LU6J53IX.js.map +0 -1
  70. package/dist/chunk-P3VS4DV3.js.map +0 -1
  71. package/dist/chunk-QUMBDPNJ.cjs.map +0 -1
  72. package/dist/chunk-RGCQSFKC.cjs.map +0 -1
  73. package/dist/chunk-RNR4HA23.cjs.map +0 -1
  74. package/dist/chunk-WESS2U3K.js +0 -755
  75. package/dist/chunk-WESS2U3K.js.map +0 -1
@@ -0,0 +1,1076 @@
1
+ 'use strict';
2
+
3
+ var chunkIGJUBJBW_cjs = require('./chunk-IGJUBJBW.cjs');
4
+ var sqliteCore = require('drizzle-orm/sqlite-core');
5
+ var v4 = require('zod/v4');
6
+ var drizzleOrm = require('drizzle-orm');
7
+ var d1 = require('drizzle-orm/d1');
8
+
9
+ // src/db/schema.ts
10
+ var schema_exports = {};
11
+ chunkIGJUBJBW_cjs.__export(schema_exports, {
12
+ apiTokens: () => apiTokens,
13
+ collections: () => collections,
14
+ content: () => content,
15
+ contentVersions: () => contentVersions,
16
+ insertCollectionSchema: () => insertCollectionSchema,
17
+ insertContentSchema: () => insertContentSchema,
18
+ insertLogConfigSchema: () => insertLogConfigSchema,
19
+ insertMediaSchema: () => insertMediaSchema,
20
+ insertPluginActivityLogSchema: () => insertPluginActivityLogSchema,
21
+ insertPluginAssetSchema: () => insertPluginAssetSchema,
22
+ insertPluginHookSchema: () => insertPluginHookSchema,
23
+ insertPluginRouteSchema: () => insertPluginRouteSchema,
24
+ insertPluginSchema: () => insertPluginSchema,
25
+ insertSystemLogSchema: () => insertSystemLogSchema,
26
+ insertUserSchema: () => insertUserSchema,
27
+ insertWorkflowHistorySchema: () => insertWorkflowHistorySchema,
28
+ logConfig: () => logConfig,
29
+ media: () => media,
30
+ pluginActivityLog: () => pluginActivityLog,
31
+ pluginAssets: () => pluginAssets,
32
+ pluginHooks: () => pluginHooks,
33
+ pluginRoutes: () => pluginRoutes,
34
+ plugins: () => plugins,
35
+ selectCollectionSchema: () => selectCollectionSchema,
36
+ selectContentSchema: () => selectContentSchema,
37
+ selectLogConfigSchema: () => selectLogConfigSchema,
38
+ selectMediaSchema: () => selectMediaSchema,
39
+ selectPluginActivityLogSchema: () => selectPluginActivityLogSchema,
40
+ selectPluginAssetSchema: () => selectPluginAssetSchema,
41
+ selectPluginHookSchema: () => selectPluginHookSchema,
42
+ selectPluginRouteSchema: () => selectPluginRouteSchema,
43
+ selectPluginSchema: () => selectPluginSchema,
44
+ selectSystemLogSchema: () => selectSystemLogSchema,
45
+ selectUserSchema: () => selectUserSchema,
46
+ selectWorkflowHistorySchema: () => selectWorkflowHistorySchema,
47
+ systemLogs: () => systemLogs,
48
+ users: () => users,
49
+ workflowHistory: () => workflowHistory
50
+ });
51
+ var CONSTANTS = {
52
+ INT8_MIN: -128,
53
+ INT8_MAX: 127,
54
+ INT8_UNSIGNED_MAX: 255,
55
+ INT16_MIN: -32768,
56
+ INT16_MAX: 32767,
57
+ INT16_UNSIGNED_MAX: 65535,
58
+ INT24_MIN: -8388608,
59
+ INT24_MAX: 8388607,
60
+ INT24_UNSIGNED_MAX: 16777215,
61
+ INT32_MIN: -2147483648,
62
+ INT32_MAX: 2147483647,
63
+ INT32_UNSIGNED_MAX: 4294967295,
64
+ INT48_MIN: -140737488355328,
65
+ INT48_MAX: 140737488355327,
66
+ INT48_UNSIGNED_MAX: 281474976710655,
67
+ INT64_MIN: -9223372036854775808n,
68
+ INT64_MAX: 9223372036854775807n,
69
+ INT64_UNSIGNED_MAX: 18446744073709551615n
70
+ };
71
+ function isColumnType(column, columnTypes) {
72
+ return columnTypes.includes(column.columnType);
73
+ }
74
+ function isWithEnum(column) {
75
+ return "enumValues" in column && Array.isArray(column.enumValues) && column.enumValues.length > 0;
76
+ }
77
+ var isPgEnum = isWithEnum;
78
+ var literalSchema = v4.z.union([v4.z.string(), v4.z.number(), v4.z.boolean(), v4.z.null()]);
79
+ var jsonSchema = v4.z.union([
80
+ literalSchema,
81
+ v4.z.record(v4.z.string(), v4.z.any()),
82
+ v4.z.array(v4.z.any())
83
+ ]);
84
+ var bufferSchema = v4.z.custom((v) => v instanceof Buffer);
85
+ function columnToSchema(column, factory) {
86
+ const z$1 = v4.z;
87
+ const coerce = {};
88
+ let schema;
89
+ if (isWithEnum(column)) {
90
+ schema = column.enumValues.length ? z$1.enum(column.enumValues) : z$1.string();
91
+ }
92
+ if (!schema) {
93
+ if (isColumnType(column, ["PgGeometry", "PgPointTuple"])) {
94
+ schema = z$1.tuple([z$1.number(), z$1.number()]);
95
+ } else if (isColumnType(column, ["PgGeometryObject", "PgPointObject"])) {
96
+ schema = z$1.object({ x: z$1.number(), y: z$1.number() });
97
+ } else if (isColumnType(column, ["PgHalfVector", "PgVector"])) {
98
+ schema = z$1.array(z$1.number());
99
+ schema = column.dimensions ? schema.length(column.dimensions) : schema;
100
+ } else if (isColumnType(column, ["PgLine"])) {
101
+ schema = z$1.tuple([z$1.number(), z$1.number(), z$1.number()]);
102
+ } else if (isColumnType(column, ["PgLineABC"])) {
103
+ schema = z$1.object({
104
+ a: z$1.number(),
105
+ b: z$1.number(),
106
+ c: z$1.number()
107
+ });
108
+ } else if (isColumnType(column, ["PgArray"])) {
109
+ schema = z$1.array(columnToSchema(column.baseColumn));
110
+ schema = column.size ? schema.length(column.size) : schema;
111
+ } else if (column.dataType === "array") {
112
+ schema = z$1.array(z$1.any());
113
+ } else if (column.dataType === "number") {
114
+ schema = numberColumnToSchema(column, z$1, coerce);
115
+ } else if (column.dataType === "bigint") {
116
+ schema = bigintColumnToSchema(column, z$1, coerce);
117
+ } else if (column.dataType === "boolean") {
118
+ schema = coerce === true || coerce.boolean ? z$1.coerce.boolean() : z$1.boolean();
119
+ } else if (column.dataType === "date") {
120
+ schema = coerce === true || coerce.date ? z$1.coerce.date() : z$1.date();
121
+ } else if (column.dataType === "string") {
122
+ schema = stringColumnToSchema(column, z$1, coerce);
123
+ } else if (column.dataType === "json") {
124
+ schema = jsonSchema;
125
+ } else if (column.dataType === "custom") {
126
+ schema = z$1.any();
127
+ } else if (column.dataType === "buffer") {
128
+ schema = bufferSchema;
129
+ }
130
+ }
131
+ if (!schema) {
132
+ schema = z$1.any();
133
+ }
134
+ return schema;
135
+ }
136
+ function numberColumnToSchema(column, z2, coerce) {
137
+ let unsigned = column.getSQLType().includes("unsigned");
138
+ let min;
139
+ let max;
140
+ let integer2 = false;
141
+ if (isColumnType(column, ["MySqlTinyInt", "SingleStoreTinyInt"])) {
142
+ min = unsigned ? 0 : CONSTANTS.INT8_MIN;
143
+ max = unsigned ? CONSTANTS.INT8_UNSIGNED_MAX : CONSTANTS.INT8_MAX;
144
+ integer2 = true;
145
+ } else if (isColumnType(column, [
146
+ "PgSmallInt",
147
+ "PgSmallSerial",
148
+ "MySqlSmallInt",
149
+ "SingleStoreSmallInt"
150
+ ])) {
151
+ min = unsigned ? 0 : CONSTANTS.INT16_MIN;
152
+ max = unsigned ? CONSTANTS.INT16_UNSIGNED_MAX : CONSTANTS.INT16_MAX;
153
+ integer2 = true;
154
+ } else if (isColumnType(column, [
155
+ "PgReal",
156
+ "MySqlFloat",
157
+ "MySqlMediumInt",
158
+ "SingleStoreMediumInt",
159
+ "SingleStoreFloat"
160
+ ])) {
161
+ min = unsigned ? 0 : CONSTANTS.INT24_MIN;
162
+ max = unsigned ? CONSTANTS.INT24_UNSIGNED_MAX : CONSTANTS.INT24_MAX;
163
+ integer2 = isColumnType(column, ["MySqlMediumInt", "SingleStoreMediumInt"]);
164
+ } else if (isColumnType(column, [
165
+ "PgInteger",
166
+ "PgSerial",
167
+ "MySqlInt",
168
+ "SingleStoreInt"
169
+ ])) {
170
+ min = unsigned ? 0 : CONSTANTS.INT32_MIN;
171
+ max = unsigned ? CONSTANTS.INT32_UNSIGNED_MAX : CONSTANTS.INT32_MAX;
172
+ integer2 = true;
173
+ } else if (isColumnType(column, [
174
+ "PgDoublePrecision",
175
+ "MySqlReal",
176
+ "MySqlDouble",
177
+ "SingleStoreReal",
178
+ "SingleStoreDouble",
179
+ "SQLiteReal"
180
+ ])) {
181
+ min = unsigned ? 0 : CONSTANTS.INT48_MIN;
182
+ max = unsigned ? CONSTANTS.INT48_UNSIGNED_MAX : CONSTANTS.INT48_MAX;
183
+ } else if (isColumnType(column, [
184
+ "PgBigInt53",
185
+ "PgBigSerial53",
186
+ "MySqlBigInt53",
187
+ "MySqlSerial",
188
+ "SingleStoreBigInt53",
189
+ "SingleStoreSerial",
190
+ "SQLiteInteger"
191
+ ])) {
192
+ unsigned = unsigned || isColumnType(column, ["MySqlSerial", "SingleStoreSerial"]);
193
+ min = unsigned ? 0 : Number.MIN_SAFE_INTEGER;
194
+ max = Number.MAX_SAFE_INTEGER;
195
+ integer2 = true;
196
+ } else if (isColumnType(column, ["MySqlYear", "SingleStoreYear"])) {
197
+ min = 1901;
198
+ max = 2155;
199
+ integer2 = true;
200
+ } else {
201
+ min = Number.MIN_SAFE_INTEGER;
202
+ max = Number.MAX_SAFE_INTEGER;
203
+ }
204
+ let schema = coerce === true || coerce?.number ? integer2 ? z2.coerce.number() : z2.coerce.number().int() : integer2 ? z2.int() : z2.number();
205
+ schema = schema.gte(min).lte(max);
206
+ return schema;
207
+ }
208
+ function bigintColumnToSchema(column, z2, coerce) {
209
+ const unsigned = column.getSQLType().includes("unsigned");
210
+ const min = unsigned ? 0n : CONSTANTS.INT64_MIN;
211
+ const max = unsigned ? CONSTANTS.INT64_UNSIGNED_MAX : CONSTANTS.INT64_MAX;
212
+ const schema = coerce === true || coerce?.bigint ? z2.coerce.bigint() : z2.bigint();
213
+ return schema.gte(min).lte(max);
214
+ }
215
+ function stringColumnToSchema(column, z2, coerce) {
216
+ if (isColumnType(column, ["PgUUID"])) {
217
+ return z2.uuid();
218
+ }
219
+ let max;
220
+ let regex;
221
+ let fixed = false;
222
+ if (isColumnType(column, ["PgVarchar", "SQLiteText"])) {
223
+ max = column.length;
224
+ } else if (isColumnType(column, ["MySqlVarChar", "SingleStoreVarChar"])) {
225
+ max = column.length ?? CONSTANTS.INT16_UNSIGNED_MAX;
226
+ } else if (isColumnType(column, ["MySqlText", "SingleStoreText"])) {
227
+ if (column.textType === "longtext") {
228
+ max = CONSTANTS.INT32_UNSIGNED_MAX;
229
+ } else if (column.textType === "mediumtext") {
230
+ max = CONSTANTS.INT24_UNSIGNED_MAX;
231
+ } else if (column.textType === "text") {
232
+ max = CONSTANTS.INT16_UNSIGNED_MAX;
233
+ } else {
234
+ max = CONSTANTS.INT8_UNSIGNED_MAX;
235
+ }
236
+ }
237
+ if (isColumnType(column, [
238
+ "PgChar",
239
+ "MySqlChar",
240
+ "SingleStoreChar"
241
+ ])) {
242
+ max = column.length;
243
+ fixed = true;
244
+ }
245
+ if (isColumnType(column, ["PgBinaryVector"])) {
246
+ regex = /^[01]+$/;
247
+ max = column.dimensions;
248
+ }
249
+ let schema = coerce === true || coerce?.string ? z2.coerce.string() : z2.string();
250
+ schema = regex ? schema.regex(regex) : schema;
251
+ return max && fixed ? schema.length(max) : max ? schema.max(max) : schema;
252
+ }
253
+ function getColumns(tableLike) {
254
+ return drizzleOrm.isTable(tableLike) ? drizzleOrm.getTableColumns(tableLike) : drizzleOrm.getViewSelectedFields(tableLike);
255
+ }
256
+ function handleColumns(columns, refinements, conditions, factory) {
257
+ const columnSchemas = {};
258
+ for (const [key, selected] of Object.entries(columns)) {
259
+ if (!drizzleOrm.is(selected, drizzleOrm.Column) && !drizzleOrm.is(selected, drizzleOrm.SQL) && !drizzleOrm.is(selected, drizzleOrm.SQL.Aliased) && typeof selected === "object") {
260
+ const columns2 = drizzleOrm.isTable(selected) || drizzleOrm.isView(selected) ? getColumns(selected) : selected;
261
+ columnSchemas[key] = handleColumns(columns2, refinements[key] ?? {}, conditions);
262
+ continue;
263
+ }
264
+ const refinement = refinements[key];
265
+ if (refinement !== void 0 && typeof refinement !== "function") {
266
+ columnSchemas[key] = refinement;
267
+ continue;
268
+ }
269
+ const column = drizzleOrm.is(selected, drizzleOrm.Column) ? selected : void 0;
270
+ const schema = column ? columnToSchema(column) : v4.z.any();
271
+ const refined = typeof refinement === "function" ? refinement(schema) : schema;
272
+ if (conditions.never(column)) {
273
+ continue;
274
+ } else {
275
+ columnSchemas[key] = refined;
276
+ }
277
+ if (column) {
278
+ if (conditions.nullable(column)) {
279
+ columnSchemas[key] = columnSchemas[key].nullable();
280
+ }
281
+ if (conditions.optional(column)) {
282
+ columnSchemas[key] = columnSchemas[key].optional();
283
+ }
284
+ }
285
+ }
286
+ return v4.z.object(columnSchemas);
287
+ }
288
+ function handleEnum(enum_, factory) {
289
+ const zod = v4.z;
290
+ return zod.enum(enum_.enumValues);
291
+ }
292
+ var selectConditions = {
293
+ never: () => false,
294
+ optional: () => false,
295
+ nullable: (column) => !column.notNull
296
+ };
297
+ var insertConditions = {
298
+ never: (column) => column?.generated?.type === "always" || column?.generatedIdentity?.type === "always",
299
+ optional: (column) => !column.notNull || column.notNull && column.hasDefault,
300
+ nullable: (column) => !column.notNull
301
+ };
302
+ var createSelectSchema = (entity, refine) => {
303
+ if (isPgEnum(entity)) {
304
+ return handleEnum(entity);
305
+ }
306
+ const columns = getColumns(entity);
307
+ return handleColumns(columns, {}, selectConditions);
308
+ };
309
+ var createInsertSchema = (entity, refine) => {
310
+ const columns = getColumns(entity);
311
+ return handleColumns(columns, refine ?? {}, insertConditions);
312
+ };
313
+
314
+ // src/db/schema.ts
315
+ var users = sqliteCore.sqliteTable("users", {
316
+ id: sqliteCore.text("id").primaryKey(),
317
+ email: sqliteCore.text("email").notNull().unique(),
318
+ username: sqliteCore.text("username").notNull().unique(),
319
+ firstName: sqliteCore.text("first_name").notNull(),
320
+ lastName: sqliteCore.text("last_name").notNull(),
321
+ passwordHash: sqliteCore.text("password_hash"),
322
+ // Hashed password, nullable for OAuth users
323
+ role: sqliteCore.text("role").notNull().default("viewer"),
324
+ // 'admin', 'editor', 'author', 'viewer'
325
+ avatar: sqliteCore.text("avatar"),
326
+ isActive: sqliteCore.integer("is_active", { mode: "boolean" }).notNull().default(true),
327
+ lastLoginAt: sqliteCore.integer("last_login_at"),
328
+ createdAt: sqliteCore.integer("created_at").notNull(),
329
+ updatedAt: sqliteCore.integer("updated_at").notNull()
330
+ });
331
+ var collections = sqliteCore.sqliteTable("collections", {
332
+ id: sqliteCore.text("id").primaryKey(),
333
+ name: sqliteCore.text("name").notNull().unique(),
334
+ displayName: sqliteCore.text("display_name").notNull(),
335
+ description: sqliteCore.text("description"),
336
+ schema: sqliteCore.text("schema", { mode: "json" }).notNull(),
337
+ // JSON schema definition
338
+ isActive: sqliteCore.integer("is_active", { mode: "boolean" }).notNull().default(true),
339
+ managed: sqliteCore.integer("managed", { mode: "boolean" }).notNull().default(false),
340
+ // Config-managed collections cannot be edited in UI
341
+ createdAt: sqliteCore.integer("created_at", { mode: "timestamp" }).notNull().$defaultFn(() => /* @__PURE__ */ new Date()),
342
+ updatedAt: sqliteCore.integer("updated_at", { mode: "timestamp" }).notNull().$defaultFn(() => /* @__PURE__ */ new Date())
343
+ });
344
+ var content = sqliteCore.sqliteTable("content", {
345
+ id: sqliteCore.text("id").primaryKey(),
346
+ collectionId: sqliteCore.text("collection_id").notNull().references(() => collections.id),
347
+ slug: sqliteCore.text("slug").notNull(),
348
+ title: sqliteCore.text("title").notNull(),
349
+ data: sqliteCore.text("data", { mode: "json" }).notNull(),
350
+ // JSON content data
351
+ status: sqliteCore.text("status").notNull().default("draft"),
352
+ // 'draft', 'published', 'archived'
353
+ publishedAt: sqliteCore.integer("published_at", { mode: "timestamp" }),
354
+ authorId: sqliteCore.text("author_id").notNull().references(() => users.id),
355
+ createdAt: sqliteCore.integer("created_at", { mode: "timestamp" }).notNull().$defaultFn(() => /* @__PURE__ */ new Date()),
356
+ updatedAt: sqliteCore.integer("updated_at", { mode: "timestamp" }).notNull().$defaultFn(() => /* @__PURE__ */ new Date())
357
+ });
358
+ var contentVersions = sqliteCore.sqliteTable("content_versions", {
359
+ id: sqliteCore.text("id").primaryKey(),
360
+ contentId: sqliteCore.text("content_id").notNull().references(() => content.id),
361
+ version: sqliteCore.integer("version").notNull(),
362
+ data: sqliteCore.text("data", { mode: "json" }).notNull(),
363
+ authorId: sqliteCore.text("author_id").notNull().references(() => users.id),
364
+ createdAt: sqliteCore.integer("created_at", { mode: "timestamp" }).notNull().$defaultFn(() => /* @__PURE__ */ new Date())
365
+ });
366
+ var media = sqliteCore.sqliteTable("media", {
367
+ id: sqliteCore.text("id").primaryKey(),
368
+ filename: sqliteCore.text("filename").notNull(),
369
+ originalName: sqliteCore.text("original_name").notNull(),
370
+ mimeType: sqliteCore.text("mime_type").notNull(),
371
+ size: sqliteCore.integer("size").notNull(),
372
+ width: sqliteCore.integer("width"),
373
+ height: sqliteCore.integer("height"),
374
+ folder: sqliteCore.text("folder").notNull().default("uploads"),
375
+ r2Key: sqliteCore.text("r2_key").notNull(),
376
+ // R2 storage key
377
+ publicUrl: sqliteCore.text("public_url").notNull(),
378
+ // CDN URL
379
+ thumbnailUrl: sqliteCore.text("thumbnail_url"),
380
+ alt: sqliteCore.text("alt"),
381
+ caption: sqliteCore.text("caption"),
382
+ tags: sqliteCore.text("tags", { mode: "json" }),
383
+ // JSON array of tags
384
+ uploadedBy: sqliteCore.text("uploaded_by").notNull().references(() => users.id),
385
+ uploadedAt: sqliteCore.integer("uploaded_at").notNull(),
386
+ updatedAt: sqliteCore.integer("updated_at"),
387
+ publishedAt: sqliteCore.integer("published_at"),
388
+ scheduledAt: sqliteCore.integer("scheduled_at"),
389
+ archivedAt: sqliteCore.integer("archived_at"),
390
+ deletedAt: sqliteCore.integer("deleted_at")
391
+ });
392
+ var apiTokens = sqliteCore.sqliteTable("api_tokens", {
393
+ id: sqliteCore.text("id").primaryKey(),
394
+ name: sqliteCore.text("name").notNull(),
395
+ token: sqliteCore.text("token").notNull().unique(),
396
+ userId: sqliteCore.text("user_id").notNull().references(() => users.id),
397
+ permissions: sqliteCore.text("permissions", { mode: "json" }).notNull(),
398
+ // Array of permissions
399
+ expiresAt: sqliteCore.integer("expires_at", { mode: "timestamp" }),
400
+ lastUsedAt: sqliteCore.integer("last_used_at", { mode: "timestamp" }),
401
+ createdAt: sqliteCore.integer("created_at", { mode: "timestamp" }).notNull().$defaultFn(() => /* @__PURE__ */ new Date())
402
+ });
403
+ var workflowHistory = sqliteCore.sqliteTable("workflow_history", {
404
+ id: sqliteCore.text("id").primaryKey(),
405
+ contentId: sqliteCore.text("content_id").notNull().references(() => content.id),
406
+ action: sqliteCore.text("action").notNull(),
407
+ fromStatus: sqliteCore.text("from_status").notNull(),
408
+ toStatus: sqliteCore.text("to_status").notNull(),
409
+ userId: sqliteCore.text("user_id").notNull().references(() => users.id),
410
+ comment: sqliteCore.text("comment"),
411
+ createdAt: sqliteCore.integer("created_at", { mode: "timestamp" }).notNull().$defaultFn(() => /* @__PURE__ */ new Date())
412
+ });
413
+ var plugins = sqliteCore.sqliteTable("plugins", {
414
+ id: sqliteCore.text("id").primaryKey(),
415
+ name: sqliteCore.text("name").notNull().unique(),
416
+ displayName: sqliteCore.text("display_name").notNull(),
417
+ description: sqliteCore.text("description"),
418
+ version: sqliteCore.text("version").notNull(),
419
+ author: sqliteCore.text("author").notNull(),
420
+ category: sqliteCore.text("category").notNull(),
421
+ icon: sqliteCore.text("icon"),
422
+ status: sqliteCore.text("status").notNull().default("inactive"),
423
+ // 'active', 'inactive', 'error'
424
+ isCore: sqliteCore.integer("is_core", { mode: "boolean" }).notNull().default(false),
425
+ settings: sqliteCore.text("settings", { mode: "json" }),
426
+ permissions: sqliteCore.text("permissions", { mode: "json" }),
427
+ dependencies: sqliteCore.text("dependencies", { mode: "json" }),
428
+ downloadCount: sqliteCore.integer("download_count").notNull().default(0),
429
+ rating: sqliteCore.integer("rating").notNull().default(0),
430
+ installedAt: sqliteCore.integer("installed_at").notNull(),
431
+ activatedAt: sqliteCore.integer("activated_at"),
432
+ lastUpdated: sqliteCore.integer("last_updated").notNull(),
433
+ errorMessage: sqliteCore.text("error_message"),
434
+ createdAt: sqliteCore.integer("created_at").notNull().$defaultFn(() => Math.floor(Date.now() / 1e3)),
435
+ updatedAt: sqliteCore.integer("updated_at").notNull().$defaultFn(() => Math.floor(Date.now() / 1e3))
436
+ });
437
+ var pluginHooks = sqliteCore.sqliteTable("plugin_hooks", {
438
+ id: sqliteCore.text("id").primaryKey(),
439
+ pluginId: sqliteCore.text("plugin_id").notNull().references(() => plugins.id),
440
+ hookName: sqliteCore.text("hook_name").notNull(),
441
+ handlerName: sqliteCore.text("handler_name").notNull(),
442
+ priority: sqliteCore.integer("priority").notNull().default(10),
443
+ isActive: sqliteCore.integer("is_active", { mode: "boolean" }).notNull().default(true),
444
+ createdAt: sqliteCore.integer("created_at").notNull().$defaultFn(() => Math.floor(Date.now() / 1e3))
445
+ });
446
+ var pluginRoutes = sqliteCore.sqliteTable("plugin_routes", {
447
+ id: sqliteCore.text("id").primaryKey(),
448
+ pluginId: sqliteCore.text("plugin_id").notNull().references(() => plugins.id),
449
+ path: sqliteCore.text("path").notNull(),
450
+ method: sqliteCore.text("method").notNull(),
451
+ handlerName: sqliteCore.text("handler_name").notNull(),
452
+ middleware: sqliteCore.text("middleware", { mode: "json" }),
453
+ isActive: sqliteCore.integer("is_active", { mode: "boolean" }).notNull().default(true),
454
+ createdAt: sqliteCore.integer("created_at").notNull().$defaultFn(() => Math.floor(Date.now() / 1e3))
455
+ });
456
+ var pluginAssets = sqliteCore.sqliteTable("plugin_assets", {
457
+ id: sqliteCore.text("id").primaryKey(),
458
+ pluginId: sqliteCore.text("plugin_id").notNull().references(() => plugins.id),
459
+ assetType: sqliteCore.text("asset_type").notNull(),
460
+ // 'css', 'js', 'image', 'font'
461
+ assetPath: sqliteCore.text("asset_path").notNull(),
462
+ loadOrder: sqliteCore.integer("load_order").notNull().default(100),
463
+ loadLocation: sqliteCore.text("load_location").notNull().default("footer"),
464
+ // 'header', 'footer'
465
+ isActive: sqliteCore.integer("is_active", { mode: "boolean" }).notNull().default(true),
466
+ createdAt: sqliteCore.integer("created_at").notNull().$defaultFn(() => Math.floor(Date.now() / 1e3))
467
+ });
468
+ var pluginActivityLog = sqliteCore.sqliteTable("plugin_activity_log", {
469
+ id: sqliteCore.text("id").primaryKey(),
470
+ pluginId: sqliteCore.text("plugin_id").notNull().references(() => plugins.id),
471
+ action: sqliteCore.text("action").notNull(),
472
+ userId: sqliteCore.text("user_id"),
473
+ details: sqliteCore.text("details", { mode: "json" }),
474
+ timestamp: sqliteCore.integer("timestamp").notNull().$defaultFn(() => Math.floor(Date.now() / 1e3))
475
+ });
476
+ var insertUserSchema = createInsertSchema(users, {
477
+ email: (schema) => schema.email(),
478
+ firstName: (schema) => schema.min(1),
479
+ lastName: (schema) => schema.min(1),
480
+ username: (schema) => schema.min(3)
481
+ });
482
+ var selectUserSchema = createSelectSchema(users);
483
+ var insertCollectionSchema = createInsertSchema(collections, {
484
+ name: (schema) => schema.min(1).regex(/^[a-z0-9_]+$/, "Collection name must be lowercase with underscores"),
485
+ displayName: (schema) => schema.min(1)
486
+ });
487
+ var selectCollectionSchema = createSelectSchema(collections);
488
+ var insertContentSchema = createInsertSchema(content, {
489
+ slug: (schema) => schema.min(1).regex(/^[a-zA-Z0-9_-]+$/, "Slug must contain only letters, numbers, underscores, and hyphens"),
490
+ title: (schema) => schema.min(1),
491
+ status: (schema) => schema
492
+ });
493
+ var selectContentSchema = createSelectSchema(content);
494
+ var insertMediaSchema = createInsertSchema(media, {
495
+ filename: (schema) => schema.min(1),
496
+ originalName: (schema) => schema.min(1),
497
+ mimeType: (schema) => schema.min(1),
498
+ size: (schema) => schema.positive(),
499
+ r2Key: (schema) => schema.min(1),
500
+ publicUrl: (schema) => schema.url(),
501
+ folder: (schema) => schema.min(1)
502
+ });
503
+ var selectMediaSchema = createSelectSchema(media);
504
+ var insertWorkflowHistorySchema = createInsertSchema(workflowHistory, {
505
+ action: (schema) => schema.min(1),
506
+ fromStatus: (schema) => schema.min(1),
507
+ toStatus: (schema) => schema.min(1)
508
+ });
509
+ var selectWorkflowHistorySchema = createSelectSchema(workflowHistory);
510
+ var insertPluginSchema = createInsertSchema(plugins, {
511
+ name: (schema) => schema.min(1),
512
+ displayName: (schema) => schema.min(1),
513
+ version: (schema) => schema.min(1),
514
+ author: (schema) => schema.min(1),
515
+ category: (schema) => schema.min(1)
516
+ });
517
+ var selectPluginSchema = createSelectSchema(plugins);
518
+ var insertPluginHookSchema = createInsertSchema(pluginHooks, {
519
+ hookName: (schema) => schema.min(1),
520
+ handlerName: (schema) => schema.min(1)
521
+ });
522
+ var selectPluginHookSchema = createSelectSchema(pluginHooks);
523
+ var insertPluginRouteSchema = createInsertSchema(pluginRoutes, {
524
+ path: (schema) => schema.min(1),
525
+ method: (schema) => schema.min(1),
526
+ handlerName: (schema) => schema.min(1)
527
+ });
528
+ var selectPluginRouteSchema = createSelectSchema(pluginRoutes);
529
+ var insertPluginAssetSchema = createInsertSchema(pluginAssets, {
530
+ assetType: (schema) => schema.min(1),
531
+ assetPath: (schema) => schema.min(1)
532
+ });
533
+ var selectPluginAssetSchema = createSelectSchema(pluginAssets);
534
+ var insertPluginActivityLogSchema = createInsertSchema(pluginActivityLog, {
535
+ action: (schema) => schema.min(1)
536
+ });
537
+ var selectPluginActivityLogSchema = createSelectSchema(pluginActivityLog);
538
+ var systemLogs = sqliteCore.sqliteTable("system_logs", {
539
+ id: sqliteCore.text("id").primaryKey(),
540
+ level: sqliteCore.text("level").notNull(),
541
+ // 'debug', 'info', 'warn', 'error', 'fatal'
542
+ category: sqliteCore.text("category").notNull(),
543
+ // 'auth', 'api', 'workflow', 'plugin', 'media', 'system', etc.
544
+ message: sqliteCore.text("message").notNull(),
545
+ data: sqliteCore.text("data", { mode: "json" }),
546
+ // Additional structured data
547
+ userId: sqliteCore.text("user_id").references(() => users.id),
548
+ sessionId: sqliteCore.text("session_id"),
549
+ requestId: sqliteCore.text("request_id"),
550
+ ipAddress: sqliteCore.text("ip_address"),
551
+ userAgent: sqliteCore.text("user_agent"),
552
+ method: sqliteCore.text("method"),
553
+ // HTTP method for API logs
554
+ url: sqliteCore.text("url"),
555
+ // Request URL for API logs
556
+ statusCode: sqliteCore.integer("status_code"),
557
+ // HTTP status code for API logs
558
+ duration: sqliteCore.integer("duration"),
559
+ // Request duration in milliseconds
560
+ stackTrace: sqliteCore.text("stack_trace"),
561
+ // Error stack trace for error logs
562
+ tags: sqliteCore.text("tags", { mode: "json" }),
563
+ // Array of tags for categorization
564
+ source: sqliteCore.text("source"),
565
+ // Source component/module that generated the log
566
+ createdAt: sqliteCore.integer("created_at", { mode: "timestamp" }).notNull().$defaultFn(() => /* @__PURE__ */ new Date())
567
+ });
568
+ var logConfig = sqliteCore.sqliteTable("log_config", {
569
+ id: sqliteCore.text("id").primaryKey(),
570
+ category: sqliteCore.text("category").notNull().unique(),
571
+ enabled: sqliteCore.integer("enabled", { mode: "boolean" }).notNull().default(true),
572
+ level: sqliteCore.text("level").notNull().default("info"),
573
+ // minimum log level to store
574
+ retention: sqliteCore.integer("retention").notNull().default(30),
575
+ // days to keep logs
576
+ maxSize: sqliteCore.integer("max_size").default(1e4),
577
+ // max number of logs per category
578
+ createdAt: sqliteCore.integer("created_at", { mode: "timestamp" }).notNull().$defaultFn(() => /* @__PURE__ */ new Date()),
579
+ updatedAt: sqliteCore.integer("updated_at", { mode: "timestamp" }).notNull().$defaultFn(() => /* @__PURE__ */ new Date())
580
+ });
581
+ var insertSystemLogSchema = createInsertSchema(systemLogs, {
582
+ level: (schema) => schema.min(1),
583
+ category: (schema) => schema.min(1),
584
+ message: (schema) => schema.min(1)
585
+ });
586
+ var selectSystemLogSchema = createSelectSchema(systemLogs);
587
+ var insertLogConfigSchema = createInsertSchema(logConfig, {
588
+ category: (schema) => schema.min(1),
589
+ level: (schema) => schema.min(1)
590
+ });
591
+ var selectLogConfigSchema = createSelectSchema(logConfig);
592
+ var Logger = class {
593
+ db;
594
+ enabled = true;
595
+ configCache = /* @__PURE__ */ new Map();
596
+ lastConfigRefresh = 0;
597
+ configRefreshInterval = 6e4;
598
+ // 1 minute
599
+ constructor(database) {
600
+ this.db = d1.drizzle(database);
601
+ }
602
+ /**
603
+ * Log a debug message
604
+ */
605
+ async debug(category, message, data, context) {
606
+ return this.log("debug", category, message, data, context);
607
+ }
608
+ /**
609
+ * Log an info message
610
+ */
611
+ async info(category, message, data, context) {
612
+ return this.log("info", category, message, data, context);
613
+ }
614
+ /**
615
+ * Log a warning message
616
+ */
617
+ async warn(category, message, data, context) {
618
+ return this.log("warn", category, message, data, context);
619
+ }
620
+ /**
621
+ * Log an error message
622
+ */
623
+ async error(category, message, error, context) {
624
+ const errorData = error instanceof Error ? {
625
+ name: error.name,
626
+ message: error.message,
627
+ stack: error.stack
628
+ } : error;
629
+ return this.log("error", category, message, errorData, {
630
+ ...context,
631
+ stackTrace: error instanceof Error ? error.stack : void 0
632
+ });
633
+ }
634
+ /**
635
+ * Log a fatal message
636
+ */
637
+ async fatal(category, message, error, context) {
638
+ const errorData = error instanceof Error ? {
639
+ name: error.name,
640
+ message: error.message,
641
+ stack: error.stack
642
+ } : error;
643
+ return this.log("fatal", category, message, errorData, {
644
+ ...context,
645
+ stackTrace: error instanceof Error ? error.stack : void 0
646
+ });
647
+ }
648
+ /**
649
+ * Log an API request
650
+ */
651
+ async logRequest(method, url, statusCode, duration, context) {
652
+ const level = statusCode >= 500 ? "error" : statusCode >= 400 ? "warn" : "info";
653
+ return this.log(level, "api", `${method} ${url} - ${statusCode}`, {
654
+ method,
655
+ url,
656
+ statusCode,
657
+ duration
658
+ }, {
659
+ ...context,
660
+ method,
661
+ url,
662
+ statusCode,
663
+ duration
664
+ });
665
+ }
666
+ /**
667
+ * Log an authentication event
668
+ */
669
+ async logAuth(action, userId, success = true, context) {
670
+ const level = success ? "info" : "warn";
671
+ return this.log(level, "auth", `Authentication ${action}: ${success ? "success" : "failed"}`, {
672
+ action,
673
+ success,
674
+ userId
675
+ }, {
676
+ ...context,
677
+ userId,
678
+ tags: ["authentication", action]
679
+ });
680
+ }
681
+ /**
682
+ * Log a security event
683
+ */
684
+ async logSecurity(event, severity, context) {
685
+ const level = severity === "critical" ? "fatal" : severity === "high" ? "error" : "warn";
686
+ return this.log(level, "security", `Security event: ${event}`, {
687
+ event,
688
+ severity
689
+ }, {
690
+ ...context,
691
+ tags: ["security", severity]
692
+ });
693
+ }
694
+ /**
695
+ * Core logging method
696
+ */
697
+ async log(level, category, message, data, context) {
698
+ if (!this.enabled) return;
699
+ try {
700
+ const config = await this.getConfig(category);
701
+ if (!config || !config.enabled || !this.shouldLog(level, config.level)) {
702
+ return;
703
+ }
704
+ const logEntry = {
705
+ id: crypto.randomUUID(),
706
+ level,
707
+ category,
708
+ message,
709
+ data: data ? JSON.stringify(data) : null,
710
+ userId: context?.userId || null,
711
+ sessionId: context?.sessionId || null,
712
+ requestId: context?.requestId || null,
713
+ ipAddress: context?.ipAddress || null,
714
+ userAgent: context?.userAgent || null,
715
+ method: context?.method || null,
716
+ url: context?.url || null,
717
+ statusCode: context?.statusCode || null,
718
+ duration: context?.duration || null,
719
+ stackTrace: context?.stackTrace || null,
720
+ tags: context?.tags ? JSON.stringify(context.tags) : null,
721
+ source: context?.source || null,
722
+ createdAt: /* @__PURE__ */ new Date()
723
+ };
724
+ await this.db.insert(systemLogs).values(logEntry);
725
+ if (config.maxSize) {
726
+ await this.cleanupCategory(category, config.maxSize);
727
+ }
728
+ } catch (error) {
729
+ console.error("Logger error:", error);
730
+ }
731
+ }
732
+ /**
733
+ * Get logs with filtering and pagination
734
+ */
735
+ async getLogs(filter = {}) {
736
+ try {
737
+ const conditions = [];
738
+ if (filter.level && filter.level.length > 0) {
739
+ conditions.push(drizzleOrm.inArray(systemLogs.level, filter.level));
740
+ }
741
+ if (filter.category && filter.category.length > 0) {
742
+ conditions.push(drizzleOrm.inArray(systemLogs.category, filter.category));
743
+ }
744
+ if (filter.userId) {
745
+ conditions.push(drizzleOrm.eq(systemLogs.userId, filter.userId));
746
+ }
747
+ if (filter.source) {
748
+ conditions.push(drizzleOrm.eq(systemLogs.source, filter.source));
749
+ }
750
+ if (filter.search) {
751
+ conditions.push(
752
+ drizzleOrm.like(systemLogs.message, `%${filter.search}%`)
753
+ );
754
+ }
755
+ if (filter.startDate) {
756
+ conditions.push(drizzleOrm.gte(systemLogs.createdAt, filter.startDate));
757
+ }
758
+ if (filter.endDate) {
759
+ conditions.push(drizzleOrm.lte(systemLogs.createdAt, filter.endDate));
760
+ }
761
+ const whereClause = conditions.length > 0 ? drizzleOrm.and(...conditions) : void 0;
762
+ const totalResult = await this.db.select({ count: drizzleOrm.count() }).from(systemLogs).where(whereClause);
763
+ const total = totalResult[0]?.count || 0;
764
+ const sortColumn = filter.sortBy === "level" ? systemLogs.level : filter.sortBy === "category" ? systemLogs.category : systemLogs.createdAt;
765
+ const sortFn = filter.sortOrder === "asc" ? drizzleOrm.asc : drizzleOrm.desc;
766
+ const logs = await this.db.select().from(systemLogs).where(whereClause).orderBy(sortFn(sortColumn)).limit(filter.limit || 50).offset(filter.offset || 0);
767
+ return { logs, total };
768
+ } catch (error) {
769
+ console.error("Error getting logs:", error);
770
+ return { logs: [], total: 0 };
771
+ }
772
+ }
773
+ /**
774
+ * Get log configuration for a category
775
+ */
776
+ async getConfig(category) {
777
+ try {
778
+ const now = Date.now();
779
+ if (this.configCache.has(category) && now - this.lastConfigRefresh < this.configRefreshInterval) {
780
+ return this.configCache.get(category) || null;
781
+ }
782
+ const configs = await this.db.select().from(logConfig).where(drizzleOrm.eq(logConfig.category, category));
783
+ const config = configs[0] || null;
784
+ if (config) {
785
+ this.configCache.set(category, config);
786
+ this.lastConfigRefresh = now;
787
+ }
788
+ return config;
789
+ } catch (error) {
790
+ console.error("Error getting log config:", error);
791
+ return null;
792
+ }
793
+ }
794
+ /**
795
+ * Update log configuration
796
+ */
797
+ async updateConfig(category, updates) {
798
+ try {
799
+ await this.db.update(logConfig).set({
800
+ ...updates,
801
+ updatedAt: /* @__PURE__ */ new Date()
802
+ }).where(drizzleOrm.eq(logConfig.category, category));
803
+ this.configCache.delete(category);
804
+ } catch (error) {
805
+ console.error("Error updating log config:", error);
806
+ }
807
+ }
808
+ /**
809
+ * Get all log configurations
810
+ */
811
+ async getAllConfigs() {
812
+ try {
813
+ return await this.db.select().from(logConfig);
814
+ } catch (error) {
815
+ console.error("Error getting log configs:", error);
816
+ return [];
817
+ }
818
+ }
819
+ /**
820
+ * Clean up old logs for a category
821
+ */
822
+ async cleanupCategory(category, maxSize) {
823
+ try {
824
+ const countResult = await this.db.select({ count: drizzleOrm.count() }).from(systemLogs).where(drizzleOrm.eq(systemLogs.category, category));
825
+ const currentCount = countResult[0]?.count || 0;
826
+ if (currentCount > maxSize) {
827
+ const cutoffLogs = await this.db.select({ createdAt: systemLogs.createdAt }).from(systemLogs).where(drizzleOrm.eq(systemLogs.category, category)).orderBy(drizzleOrm.desc(systemLogs.createdAt)).limit(1).offset(maxSize - 1);
828
+ if (cutoffLogs[0]) {
829
+ await this.db.delete(systemLogs).where(
830
+ drizzleOrm.and(
831
+ drizzleOrm.eq(systemLogs.category, category),
832
+ drizzleOrm.lte(systemLogs.createdAt, cutoffLogs[0].createdAt)
833
+ )
834
+ );
835
+ }
836
+ }
837
+ } catch (error) {
838
+ console.error("Error cleaning up logs:", error);
839
+ }
840
+ }
841
+ /**
842
+ * Clean up logs based on retention policy
843
+ */
844
+ async cleanupByRetention() {
845
+ try {
846
+ const configs = await this.getAllConfigs();
847
+ for (const config of configs) {
848
+ if (config.retention > 0) {
849
+ const cutoffDate = /* @__PURE__ */ new Date();
850
+ cutoffDate.setDate(cutoffDate.getDate() - config.retention);
851
+ await this.db.delete(systemLogs).where(
852
+ drizzleOrm.and(
853
+ drizzleOrm.eq(systemLogs.category, config.category),
854
+ drizzleOrm.lte(systemLogs.createdAt, cutoffDate)
855
+ )
856
+ );
857
+ }
858
+ }
859
+ } catch (error) {
860
+ console.error("Error cleaning up logs by retention:", error);
861
+ }
862
+ }
863
+ /**
864
+ * Check if a log level should be recorded based on configuration
865
+ */
866
+ shouldLog(level, configLevel) {
867
+ const levels = ["debug", "info", "warn", "error", "fatal"];
868
+ const levelIndex = levels.indexOf(level);
869
+ const configLevelIndex = levels.indexOf(configLevel);
870
+ return levelIndex >= configLevelIndex;
871
+ }
872
+ /**
873
+ * Enable or disable logging
874
+ */
875
+ setEnabled(enabled) {
876
+ this.enabled = enabled;
877
+ }
878
+ /**
879
+ * Check if logging is enabled
880
+ */
881
+ isEnabled() {
882
+ return this.enabled;
883
+ }
884
+ };
885
+ var loggerInstance = null;
886
+ function getLogger(database) {
887
+ if (!loggerInstance && database) {
888
+ loggerInstance = new Logger(database);
889
+ }
890
+ if (!loggerInstance) {
891
+ throw new Error("Logger not initialized. Call getLogger with a database instance first.");
892
+ }
893
+ return loggerInstance;
894
+ }
895
+ function initLogger(database) {
896
+ loggerInstance = new Logger(database);
897
+ return loggerInstance;
898
+ }
899
+
900
+ // src/services/cache.ts
901
+ var CacheService = class {
902
+ config;
903
+ memoryCache = /* @__PURE__ */ new Map();
904
+ constructor(config) {
905
+ this.config = config;
906
+ }
907
+ /**
908
+ * Generate cache key with prefix
909
+ */
910
+ generateKey(type, identifier) {
911
+ const parts = [this.config.keyPrefix, type];
912
+ if (identifier) {
913
+ parts.push(identifier);
914
+ }
915
+ return parts.join(":");
916
+ }
917
+ /**
918
+ * Get value from cache
919
+ */
920
+ async get(key) {
921
+ const cached = this.memoryCache.get(key);
922
+ if (!cached) {
923
+ return null;
924
+ }
925
+ if (Date.now() > cached.expires) {
926
+ this.memoryCache.delete(key);
927
+ return null;
928
+ }
929
+ return cached.value;
930
+ }
931
+ /**
932
+ * Get value from cache with source information
933
+ */
934
+ async getWithSource(key) {
935
+ const cached = this.memoryCache.get(key);
936
+ if (!cached) {
937
+ return {
938
+ hit: false,
939
+ data: null,
940
+ source: "none"
941
+ };
942
+ }
943
+ if (Date.now() > cached.expires) {
944
+ this.memoryCache.delete(key);
945
+ return {
946
+ hit: false,
947
+ data: null,
948
+ source: "expired"
949
+ };
950
+ }
951
+ return {
952
+ hit: true,
953
+ data: cached.value,
954
+ source: "memory",
955
+ ttl: (cached.expires - Date.now()) / 1e3
956
+ // TTL in seconds
957
+ };
958
+ }
959
+ /**
960
+ * Set value in cache
961
+ */
962
+ async set(key, value, ttl) {
963
+ const expires = Date.now() + (ttl || this.config.ttl) * 1e3;
964
+ this.memoryCache.set(key, { value, expires });
965
+ }
966
+ /**
967
+ * Delete specific key from cache
968
+ */
969
+ async delete(key) {
970
+ this.memoryCache.delete(key);
971
+ }
972
+ /**
973
+ * Invalidate cache keys matching a pattern
974
+ * For memory cache, we do simple string matching
975
+ */
976
+ async invalidate(pattern) {
977
+ const regexPattern = pattern.replace(/\*/g, ".*").replace(/\?/g, ".");
978
+ const regex = new RegExp(`^${regexPattern}$`);
979
+ for (const key of this.memoryCache.keys()) {
980
+ if (regex.test(key)) {
981
+ this.memoryCache.delete(key);
982
+ }
983
+ }
984
+ }
985
+ /**
986
+ * Clear all cache
987
+ */
988
+ async clear() {
989
+ this.memoryCache.clear();
990
+ }
991
+ /**
992
+ * Get value from cache or set it using a callback
993
+ */
994
+ async getOrSet(key, callback, ttl) {
995
+ const cached = await this.get(key);
996
+ if (cached !== null) {
997
+ return cached;
998
+ }
999
+ const value = await callback();
1000
+ await this.set(key, value, ttl);
1001
+ return value;
1002
+ }
1003
+ };
1004
+ var CACHE_CONFIGS = {
1005
+ api: {
1006
+ ttl: 300,
1007
+ // 5 minutes
1008
+ keyPrefix: "api"
1009
+ },
1010
+ user: {
1011
+ ttl: 600,
1012
+ // 10 minutes
1013
+ keyPrefix: "user"
1014
+ },
1015
+ content: {
1016
+ ttl: 300,
1017
+ // 5 minutes
1018
+ keyPrefix: "content"
1019
+ },
1020
+ collection: {
1021
+ ttl: 600,
1022
+ // 10 minutes
1023
+ keyPrefix: "collection"
1024
+ }
1025
+ };
1026
+ function getCacheService(config) {
1027
+ return new CacheService(config);
1028
+ }
1029
+
1030
+ exports.CACHE_CONFIGS = CACHE_CONFIGS;
1031
+ exports.CacheService = CacheService;
1032
+ exports.Logger = Logger;
1033
+ exports.apiTokens = apiTokens;
1034
+ exports.collections = collections;
1035
+ exports.content = content;
1036
+ exports.contentVersions = contentVersions;
1037
+ exports.getCacheService = getCacheService;
1038
+ exports.getLogger = getLogger;
1039
+ exports.initLogger = initLogger;
1040
+ exports.insertCollectionSchema = insertCollectionSchema;
1041
+ exports.insertContentSchema = insertContentSchema;
1042
+ exports.insertLogConfigSchema = insertLogConfigSchema;
1043
+ exports.insertMediaSchema = insertMediaSchema;
1044
+ exports.insertPluginActivityLogSchema = insertPluginActivityLogSchema;
1045
+ exports.insertPluginAssetSchema = insertPluginAssetSchema;
1046
+ exports.insertPluginHookSchema = insertPluginHookSchema;
1047
+ exports.insertPluginRouteSchema = insertPluginRouteSchema;
1048
+ exports.insertPluginSchema = insertPluginSchema;
1049
+ exports.insertSystemLogSchema = insertSystemLogSchema;
1050
+ exports.insertUserSchema = insertUserSchema;
1051
+ exports.insertWorkflowHistorySchema = insertWorkflowHistorySchema;
1052
+ exports.logConfig = logConfig;
1053
+ exports.media = media;
1054
+ exports.pluginActivityLog = pluginActivityLog;
1055
+ exports.pluginAssets = pluginAssets;
1056
+ exports.pluginHooks = pluginHooks;
1057
+ exports.pluginRoutes = pluginRoutes;
1058
+ exports.plugins = plugins;
1059
+ exports.schema_exports = schema_exports;
1060
+ exports.selectCollectionSchema = selectCollectionSchema;
1061
+ exports.selectContentSchema = selectContentSchema;
1062
+ exports.selectLogConfigSchema = selectLogConfigSchema;
1063
+ exports.selectMediaSchema = selectMediaSchema;
1064
+ exports.selectPluginActivityLogSchema = selectPluginActivityLogSchema;
1065
+ exports.selectPluginAssetSchema = selectPluginAssetSchema;
1066
+ exports.selectPluginHookSchema = selectPluginHookSchema;
1067
+ exports.selectPluginRouteSchema = selectPluginRouteSchema;
1068
+ exports.selectPluginSchema = selectPluginSchema;
1069
+ exports.selectSystemLogSchema = selectSystemLogSchema;
1070
+ exports.selectUserSchema = selectUserSchema;
1071
+ exports.selectWorkflowHistorySchema = selectWorkflowHistorySchema;
1072
+ exports.systemLogs = systemLogs;
1073
+ exports.users = users;
1074
+ exports.workflowHistory = workflowHistory;
1075
+ //# sourceMappingURL=chunk-3NVJ6W27.cjs.map
1076
+ //# sourceMappingURL=chunk-3NVJ6W27.cjs.map