@loggerjs/node 0.6.0 → 0.7.0

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 (71) hide show
  1. package/README.md +5 -4
  2. package/dist/bullmq-integration.cjs +2 -145
  3. package/dist/bullmq-integration.cjs.map +1 -1
  4. package/dist/bullmq-integration.js +1 -144
  5. package/dist/bullmq-integration.js.map +1 -1
  6. package/dist/chunks/node-destination-DvP8jBvm.cjs +254 -0
  7. package/dist/chunks/node-destination-DvP8jBvm.cjs.map +1 -0
  8. package/dist/chunks/node-destination-YnpYbctz.js +243 -0
  9. package/dist/chunks/node-destination-YnpYbctz.js.map +1 -0
  10. package/dist/context.cjs +1 -1
  11. package/dist/context.js +1 -1
  12. package/dist/diagnostics-channel-integration.cjs +1 -1
  13. package/dist/file-transport.cjs +3 -232
  14. package/dist/file-transport.cjs.map +1 -1
  15. package/dist/file-transport.js +3 -232
  16. package/dist/file-transport.js.map +1 -1
  17. package/dist/http-transport.cjs +25 -4
  18. package/dist/http-transport.cjs.map +1 -1
  19. package/dist/http-transport.d.ts +15 -0
  20. package/dist/http-transport.d.ts.map +1 -1
  21. package/dist/http-transport.js +25 -4
  22. package/dist/http-transport.js.map +1 -1
  23. package/dist/index.cjs +54 -2375
  24. package/dist/index.d.ts +211 -19
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +25 -2347
  27. package/dist/internal-types.d.ts +1 -0
  28. package/dist/internal-types.d.ts.map +1 -1
  29. package/dist/logger-diagnostics.cjs +4 -5
  30. package/dist/logger-diagnostics.cjs.map +1 -1
  31. package/dist/logger-diagnostics.d.ts +1 -1
  32. package/dist/logger-diagnostics.d.ts.map +1 -1
  33. package/dist/logger-diagnostics.js +1 -1
  34. package/dist/logger-diagnostics.js.map +1 -1
  35. package/dist/nest-integration.cjs +2 -127
  36. package/dist/nest-integration.cjs.map +1 -1
  37. package/dist/nest-integration.js +1 -126
  38. package/dist/nest-integration.js.map +1 -1
  39. package/dist/node-destination.d.ts.map +1 -1
  40. package/dist/payload-transforms.cjs +2 -2
  41. package/dist/payload-transforms.cjs.map +1 -1
  42. package/dist/payload-transforms.d.ts.map +1 -1
  43. package/dist/payload-transforms.js +1 -1
  44. package/dist/payload-transforms.js.map +1 -1
  45. package/dist/prisma-integration.cjs +2 -125
  46. package/dist/prisma-integration.cjs.map +1 -1
  47. package/dist/prisma-integration.js +1 -124
  48. package/dist/prisma-integration.js.map +1 -1
  49. package/dist/redis-integration.cjs +2 -125
  50. package/dist/redis-integration.cjs.map +1 -1
  51. package/dist/redis-integration.js +1 -124
  52. package/dist/redis-integration.js.map +1 -1
  53. package/dist/rotating-file-transport.cjs +24 -239
  54. package/dist/rotating-file-transport.cjs.map +1 -1
  55. package/dist/rotating-file-transport.d.ts.map +1 -1
  56. package/dist/rotating-file-transport.js +24 -239
  57. package/dist/rotating-file-transport.js.map +1 -1
  58. package/dist/stdout-transport.cjs +3 -162
  59. package/dist/stdout-transport.cjs.map +1 -1
  60. package/dist/stdout-transport.js +3 -162
  61. package/dist/stdout-transport.js.map +1 -1
  62. package/dist/syslog-transport.cjs +1 -1
  63. package/dist/syslog-transport.js +1 -1
  64. package/dist/worker-transport.cjs +5 -4
  65. package/dist/worker-transport.cjs.map +1 -1
  66. package/dist/worker-transport.d.ts.map +1 -1
  67. package/dist/worker-transport.js +3 -2
  68. package/dist/worker-transport.js.map +1 -1
  69. package/package.json +5 -2
  70. package/dist/index.cjs.map +0 -1
  71. package/dist/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"prisma-integration.cjs","names":[],"sources":["../src/database-integration.ts","../src/prisma-integration.ts"],"sourcesContent":["import {\n normalizeValue,\n type CaptureInput,\n type Integration,\n type IntegrationSetupContext,\n type LoggerLevel,\n} from \"@loggerjs/core\";\n\nexport interface DatabaseClientLike {\n [method: string]: unknown;\n}\n\nexport interface DatabaseIntegrationTarget {\n client: DatabaseClientLike;\n name?: string;\n system?: string;\n methods?: readonly string[];\n}\n\nexport interface DatabaseOperationInfo {\n target: string;\n system?: string;\n method: string;\n statement?: string;\n}\n\nexport interface DatabaseIntegrationOptions {\n client?: DatabaseClientLike;\n targets?: readonly DatabaseIntegrationTarget[];\n name?: string;\n system?: string;\n methods?: readonly string[];\n captureAll?: boolean;\n captureSuccessful?: boolean;\n minDurationMs?: number;\n sampleRate?: number;\n random?: () => number;\n captureParameters?: boolean;\n sanitizeStatement?: (statement: string) => string;\n getStatement?: (args: readonly unknown[], method: string) => string | undefined;\n level?: (durationMs: number, error: unknown, info: DatabaseOperationInfo) => LoggerLevel;\n}\n\ntype DatabaseMethod = (this: unknown, ...args: unknown[]) => unknown;\n\nconst defaultMethods = [\"query\", \"execute\", \"run\", \"all\", \"get\"] as const;\nconst defaultRandom = () => Math.random();\n\nfunction defaultLevel(_durationMs: number, error: unknown): LoggerLevel {\n return error ? \"error\" : \"debug\";\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { then?: unknown }).then === \"function\"\n );\n}\n\nfunction defaultStatement(args: readonly unknown[]): string | undefined {\n const first = args[0];\n if (typeof first === \"string\") return first;\n if (typeof first !== \"object\" || first === null) return undefined;\n const input = first as { sql?: unknown; text?: unknown; query?: unknown };\n if (typeof input.sql === \"string\") return input.sql;\n if (typeof input.text === \"string\") return input.text;\n if (typeof input.query === \"string\") return input.query;\n return undefined;\n}\n\nfunction statementFor(\n args: readonly unknown[],\n method: string,\n options: DatabaseIntegrationOptions,\n) {\n const statement = options.getStatement?.(args, method) ?? defaultStatement(args);\n return statement && options.sanitizeStatement ? options.sanitizeStatement(statement) : statement;\n}\n\nfunction parametersFor(args: readonly unknown[], captureParameters: boolean) {\n if (!captureParameters) return undefined;\n const first = args[0];\n const second = args[1];\n const parameters =\n second ??\n (typeof first === \"object\" && first\n ? ((first as { values?: unknown; params?: unknown; parameters?: unknown }).values ??\n (first as { params?: unknown }).params ??\n (first as { parameters?: unknown }).parameters)\n : undefined);\n return parameters === undefined\n ? undefined\n : normalizeValue(parameters, { maxDepth: 4, maxObjectKeys: 80 });\n}\n\nexport function databaseIntegration(options: DatabaseIntegrationOptions = {}): Integration {\n const targets =\n options.targets ??\n (options.client\n ? [\n {\n client: options.client,\n name: options.name,\n system: options.system,\n methods: options.methods,\n },\n ]\n : []);\n const captureAll = options.captureAll ?? options.captureSuccessful ?? false;\n const sampleRate = options.sampleRate ?? 1;\n const random = options.random ?? defaultRandom;\n const levelFor = options.level ?? defaultLevel;\n\n const shouldCapture = (durationMs: number, error: unknown) => {\n if (error) return true;\n if (options.minDurationMs !== undefined && durationMs >= options.minDurationMs) return true;\n if (!captureAll) return false;\n return sampleRate >= 1 || random() < sampleRate;\n };\n\n return {\n name: \"database\",\n setup(api: IntegrationSetupContext) {\n const capture = api.guard((input: CaptureInput) => api.capture(input));\n const disposers: Array<() => void> = [];\n let disposed = false;\n\n const captureResult = (\n info: DatabaseOperationInfo,\n started: number,\n args: readonly unknown[],\n error: unknown,\n ) => {\n const durationMs = Date.now() - started;\n if (disposed || !shouldCapture(durationMs, error)) return;\n capture({\n level: levelFor(durationMs, error, info),\n message: error\n ? `Database error ${info.method}${info.statement ? ` ${info.statement}` : \"\"}`\n : `Database ${info.method}${info.statement ? ` ${info.statement}` : \"\"}`,\n error,\n props: {\n db: {\n kind: info.target,\n system: info.system,\n method: info.method,\n statement: info.statement,\n durationMs,\n parameters: parametersFor(args, options.captureParameters ?? false),\n },\n },\n });\n };\n\n for (const target of targets) {\n const methods = target.methods ?? options.methods ?? defaultMethods;\n for (const method of methods) {\n const original = target.client[method];\n if (typeof original !== \"function\") continue;\n const originalMethod = original as DatabaseMethod;\n const targetName = target.name ?? options.name ?? \"database\";\n const system = target.system ?? options.system;\n\n target.client[method] = function wrappedDatabaseMethod(\n this: unknown,\n ...args: unknown[]\n ) {\n const started = Date.now();\n const info: DatabaseOperationInfo = {\n target: targetName,\n system,\n method,\n statement: statementFor(args, method, options),\n };\n try {\n const result = originalMethod.apply(this, args);\n if (isPromiseLike(result)) {\n return result.then(\n (value) => {\n captureResult(info, started, args, undefined);\n return value;\n },\n (error) => {\n captureResult(info, started, args, error);\n throw error;\n },\n );\n }\n captureResult(info, started, args, undefined);\n return result;\n } catch (error) {\n captureResult(info, started, args, error);\n throw error;\n }\n };\n\n disposers.push(() => {\n target.client[method] = originalMethod;\n });\n }\n }\n\n return () => {\n if (disposed) return;\n disposed = true;\n for (const dispose of disposers) dispose();\n };\n },\n };\n}\n","import {\n databaseIntegration,\n type DatabaseClientLike,\n type DatabaseIntegrationOptions,\n} from \"./database-integration\";\n\nexport interface PrismaIntegrationOptions extends Omit<\n DatabaseIntegrationOptions,\n \"client\" | \"system\" | \"methods\" | \"getStatement\"\n> {\n /**\n * Prisma-like client whose raw query methods should be wrapped. This adapter\n * does not subscribe to `$on(\"query\")` and does not capture typed model\n * operations such as `prisma.user.findMany()`.\n */\n client: DatabaseClientLike;\n}\n\nconst prismaMethods = [\"$executeRaw\", \"$executeRawUnsafe\", \"$queryRaw\", \"$queryRawUnsafe\"] as const;\n\nfunction prismaStatement(args: readonly unknown[]): string | undefined {\n const first = args[0];\n if (typeof first === \"string\") return first;\n if (Array.isArray(first) && \"raw\" in first) return (first as { raw?: string[] }).raw?.join(\"?\");\n return undefined;\n}\n\nexport function prismaIntegration(options: PrismaIntegrationOptions) {\n return databaseIntegration({\n ...options,\n name: options.name ?? \"prisma\",\n system: \"prisma\",\n methods: prismaMethods,\n getStatement: prismaStatement,\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"prisma-integration.cjs","names":["databaseIntegration"],"sources":["../src/prisma-integration.ts"],"sourcesContent":["import {\n databaseIntegration,\n type DatabaseClientLike,\n type DatabaseIntegrationOptions,\n} from \"./database-integration\";\n\nexport interface PrismaIntegrationOptions extends Omit<\n DatabaseIntegrationOptions,\n \"client\" | \"system\" | \"methods\" | \"getStatement\"\n> {\n /**\n * Prisma-like client whose raw query methods should be wrapped. This adapter\n * does not subscribe to `$on(\"query\")` and does not capture typed model\n * operations such as `prisma.user.findMany()`.\n */\n client: DatabaseClientLike;\n}\n\nconst prismaMethods = [\"$executeRaw\", \"$executeRawUnsafe\", \"$queryRaw\", \"$queryRawUnsafe\"] as const;\n\nfunction prismaStatement(args: readonly unknown[]): string | undefined {\n const first = args[0];\n if (typeof first === \"string\") return first;\n if (Array.isArray(first) && \"raw\" in first) return (first as { raw?: string[] }).raw?.join(\"?\");\n return undefined;\n}\n\nexport function prismaIntegration(options: PrismaIntegrationOptions) {\n return databaseIntegration({\n ...options,\n name: options.name ?? \"prisma\",\n system: \"prisma\",\n methods: prismaMethods,\n getStatement: prismaStatement,\n });\n}\n"],"mappings":";;;AAkBA,MAAM,gBAAgB;CAAC;CAAe;CAAqB;CAAa;AAAiB;AAEzF,SAAS,gBAAgB,MAA8C;CACrE,MAAM,QAAQ,KAAK;CACnB,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,IAAI,MAAM,QAAQ,KAAK,KAAK,SAAS,OAAO,OAAQ,MAA6B,KAAK,KAAK,GAAG;AAEhG;AAEA,SAAgB,kBAAkB,SAAmC;CACnE,OAAOA,6BAAAA,oBAAoB;EACzB,GAAG;EACH,MAAM,QAAQ,QAAQ;EACtB,QAAQ;EACR,SAAS;EACT,cAAc;CAChB,CAAC;AACH"}
