@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.
- package/LICENSE +21 -0
- package/README.md +442 -0
- package/dist/adapters/drizzle.cjs +123 -0
- package/dist/adapters/drizzle.cjs.map +1 -0
- package/dist/adapters/drizzle.d.cts +76 -0
- package/dist/adapters/drizzle.d.ts +76 -0
- package/dist/adapters/drizzle.js +99 -0
- package/dist/adapters/drizzle.js.map +1 -0
- package/dist/adapters/prisma.cjs +120 -0
- package/dist/adapters/prisma.cjs.map +1 -0
- package/dist/adapters/prisma.d.cts +75 -0
- package/dist/adapters/prisma.d.ts +75 -0
- package/dist/adapters/prisma.js +96 -0
- package/dist/adapters/prisma.js.map +1 -0
- package/dist/adapters/sql.cjs +206 -0
- package/dist/adapters/sql.cjs.map +1 -0
- package/dist/adapters/sql.d.cts +111 -0
- package/dist/adapters/sql.d.ts +111 -0
- package/dist/adapters/sql.js +182 -0
- package/dist/adapters/sql.js.map +1 -0
- package/dist/api/index.cjs +257 -0
- package/dist/api/index.cjs.map +1 -0
- package/dist/api/index.d.cts +137 -0
- package/dist/api/index.d.ts +137 -0
- package/dist/api/index.js +231 -0
- package/dist/api/index.js.map +1 -0
- package/dist/auth/clerk.cjs +60 -0
- package/dist/auth/clerk.cjs.map +1 -0
- package/dist/auth/clerk.d.cts +83 -0
- package/dist/auth/clerk.d.ts +83 -0
- package/dist/auth/clerk.js +36 -0
- package/dist/auth/clerk.js.map +1 -0
- package/dist/auth/next-auth.cjs +50 -0
- package/dist/auth/next-auth.cjs.map +1 -0
- package/dist/auth/next-auth.d.cts +53 -0
- package/dist/auth/next-auth.d.ts +53 -0
- package/dist/auth/next-auth.js +26 -0
- package/dist/auth/next-auth.js.map +1 -0
- package/dist/components/index.cjs +1175 -0
- package/dist/components/index.cjs.map +1 -0
- package/dist/components/index.d.cts +141 -0
- package/dist/components/index.d.ts +141 -0
- package/dist/components/index.js +1147 -0
- package/dist/components/index.js.map +1 -0
- package/dist/index.cjs +241 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +109 -0
- package/dist/index.d.ts +109 -0
- package/dist/index.js +212 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/drizzle.cjs +100 -0
- package/dist/schemas/drizzle.cjs.map +1 -0
- package/dist/schemas/drizzle.d.cts +32 -0
- package/dist/schemas/drizzle.d.ts +32 -0
- package/dist/schemas/drizzle.js +74 -0
- package/dist/schemas/drizzle.js.map +1 -0
- package/dist/types-C3x_Ry2e.d.cts +195 -0
- package/dist/types-C3x_Ry2e.d.ts +195 -0
- package/package.json +128 -0
- package/schemas/prisma.prisma +23 -0
- 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":";;;AA8EO,SAAS,qBACZ,QACe;AACf,QAAM,EAAE,IAAI,OAAO,UAAU,IAAI;AACjC,QAAM,EAAE,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK,KAAK,MAAM,IAAI,IAAI;AAEvD,SAAO;AAAA,IACH,MAAM,OAAO,OAAO;AAChB,YAAM,KAAK,OAAO,WAAW;AAC7B,YAAM,SAAS,MAAM,GAChB,OAAO,KAAK,EACZ,OAAO;AAAA,QACJ;AAAA,QACA,OAAO,MAAM;AAAA,QACb,SAAS,MAAM;AAAA,QACf,OAAO,MAAM;AAAA,QACb,QAAQ,MAAM;AAAA,QACd,WAAW,MAAM;AAAA,QACjB,UAAU,MAAM;AAAA,QAChB,MAAM,MAAM;AAAA,QACZ,QAAQ,MAAM;AAAA,QACd,WAAW,MAAM;AAAA,QACjB,IAAI,MAAM;AAAA,QACV,UAAU,MAAM;AAAA,MACpB,CAAC,EACA,UAAU;AAEf,aAAO,OAAO,CAAC;AAAA,IACnB;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,aAAwB,CAAC;AAE/B,UAAI,OAAO;AACP,mBAAW,KAAK,GAAG,MAAM,OAAO,KAAK,CAAC;AAAA,MAC1C;AAEA,UAAI,QAAQ;AACR,mBAAW,KAAK,GAAG,MAAM,QAAQ,MAAM,CAAC;AAAA,MAC5C;AAEA,UAAI,QAAQ;AACR,mBAAW;AAAA,UACP;AAAA,YACI,KAAK,MAAM,SAAS,IAAI,MAAM,GAAG;AAAA,YACjC,KAAK,MAAM,OAAO,IAAI,MAAM,GAAG;AAAA,YAC/B,KAAK,MAAM,MAAM,IAAI,MAAM,GAAG;AAAA,YAC9B,KAAK,MAAM,WAAW,IAAI,MAAM,GAAG;AAAA,UACvC;AAAA,QACJ;AAAA,MACJ;AAEA,UAAI,WAAW;AACX,mBAAW,KAAK,IAAI,MAAM,WAAW,SAAS,CAAC;AAAA,MACnD;AAEA,UAAI,SAAS;AACT,mBAAW,KAAK,IAAI,MAAM,WAAW,OAAO,CAAC;AAAA,MACjD;AAEA,YAAM,iBACF,WAAW,SAAS,IAAI,IAAI,GAAG,UAAU,IAAI;AACjD,YAAM,UAAU,UAAU,SAAS,OAAO;AAC1C,YAAM,cACF,YAAY,UAAU,MAAM,QAAQ,MAAM;AAE9C,UAAI,QAAQ,GAAG,OAAO,EAAE,KAAK,KAAK;AAElC,UAAI,gBAAgB;AAChB,gBAAQ,MAAM,MAAM,cAAc;AAAA,MACtC;AAEA,YAAM,OAAO,MAAM,MACd,QAAQ,QAAQ,WAAW,CAAC,EAC5B,MAAM,KAAK,EACX,QAAQ,OAAO,KAAK,KAAK;AAE9B,YAAM,QAAQ,MAAM,GAAG,OAAO,OAAO,cAAc;AAEnD,aAAO,EAAE,MAA+B,MAAM;AAAA,IAClD;AAAA,IAEA,MAAM,SAAS,IAAY;AACvB,YAAM,UAAU,MAAM,GACjB,OAAO,EACP,KAAK,KAAK,EACV,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC,EACtB,MAAM,CAAC,EACP,OAAO,CAAC;AAEb,aAAQ,QAAQ,CAAC,KAAuB;AAAA,IAC5C;AAAA,IAEA,MAAM,OAAO,IAAY;AACrB,YAAM,GAAG,OAAO,KAAK,EAAE,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;AAAA,IACjD;AAAA,IAEA,MAAM,WAAW,SAAS;AACtB,YAAM,aAAwB,CAAC;AAE/B,UAAI,QAAQ,QAAQ;AAChB,mBAAW,KAAK,GAAG,MAAM,WAAW,QAAQ,MAAM,CAAC;AAAA,MACvD;AAEA,UAAI,QAAQ,OAAO;AACf,mBAAW,KAAK,GAAG,MAAM,OAAO,QAAQ,KAAK,CAAC;AAAA,MAClD;AAEA,YAAM,iBACF,WAAW,SAAS,IAAI,IAAI,GAAG,UAAU,IAAI;AAEjD,UAAI,CAAC,gBAAgB;AACjB,eAAO;AAAA,MACX;AAEA,YAAM,SAAS,MAAM,GAAG,OAAO,KAAK,EAAE,MAAM,cAAc;AAC1D,aAAO,OAAO,YAAY;AAAA,IAC9B;AAAA,EACJ;AACJ;","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":[]}
|