@vinetechke/next-error-logger 0.1.0-beta.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 (61) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +442 -0
  3. package/dist/adapters/drizzle.cjs +123 -0
  4. package/dist/adapters/drizzle.cjs.map +1 -0
  5. package/dist/adapters/drizzle.d.cts +76 -0
  6. package/dist/adapters/drizzle.d.ts +76 -0
  7. package/dist/adapters/drizzle.js +99 -0
  8. package/dist/adapters/drizzle.js.map +1 -0
  9. package/dist/adapters/prisma.cjs +120 -0
  10. package/dist/adapters/prisma.cjs.map +1 -0
  11. package/dist/adapters/prisma.d.cts +75 -0
  12. package/dist/adapters/prisma.d.ts +75 -0
  13. package/dist/adapters/prisma.js +96 -0
  14. package/dist/adapters/prisma.js.map +1 -0
  15. package/dist/adapters/sql.cjs +206 -0
  16. package/dist/adapters/sql.cjs.map +1 -0
  17. package/dist/adapters/sql.d.cts +111 -0
  18. package/dist/adapters/sql.d.ts +111 -0
  19. package/dist/adapters/sql.js +182 -0
  20. package/dist/adapters/sql.js.map +1 -0
  21. package/dist/api/index.cjs +257 -0
  22. package/dist/api/index.cjs.map +1 -0
  23. package/dist/api/index.d.cts +137 -0
  24. package/dist/api/index.d.ts +137 -0
  25. package/dist/api/index.js +231 -0
  26. package/dist/api/index.js.map +1 -0
  27. package/dist/auth/clerk.cjs +60 -0
  28. package/dist/auth/clerk.cjs.map +1 -0
  29. package/dist/auth/clerk.d.cts +83 -0
  30. package/dist/auth/clerk.d.ts +83 -0
  31. package/dist/auth/clerk.js +36 -0
  32. package/dist/auth/clerk.js.map +1 -0
  33. package/dist/auth/next-auth.cjs +50 -0
  34. package/dist/auth/next-auth.cjs.map +1 -0
  35. package/dist/auth/next-auth.d.cts +53 -0
  36. package/dist/auth/next-auth.d.ts +53 -0
  37. package/dist/auth/next-auth.js +26 -0
  38. package/dist/auth/next-auth.js.map +1 -0
  39. package/dist/components/index.cjs +1175 -0
  40. package/dist/components/index.cjs.map +1 -0
  41. package/dist/components/index.d.cts +141 -0
  42. package/dist/components/index.d.ts +141 -0
  43. package/dist/components/index.js +1147 -0
  44. package/dist/components/index.js.map +1 -0
  45. package/dist/index.cjs +241 -0
  46. package/dist/index.cjs.map +1 -0
  47. package/dist/index.d.cts +109 -0
  48. package/dist/index.d.ts +109 -0
  49. package/dist/index.js +212 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/schemas/drizzle.cjs +100 -0
  52. package/dist/schemas/drizzle.cjs.map +1 -0
  53. package/dist/schemas/drizzle.d.cts +32 -0
  54. package/dist/schemas/drizzle.d.ts +32 -0
  55. package/dist/schemas/drizzle.js +74 -0
  56. package/dist/schemas/drizzle.js.map +1 -0
  57. package/dist/types-C3x_Ry2e.d.cts +195 -0
  58. package/dist/types-C3x_Ry2e.d.ts +195 -0
  59. package/package.json +128 -0
  60. package/schemas/prisma.prisma +23 -0
  61. package/schemas/schema.sql +75 -0