@@ -1,127 +1,4 @@
1
- import { normalizeValue } from "@loggerjs/core";
2
- //#region src/database-integration.ts
3
- const defaultMethods = [
4
- "query",
5
- "execute",
6
- "run",
7
- "all",
8
- "get"
9
- ];
10
- const defaultRandom = () => Math.random();
11
- function defaultLevel(_durationMs, error) {
12
- return error ? "error" : "debug";
13
- }
14
- function isPromiseLike(value) {
15
- return typeof value === "object" && value !== null && typeof value.then === "function";
16
- }
17
- function defaultStatement(args) {
18
- const first = args[0];
19
- if (typeof first === "string") return first;
20
- if (typeof first !== "object" || first === null) return void 0;
21
- const input = first;
22
- if (typeof input.sql === "string") return input.sql;
23
- if (typeof input.text === "string") return input.text;
24
- if (typeof input.query === "string") return input.query;
25
- }
26
- function statementFor(args, method, options) {
27
- const statement = options.getStatement?.(args, method) ?? defaultStatement(args);
28
- return statement && options.sanitizeStatement ? options.sanitizeStatement(statement) : statement;
29
- }
30
- function parametersFor(args, captureParameters) {
31
- if (!captureParameters) return void 0;
32
- const first = args[0];
33
- const parameters = args[1] ?? (typeof first === "object" && first ? first.values ?? first.params ?? first.parameters : void 0);
34
- return parameters === void 0 ? void 0 : normalizeValue(parameters, {
35
- maxDepth: 4,
36
- maxObjectKeys: 80
37
- });
38
- }
39
- function databaseIntegration(options = {}) {
40
- const targets = options.targets ?? (options.client ? [{
41
- client: options.client,
42
- name: options.name,
43
- system: options.system,
44
- methods: options.methods
45
- }] : []);
46
- const captureAll = options.captureAll ?? options.captureSuccessful ?? false;
47
- const sampleRate = options.sampleRate ?? 1;
48
- const random = options.random ?? defaultRandom;
49
- const levelFor = options.level ?? defaultLevel;
50
- const shouldCapture = (durationMs, error) => {
51
- if (error) return true;
52
- if (options.minDurationMs !== void 0 && durationMs >= options.minDurationMs) return true;
53
- if (!captureAll) return false;
54
- return sampleRate >= 1 || random() < sampleRate;
55
- };
56
- return {
57
- name: "database",
58
- setup(api) {
59
- const capture = api.guard((input) => api.capture(input));
60
- const disposers = [];
61
- let disposed = false;
62
- const captureResult = (info, started, args, error) => {
63
- const durationMs = Date.now() - started;
64
- if (disposed || !shouldCapture(durationMs, error)) return;
65
- capture({
66
- level: levelFor(durationMs, error, info),
67
- message: error ? `Database error ${info.method}${info.statement ? ` ${info.statement}` : ""}` : `Database ${info.method}${info.statement ? ` ${info.statement}` : ""}`,
68
- error,
69
- props: { db: {
70
- kind: info.target,
71
- system: info.system,
72
- method: info.method,
73
- statement: info.statement,
74
- durationMs,
75
- parameters: parametersFor(args, options.captureParameters ?? false)
76
- } }
77
- });
78
- };
79
- for (const target of targets) {
80
- const methods = target.methods ?? options.methods ?? defaultMethods;
81
- for (const method of methods) {
82
- const original = target.client[method];
83
- if (typeof original !== "function") continue;
84
- const originalMethod = original;
85
- const targetName = target.name ?? options.name ?? "database";
86
- const system = target.system ?? options.system;
87
- target.client[method] = function wrappedDatabaseMethod(...args) {
88
- const started = Date.now();
89
- const info = {
90
- target: targetName,
91
- system,
92
- method,
93
- statement: statementFor(args, method, options)
94
- };
95
- try {
96
- const result = originalMethod.apply(this, args);
97
- if (isPromiseLike(result)) return result.then((value) => {
98
- captureResult(info, started, args, void 0);
99
- return value;
100
- }, (error) => {
101
- captureResult(info, started, args, error);
102
- throw error;
103
- });
104
- captureResult(info, started, args, void 0);
105
- return result;
106
- } catch (error) {
107
- captureResult(info, started, args, error);
108
- throw error;
109
- }
110
- };
111
- disposers.push(() => {
112
- target.client[method] = originalMethod;
113
- });
114
- }
115
- }
116
- return () => {
117
- if (disposed) return;
118
- disposed = true;
119
- for (const dispose of disposers) dispose();
120
- };
121
- }
122
- };
123
- }
124
- //#endregion
1
+ import { databaseIntegration } from "./database-integration.js";
125
2
  //#region src/prisma-integration.ts
