cipher-logger 1.2.0 → 1.3.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.
- package/README.md +15 -6
- package/dist/index.d.mts +40 -1
- package/dist/index.d.ts +40 -1
- package/dist/index.js +141 -0
- package/dist/index.mjs +138 -0
- package/package.json +19 -1
package/README.md
CHANGED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
|
|
24
24
|
---
|
|
25
25
|
|
|
26
|
-
**Cipher Logger** is a lightweight, production-ready HTTP logging library for Node.js. It captures every request in **Express
|
|
26
|
+
**Cipher Logger** is a lightweight, production-ready HTTP logging library for Node.js. It captures every request in **Express**, **Next.js**, **React**, **Vue**, and **Nuxt** applications. You decide exactly which fields appear in each log — required fields are always recorded, optional fields are opt-in.
|
|
27
27
|
|
|
28
28
|
## Table of Contents
|
|
29
29
|
|
|
@@ -48,11 +48,11 @@
|
|
|
48
48
|
- **Configurable fields** — fine-grained control over optional log fields
|
|
49
49
|
- **Express middleware** — records real `status` and `duration` after the response finishes
|
|
50
50
|
- **Next.js middleware** — drop-in support for `middleware.ts`
|
|
51
|
-
- **
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
51
|
+
- **React**, **Vue**, and **Nuxt** support — modern app stacks alongside the server frameworks
|
|
52
|
+
- **Zero heavy dependencies** — only framework peers are optional
|
|
53
|
+
- **Fastify middleware** — lightweight hook-compatible middleware for Fastify
|
|
54
|
+
- **NestJS middleware** — Express-compatible middleware for Nest apps
|
|
55
|
+
- **Hono middleware** — edge-friendly middleware for Hono apps
|
|
56
56
|
- **Node.js 18+** compatible
|
|
57
57
|
|
|
58
58
|
---
|
|
@@ -78,6 +78,15 @@ npm install express
|
|
|
78
78
|
# Next.js
|
|
79
79
|
npm install next
|
|
80
80
|
|
|
81
|
+
# React
|
|
82
|
+
npm install react
|
|
83
|
+
|
|
84
|
+
# Vue
|
|
85
|
+
npm install vue
|
|
86
|
+
|
|
87
|
+
# Nuxt
|
|
88
|
+
npm install nuxt
|
|
89
|
+
|
|
81
90
|
# Fastify
|
|
82
91
|
npm install fastify
|
|
83
92
|
|
package/dist/index.d.mts
CHANGED
|
@@ -76,10 +76,49 @@ declare function createNestMiddleware(cipher: CipherLogger): NestMiddleware;
|
|
|
76
76
|
type HonoMiddleware = (c: Context, next: () => Promise<void>) => Response | Promise<Response>;
|
|
77
77
|
declare function createHonoMiddleware(cipher: CipherLogger): HonoMiddleware;
|
|
78
78
|
|
|
79
|
+
type ReactRequest = {
|
|
80
|
+
method: string;
|
|
81
|
+
url: string;
|
|
82
|
+
headers: Headers | Record<string, string | string[] | undefined>;
|
|
83
|
+
};
|
|
84
|
+
type ReactResponse = {
|
|
85
|
+
status?: number;
|
|
86
|
+
end: (...args: unknown[]) => unknown;
|
|
87
|
+
};
|
|
88
|
+
type ReactMiddleware = (req: ReactRequest, res: ReactResponse) => void;
|
|
89
|
+
declare function createReactMiddleware(cipher: CipherLogger): ReactMiddleware;
|
|
90
|
+
|
|
91
|
+
type VueRequest = {
|
|
92
|
+
method: string;
|
|
93
|
+
url: string;
|
|
94
|
+
headers: Headers | Record<string, string | string[] | undefined>;
|
|
95
|
+
};
|
|
96
|
+
type VueResponse = {
|
|
97
|
+
status?: number;
|
|
98
|
+
end: (...args: unknown[]) => unknown;
|
|
99
|
+
};
|
|
100
|
+
type VueMiddleware = (req: VueRequest, res: VueResponse) => void;
|
|
101
|
+
declare function createVueMiddleware(cipher: CipherLogger): VueMiddleware;
|
|
102
|
+
|
|
103
|
+
type NuxtRequest = {
|
|
104
|
+
method: string;
|
|
105
|
+
url: string;
|
|
106
|
+
headers: Headers | Record<string, string | string[] | undefined>;
|
|
107
|
+
};
|
|
108
|
+
type NuxtResponse = {
|
|
109
|
+
status?: number;
|
|
110
|
+
end: (...args: unknown[]) => unknown;
|
|
111
|
+
};
|
|
112
|
+
type NuxtMiddleware = (req: NuxtRequest, res: NuxtResponse) => void;
|
|
113
|
+
declare function createNuxtMiddleware(cipher: CipherLogger): NuxtMiddleware;
|
|
114
|
+
|
|
79
115
|
interface CipherLogger {
|
|
80
116
|
logRequest(input: RequestLogInput): RequestLog;
|
|
81
117
|
express(): ExpressMiddleware;
|
|
82
118
|
next(): NextMiddleware;
|
|
119
|
+
react(): ReactMiddleware;
|
|
120
|
+
vue(): VueMiddleware;
|
|
121
|
+
nuxt(): NuxtMiddleware;
|
|
83
122
|
fastify(): FastifyMiddleware;
|
|
84
123
|
nest(): NestMiddleware;
|
|
85
124
|
hono(): HonoMiddleware;
|
|
@@ -88,4 +127,4 @@ declare function createCipherLogger(config?: CipherLoggerConfig): CipherLogger;
|
|
|
88
127
|
|
|
89
128
|
declare const logger: Logger;
|
|
90
129
|
|
|
91
|
-
export { type CipherLogger, type CipherLoggerConfig, type ExpressMiddleware, type FastifyMiddleware, type HonoMiddleware, type LogLevel, type LogMeta, Logger, type LoggerOptions, type NestMiddleware, type NextMiddleware, type OptionalRequestField, type RequestLog, type RequestLogInput, createCipherLogger, createExpressMiddleware, createFastifyMiddleware, createHonoMiddleware, createNestMiddleware, createNextMiddleware, logger, type RequestLog as request };
|
|
130
|
+
export { type CipherLogger, type CipherLoggerConfig, type ExpressMiddleware, type FastifyMiddleware, type HonoMiddleware, type LogLevel, type LogMeta, Logger, type LoggerOptions, type NestMiddleware, type NextMiddleware, type NuxtMiddleware, type OptionalRequestField, type ReactMiddleware, type RequestLog, type RequestLogInput, type VueMiddleware, createCipherLogger, createExpressMiddleware, createFastifyMiddleware, createHonoMiddleware, createNestMiddleware, createNextMiddleware, createNuxtMiddleware, createReactMiddleware, createVueMiddleware, logger, type RequestLog as request };
|
package/dist/index.d.ts
CHANGED
|
@@ -76,10 +76,49 @@ declare function createNestMiddleware(cipher: CipherLogger): NestMiddleware;
|
|
|
76
76
|
type HonoMiddleware = (c: Context, next: () => Promise<void>) => Response | Promise<Response>;
|
|
77
77
|
declare function createHonoMiddleware(cipher: CipherLogger): HonoMiddleware;
|
|
78
78
|
|
|
79
|
+
type ReactRequest = {
|
|
80
|
+
method: string;
|
|
81
|
+
url: string;
|
|
82
|
+
headers: Headers | Record<string, string | string[] | undefined>;
|
|
83
|
+
};
|
|
84
|
+
type ReactResponse = {
|
|
85
|
+
status?: number;
|
|
86
|
+
end: (...args: unknown[]) => unknown;
|
|
87
|
+
};
|
|
88
|
+
type ReactMiddleware = (req: ReactRequest, res: ReactResponse) => void;
|
|
89
|
+
declare function createReactMiddleware(cipher: CipherLogger): ReactMiddleware;
|
|
90
|
+
|
|
91
|
+
type VueRequest = {
|
|
92
|
+
method: string;
|
|
93
|
+
url: string;
|
|
94
|
+
headers: Headers | Record<string, string | string[] | undefined>;
|
|
95
|
+
};
|
|
96
|
+
type VueResponse = {
|
|
97
|
+
status?: number;
|
|
98
|
+
end: (...args: unknown[]) => unknown;
|
|
99
|
+
};
|
|
100
|
+
type VueMiddleware = (req: VueRequest, res: VueResponse) => void;
|
|
101
|
+
declare function createVueMiddleware(cipher: CipherLogger): VueMiddleware;
|
|
102
|
+
|
|
103
|
+
type NuxtRequest = {
|
|
104
|
+
method: string;
|
|
105
|
+
url: string;
|
|
106
|
+
headers: Headers | Record<string, string | string[] | undefined>;
|
|
107
|
+
};
|
|
108
|
+
type NuxtResponse = {
|
|
109
|
+
status?: number;
|
|
110
|
+
end: (...args: unknown[]) => unknown;
|
|
111
|
+
};
|
|
112
|
+
type NuxtMiddleware = (req: NuxtRequest, res: NuxtResponse) => void;
|
|
113
|
+
declare function createNuxtMiddleware(cipher: CipherLogger): NuxtMiddleware;
|
|
114
|
+
|
|
79
115
|
interface CipherLogger {
|
|
80
116
|
logRequest(input: RequestLogInput): RequestLog;
|
|
81
117
|
express(): ExpressMiddleware;
|
|
82
118
|
next(): NextMiddleware;
|
|
119
|
+
react(): ReactMiddleware;
|
|
120
|
+
vue(): VueMiddleware;
|
|
121
|
+
nuxt(): NuxtMiddleware;
|
|
83
122
|
fastify(): FastifyMiddleware;
|
|
84
123
|
nest(): NestMiddleware;
|
|
85
124
|
hono(): HonoMiddleware;
|
|
@@ -88,4 +127,4 @@ declare function createCipherLogger(config?: CipherLoggerConfig): CipherLogger;
|
|
|
88
127
|
|
|
89
128
|
declare const logger: Logger;
|
|
90
129
|
|
|
91
|
-
export { type CipherLogger, type CipherLoggerConfig, type ExpressMiddleware, type FastifyMiddleware, type HonoMiddleware, type LogLevel, type LogMeta, Logger, type LoggerOptions, type NestMiddleware, type NextMiddleware, type OptionalRequestField, type RequestLog, type RequestLogInput, createCipherLogger, createExpressMiddleware, createFastifyMiddleware, createHonoMiddleware, createNestMiddleware, createNextMiddleware, logger, type RequestLog as request };
|
|
130
|
+
export { type CipherLogger, type CipherLoggerConfig, type ExpressMiddleware, type FastifyMiddleware, type HonoMiddleware, type LogLevel, type LogMeta, Logger, type LoggerOptions, type NestMiddleware, type NextMiddleware, type NuxtMiddleware, type OptionalRequestField, type ReactMiddleware, type RequestLog, type RequestLogInput, type VueMiddleware, createCipherLogger, createExpressMiddleware, createFastifyMiddleware, createHonoMiddleware, createNestMiddleware, createNextMiddleware, createNuxtMiddleware, createReactMiddleware, createVueMiddleware, logger, type RequestLog as request };
|
package/dist/index.js
CHANGED
|
@@ -27,6 +27,9 @@ __export(src_exports, {
|
|
|
27
27
|
createHonoMiddleware: () => createHonoMiddleware,
|
|
28
28
|
createNestMiddleware: () => createNestMiddleware,
|
|
29
29
|
createNextMiddleware: () => createNextMiddleware,
|
|
30
|
+
createNuxtMiddleware: () => createNuxtMiddleware,
|
|
31
|
+
createReactMiddleware: () => createReactMiddleware,
|
|
32
|
+
createVueMiddleware: () => createVueMiddleware,
|
|
30
33
|
logger: () => logger
|
|
31
34
|
});
|
|
32
35
|
module.exports = __toCommonJS(src_exports);
|
|
@@ -371,6 +374,132 @@ function createHonoMiddleware(cipher) {
|
|
|
371
374
|
};
|
|
372
375
|
}
|
|
373
376
|
|
|
377
|
+
// src/adapters/react/middleware.ts
|
|
378
|
+
function getHeader6(request, name) {
|
|
379
|
+
if (request.headers instanceof Headers) {
|
|
380
|
+
return request.headers.get(name) ?? void 0;
|
|
381
|
+
}
|
|
382
|
+
const value = request.headers[name.toLowerCase()];
|
|
383
|
+
if (Array.isArray(value)) {
|
|
384
|
+
return value[0];
|
|
385
|
+
}
|
|
386
|
+
return value ?? void 0;
|
|
387
|
+
}
|
|
388
|
+
function parseQuery6(url) {
|
|
389
|
+
const result = {};
|
|
390
|
+
for (const [key, value] of url.searchParams.entries()) {
|
|
391
|
+
result[key] = value;
|
|
392
|
+
}
|
|
393
|
+
return Object.keys(result).length > 0 ? result : void 0;
|
|
394
|
+
}
|
|
395
|
+
function createReactMiddleware(cipher) {
|
|
396
|
+
return (req, res) => {
|
|
397
|
+
const start = Date.now();
|
|
398
|
+
const originalEnd = res.end.bind(res);
|
|
399
|
+
res.end = ((...args) => {
|
|
400
|
+
const url = new URL(req.url, "http://localhost");
|
|
401
|
+
cipher.logRequest({
|
|
402
|
+
method: req.method,
|
|
403
|
+
path: url.pathname + url.search,
|
|
404
|
+
status: res.status ?? 200,
|
|
405
|
+
duration: Date.now() - start,
|
|
406
|
+
ip: getHeader6(req, "x-forwarded-for")?.split(",")[0]?.trim() ?? getHeader6(req, "x-real-ip"),
|
|
407
|
+
userAgent: getHeader6(req, "user-agent"),
|
|
408
|
+
referer: getHeader6(req, "referer"),
|
|
409
|
+
protocol: url.protocol.replace(":", ""),
|
|
410
|
+
host: getHeader6(req, "host"),
|
|
411
|
+
query: parseQuery6(url),
|
|
412
|
+
requestId: getHeader6(req, "x-request-id")
|
|
413
|
+
});
|
|
414
|
+
return originalEnd(...args);
|
|
415
|
+
});
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
// src/adapters/vue/middleware.ts
|
|
420
|
+
function getHeader7(request, name) {
|
|
421
|
+
if (request.headers instanceof Headers) {
|
|
422
|
+
return request.headers.get(name) ?? void 0;
|
|
423
|
+
}
|
|
424
|
+
const value = request.headers[name.toLowerCase()];
|
|
425
|
+
if (Array.isArray(value)) {
|
|
426
|
+
return value[0];
|
|
427
|
+
}
|
|
428
|
+
return value ?? void 0;
|
|
429
|
+
}
|
|
430
|
+
function parseQuery7(url) {
|
|
431
|
+
const result = {};
|
|
432
|
+
for (const [key, value] of url.searchParams.entries()) {
|
|
433
|
+
result[key] = value;
|
|
434
|
+
}
|
|
435
|
+
return Object.keys(result).length > 0 ? result : void 0;
|
|
436
|
+
}
|
|
437
|
+
function createVueMiddleware(cipher) {
|
|
438
|
+
return (req, res) => {
|
|
439
|
+
const start = Date.now();
|
|
440
|
+
const originalEnd = res.end.bind(res);
|
|
441
|
+
res.end = ((...args) => {
|
|
442
|
+
const url = new URL(req.url, "http://localhost");
|
|
443
|
+
cipher.logRequest({
|
|
444
|
+
method: req.method,
|
|
445
|
+
path: url.pathname + url.search,
|
|
446
|
+
status: res.status ?? 200,
|
|
447
|
+
duration: Date.now() - start,
|
|
448
|
+
ip: getHeader7(req, "x-forwarded-for")?.split(",")[0]?.trim() ?? getHeader7(req, "x-real-ip"),
|
|
449
|
+
userAgent: getHeader7(req, "user-agent"),
|
|
450
|
+
referer: getHeader7(req, "referer"),
|
|
451
|
+
protocol: url.protocol.replace(":", ""),
|
|
452
|
+
host: getHeader7(req, "host"),
|
|
453
|
+
query: parseQuery7(url),
|
|
454
|
+
requestId: getHeader7(req, "x-request-id")
|
|
455
|
+
});
|
|
456
|
+
return originalEnd(...args);
|
|
457
|
+
});
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
// src/adapters/nuxt/middleware.ts
|
|
462
|
+
function getHeader8(request, name) {
|
|
463
|
+
if (request.headers instanceof Headers) {
|
|
464
|
+
return request.headers.get(name) ?? void 0;
|
|
465
|
+
}
|
|
466
|
+
const value = request.headers[name.toLowerCase()];
|
|
467
|
+
if (Array.isArray(value)) {
|
|
468
|
+
return value[0];
|
|
469
|
+
}
|
|
470
|
+
return value ?? void 0;
|
|
471
|
+
}
|
|
472
|
+
function parseQuery8(url) {
|
|
473
|
+
const result = {};
|
|
474
|
+
for (const [key, value] of url.searchParams.entries()) {
|
|
475
|
+
result[key] = value;
|
|
476
|
+
}
|
|
477
|
+
return Object.keys(result).length > 0 ? result : void 0;
|
|
478
|
+
}
|
|
479
|
+
function createNuxtMiddleware(cipher) {
|
|
480
|
+
return (req, res) => {
|
|
481
|
+
const start = Date.now();
|
|
482
|
+
const originalEnd = res.end.bind(res);
|
|
483
|
+
res.end = ((...args) => {
|
|
484
|
+
const url = new URL(req.url, "http://localhost");
|
|
485
|
+
cipher.logRequest({
|
|
486
|
+
method: req.method,
|
|
487
|
+
path: url.pathname + url.search,
|
|
488
|
+
status: res.status ?? 200,
|
|
489
|
+
duration: Date.now() - start,
|
|
490
|
+
ip: getHeader8(req, "x-forwarded-for")?.split(",")[0]?.trim() ?? getHeader8(req, "x-real-ip"),
|
|
491
|
+
userAgent: getHeader8(req, "user-agent"),
|
|
492
|
+
referer: getHeader8(req, "referer"),
|
|
493
|
+
protocol: url.protocol.replace(":", ""),
|
|
494
|
+
host: getHeader8(req, "host"),
|
|
495
|
+
query: parseQuery8(url),
|
|
496
|
+
requestId: getHeader8(req, "x-request-id")
|
|
497
|
+
});
|
|
498
|
+
return originalEnd(...args);
|
|
499
|
+
});
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
|
|
374
503
|
// src/core/create-cipher-logger.ts
|
|
375
504
|
function createCipherLogger(config = {}) {
|
|
376
505
|
const fields = resolveFieldConfig(config.fields);
|
|
@@ -390,6 +519,15 @@ function createCipherLogger(config = {}) {
|
|
|
390
519
|
next() {
|
|
391
520
|
return createNextMiddleware(cipherLogger);
|
|
392
521
|
},
|
|
522
|
+
react() {
|
|
523
|
+
return createReactMiddleware(cipherLogger);
|
|
524
|
+
},
|
|
525
|
+
vue() {
|
|
526
|
+
return createVueMiddleware(cipherLogger);
|
|
527
|
+
},
|
|
528
|
+
nuxt() {
|
|
529
|
+
return createNuxtMiddleware(cipherLogger);
|
|
530
|
+
},
|
|
393
531
|
fastify() {
|
|
394
532
|
return createFastifyMiddleware(cipherLogger);
|
|
395
533
|
},
|
|
@@ -414,5 +552,8 @@ var logger = new Logger();
|
|
|
414
552
|
createHonoMiddleware,
|
|
415
553
|
createNestMiddleware,
|
|
416
554
|
createNextMiddleware,
|
|
555
|
+
createNuxtMiddleware,
|
|
556
|
+
createReactMiddleware,
|
|
557
|
+
createVueMiddleware,
|
|
417
558
|
logger
|
|
418
559
|
});
|
package/dist/index.mjs
CHANGED
|
@@ -338,6 +338,132 @@ function createHonoMiddleware(cipher) {
|
|
|
338
338
|
};
|
|
339
339
|
}
|
|
340
340
|
|
|
341
|
+
// src/adapters/react/middleware.ts
|
|
342
|
+
function getHeader6(request, name) {
|
|
343
|
+
if (request.headers instanceof Headers) {
|
|
344
|
+
return request.headers.get(name) ?? void 0;
|
|
345
|
+
}
|
|
346
|
+
const value = request.headers[name.toLowerCase()];
|
|
347
|
+
if (Array.isArray(value)) {
|
|
348
|
+
return value[0];
|
|
349
|
+
}
|
|
350
|
+
return value ?? void 0;
|
|
351
|
+
}
|
|
352
|
+
function parseQuery6(url) {
|
|
353
|
+
const result = {};
|
|
354
|
+
for (const [key, value] of url.searchParams.entries()) {
|
|
355
|
+
result[key] = value;
|
|
356
|
+
}
|
|
357
|
+
return Object.keys(result).length > 0 ? result : void 0;
|
|
358
|
+
}
|
|
359
|
+
function createReactMiddleware(cipher) {
|
|
360
|
+
return (req, res) => {
|
|
361
|
+
const start = Date.now();
|
|
362
|
+
const originalEnd = res.end.bind(res);
|
|
363
|
+
res.end = ((...args) => {
|
|
364
|
+
const url = new URL(req.url, "http://localhost");
|
|
365
|
+
cipher.logRequest({
|
|
366
|
+
method: req.method,
|
|
367
|
+
path: url.pathname + url.search,
|
|
368
|
+
status: res.status ?? 200,
|
|
369
|
+
duration: Date.now() - start,
|
|
370
|
+
ip: getHeader6(req, "x-forwarded-for")?.split(",")[0]?.trim() ?? getHeader6(req, "x-real-ip"),
|
|
371
|
+
userAgent: getHeader6(req, "user-agent"),
|
|
372
|
+
referer: getHeader6(req, "referer"),
|
|
373
|
+
protocol: url.protocol.replace(":", ""),
|
|
374
|
+
host: getHeader6(req, "host"),
|
|
375
|
+
query: parseQuery6(url),
|
|
376
|
+
requestId: getHeader6(req, "x-request-id")
|
|
377
|
+
});
|
|
378
|
+
return originalEnd(...args);
|
|
379
|
+
});
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// src/adapters/vue/middleware.ts
|
|
384
|
+
function getHeader7(request, name) {
|
|
385
|
+
if (request.headers instanceof Headers) {
|
|
386
|
+
return request.headers.get(name) ?? void 0;
|
|
387
|
+
}
|
|
388
|
+
const value = request.headers[name.toLowerCase()];
|
|
389
|
+
if (Array.isArray(value)) {
|
|
390
|
+
return value[0];
|
|
391
|
+
}
|
|
392
|
+
return value ?? void 0;
|
|
393
|
+
}
|
|
394
|
+
function parseQuery7(url) {
|
|
395
|
+
const result = {};
|
|
396
|
+
for (const [key, value] of url.searchParams.entries()) {
|
|
397
|
+
result[key] = value;
|
|
398
|
+
}
|
|
399
|
+
return Object.keys(result).length > 0 ? result : void 0;
|
|
400
|
+
}
|
|
401
|
+
function createVueMiddleware(cipher) {
|
|
402
|
+
return (req, res) => {
|
|
403
|
+
const start = Date.now();
|
|
404
|
+
const originalEnd = res.end.bind(res);
|
|
405
|
+
res.end = ((...args) => {
|
|
406
|
+
const url = new URL(req.url, "http://localhost");
|
|
407
|
+
cipher.logRequest({
|
|
408
|
+
method: req.method,
|
|
409
|
+
path: url.pathname + url.search,
|
|
410
|
+
status: res.status ?? 200,
|
|
411
|
+
duration: Date.now() - start,
|
|
412
|
+
ip: getHeader7(req, "x-forwarded-for")?.split(",")[0]?.trim() ?? getHeader7(req, "x-real-ip"),
|
|
413
|
+
userAgent: getHeader7(req, "user-agent"),
|
|
414
|
+
referer: getHeader7(req, "referer"),
|
|
415
|
+
protocol: url.protocol.replace(":", ""),
|
|
416
|
+
host: getHeader7(req, "host"),
|
|
417
|
+
query: parseQuery7(url),
|
|
418
|
+
requestId: getHeader7(req, "x-request-id")
|
|
419
|
+
});
|
|
420
|
+
return originalEnd(...args);
|
|
421
|
+
});
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
// src/adapters/nuxt/middleware.ts
|
|
426
|
+
function getHeader8(request, name) {
|
|
427
|
+
if (request.headers instanceof Headers) {
|
|
428
|
+
return request.headers.get(name) ?? void 0;
|
|
429
|
+
}
|
|
430
|
+
const value = request.headers[name.toLowerCase()];
|
|
431
|
+
if (Array.isArray(value)) {
|
|
432
|
+
return value[0];
|
|
433
|
+
}
|
|
434
|
+
return value ?? void 0;
|
|
435
|
+
}
|
|
436
|
+
function parseQuery8(url) {
|
|
437
|
+
const result = {};
|
|
438
|
+
for (const [key, value] of url.searchParams.entries()) {
|
|
439
|
+
result[key] = value;
|
|
440
|
+
}
|
|
441
|
+
return Object.keys(result).length > 0 ? result : void 0;
|
|
442
|
+
}
|
|
443
|
+
function createNuxtMiddleware(cipher) {
|
|
444
|
+
return (req, res) => {
|
|
445
|
+
const start = Date.now();
|
|
446
|
+
const originalEnd = res.end.bind(res);
|
|
447
|
+
res.end = ((...args) => {
|
|
448
|
+
const url = new URL(req.url, "http://localhost");
|
|
449
|
+
cipher.logRequest({
|
|
450
|
+
method: req.method,
|
|
451
|
+
path: url.pathname + url.search,
|
|
452
|
+
status: res.status ?? 200,
|
|
453
|
+
duration: Date.now() - start,
|
|
454
|
+
ip: getHeader8(req, "x-forwarded-for")?.split(",")[0]?.trim() ?? getHeader8(req, "x-real-ip"),
|
|
455
|
+
userAgent: getHeader8(req, "user-agent"),
|
|
456
|
+
referer: getHeader8(req, "referer"),
|
|
457
|
+
protocol: url.protocol.replace(":", ""),
|
|
458
|
+
host: getHeader8(req, "host"),
|
|
459
|
+
query: parseQuery8(url),
|
|
460
|
+
requestId: getHeader8(req, "x-request-id")
|
|
461
|
+
});
|
|
462
|
+
return originalEnd(...args);
|
|
463
|
+
});
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
|
|
341
467
|
// src/core/create-cipher-logger.ts
|
|
342
468
|
function createCipherLogger(config = {}) {
|
|
343
469
|
const fields = resolveFieldConfig(config.fields);
|
|
@@ -357,6 +483,15 @@ function createCipherLogger(config = {}) {
|
|
|
357
483
|
next() {
|
|
358
484
|
return createNextMiddleware(cipherLogger);
|
|
359
485
|
},
|
|
486
|
+
react() {
|
|
487
|
+
return createReactMiddleware(cipherLogger);
|
|
488
|
+
},
|
|
489
|
+
vue() {
|
|
490
|
+
return createVueMiddleware(cipherLogger);
|
|
491
|
+
},
|
|
492
|
+
nuxt() {
|
|
493
|
+
return createNuxtMiddleware(cipherLogger);
|
|
494
|
+
},
|
|
360
495
|
fastify() {
|
|
361
496
|
return createFastifyMiddleware(cipherLogger);
|
|
362
497
|
},
|
|
@@ -380,5 +515,8 @@ export {
|
|
|
380
515
|
createHonoMiddleware,
|
|
381
516
|
createNestMiddleware,
|
|
382
517
|
createNextMiddleware,
|
|
518
|
+
createNuxtMiddleware,
|
|
519
|
+
createReactMiddleware,
|
|
520
|
+
createVueMiddleware,
|
|
383
521
|
logger
|
|
384
522
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cipher-logger",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "See every request. Capture every error. Understand your application.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -47,6 +47,12 @@
|
|
|
47
47
|
"nextjs",
|
|
48
48
|
"nextjs-logger",
|
|
49
49
|
"nextjs-middleware",
|
|
50
|
+
"react",
|
|
51
|
+
"react-logger",
|
|
52
|
+
"vue",
|
|
53
|
+
"vue-logger",
|
|
54
|
+
"nuxt",
|
|
55
|
+
"nuxt-logger",
|
|
50
56
|
"express",
|
|
51
57
|
"express-logger",
|
|
52
58
|
"fastify",
|
|
@@ -68,6 +74,9 @@
|
|
|
68
74
|
"peerDependencies": {
|
|
69
75
|
"express": ">=4",
|
|
70
76
|
"next": ">=13",
|
|
77
|
+
"react": ">=18",
|
|
78
|
+
"vue": ">=3",
|
|
79
|
+
"nuxt": ">=3",
|
|
71
80
|
"fastify": ">=4",
|
|
72
81
|
"hono": ">=1",
|
|
73
82
|
"@nestjs/common": ">=10",
|
|
@@ -80,6 +89,15 @@
|
|
|
80
89
|
"next": {
|
|
81
90
|
"optional": true
|
|
82
91
|
},
|
|
92
|
+
"react": {
|
|
93
|
+
"optional": true
|
|
94
|
+
},
|
|
95
|
+
"vue": {
|
|
96
|
+
"optional": true
|
|
97
|
+
},
|
|
98
|
+
"nuxt": {
|
|
99
|
+
"optional": true
|
|
100
|
+
},
|
|
83
101
|
"fastify": {
|
|
84
102
|
"optional": true
|
|
85
103
|
},
|