@@ -0,0 +1,76 @@
1
+ import { D as DatabaseAdapter } from '../types-C3x_Ry2e.js';
2
+
3
+ /**
4
+ * Drizzle table interface
5
+ * Using flexible typing to support various Drizzle table definitions
6
+ */
7
+ type DrizzleTable = any;
8
+ /**
9
+ * Drizzle database interface
10
+ * Using flexible typing to support various Drizzle dialects and query patterns
11
+ */
12
+ type DrizzleDB = any;
13
+ /**
14
+ * Configuration for the Drizzle adapter
15
+ */
16
+ interface DrizzleAdapterConfig {
17
+ /** Your Drizzle database instance */
18
+ db: DrizzleDB;
19
+ /** Your ErrorLog table definition */
20
+ table: DrizzleTable;
21
+ /** Drizzle operators (eq, and, or, like, lt, desc, etc.) */
22
+ operators: {
23
+ eq: (column: unknown, value: unknown) => unknown;
24
+ and: (...conditions: unknown[]) => unknown;
25
+ or: (...conditions: unknown[]) => unknown;
26
+ like: (column: unknown, value: string) => unknown;
27
+ lt: (column: unknown, value: unknown) => unknown;
28
+ gte: (column: unknown, value: unknown) => unknown;
29
+ lte: (column: unknown, value: unknown) => unknown;
30
+ desc: (column: unknown) => unknown;
31
+ asc: (column: unknown) => unknown;
32
+ };
33
+ }
34
+ /**
35
+ * Create a Drizzle database adapter
36
+ *
37
+ * Requires an errorLogs table in your Drizzle schema:
38
+ *
39
+ * ```ts
40
+ * // schema.ts
41
+ * import { pgTable, text, timestamp, json } from 'drizzle-orm/pg-core'
42
+ *
43
+ * export const errorLogs = pgTable('error_logs', {
44
+ * id: text('id').primaryKey().$defaultFn(() => crypto.randomUUID()),
45
+ * level: text('level').notNull(),
46
+ * message: text('message').notNull(),
47
+ * stack: text('stack'),
48
+ * userId: text('user_id'),
49
+ * userEmail: text('user_email'),
50
+ * userName: text('user_name'),
51
+ * path: text('path'),
52
+ * method: text('method'),
53
+ * userAgent: text('user_agent'),
54
+ * ip: text('ip'),
55
+ * metadata: json('metadata'),
56
+ * createdAt: timestamp('created_at').defaultNow().notNull(),
57
+ * })
58
+ * ```
59
+ *
60
+ * @example
61
+ * ```ts
62
+ * import { createDrizzleAdapter } from '@vinetechke/next-error-logger/adapters/drizzle'
63
+ * import { db } from '@/lib/db'
64
+ * import { errorLogs } from '@/lib/schema'
65
+ * import { eq, and, or, like, lt, gte, lte, desc, asc } from 'drizzle-orm'
66
+ *
67
+ * const adapter = createDrizzleAdapter({
68
+ * db,
69
+ * table: errorLogs,
70
+ * operators: { eq, and, or, like, lt, gte, lte, desc, asc },
71
+ * })
72
+ * ```
73
+ */
74
+ declare function createDrizzleAdapter(config: DrizzleAdapterConfig): DatabaseAdapter;
75
+
76
+ export { type DrizzleAdapterConfig, createDrizzleAdapter };
@@ -0,0 +1,99 @@
1
+ "use client";
2
+
3
+ // src/adapters/drizzle.ts
4
+ function createDrizzleAdapter(config) {
5
+ const { db, table, operators } = config;
6
+ const { eq, and, or, like, lt, gte, lte, desc, asc } = operators;
7
+ return {
8
+ async create(entry) {
9
+ const id = crypto.randomUUID();
10
+ const result = await db.insert(table).values({
11
+ id,
12
+ level: entry.level,
13
+ message: entry.message,
14
+ stack: entry.stack,
15
+ userId: entry.userId,
16
+ userEmail: entry.userEmail,
17
+ userName: entry.userName,
18
+ path: entry.path,
19
+ method: entry.method,
20
+ userAgent: entry.userAgent,
21
+ ip: entry.ip,
22
+ metadata: entry.metadata
23
+ }).returning();
24
+ return result[0];
25
+ },
26
+ async findMany(options) {
27
+ const {
28
+ page = 1,
29
+ limit = 50,
30
+ level,
31
+ userId,
32
+ search,
33
+ startDate,
34
+ endDate,
35
+ orderBy = "createdAt",
36
+ order = "desc"
37
+ } = options;
38
+ const conditions = [];
39
+ if (level) {
40
+ conditions.push(eq(table.level, level));
41
+ }
42
+ if (userId) {
43
+ conditions.push(eq(table.userId, userId));
44
+ }
45
+ if (search) {
46
+ conditions.push(
47
+ or(
48
+ like(table.message, `%${search}%`),
49
+ like(table.stack, `%${search}%`),
50
+ like(table.path, `%${search}%`),
51
+ like(table.userEmail, `%${search}%`)
52
+ )
53
+ );
54
+ }
55
+ if (startDate) {
56
+ conditions.push(gte(table.createdAt, startDate));
57
+ }
58
+ if (endDate) {
59
+ conditions.push(lte(table.createdAt, endDate));
60
+ }
61
+ const whereCondition = conditions.length > 0 ? and(...conditions) : void 0;
62
+ const orderFn = order === "desc" ? desc : asc;
63
+ const orderColumn = orderBy === "level" ? table.level : table.createdAt;
64
+ let query = db.select().from(table);
65
+ if (whereCondition) {
66
+ query = query.where(whereCondition);
67
+ }
68
+ const logs = await query.orderBy(orderFn(orderColumn)).limit(limit).offset((page - 1) * limit);
69
+ const total = await db.$count(table, whereCondition);
70
+ return { logs, total };
71
+ },
72
+ async findById(id) {
73
+ const results = await db.select().from(table).where(eq(table.id, id)).limit(1).offset(0);
74
+ return results[0] || null;
75
+ },
76
+ async delete(id) {
77
+ await db.delete(table).where(eq(table.id, id));
78
+ },
79
+ async deleteMany(options) {
80
+ const conditions = [];
81
+ if (options.before) {
82
+ conditions.push(lt(table.createdAt, options.before));
83
+ }
84
+ if (options.level) {
85
+ conditions.push(eq(table.level, options.level));
86
+ }
87
+ const whereCondition = conditions.length > 0 ? and(...conditions) : void 0;
88
+ if (!whereCondition) {
89
+ return 0;
90
+ }
91
+ const result = await db.delete(table).where(whereCondition);
92
+ return result.rowCount || 0;
93
+ }
94
+ };
95
+ }
96
+ export {
97
+ createDrizzleAdapter
98
+ };
99
+ //# sourceMappingURL=drizzle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/adapters/drizzle.ts"],"sourcesContent":["import type { DatabaseAdapter, ErrorLogEntry, QueryOptions } from '../types'\n\n/**\n * Drizzle table interface\n * Using flexible typing to support various Drizzle table definitions\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype DrizzleTable = any\n\n/**\n * Drizzle database interface\n * Using flexible typing to support various Drizzle dialects and query patterns\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype DrizzleDB = any\n\n/**\n * Configuration for the Drizzle adapter\n */\nexport interface DrizzleAdapterConfig {\n /** Your Drizzle database instance */\n db: DrizzleDB\n /** Your ErrorLog table definition */\n table: DrizzleTable\n /** Drizzle operators (eq, and, or, like, lt, desc, etc.) */\n operators: {\n eq: (column: unknown, value: unknown) => unknown\n and: (...conditions: unknown[]) => unknown\n or: (...conditions: unknown[]) => unknown\n like: (column: unknown, value: string) => unknown\n lt: (column: unknown, value: unknown) => unknown\n gte: (column: unknown, value: unknown) => unknown\n lte: (column: unknown, value: unknown) => unknown\n desc: (column: unknown) => unknown\n asc: (column: unknown) => unknown\n }\n}\n\n/**\n * Create a Drizzle database adapter\n *\n * Requires an errorLogs table in your Drizzle schema:\n *\n * ```ts\n * // schema.ts\n * import { pgTable, text, timestamp, json } from 'drizzle-orm/pg-core'\n *\n * export const errorLogs = pgTable('error_logs', {\n * id: text('id').primaryKey().$defaultFn(() => crypto.randomUUID()),\n * level: text('level').notNull(),\n * message: text('message').notNull(),\n * stack: text('stack'),\n * userId: text('user_id'),\n * userEmail: text('user_email'),\n * userName: text('user_name'),\n * path: text('path'),\n * method: text('method'),\n * userAgent: text('user_agent'),\n * ip: text('ip'),\n * metadata: json('metadata'),\n * createdAt: timestamp('created_at').defaultNow().notNull(),\n * })\n * ```\n *\n * @example\n * ```ts\n * import { createDrizzleAdapter } from '@vinetechke/next-error-logger/adapters/drizzle'\n * import { db } from '@/lib/db'\n * import { errorLogs } from '@/lib/schema'\n * import { eq, and, or, like, lt, gte, lte, desc, asc } from 'drizzle-orm'\n *\n * const adapter = createDrizzleAdapter({\n * db,\n * table: errorLogs,\n * operators: { eq, and, or, like, lt, gte, lte, desc, asc },\n * })\n * ```\n */\nexport function createDrizzleAdapter(\n config: DrizzleAdapterConfig,\n): DatabaseAdapter {\n const { db, table, operators } = config\n const { eq, and, or, like, lt, gte, lte, desc, asc } = operators\n\n return {\n async create(entry) {\n const id = crypto.randomUUID()\n const result = await db\n .insert(table)\n .values({\n id,\n level: entry.level,\n message: entry.message,\n stack: entry.stack,\n userId: entry.userId,\n userEmail: entry.userEmail,\n userName: entry.userName,\n path: entry.path,\n method: entry.method,\n userAgent: entry.userAgent,\n ip: entry.ip,\n metadata: entry.metadata,\n })\n .returning()\n\n return result[0] as ErrorLogEntry\n },\n\n async findMany(options: QueryOptions) {\n const {\n page = 1,\n limit = 50,\n level,\n userId,\n search,\n startDate,\n endDate,\n orderBy = 'createdAt',\n order = 'desc',\n } = options\n\n // Build conditions array\n const conditions: unknown[] = []\n\n if (level) {\n conditions.push(eq(table.level, level))\n }\n\n if (userId) {\n conditions.push(eq(table.userId, userId))\n }\n\n if (search) {\n conditions.push(\n or(\n like(table.message, `%${search}%`),\n like(table.stack, `%${search}%`),\n like(table.path, `%${search}%`),\n like(table.userEmail, `%${search}%`),\n ),\n )\n }\n\n if (startDate) {\n conditions.push(gte(table.createdAt, startDate))\n }\n\n if (endDate) {\n conditions.push(lte(table.createdAt, endDate))\n }\n\n const whereCondition =\n conditions.length > 0 ? and(...conditions) : undefined\n const orderFn = order === 'desc' ? desc : asc\n const orderColumn =\n orderBy === 'level' ? table.level : table.createdAt\n\n let query = db.select().from(table)\n\n if (whereCondition) {\n query = query.where(whereCondition) as typeof query\n }\n\n const logs = await query\n .orderBy(orderFn(orderColumn))\n .limit(limit)\n .offset((page - 1) * limit)\n\n const total = await db.$count(table, whereCondition)\n\n return { logs: logs as ErrorLogEntry[], total }\n },\n\n async findById(id: string) {\n const results = await db\n .select()\n .from(table)\n .where(eq(table.id, id))\n .limit(1)\n .offset(0)\n\n return (results[0] as ErrorLogEntry) || null\n },\n\n async delete(id: string) {\n await db.delete(table).where(eq(table.id, id))\n },\n\n async deleteMany(options) {\n const conditions: unknown[] = []\n\n if (options.before) {\n conditions.push(lt(table.createdAt, options.before))\n }\n\n if (options.level) {\n conditions.push(eq(table.level, options.level))\n }\n\n const whereCondition =\n conditions.length > 0 ? and(...conditions) : undefined\n\n if (!whereCondition) {\n return 0\n }\n\n const result = await db.delete(table).where(whereCondition)\n return result.rowCount || 0\n },\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,120 @@
1
+ "use client";
2
+ "use strict";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+
21
+ // src/adapters/prisma.ts
22
+ var prisma_exports = {};
23
+ __export(prisma_exports, {
24
+ createPrismaAdapter: () => createPrismaAdapter
25
+ });
26
+ module.exports = __toCommonJS(prisma_exports);
27
+ function createPrismaAdapter(prisma) {
28
+ return {
29
+ async create(entry) {
30
+ const result = await prisma.errorLog.create({
31
+ data: {
32
+ level: entry.level,
33
+ message: entry.message,
34
+ stack: entry.stack,
35
+ userId: entry.userId,
36
+ userEmail: entry.userEmail,
37
+ userName: entry.userName,
38
+ path: entry.path,
39
+ method: entry.method,
40
+ userAgent: entry.userAgent,
41
+ ip: entry.ip,
42
+ metadata: entry.metadata ? JSON.parse(JSON.stringify(entry.metadata)) : null
43
+ }
44
+ });
45
+ return result;
46
+ },
47
+ async findMany(options) {
48
+ const {
49
+ page = 1,
50
+ limit = 50,
51
+ level,
52
+ userId,
53
+ search,
54
+ startDate,
55
+ endDate,
56
+ orderBy = "createdAt",
57
+ order = "desc"
58
+ } = options;
59
+ const where = {};
60
+ if (level) {
61
+ where.level = level;
62
+ }
63
+ if (userId) {
64
+ where.userId = userId;
65
+ }
66
+ if (search) {
67
+ where.OR = [
68
+ { message: { contains: search, mode: "insensitive" } },
69
+ { stack: { contains: search, mode: "insensitive" } },
70
+ { path: { contains: search, mode: "insensitive" } },
71
+ { userEmail: { contains: search, mode: "insensitive" } }
72
+ ];
73
+ }
74
+ if (startDate || endDate) {
75
+ where.createdAt = {};
76
+ if (startDate) {
77
+ ;
78
+ where.createdAt.gte = startDate;
79
+ }
80
+ if (endDate) {
81
+ ;
82
+ where.createdAt.lte = endDate;
83
+ }
84
+ }
85
+ const [logs, total] = await Promise.all([
86
+ prisma.errorLog.findMany({
87
+ where,
88
+ orderBy: { [orderBy]: order },
89
+ skip: (page - 1) * limit,
90
+ take: limit
91
+ }),
92
+ prisma.errorLog.count({ where })
93
+ ]);
94
+ return { logs, total };
95
+ },
96
+ async findById(id) {
97
+ const result = await prisma.errorLog.findUnique({ where: { id } });
98
+ return result;
99
+ },
100
+ async delete(id) {
101
+ await prisma.errorLog.delete({ where: { id } });
102
+ },
103
+ async deleteMany(options) {
104
+ const where = {};
105
+ if (options.before) {
106
+ where.createdAt = { lt: options.before };
107
+ }
108
+ if (options.level) {
109
+ where.level = options.level;
110
+ }
111
+ const result = await prisma.errorLog.deleteMany({ where });
112
+ return result.count;
113
+ }
114
+ };
115
+ }
116
+ // Annotate the CommonJS export names for ESM import in node:
117
+ 0 && (module.exports = {
118
+ createPrismaAdapter
119
+ });
120
+ //# sourceMappingURL=prisma.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/adapters/prisma.ts"],"sourcesContent":["import type {\n DatabaseAdapter,\n ErrorLogEntry,\n QueryOptions,\n LogLevel,\n} from '../types'\n\n/**\n * Prisma client interface - matches @prisma/client structure\n * We use a generic interface to avoid requiring @prisma/client as a dependency\n */\ninterface PrismaClientLike {\n errorLog: {\n create: (args: { data: Record<string, unknown> }) => Promise<unknown>\n findMany: (args: {\n where?: Record<string, unknown>\n orderBy?: Record<string, unknown>\n skip?: number\n take?: number\n }) => Promise<unknown[]>\n findUnique: (args: { where: { id: string } }) => Promise<unknown | null>\n delete: (args: { where: { id: string } }) => Promise<unknown>\n deleteMany: (args: {\n where?: Record<string, unknown>\n }) => Promise<{ count: number }>\n count: (args: { where?: Record<string, unknown> }) => Promise<number>\n }\n}\n\n/**\n * Create a Prisma database adapter\n *\n * Requires an ErrorLog model in your Prisma schema:\n *\n * ```prisma\n * model ErrorLog {\n * id String @id @default(cuid())\n * level String\n * message String @db.Text\n * stack String? @db.Text\n * userId String?\n * userEmail String?\n * userName String?\n * path String?\n * method String?\n * userAgent String?\n * ip String?\n * metadata Json?\n * createdAt DateTime @default(now())\n *\n * @@index([level])\n * @@index([userId])\n * @@index([createdAt])\n * }\n * ```\n *\n * @example\n * ```ts\n * import { createPrismaAdapter } from '@vinetechke/next-error-logger/adapters/prisma'\n * import { prisma } from '@/lib/prisma'\n *\n * const adapter = createPrismaAdapter(prisma)\n * ```\n */\nexport function createPrismaAdapter(prisma: PrismaClientLike): DatabaseAdapter {\n return {\n async create(entry) {\n const result = await prisma.errorLog.create({\n data: {\n level: entry.level,\n message: entry.message,\n stack: entry.stack,\n userId: entry.userId,\n userEmail: entry.userEmail,\n userName: entry.userName,\n path: entry.path,\n method: entry.method,\n userAgent: entry.userAgent,\n ip: entry.ip,\n metadata: entry.metadata\n ? JSON.parse(JSON.stringify(entry.metadata))\n : null,\n },\n })\n return result as ErrorLogEntry\n },\n\n async findMany(options: QueryOptions) {\n const {\n page = 1,\n limit = 50,\n level,\n userId,\n search,\n startDate,\n endDate,\n orderBy = 'createdAt',\n order = 'desc',\n } = options\n\n // Build where clause\n const where: Record<string, unknown> = {}\n\n if (level) {\n where.level = level\n }\n\n if (userId) {\n where.userId = userId\n }\n\n if (search) {\n where.OR = [\n { message: { contains: search, mode: 'insensitive' } },\n { stack: { contains: search, mode: 'insensitive' } },\n { path: { contains: search, mode: 'insensitive' } },\n { userEmail: { contains: search, mode: 'insensitive' } },\n ]\n }\n\n if (startDate || endDate) {\n where.createdAt = {}\n if (startDate) {\n ;(where.createdAt as Record<string, unknown>).gte =\n startDate\n }\n if (endDate) {\n ;(where.createdAt as Record<string, unknown>).lte = endDate\n }\n }\n\n const [logs, total] = await Promise.all([\n prisma.errorLog.findMany({\n where,\n orderBy: { [orderBy]: order },\n skip: (page - 1) * limit,\n take: limit,\n }),\n prisma.errorLog.count({ where }),\n ])\n\n return { logs: logs as ErrorLogEntry[], total }\n },\n\n async findById(id: string) {\n const result = await prisma.errorLog.findUnique({ where: { id } })\n return result as ErrorLogEntry | null\n },\n\n async delete(id: string) {\n await prisma.errorLog.delete({ where: { id } })\n },\n\n async deleteMany(options) {\n const where: Record<string, unknown> = {}\n\n if (options.before) {\n where.createdAt = { lt: options.before }\n }\n\n if (options.level) {\n where.level = options.level\n }\n\n const result = await prisma.errorLog.deleteMany({ where })\n return result.count\n },\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgEO,SAAS,oBAAoB,QAA2C;AAC3E,SAAO;AAAA,IACH,MAAM,OAAO,OAAO;AAChB,YAAM,SAAS,MAAM,OAAO,SAAS,OAAO;AAAA,QACxC,MAAM;AAAA,UACF,OAAO,MAAM;AAAA,UACb,SAAS,MAAM;AAAA,UACf,OAAO,MAAM;AAAA,UACb,QAAQ,MAAM;AAAA,UACd,WAAW,MAAM;AAAA,UACjB,UAAU,MAAM;AAAA,UAChB,MAAM,MAAM;AAAA,UACZ,QAAQ,MAAM;AAAA,UACd,WAAW,MAAM;AAAA,UACjB,IAAI,MAAM;AAAA,UACV,UAAU,MAAM,WACV,KAAK,MAAM,KAAK,UAAU,MAAM,QAAQ,CAAC,IACzC;AAAA,QACV;AAAA,MACJ,CAAC;AACD,aAAO;AAAA,IACX;AAAA,IAEA,MAAM,SAAS,SAAuB;AAClC,YAAM;AAAA,QACF,OAAO;AAAA,QACP,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV,QAAQ;AAAA,MACZ,IAAI;AAGJ,YAAM,QAAiC,CAAC;AAExC,UAAI,OAAO;AACP,cAAM,QAAQ;AAAA,MAClB;AAEA,UAAI,QAAQ;AACR,cAAM,SAAS;AAAA,MACnB;AAEA,UAAI,QAAQ;AACR,cAAM,KAAK;AAAA,UACP,EAAE,SAAS,EAAE,UAAU,QAAQ,MAAM,cAAc,EAAE;AAAA,UACrD,EAAE,OAAO,EAAE,UAAU,QAAQ,MAAM,cAAc,EAAE;AAAA,UACnD,EAAE,MAAM,EAAE,UAAU,QAAQ,MAAM,cAAc,EAAE;AAAA,UAClD,EAAE,WAAW,EAAE,UAAU,QAAQ,MAAM,cAAc,EAAE;AAAA,QAC3D;AAAA,MACJ;AAEA,UAAI,aAAa,SAAS;AACtB,cAAM,YAAY,CAAC;AACnB,YAAI,WAAW;AACX;AAAC,UAAC,MAAM,UAAsC,MAC1C;AAAA,QACR;AACA,YAAI,SAAS;AACT;AAAC,UAAC,MAAM,UAAsC,MAAM;AAAA,QACxD;AAAA,MACJ;AAEA,YAAM,CAAC,MAAM,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,QACpC,OAAO,SAAS,SAAS;AAAA,UACrB;AAAA,UACA,SAAS,EAAE,CAAC,OAAO,GAAG,MAAM;AAAA,UAC5B,OAAO,OAAO,KAAK;AAAA,UACnB,MAAM;AAAA,QACV,CAAC;AAAA,QACD,OAAO,SAAS,MAAM,EAAE,MAAM,CAAC;AAAA,MACnC,CAAC;AAED,aAAO,EAAE,MAA+B,MAAM;AAAA,IAClD;AAAA,IAEA,MAAM,SAAS,IAAY;AACvB,YAAM,SAAS,MAAM,OAAO,SAAS,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AACjE,aAAO;AAAA,IACX;AAAA,IAEA,MAAM,OAAO,IAAY;AACrB,YAAM,OAAO,SAAS,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AAAA,IAClD;AAAA,IAEA,MAAM,WAAW,SAAS;AACtB,YAAM,QAAiC,CAAC;AAExC,UAAI,QAAQ,QAAQ;AAChB,cAAM,YAAY,EAAE,IAAI,QAAQ,OAAO;AAAA,MAC3C;AAEA,UAAI,QAAQ,OAAO;AACf,cAAM,QAAQ,QAAQ;AAAA,MAC1B;AAEA,YAAM,SAAS,MAAM,OAAO,SAAS,WAAW,EAAE,MAAM,CAAC;AACzD,aAAO,OAAO;AAAA,IAClB;AAAA,EACJ;AACJ;","names":[]}
@@ -0,0 +1,75 @@
1
+ import { D as DatabaseAdapter } from '../types-C3x_Ry2e.cjs';
2
+
3
+ /**
4
+ * Prisma client interface - matches @prisma/client structure
5
+ * We use a generic interface to avoid requiring @prisma/client as a dependency
6
+ */
7
+ interface PrismaClientLike {
8
+ errorLog: {
9
+ create: (args: {
10
+ data: Record<string, unknown>;
11
+ }) => Promise<unknown>;
12
+ findMany: (args: {
13
+ where?: Record<string, unknown>;
14
+ orderBy?: Record<string, unknown>;
15
+ skip?: number;
16
+ take?: number;
17
+ }) => Promise<unknown[]>;
18
+ findUnique: (args: {
19
+ where: {
20
+ id: string;
21
+ };
22
+ }) => Promise<unknown | null>;
23
+ delete: (args: {
24
+ where: {
25
+ id: string;
26
+ };
27
+ }) => Promise<unknown>;
28
+ deleteMany: (args: {
29
+ where?: Record<string, unknown>;
30
+ }) => Promise<{
31
+ count: number;
32
+ }>;
33
+ count: (args: {
34
+ where?: Record<string, unknown>;
35
+ }) => Promise<number>;
36
+ };
37
+ }
38
+ /**
39
+ * Create a Prisma database adapter
40
+ *
41
+ * Requires an ErrorLog model in your Prisma schema:
42
+ *
43
+ * ```prisma
44
+ * model ErrorLog {
45
+ * id String @id @default(cuid())
46
+ * level String
47
+ * message String @db.Text
48
+ * stack String? @db.Text
49
+ * userId String?
50
+ * userEmail String?
51
+ * userName String?
52
+ * path String?
53
+ * method String?
54
+ * userAgent String?
55
+ * ip String?
56
+ * metadata Json?
57
+ * createdAt DateTime @default(now())
58
+ *
59
+ * @@index([level])
60
+ * @@index([userId])
61
+ * @@index([createdAt])
62
+ * }
63
+ * ```
64
+ *
65
+ * @example
66
+ * ```ts
67
+ * import { createPrismaAdapter } from '@vinetechke/next-error-logger/adapters/prisma'
68
+ * import { prisma } from '@/lib/prisma'
69
+ *
70
+ * const adapter = createPrismaAdapter(prisma)
71
+ * ```
72
+ */
73
+ declare function createPrismaAdapter(prisma: PrismaClientLike): DatabaseAdapter;
74
+
75
+ export { createPrismaAdapter };
@@ -0,0 +1,75 @@
1
+ import { D as DatabaseAdapter } from '../types-C3x_Ry2e.js';
2
+
3
+ /**
4
+ * Prisma client interface - matches @prisma/client structure
5
+ * We use a generic interface to avoid requiring @prisma/client as a dependency
6
+ */
7
+ interface PrismaClientLike {
8
+ errorLog: {
9
+ create: (args: {
10
+ data: Record<string, unknown>;
11
+ }) => Promise<unknown>;
12
+ findMany: (args: {
13
+ where?: Record<string, unknown>;
14
+ orderBy?: Record<string, unknown>;
15
+ skip?: number;
16
+ take?: number;
17
+ }) => Promise<unknown[]>;
18
+ findUnique: (args: {
19
+ where: {
20
+ id: string;
21
+ };
22
+ }) => Promise<unknown | null>;
23
+ delete: (args: {
24
+ where: {
25
+ id: string;
26
+ };
27
+ }) => Promise<unknown>;
28
+ deleteMany: (args: {
29
+ where?: Record<string, unknown>;
30
+ }) => Promise<{
31
+ count: number;
32
+ }>;
33
+ count: (args: {
34
+ where?: Record<string, unknown>;
35
+ }) => Promise<number>;
36
+ };
37
+ }
38
+ /**
39
+ * Create a Prisma database adapter
40
+ *
41
+ * Requires an ErrorLog model in your Prisma schema:
42
+ *
43
+ * ```prisma
44
+ * model ErrorLog {
45
+ * id String @id @default(cuid())
46
+ * level String
47
+ * message String @db.Text
48
+ * stack String? @db.Text
49
+ * userId String?
50
+ * userEmail String?
51
+ * userName String?
52
+ * path String?
53
+ * method String?
54
+ * userAgent String?
55
+ * ip String?
56
+ * metadata Json?
57
+ * createdAt DateTime @default(now())
58
+ *
59
+ * @@index([level])
60
+ * @@index([userId])
61
+ * @@index([createdAt])
62
+ * }
63
+ * ```
64
+ *
65
+ * @example
66
+ * ```ts
67
+ * import { createPrismaAdapter } from '@vinetechke/next-error-logger/adapters/prisma'
68
+ * import { prisma } from '@/lib/prisma'
69
+ *
70
+ * const adapter = createPrismaAdapter(prisma)
71
+ * ```
72
+ */
73
+ declare function createPrismaAdapter(prisma: PrismaClientLike): DatabaseAdapter;
74
+
75
+ export { createPrismaAdapter };
@@ -0,0 +1,96 @@
1
+ "use client";
2
+
3
+ // src/adapters/prisma.ts
4
+ function createPrismaAdapter(prisma) {
5
+ return {
6
+ async create(entry) {
7
+ const result = await prisma.errorLog.create({
8
+ data: {
9
+ level: entry.level,
10
+ message: entry.message,
11
+ stack: entry.stack,
12
+ userId: entry.userId,
13
+ userEmail: entry.userEmail,
14
+ userName: entry.userName,
15
+ path: entry.path,
16
+ method: entry.method,
17
+ userAgent: entry.userAgent,
18
+ ip: entry.ip,
19
+ metadata: entry.metadata ? JSON.parse(JSON.stringify(entry.metadata)) : null
20
+ }
21
+ });
22
+ return result;
23
+ },
24
+ async findMany(options) {
25
+ const {
26
+ page = 1,
27
+ limit = 50,
28
+ level,
29
+ userId,
30
+ search,
31
+ startDate,
32
+ endDate,
33
+ orderBy = "createdAt",
34
+ order = "desc"
35
+ } = options;
36
+ const where = {};
37
+ if (level) {
38
+ where.level = level;
39
+ }
40
+ if (userId) {
41
+ where.userId = userId;
42
+ }
43
+ if (search) {
44
+ where.OR = [
45
+ { message: { contains: search, mode: "insensitive" } },
46
+ { stack: { contains: search, mode: "insensitive" } },
47
+ { path: { contains: search, mode: "insensitive" } },
48
+ { userEmail: { contains: search, mode: "insensitive" } }
49
+ ];
50
+ }
51
+ if (startDate || endDate) {
52
+ where.createdAt = {};
53
+ if (startDate) {
54
+ ;
55
+ where.createdAt.gte = startDate;
56
+ }
57
+ if (endDate) {
58
+ ;
59
+ where.createdAt.lte = endDate;
60
+ }
61
+ }
62
+ const [logs, total] = await Promise.all([
63
+ prisma.errorLog.findMany({
64
+ where,
65
+ orderBy: { [orderBy]: order },
66
+ skip: (page - 1) * limit,
67
+ take: limit
68
+ }),
69
+ prisma.errorLog.count({ where })
70
+ ]);
71
+ return { logs, total };
72
+ },
73
+ async findById(id) {
74
+ const result = await prisma.errorLog.findUnique({ where: { id } });
75
+ return result;
76
+ },
77
+ async delete(id) {
78
+ await prisma.errorLog.delete({ where: { id } });
79
+ },
80
+ async deleteMany(options) {
81
+ const where = {};
82
+ if (options.before) {
83
+ where.createdAt = { lt: options.before };
84
+ }
85
+ if (options.level) {
86
+ where.level = options.level;
87
+ }
88
+ const result = await prisma.errorLog.deleteMany({ where });
89
+ return result.count;
90
+ }
91
+ };
92
+ }
93
+ export {
94
+ createPrismaAdapter
95
+ };
96
+ //# sourceMappingURL=prisma.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/adapters/prisma.ts"],"sourcesContent":["import type {\n DatabaseAdapter,\n ErrorLogEntry,\n QueryOptions,\n LogLevel,\n} from '../types'\n\n/**\n * Prisma client interface - matches @prisma/client structure\n * We use a generic interface to avoid requiring @prisma/client as a dependency\n */\ninterface PrismaClientLike {\n errorLog: {\n create: (args: { data: Record<string, unknown> }) => Promise<unknown>\n findMany: (args: {\n where?: Record<string, unknown>\n orderBy?: Record<string, unknown>\n skip?: number\n take?: number\n }) => Promise<unknown[]>\n findUnique: (args: { where: { id: string } }) => Promise<unknown | null>\n delete: (args: { where: { id: string } }) => Promise<unknown>\n deleteMany: (args: {\n where?: Record<string, unknown>\n }) => Promise<{ count: number }>\n count: (args: { where?: Record<string, unknown> }) => Promise<number>\n }\n}\n\n/**\n * Create a Prisma database adapter\n *\n * Requires an ErrorLog model in your Prisma schema:\n *\n * ```prisma\n * model ErrorLog {\n * id String @id @default(cuid())\n * level String\n * message String @db.Text\n * stack String? @db.Text\n * userId String?\n * userEmail String?\n * userName String?\n * path String?\n * method String?\n * userAgent String?\n * ip String?\n * metadata Json?\n * createdAt DateTime @default(now())\n *\n * @@index([level])\n * @@index([userId])\n * @@index([createdAt])\n * }\n * ```\n *\n * @example\n * ```ts\n * import { createPrismaAdapter } from '@vinetechke/next-error-logger/adapters/prisma'\n * import { prisma } from '@/lib/prisma'\n *\n * const adapter = createPrismaAdapter(prisma)\n * ```\n */\nexport function createPrismaAdapter(prisma: PrismaClientLike): DatabaseAdapter {\n return {\n async create(entry) {\n const result = await prisma.errorLog.create({\n data: {\n level: entry.level,\n message: entry.message,\n stack: entry.stack,\n userId: entry.userId,\n userEmail: entry.userEmail,\n userName: entry.userName,\n path: entry.path,\n method: entry.method,\n userAgent: entry.userAgent,\n ip: entry.ip,\n metadata: entry.metadata\n ? JSON.parse(JSON.stringify(entry.metadata))\n : null,\n },\n })\n return result as ErrorLogEntry\n },\n\n async findMany(options: QueryOptions) {\n const {\n page = 1,\n limit = 50,\n level,\n userId,\n search,\n startDate,\n endDate,\n orderBy = 'createdAt',\n order = 'desc',\n } = options\n\n // Build where clause\n const where: Record<string, unknown> = {}\n\n if (level) {\n where.level = level\n }\n\n if (userId) {\n where.userId = userId\n }\n\n if (search) {\n where.OR = [\n { message: { contains: search, mode: 'insensitive' } },\n { stack: { contains: search, mode: 'insensitive' } },\n { path: { contains: search, mode: 'insensitive' } },\n { userEmail: { contains: search, mode: 'insensitive' } },\n ]\n }\n\n if (startDate || endDate) {\n where.createdAt = {}\n if (startDate) {\n ;(where.createdAt as Record<string, unknown>).gte =\n startDate\n }\n if (endDate) {\n ;(where.createdAt as Record<string, unknown>).lte = endDate\n }\n }\n\n const [logs, total] = await Promise.all([\n prisma.errorLog.findMany({\n where,\n orderBy: { [orderBy]: order },\n skip: (page - 1) * limit,\n take: limit,\n }),\n prisma.errorLog.count({ where }),\n ])\n\n return { logs: logs as ErrorLogEntry[], total }\n },\n\n async findById(id: string) {\n const result = await prisma.errorLog.findUnique({ where: { id } })\n return result as ErrorLogEntry | null\n },\n\n async delete(id: string) {\n await prisma.errorLog.delete({ where: { id } })\n },\n\n async deleteMany(options) {\n const where: Record<string, unknown> = {}\n\n if (options.before) {\n where.createdAt = { lt: options.before }\n }\n\n if (options.level) {\n where.level = options.level\n }\n\n const result = await prisma.errorLog.deleteMany({ where })\n return result.count\n },\n }\n}\n"],"mappings":";;;AAgEO,SAAS,oBAAoB,QAA2C;AAC3E,SAAO;AAAA,IACH,MAAM,OAAO,OAAO;AAChB,YAAM,SAAS,MAAM,OAAO,SAAS,OAAO;AAAA,QACxC,MAAM;AAAA,UACF,OAAO,MAAM;AAAA,UACb,SAAS,MAAM;AAAA,UACf,OAAO,MAAM;AAAA,UACb,QAAQ,MAAM;AAAA,UACd,WAAW,MAAM;AAAA,UACjB,UAAU,MAAM;AAAA,UAChB,MAAM,MAAM;AAAA,UACZ,QAAQ,MAAM;AAAA,UACd,WAAW,MAAM;AAAA,UACjB,IAAI,MAAM;AAAA,UACV,UAAU,MAAM,WACV,KAAK,MAAM,KAAK,UAAU,MAAM,QAAQ,CAAC,IACzC;AAAA,QACV;AAAA,MACJ,CAAC;AACD,aAAO;AAAA,IACX;AAAA,IAEA,MAAM,SAAS,SAAuB;AAClC,YAAM;AAAA,QACF,OAAO;AAAA,QACP,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV,QAAQ;AAAA,MACZ,IAAI;AAGJ,YAAM,QAAiC,CAAC;AAExC,UAAI,OAAO;AACP,cAAM,QAAQ;AAAA,MAClB;AAEA,UAAI,QAAQ;AACR,cAAM,SAAS;AAAA,MACnB;AAEA,UAAI,QAAQ;AACR,cAAM,KAAK;AAAA,UACP,EAAE,SAAS,EAAE,UAAU,QAAQ,MAAM,cAAc,EAAE;AAAA,UACrD,EAAE,OAAO,EAAE,UAAU,QAAQ,MAAM,cAAc,EAAE;AAAA,UACnD,EAAE,MAAM,EAAE,UAAU,QAAQ,MAAM,cAAc,EAAE;AAAA,UAClD,EAAE,WAAW,EAAE,UAAU,QAAQ,MAAM,cAAc,EAAE;AAAA,QAC3D;AAAA,MACJ;AAEA,UAAI,aAAa,SAAS;AACtB,cAAM,YAAY,CAAC;AACnB,YAAI,WAAW;AACX;AAAC,UAAC,MAAM,UAAsC,MAC1C;AAAA,QACR;AACA,YAAI,SAAS;AACT;AAAC,UAAC,MAAM,UAAsC,MAAM;AAAA,QACxD;AAAA,MACJ;AAEA,YAAM,CAAC,MAAM,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,QACpC,OAAO,SAAS,SAAS;AAAA,UACrB;AAAA,UACA,SAAS,EAAE,CAAC,OAAO,GAAG,MAAM;AAAA,UAC5B,OAAO,OAAO,KAAK;AAAA,UACnB,MAAM;AAAA,QACV,CAAC;AAAA,QACD,OAAO,SAAS,MAAM,EAAE,MAAM,CAAC;AAAA,MACnC,CAAC;AAED,aAAO,EAAE,MAA+B,MAAM;AAAA,IAClD;AAAA,IAEA,MAAM,SAAS,IAAY;AACvB,YAAM,SAAS,MAAM,OAAO,SAAS,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AACjE,aAAO;AAAA,IACX;AAAA,IAEA,MAAM,OAAO,IAAY;AACrB,YAAM,OAAO,SAAS,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AAAA,IAClD;AAAA,IAEA,MAAM,WAAW,SAAS;AACtB,YAAM,QAAiC,CAAC;AAExC,UAAI,QAAQ,QAAQ;AAChB,cAAM,YAAY,EAAE,IAAI,QAAQ,OAAO;AAAA,MAC3C;AAEA,UAAI,QAAQ,OAAO;AACf,cAAM,QAAQ,QAAQ;AAAA,MAC1B;AAEA,YAAM,SAAS,MAAM,OAAO,SAAS,WAAW,EAAE,MAAM,CAAC;AACzD,aAAO,OAAO;AAAA,IAClB;AAAA,EACJ;AACJ;","names":[]}