126
3
  const prismaMethods = [
127
4
  "$executeRaw",
@@ -1 +1 @@
1
- {"version":3,"file":"prisma-integration.js","names":[],"sources":["../src/database-integration.ts","../src/prisma-integration.ts"],"sourcesContent":["import {\n normalizeValue,\n type CaptureInput,\n type Integration,\n type IntegrationSetupContext,\n type LoggerLevel,\n} from \"@loggerjs/core\";\n\nexport interface DatabaseClientLike {\n [method: string]: unknown;\n}\n\nexport interface DatabaseIntegrationTarget {\n client: DatabaseClientLike;\n name?: string;\n system?: string;\n methods?: readonly string[];\n}\n\nexport interface DatabaseOperationInfo {\n target: string;\n system?: string;\n method: string;\n statement?: string;\n}\n\nexport interface DatabaseIntegrationOptions {\n client?: DatabaseClientLike;\n targets?: readonly DatabaseIntegrationTarget[];\n name?: string;\n system?: string;\n methods?: readonly string[];\n captureAll?: boolean;\n captureSuccessful?: boolean;\n minDurationMs?: number;\n sampleRate?: number;\n random?: () => number;\n captureParameters?: boolean;\n sanitizeStatement?: (statement: string) => string;\n getStatement?: (args: readonly unknown[], method: string) => string | undefined;\n level?: (durationMs: number, error: unknown, info: DatabaseOperationInfo) => LoggerLevel;\n}\n\ntype DatabaseMethod = (this: unknown, ...args: unknown[]) => unknown;\n\nconst defaultMethods = [\"query\", \"execute\", \"run\", \"all\", \"get\"] as const;\nconst defaultRandom = () => Math.random();\n\nfunction defaultLevel(_durationMs: number, error: unknown): LoggerLevel {\n return error ? \"error\" : \"debug\";\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { then?: unknown }).then === \"function\"\n );\n}\n\nfunction defaultStatement(args: readonly unknown[]): string | undefined {\n const first = args[0];\n if (typeof first === \"string\") return first;\n if (typeof first !== \"object\" || first === null) return undefined;\n const input = first as { sql?: unknown; text?: unknown; query?: unknown };\n if (typeof input.sql === \"string\") return input.sql;\n if (typeof input.text === \"string\") return input.text;\n if (typeof input.query === \"string\") return input.query;\n return undefined;\n}\n\nfunction statementFor(\n args: readonly unknown[],\n method: string,\n options: DatabaseIntegrationOptions,\n) {\n const statement = options.getStatement?.(args, method) ?? defaultStatement(args);\n return statement && options.sanitizeStatement ? options.sanitizeStatement(statement) : statement;\n}\n\nfunction parametersFor(args: readonly unknown[], captureParameters: boolean) {\n if (!captureParameters) return undefined;\n const first = args[0];\n const second = args[1];\n const parameters =\n second ??\n (typeof first === \"object\" && first\n ? ((first as { values?: unknown; params?: unknown; parameters?: unknown }).values ??\n (first as { params?: unknown }).params ??\n (first as { parameters?: unknown }).parameters)\n : undefined);\n return parameters === undefined\n ? undefined\n : normalizeValue(parameters, { maxDepth: 4, maxObjectKeys: 80 });\n}\n\nexport function databaseIntegration(options: DatabaseIntegrationOptions = {}): Integration {\n const targets =\n options.targets ??\n (options.client\n ? [\n {\n client: options.client,\n name: options.name,\n system: options.system,\n methods: options.methods,\n },\n ]\n : []);\n const captureAll = options.captureAll ?? options.captureSuccessful ?? false;\n const sampleRate = options.sampleRate ?? 1;\n const random = options.random ?? defaultRandom;\n const levelFor = options.level ?? defaultLevel;\n\n const shouldCapture = (durationMs: number, error: unknown) => {\n if (error) return true;\n if (options.minDurationMs !== undefined && durationMs >= options.minDurationMs) return true;\n if (!captureAll) return false;\n return sampleRate >= 1 || random() < sampleRate;\n };\n\n return {\n name: \"database\",\n setup(api: IntegrationSetupContext) {\n const capture = api.guard((input: CaptureInput) => api.capture(input));\n const disposers: Array<() => void> = [];\n let disposed = false;\n\n const captureResult = (\n info: DatabaseOperationInfo,\n started: number,\n args: readonly unknown[],\n error: unknown,\n ) => {\n const durationMs = Date.now() - started;\n if (disposed || !shouldCapture(durationMs, error)) return;\n capture({\n level: levelFor(durationMs, error, info),\n message: error\n ? `Database error ${info.method}${info.statement ? ` ${info.statement}` : \"\"}`\n : `Database ${info.method}${info.statement ? ` ${info.statement}` : \"\"}`,\n error,\n props: {\n db: {\n kind: info.target,\n system: info.system,\n method: info.method,\n statement: info.statement,\n durationMs,\n parameters: parametersFor(args, options.captureParameters ?? false),\n },\n },\n });\n };\n\n for (const target of targets) {\n const methods = target.methods ?? options.methods ?? defaultMethods;\n for (const method of methods) {\n const original = target.client[method];\n if (typeof original !== \"function\") continue;\n const originalMethod = original as DatabaseMethod;\n const targetName = target.name ?? options.name ?? \"database\";\n const system = target.system ?? options.system;\n\n target.client[method] = function wrappedDatabaseMethod(\n this: unknown,\n ...args: unknown[]\n ) {\n const started = Date.now();\n const info: DatabaseOperationInfo = {\n target: targetName,\n system,\n method,\n statement: statementFor(args, method, options),\n };\n try {\n const result = originalMethod.apply(this, args);\n if (isPromiseLike(result)) {\n return result.then(\n (value) => {\n captureResult(info, started, args, undefined);\n return value;\n },\n (error) => {\n captureResult(info, started, args, error);\n throw error;\n },\n );\n }\n captureResult(info, started, args, undefined);\n return result;\n } catch (error) {\n captureResult(info, started, args, error);\n throw error;\n }\n };\n\n disposers.push(() => {\n target.client[method] = originalMethod;\n });\n }\n }\n\n return () => {\n if (disposed) return;\n disposed = true;\n for (const dispose of disposers) dispose();\n };\n },\n };\n}\n","import {\n databaseIntegration,\n type DatabaseClientLike,\n type DatabaseIntegrationOptions,\n} from \"./database-integration\";\n\nexport interface PrismaIntegrationOptions extends Omit<\n DatabaseIntegrationOptions,\n \"client\" | \"system\" | \"methods\" | \"getStatement\"\n> {\n /**\n * Prisma-like client whose raw query methods should be wrapped. This adapter\n * does not subscribe to `$on(\"query\")` and does not capture typed model\n * operations such as `prisma.user.findMany()`.\n */\n client: DatabaseClientLike;\n}\n\nconst prismaMethods = [\"$executeRaw\", \"$executeRawUnsafe\", \"$queryRaw\", \"$queryRawUnsafe\"] as const;\n\nfunction prismaStatement(args: readonly unknown[]): string | undefined {\n const first = args[0];\n if (typeof first === \"string\") return first;\n if (Array.isArray(first) && \"raw\" in first) return (first as { raw?: string[] }).raw?.join(\"?\");\n return undefined;\n}\n\nexport function prismaIntegration(options: PrismaIntegrationOptions) {\n return databaseIntegration({\n ...options,\n name: options.name ?? \"prisma\",\n system: \"prisma\",\n methods: prismaMethods,\n getStatement: prismaStatement,\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"prisma-integration.js","names":[],"sources":["../src/prisma-integration.ts"],"sourcesContent":["import {\n databaseIntegration,\n type DatabaseClientLike,\n type DatabaseIntegrationOptions,\n} from \"./database-integration\";\n\nexport interface PrismaIntegrationOptions extends Omit<\n DatabaseIntegrationOptions,\n \"client\" | \"system\" | \"methods\" | \"getStatement\"\n> {\n /**\n * Prisma-like client whose raw query methods should be wrapped. This adapter\n * does not subscribe to `$on(\"query\")` and does not capture typed model\n * operations such as `prisma.user.findMany()`.\n */\n client: DatabaseClientLike;\n}\n\nconst prismaMethods = [\"$executeRaw\", \"$executeRawUnsafe\", \"$queryRaw\", \"$queryRawUnsafe\"] as const;\n\nfunction prismaStatement(args: readonly unknown[]): string | undefined {\n const first = args[0];\n if (typeof first === \"string\") return first;\n if (Array.isArray(first) && \"raw\" in first) return (first as { raw?: string[] }).raw?.join(\"?\");\n return undefined;\n}\n\nexport function prismaIntegration(options: PrismaIntegrationOptions) {\n return databaseIntegration({\n ...options,\n name: options.name ?? \"prisma\",\n system: \"prisma\",\n methods: prismaMethods,\n getStatement: prismaStatement,\n });\n}\n"],"mappings":";;AAkBA,MAAM,gBAAgB;CAAC;CAAe;CAAqB;CAAa;AAAiB;AAEzF,SAAS,gBAAgB,MAA8C;CACrE,MAAM,QAAQ,KAAK;CACnB,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,IAAI,MAAM,QAAQ,KAAK,KAAK,SAAS,OAAO,OAAQ,MAA6B,KAAK,KAAK,GAAG;AAEhG;AAEA,SAAgB,kBAAkB,SAAmC;CACnE,OAAO,oBAAoB;EACzB,GAAG;EACH,MAAM,QAAQ,QAAQ;EACtB,QAAQ;EACR,SAAS;EACT,cAAc;CAChB,CAAC;AACH"}
@@ -1,128 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- let _loggerjs_core = require("@loggerjs/core");
3
- //#region src/database-integration.ts
4
- const defaultMethods = [
5
- "query",
6
- "execute",
7
- "run",
8
- "all",
9
- "get"
10
- ];
11
- const defaultRandom = () => Math.random();
12
- function defaultLevel(_durationMs, error) {
13
- return error ? "error" : "debug";
14
- }
15
- function isPromiseLike(value) {
16
- return typeof value === "object" && value !== null && typeof value.then === "function";
17
- }
18
- function defaultStatement(args) {
19
- const first = args[0];
20
- if (typeof first === "string") return first;
21
- if (typeof first !== "object" || first === null) return void 0;
22
- const input = first;
23
- if (typeof input.sql === "string") return input.sql;
24
- if (typeof input.text === "string") return input.text;
25
- if (typeof input.query === "string") return input.query;
26
- }
27
- function statementFor(args, method, options) {
28
- const statement = options.getStatement?.(args, method) ?? defaultStatement(args);
29
- return statement && options.sanitizeStatement ? options.sanitizeStatement(statement) : statement;
30
- }
31
- function parametersFor(args, captureParameters) {
32
- if (!captureParameters) return void 0;
33
- const first = args[0];
34
- const parameters = args[1] ?? (typeof first === "object" && first ? first.values ?? first.params ?? first.parameters : void 0);
35
- return parameters === void 0 ? void 0 : (0, _loggerjs_core.normalizeValue)(parameters, {
36
- maxDepth: 4,
37
- maxObjectKeys: 80
38
- });
39
- }
40
- function databaseIntegration(options = {}) {
41
- const targets = options.targets ?? (options.client ? [{
42
- client: options.client,
43
- name: options.name,
44
- system: options.system,
45
- methods: options.methods
46
- }] : []);
47
- const captureAll = options.captureAll ?? options.captureSuccessful ?? false;
48
- const sampleRate = options.sampleRate ?? 1;
49
- const random = options.random ?? defaultRandom;
50
- const levelFor = options.level ?? defaultLevel;
51
- const shouldCapture = (durationMs, error) => {
52
- if (error) return true;
53
- if (options.minDurationMs !== void 0 && durationMs >= options.minDurationMs) return true;
54
- if (!captureAll) return false;
55
- return sampleRate >= 1 || random() < sampleRate;
56
- };
57
- return {
58
- name: "database",
59
- setup(api) {
60
- const capture = api.guard((input) => api.capture(input));
61
- const disposers = [];
62
- let disposed = false;
63
- const captureResult = (info, started, args, error) => {
64
- const durationMs = Date.now() - started;
65
- if (disposed || !shouldCapture(durationMs, error)) return;
66
- capture({
67
- level: levelFor(durationMs, error, info),
68
- message: error ? `Database error ${info.method}${info.statement ? ` ${info.statement}` : ""}` : `Database ${info.method}${info.statement ? ` ${info.statement}` : ""}`,
69
- error,
70
- props: { db: {
71
- kind: info.target,
72
- system: info.system,
73
- method: info.method,
74
- statement: info.statement,
75
- durationMs,
76
- parameters: parametersFor(args, options.captureParameters ?? false)
77
- } }
78
- });
79
- };
80
- for (const target of targets) {
81
- const methods = target.methods ?? options.methods ?? defaultMethods;
82
- for (const method of methods) {
83
- const original = target.client[method];
84
- if (typeof original !== "function") continue;
85
- const originalMethod = original;
86
- const targetName = target.name ?? options.name ?? "database";
87
- const system = target.system ?? options.system;
88
- target.client[method] = function wrappedDatabaseMethod(...args) {
89
- const started = Date.now();
90
- const info = {
91
- target: targetName,
92
- system,
93
- method,
94
- statement: statementFor(args, method, options)
95
- };
96
- try {
97
- const result = originalMethod.apply(this, args);
98
- if (isPromiseLike(result)) return result.then((value) => {
99
- captureResult(info, started, args, void 0);
100
- return value;
101
- }, (error) => {
102
- captureResult(info, started, args, error);
103
- throw error;
104
- });
105
- captureResult(info, started, args, void 0);
106
- return result;
107
- } catch (error) {
108
- captureResult(info, started, args, error);
109
- throw error;
110
- }
111
- };
112
- disposers.push(() => {
113
- target.client[method] = originalMethod;
114
- });
115
- }
116
- }
117
- return () => {
118
- if (disposed) return;
119
- disposed = true;
120
- for (const dispose of disposers) dispose();
121
- };
122
- }
123
- };
124
- }
125
- //#endregion
2
+ const require_database_integration = require("./database-integration.cjs");
126
3
  //#region src/redis-integration.ts
127
4
  const redisMethods = [
128
5
  "del",
@@ -140,7 +17,7 @@ function redisStatement(args, method) {
140
17
  return `${method.toUpperCase()}${key}`;
141
18
  }
142
19
  function redisIntegration(options) {
143
- return databaseIntegration({
20
+ return require_database_integration.databaseIntegration({
144
21
  ...options,
145
22
  name: options.name ?? "redis",
146
23
  system: "redis",
@@ -1 +1 @@
1
- {"version":3,"file":"redis-integration.cjs","names":[],"sources":["../src/database-integration.ts","../src/redis-integration.ts"],"sourcesContent":["import {\n normalizeValue,\n type CaptureInput,\n type Integration,\n type IntegrationSetupContext,\n type LoggerLevel,\n} from \"@loggerjs/core\";\n\nexport interface DatabaseClientLike {\n [method: string]: unknown;\n}\n\nexport interface DatabaseIntegrationTarget {\n client: DatabaseClientLike;\n name?: string;\n system?: string;\n methods?: readonly string[];\n}\n\nexport interface DatabaseOperationInfo {\n target: string;\n system?: string;\n method: string;\n statement?: string;\n}\n\nexport interface DatabaseIntegrationOptions {\n client?: DatabaseClientLike;\n targets?: readonly DatabaseIntegrationTarget[];\n name?: string;\n system?: string;\n methods?: readonly string[];\n captureAll?: boolean;\n captureSuccessful?: boolean;\n minDurationMs?: number;\n sampleRate?: number;\n random?: () => number;\n captureParameters?: boolean;\n sanitizeStatement?: (statement: string) => string;\n getStatement?: (args: readonly unknown[], method: string) => string | undefined;\n level?: (durationMs: number, error: unknown, info: DatabaseOperationInfo) => LoggerLevel;\n}\n\ntype DatabaseMethod = (this: unknown, ...args: unknown[]) => unknown;\n\nconst defaultMethods = [\"query\", \"execute\", \"run\", \"all\", \"get\"] as const;\nconst defaultRandom = () => Math.random();\n\nfunction defaultLevel(_durationMs: number, error: unknown): LoggerLevel {\n return error ? \"error\" : \"debug\";\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { then?: unknown }).then === \"function\"\n );\n}\n\nfunction defaultStatement(args: readonly unknown[]): string | undefined {\n const first = args[0];\n if (typeof first === \"string\") return first;\n if (typeof first !== \"object\" || first === null) return undefined;\n const input = first as { sql?: unknown; text?: unknown; query?: unknown };\n if (typeof input.sql === \"string\") return input.sql;\n if (typeof input.text === \"string\") return input.text;\n if (typeof input.query === \"string\") return input.query;\n return undefined;\n}\n\nfunction statementFor(\n args: readonly unknown[],\n method: string,\n options: DatabaseIntegrationOptions,\n) {\n const statement = options.getStatement?.(args, method) ?? defaultStatement(args);\n return statement && options.sanitizeStatement ? options.sanitizeStatement(statement) : statement;\n}\n\nfunction parametersFor(args: readonly unknown[], captureParameters: boolean) {\n if (!captureParameters) return undefined;\n const first = args[0];\n const second = args[1];\n const parameters =\n second ??\n (typeof first === \"object\" && first\n ? ((first as { values?: unknown; params?: unknown; parameters?: unknown }).values ??\n (first as { params?: unknown }).params ??\n (first as { parameters?: unknown }).parameters)\n : undefined);\n return parameters === undefined\n ? undefined\n : normalizeValue(parameters, { maxDepth: 4, maxObjectKeys: 80 });\n}\n\nexport function databaseIntegration(options: DatabaseIntegrationOptions = {}): Integration {\n const targets =\n options.targets ??\n (options.client\n ? [\n {\n client: options.client,\n name: options.name,\n system: options.system,\n methods: options.methods,\n },\n ]\n : []);\n const captureAll = options.captureAll ?? options.captureSuccessful ?? false;\n const sampleRate = options.sampleRate ?? 1;\n const random = options.random ?? defaultRandom;\n const levelFor = options.level ?? defaultLevel;\n\n const shouldCapture = (durationMs: number, error: unknown) => {\n if (error) return true;\n if (options.minDurationMs !== undefined && durationMs >= options.minDurationMs) return true;\n if (!captureAll) return false;\n return sampleRate >= 1 || random() < sampleRate;\n };\n\n return {\n name: \"database\",\n setup(api: IntegrationSetupContext) {\n const capture = api.guard((input: CaptureInput) => api.capture(input));\n const disposers: Array<() => void> = [];\n let disposed = false;\n\n const captureResult = (\n info: DatabaseOperationInfo,\n started: number,\n args: readonly unknown[],\n error: unknown,\n ) => {\n const durationMs = Date.now() - started;\n if (disposed || !shouldCapture(durationMs, error)) return;\n capture({\n level: levelFor(durationMs, error, info),\n message: error\n ? `Database error ${info.method}${info.statement ? ` ${info.statement}` : \"\"}`\n : `Database ${info.method}${info.statement ? ` ${info.statement}` : \"\"}`,\n error,\n props: {\n db: {\n kind: info.target,\n system: info.system,\n method: info.method,\n statement: info.statement,\n durationMs,\n parameters: parametersFor(args, options.captureParameters ?? false),\n },\n },\n });\n };\n\n for (const target of targets) {\n const methods = target.methods ?? options.methods ?? defaultMethods;\n for (const method of methods) {\n const original = target.client[method];\n if (typeof original !== \"function\") continue;\n const originalMethod = original as DatabaseMethod;\n const targetName = target.name ?? options.name ?? \"database\";\n const system = target.system ?? options.system;\n\n target.client[method] = function wrappedDatabaseMethod(\n this: unknown,\n ...args: unknown[]\n ) {\n const started = Date.now();\n const info: DatabaseOperationInfo = {\n target: targetName,\n system,\n method,\n statement: statementFor(args, method, options),\n };\n try {\n const result = originalMethod.apply(this, args);\n if (isPromiseLike(result)) {\n return result.then(\n (value) => {\n captureResult(info, started, args, undefined);\n return value;\n },\n (error) => {\n captureResult(info, started, args, error);\n throw error;\n },\n );\n }\n captureResult(info, started, args, undefined);\n return result;\n } catch (error) {\n captureResult(info, started, args, error);\n throw error;\n }\n };\n\n disposers.push(() => {\n target.client[method] = originalMethod;\n });\n }\n }\n\n return () => {\n if (disposed) return;\n disposed = true;\n for (const dispose of disposers) dispose();\n };\n },\n };\n}\n","import {\n databaseIntegration,\n type DatabaseClientLike,\n type DatabaseIntegrationOptions,\n} from \"./database-integration\";\n\nexport interface RedisIntegrationOptions extends Omit<\n DatabaseIntegrationOptions,\n \"client\" | \"system\" | \"methods\" | \"getStatement\"\n> {\n client: DatabaseClientLike;\n methods?: readonly string[];\n}\n\nconst redisMethods = [\n \"del\",\n \"get\",\n \"hget\",\n \"hset\",\n \"lpush\",\n \"publish\",\n \"rpush\",\n \"set\",\n \"xadd\",\n] as const;\n\nfunction redisStatement(args: readonly unknown[], method: string): string | undefined {\n const key = args[0] === undefined ? \"\" : ` ${String(args[0])}`;\n return `${method.toUpperCase()}${key}`;\n}\n\nexport function redisIntegration(options: RedisIntegrationOptions) {\n return databaseIntegration({\n ...options,\n name: options.name ?? \"redis\",\n system: \"redis\",\n methods: options.methods ?? redisMethods,\n getStatement: redisStatement,\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"redis-integration.cjs","names":["databaseIntegration"],"sources":["../src/redis-integration.ts"],"sourcesContent":["import {\n databaseIntegration,\n type DatabaseClientLike,\n type DatabaseIntegrationOptions,\n} from \"./database-integration\";\n\nexport interface RedisIntegrationOptions extends Omit<\n DatabaseIntegrationOptions,\n \"client\" | \"system\" | \"methods\" | \"getStatement\"\n> {\n client: DatabaseClientLike;\n methods?: readonly string[];\n}\n\nconst redisMethods = [\n \"del\",\n \"get\",\n \"hget\",\n \"hset\",\n \"lpush\",\n \"publish\",\n \"rpush\",\n \"set\",\n \"xadd\",\n] as const;\n\nfunction redisStatement(args: readonly unknown[], method: string): string | undefined {\n const key = args[0] === undefined ? \"\" : ` ${String(args[0])}`;\n return `${method.toUpperCase()}${key}`;\n}\n\nexport function redisIntegration(options: RedisIntegrationOptions) {\n return databaseIntegration({\n ...options,\n name: options.name ?? \"redis\",\n system: \"redis\",\n methods: options.methods ?? redisMethods,\n getStatement: redisStatement,\n });\n}\n"],"mappings":";;;AAcA,MAAM,eAAe;CACnB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,SAAS,eAAe,MAA0B,QAAoC;CACpF,MAAM,MAAM,KAAK,OAAO,KAAA,IAAY,KAAK,IAAI,OAAO,KAAK,EAAE;CAC3D,OAAO,GAAG,OAAO,YAAY,IAAI;AACnC;AAEA,SAAgB,iBAAiB,SAAkC;CACjE,OAAOA,6BAAAA,oBAAoB;EACzB,GAAG;EACH,MAAM,QAAQ,QAAQ;EACtB,QAAQ;EACR,SAAS,QAAQ,WAAW;EAC5B,cAAc;CAChB,CAAC;AACH"}
@@ -1,127 +1,4 @@
1
- import { normalizeValue } from "@loggerjs/core";
2
- //#region src/database-integration.ts
3
- const defaultMethods = [
4
- "query",
5
- "execute",
6
- "run",
7
- "all",
8
- "get"
9
- ];
10
- const defaultRandom = () => Math.random();
11
- function defaultLevel(_durationMs, error) {
12
- return error ? "error" : "debug";
13
- }
14
- function isPromiseLike(value) {
15
- return typeof value === "object" && value !== null && typeof value.then === "function";
16
- }
17
- function defaultStatement(args) {
18
- const first = args[0];
19
- if (typeof first === "string") return first;
20
- if (typeof first !== "object" || first === null) return void 0;
21
- const input = first;
22
- if (typeof input.sql === "string") return input.sql;
23
- if (typeof input.text === "string") return input.text;
24
- if (typeof input.query === "string") return input.query;
25
- }
26
- function statementFor(args, method, options) {
27
- const statement = options.getStatement?.(args, method) ?? defaultStatement(args);
28
- return statement && options.sanitizeStatement ? options.sanitizeStatement(statement) : statement;
29
- }
30
- function parametersFor(args, captureParameters) {
31
- if (!captureParameters) return void 0;
32
- const first = args[0];
33
- const parameters = args[1] ?? (typeof first === "object" && first ? first.values ?? first.params ?? first.parameters : void 0);
34
- return parameters === void 0 ? void 0 : normalizeValue(parameters, {
35
- maxDepth: 4,
36
- maxObjectKeys: 80
37
- });
38
- }
39
- function databaseIntegration(options = {}) {
40
- const targets = options.targets ?? (options.client ? [{
41
- client: options.client,
42
- name: options.name,
43
- system: options.system,
44
- methods: options.methods
45
- }] : []);
46
- const captureAll = options.captureAll ?? options.captureSuccessful ?? false;
47
- const sampleRate = options.sampleRate ?? 1;
48
- const random = options.random ?? defaultRandom;
49
- const levelFor = options.level ?? defaultLevel;
50
- const shouldCapture = (durationMs, error) => {
51
- if (error) return true;
52
- if (options.minDurationMs !== void 0 && durationMs >= options.minDurationMs) return true;
53
- if (!captureAll) return false;
54
- return sampleRate >= 1 || random() < sampleRate;
55
- };
56
- return {
57
- name: "database",
58
- setup(api) {
59
- const capture = api.guard((input) => api.capture(input));
60
- const disposers = [];
61
- let disposed = false;
62
- const captureResult = (info, started, args, error) => {
63
- const durationMs = Date.now() - started;
64
- if (disposed || !shouldCapture(durationMs, error)) return;
65
- capture({
66
- level: levelFor(durationMs, error, info),
67
- message: error ? `Database error ${info.method}${info.statement ? ` ${info.statement}` : ""}` : `Database ${info.method}${info.statement ? ` ${info.statement}` : ""}`,
68
- error,
69
- props: { db: {
70
- kind: info.target,
71
- system: info.system,
72
- method: info.method,
73
- statement: info.statement,
74
- durationMs,
75
- parameters: parametersFor(args, options.captureParameters ?? false)
76
- } }
77
- });
78
- };
79
- for (const target of targets) {
80
- const methods = target.methods ?? options.methods ?? defaultMethods;
81
- for (const method of methods) {
82
- const original = target.client[method];
83
- if (typeof original !== "function") continue;
84
- const originalMethod = original;
85
- const targetName = target.name ?? options.name ?? "database";
86
- const system = target.system ?? options.system;
87
- target.client[method] = function wrappedDatabaseMethod(...args) {
88
- const started = Date.now();
89
- const info = {
90
- target: targetName,
91
- system,
92
- method,
93
- statement: statementFor(args, method, options)
94
- };
95
- try {
96
- const result = originalMethod.apply(this, args);
97
- if (isPromiseLike(result)) return result.then((value) => {
98
- captureResult(info, started, args, void 0);
99
- return value;
100
- }, (error) => {
101
- captureResult(info, started, args, error);
102
- throw error;
103
- });
104
- captureResult(info, started, args, void 0);
105
- return result;
106
- } catch (error) {
107
- captureResult(info, started, args, error);
108
- throw error;
109
- }
110
- };
111
- disposers.push(() => {
112
- target.client[method] = originalMethod;
113
- });
114
- }
115
- }
116
- return () => {
117
- if (disposed) return;
118
- disposed = true;
119
- for (const dispose of disposers) dispose();
120
- };
121
- }
122
- };
123
- }
124
- //#endregion
1
+ import { databaseIntegration } from "./database-integration.js";
125
2
  //#region src/redis-integration.ts
126
3
  const redisMethods = [
127
4
  "del",
@@ -1 +1 @@
1
- {"version":3,"file":"redis-integration.js","names":[],"sources":["../src/database-integration.ts","../src/redis-integration.ts"],"sourcesContent":["import {\n normalizeValue,\n type CaptureInput,\n type Integration,\n type IntegrationSetupContext,\n type LoggerLevel,\n} from \"@loggerjs/core\";\n\nexport interface DatabaseClientLike {\n [method: string]: unknown;\n}\n\nexport interface DatabaseIntegrationTarget {\n client: DatabaseClientLike;\n name?: string;\n system?: string;\n methods?: readonly string[];\n}\n\nexport interface DatabaseOperationInfo {\n target: string;\n system?: string;\n method: string;\n statement?: string;\n}\n\nexport interface DatabaseIntegrationOptions {\n client?: DatabaseClientLike;\n targets?: readonly DatabaseIntegrationTarget[];\n name?: string;\n system?: string;\n methods?: readonly string[];\n captureAll?: boolean;\n captureSuccessful?: boolean;\n minDurationMs?: number;\n sampleRate?: number;\n random?: () => number;\n captureParameters?: boolean;\n sanitizeStatement?: (statement: string) => string;\n getStatement?: (args: readonly unknown[], method: string) => string | undefined;\n level?: (durationMs: number, error: unknown, info: DatabaseOperationInfo) => LoggerLevel;\n}\n\ntype DatabaseMethod = (this: unknown, ...args: unknown[]) => unknown;\n\nconst defaultMethods = [\"query\", \"execute\", \"run\", \"all\", \"get\"] as const;\nconst defaultRandom = () => Math.random();\n\nfunction defaultLevel(_durationMs: number, error: unknown): LoggerLevel {\n return error ? \"error\" : \"debug\";\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { then?: unknown }).then === \"function\"\n );\n}\n\nfunction defaultStatement(args: readonly unknown[]): string | undefined {\n const first = args[0];\n if (typeof first === \"string\") return first;\n if (typeof first !== \"object\" || first === null) return undefined;\n const input = first as { sql?: unknown; text?: unknown; query?: unknown };\n if (typeof input.sql === \"string\") return input.sql;\n if (typeof input.text === \"string\") return input.text;\n if (typeof input.query === \"string\") return input.query;\n return undefined;\n}\n\nfunction statementFor(\n args: readonly unknown[],\n method: string,\n options: DatabaseIntegrationOptions,\n) {\n const statement = options.getStatement?.(args, method) ?? defaultStatement(args);\n return statement && options.sanitizeStatement ? options.sanitizeStatement(statement) : statement;\n}\n\nfunction parametersFor(args: readonly unknown[], captureParameters: boolean) {\n if (!captureParameters) return undefined;\n const first = args[0];\n const second = args[1];\n const parameters =\n second ??\n (typeof first === \"object\" && first\n ? ((first as { values?: unknown; params?: unknown; parameters?: unknown }).values ??\n (first as { params?: unknown }).params ??\n (first as { parameters?: unknown }).parameters)\n : undefined);\n return parameters === undefined\n ? undefined\n : normalizeValue(parameters, { maxDepth: 4, maxObjectKeys: 80 });\n}\n\nexport function databaseIntegration(options: DatabaseIntegrationOptions = {}): Integration {\n const targets =\n options.targets ??\n (options.client\n ? [\n {\n client: options.client,\n name: options.name,\n system: options.system,\n methods: options.methods,\n },\n ]\n : []);\n const captureAll = options.captureAll ?? options.captureSuccessful ?? false;\n const sampleRate = options.sampleRate ?? 1;\n const random = options.random ?? defaultRandom;\n const levelFor = options.level ?? defaultLevel;\n\n const shouldCapture = (durationMs: number, error: unknown) => {\n if (error) return true;\n if (options.minDurationMs !== undefined && durationMs >= options.minDurationMs) return true;\n if (!captureAll) return false;\n return sampleRate >= 1 || random() < sampleRate;\n };\n\n return {\n name: \"database\",\n setup(api: IntegrationSetupContext) {\n const capture = api.guard((input: CaptureInput) => api.capture(input));\n const disposers: Array<() => void> = [];\n let disposed = false;\n\n const captureResult = (\n info: DatabaseOperationInfo,\n started: number,\n args: readonly unknown[],\n error: unknown,\n ) => {\n const durationMs = Date.now() - started;\n if (disposed || !shouldCapture(durationMs, error)) return;\n capture({\n level: levelFor(durationMs, error, info),\n message: error\n ? `Database error ${info.method}${info.statement ? ` ${info.statement}` : \"\"}`\n : `Database ${info.method}${info.statement ? ` ${info.statement}` : \"\"}`,\n error,\n props: {\n db: {\n kind: info.target,\n system: info.system,\n method: info.method,\n statement: info.statement,\n durationMs,\n parameters: parametersFor(args, options.captureParameters ?? false),\n },\n },\n });\n };\n\n for (const target of targets) {\n const methods = target.methods ?? options.methods ?? defaultMethods;\n for (const method of methods) {\n const original = target.client[method];\n if (typeof original !== \"function\") continue;\n const originalMethod = original as DatabaseMethod;\n const targetName = target.name ?? options.name ?? \"database\";\n const system = target.system ?? options.system;\n\n target.client[method] = function wrappedDatabaseMethod(\n this: unknown,\n ...args: unknown[]\n ) {\n const started = Date.now();\n const info: DatabaseOperationInfo = {\n target: targetName,\n system,\n method,\n statement: statementFor(args, method, options),\n };\n try {\n const result = originalMethod.apply(this, args);\n if (isPromiseLike(result)) {\n return result.then(\n (value) => {\n captureResult(info, started, args, undefined);\n return value;\n },\n (error) => {\n captureResult(info, started, args, error);\n throw error;\n },\n );\n }\n captureResult(info, started, args, undefined);\n return result;\n } catch (error) {\n captureResult(info, started, args, error);\n throw error;\n }\n };\n\n disposers.push(() => {\n target.client[method] = originalMethod;\n });\n }\n }\n\n return () => {\n if (disposed) return;\n disposed = true;\n for (const dispose of disposers) dispose();\n };\n },\n };\n}\n","import {\n databaseIntegration,\n type DatabaseClientLike,\n type DatabaseIntegrationOptions,\n} from \"./database-integration\";\n\nexport interface RedisIntegrationOptions extends Omit<\n DatabaseIntegrationOptions,\n \"client\" | \"system\" | \"methods\" | \"getStatement\"\n> {\n client: DatabaseClientLike;\n methods?: readonly string[];\n}\n\nconst redisMethods = [\n \"del\",\n \"get\",\n \"hget\",\n \"hset\",\n \"lpush\",\n \"publish\",\n \"rpush\",\n \"set\",\n \"xadd\",\n] as const;\n\nfunction redisStatement(args: readonly unknown[], method: string): string | undefined {\n const key = args[0] === undefined ? \"\" : ` ${String(args[0])}`;\n return `${method.toUpperCase()}${key}`;\n}\n\nexport function redisIntegration(options: RedisIntegrationOptions) {\n return databaseIntegration({\n ...options,\n name: options.name ?? \"redis\",\n system: \"redis\",\n methods: options.methods ?? redisMethods,\n getStatement: redisStatement,\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"redis-integration.js","names":[],"sources":["../src/redis-integration.ts"],"sourcesContent":["import {\n databaseIntegration,\n type DatabaseClientLike,\n type DatabaseIntegrationOptions,\n} from \"./database-integration\";\n\nexport interface RedisIntegrationOptions extends Omit<\n DatabaseIntegrationOptions,\n \"client\" | \"system\" | \"methods\" | \"getStatement\"\n> {\n client: DatabaseClientLike;\n methods?: readonly string[];\n}\n\nconst redisMethods = [\n \"del\",\n \"get\",\n \"hget\",\n \"hset\",\n \"lpush\",\n \"publish\",\n \"rpush\",\n \"set\",\n \"xadd\",\n] as const;\n\nfunction redisStatement(args: readonly unknown[], method: string): string | undefined {\n const key = args[0] === undefined ? \"\" : ` ${String(args[0])}`;\n return `${method.toUpperCase()}${key}`;\n}\n\nexport function redisIntegration(options: RedisIntegrationOptions) {\n return databaseIntegration({\n ...options,\n name: options.name ?? \"redis\",\n system: \"redis\",\n methods: options.methods ?? redisMethods,\n getStatement: redisStatement,\n });\n}\n"],"mappings":";;AAcA,MAAM,eAAe;CACnB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,SAAS,eAAe,MAA0B,QAAoC;CACpF,MAAM,MAAM,KAAK,OAAO,KAAA,IAAY,KAAK,IAAI,OAAO,KAAK,EAAE;CAC3D,OAAO,GAAG,OAAO,YAAY,IAAI;AACnC;AAEA,SAAgB,iBAAiB,SAAkC;CACjE,OAAO,oBAAoB;EACzB,GAAG;EACH,MAAM,QAAQ,QAAQ;EACtB,QAAQ;EACR,SAAS,QAAQ,WAAW;EAC5B,cAAc;CAChB,CAAC;AACH"}