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 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** and **Next.js** applications. You decide exactly which fields appear in each log — required fields are always recorded, optional fields are opt-in.
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
- - **Zero heavy dependencies** — only `express` or `next` as optional peer dependencies
52
- - **Fastify middleware** — lightweight hook-compatible middleware for Fastify
53
- - **NestJS middleware** — Express-compatible middleware for Nest apps
54
- - **Hono middleware** — edge-friendly middleware for Hono apps
55
- - **Zero heavy dependencies** — only framework peers are optional
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.2.0",
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
  },