api-logger-mongodb 1.0.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 (39) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +353 -0
  3. package/dist/core/logger.d.ts +58 -0
  4. package/dist/core/logger.d.ts.map +1 -0
  5. package/dist/core/logger.js +218 -0
  6. package/dist/core/logger.js.map +1 -0
  7. package/dist/index.d.ts +8 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +35 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/middleware/express.d.ts +8 -0
  12. package/dist/middleware/express.d.ts.map +1 -0
  13. package/dist/middleware/express.js +55 -0
  14. package/dist/middleware/express.js.map +1 -0
  15. package/dist/middleware/nestjs.d.ts +28 -0
  16. package/dist/middleware/nestjs.d.ts.map +1 -0
  17. package/dist/middleware/nestjs.js +77 -0
  18. package/dist/middleware/nestjs.js.map +1 -0
  19. package/dist/types/index.d.ts +75 -0
  20. package/dist/types/index.d.ts.map +1 -0
  21. package/dist/types/index.js +3 -0
  22. package/dist/types/index.js.map +1 -0
  23. package/dist/utils/filter.d.ts +23 -0
  24. package/dist/utils/filter.d.ts.map +1 -0
  25. package/dist/utils/filter.js +143 -0
  26. package/dist/utils/filter.js.map +1 -0
  27. package/dist/utils/mask.d.ts +16 -0
  28. package/dist/utils/mask.d.ts.map +1 -0
  29. package/dist/utils/mask.js +110 -0
  30. package/dist/utils/mask.js.map +1 -0
  31. package/dist/utils/standalone.d.ts +45 -0
  32. package/dist/utils/standalone.d.ts.map +1 -0
  33. package/dist/utils/standalone.js +115 -0
  34. package/dist/utils/standalone.js.map +1 -0
  35. package/dist/utils/validate.d.ts +6 -0
  36. package/dist/utils/validate.d.ts.map +1 -0
  37. package/dist/utils/validate.js +21 -0
  38. package/dist/utils/validate.js.map +1 -0
  39. package/package.json +73 -0
@@ -0,0 +1,45 @@
1
+ import { ApiLogger } from '../core/logger';
2
+ import { ApiLoggerOptions } from '../types';
3
+ /**
4
+ * Standalone API Logger for use with axios or any HTTP client
5
+ */
6
+ export declare class StandaloneApiLogger {
7
+ private logger;
8
+ private initialized;
9
+ private initPromise;
10
+ constructor(options: ApiLoggerOptions);
11
+ /**
12
+ * Initialize MongoDB connection (single-flight, concurrent-safe).
13
+ */
14
+ init(): Promise<void>;
15
+ /**
16
+ * Log an HTTP request and response
17
+ */
18
+ logRequest(url: string, method: string, requestData: {
19
+ headers?: Record<string, string>;
20
+ body?: any;
21
+ query?: Record<string, any>;
22
+ params?: Record<string, any>;
23
+ }, responseData: {
24
+ statusCode: number;
25
+ body?: any;
26
+ headers?: Record<string, string>;
27
+ }, userInfo?: any, durationMs?: number): Promise<void>;
28
+ /**
29
+ * Close MongoDB connection
30
+ */
31
+ close(): Promise<void>;
32
+ /**
33
+ * Get the underlying logger instance
34
+ */
35
+ getLogger(): ApiLogger;
36
+ }
37
+ /**
38
+ * Axios interceptor factory for automatic logging
39
+ */
40
+ export declare function createAxiosLogger(logger: StandaloneApiLogger, getUserInfo?: () => any): {
41
+ request: (config: any) => any;
42
+ response: (response: any) => Promise<any>;
43
+ error: (error: any) => Promise<never>;
44
+ };
45
+ //# sourceMappingURL=standalone.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standalone.d.ts","sourceRoot":"","sources":["../../src/utils/standalone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAe,MAAM,UAAU,CAAC;AAEzD;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAA8B;gBAErC,OAAO,EAAE,gBAAgB;IAIrC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B;;OAEG;IACG,UAAU,CACd,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,WAAW,EAAE;QACX,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,GAAG,CAAC;QACX,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAC9B,EACD,YAAY,EAAE;QACZ,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,GAAG,CAAC;QACX,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,EACD,QAAQ,CAAC,EAAE,GAAG,EACd,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IA0BhB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;OAEG;IACH,SAAS,IAAI,SAAS;CAGvB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,mBAAmB,EAC3B,WAAW,CAAC,EAAE,MAAM,GAAG;sBAGH,GAAG;yBAIM,GAAG;mBAuBT,GAAG;EA0B3B"}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StandaloneApiLogger = void 0;
4
+ exports.createAxiosLogger = createAxiosLogger;
5
+ const logger_1 = require("../core/logger");
6
+ /**
7
+ * Standalone API Logger for use with axios or any HTTP client
8
+ */
9
+ class StandaloneApiLogger {
10
+ constructor(options) {
11
+ this.initialized = false;
12
+ this.initPromise = null;
13
+ this.logger = new logger_1.ApiLogger(options);
14
+ }
15
+ /**
16
+ * Initialize MongoDB connection (single-flight, concurrent-safe).
17
+ */
18
+ async init() {
19
+ if (this.initialized)
20
+ return;
21
+ if (this.initPromise) {
22
+ await this.initPromise;
23
+ return;
24
+ }
25
+ this.initPromise = this.logger.init();
26
+ try {
27
+ await this.initPromise;
28
+ this.initialized = true;
29
+ }
30
+ finally {
31
+ this.initPromise = null;
32
+ }
33
+ }
34
+ /**
35
+ * Log an HTTP request and response
36
+ */
37
+ async logRequest(url, method, requestData, responseData, userInfo, durationMs) {
38
+ await this.init();
39
+ const logEntry = {
40
+ url,
41
+ method: method.toUpperCase(),
42
+ request: {
43
+ headers: requestData.headers || {},
44
+ body: requestData.body || {},
45
+ query: requestData.query || {},
46
+ params: requestData.params || {}
47
+ },
48
+ response: {
49
+ statusCode: responseData.statusCode,
50
+ body: responseData.body
51
+ },
52
+ user: userInfo,
53
+ createdAt: new Date(),
54
+ durationMs: durationMs || 0,
55
+ ip: undefined,
56
+ userAgent: undefined
57
+ };
58
+ await this.logger.logEntry(logEntry);
59
+ }
60
+ /**
61
+ * Close MongoDB connection
62
+ */
63
+ async close() {
64
+ await this.logger.close();
65
+ }
66
+ /**
67
+ * Get the underlying logger instance
68
+ */
69
+ getLogger() {
70
+ return this.logger;
71
+ }
72
+ }
73
+ exports.StandaloneApiLogger = StandaloneApiLogger;
74
+ /**
75
+ * Axios interceptor factory for automatic logging
76
+ */
77
+ function createAxiosLogger(logger, getUserInfo) {
78
+ return {
79
+ request: (config) => {
80
+ config.metadata = { startTime: Date.now() };
81
+ return config;
82
+ },
83
+ response: async (response) => {
84
+ const startTime = response?.config?.metadata?.startTime ?? Date.now();
85
+ const durationMs = Date.now() - startTime;
86
+ await logger.logRequest(response.config.url, response.config.method, {
87
+ headers: response.config.headers,
88
+ body: response.config.data,
89
+ query: response.config.params
90
+ }, {
91
+ statusCode: response.status,
92
+ body: response.data,
93
+ headers: response.headers
94
+ }, getUserInfo ? getUserInfo() : undefined, durationMs);
95
+ return response;
96
+ },
97
+ error: async (error) => {
98
+ if (error.response) {
99
+ const startTime = error?.config?.metadata?.startTime ?? Date.now();
100
+ const durationMs = Date.now() - startTime;
101
+ await logger.logRequest(error.config.url, error.config.method, {
102
+ headers: error.config.headers,
103
+ body: error.config.data,
104
+ query: error.config.params
105
+ }, {
106
+ statusCode: error.response.status,
107
+ body: error.response.data,
108
+ headers: error.response.headers
109
+ }, getUserInfo ? getUserInfo() : undefined, durationMs);
110
+ }
111
+ return Promise.reject(error);
112
+ }
113
+ };
114
+ }
115
+ //# sourceMappingURL=standalone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standalone.js","sourceRoot":"","sources":["../../src/utils/standalone.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { ApiLoggerOptions } from '../types';
2
+ /**
3
+ * Validates API logger options at construction. Throws if invalid.
4
+ */
5
+ export declare function validateLoggerOptions(options: ApiLoggerOptions): void;
6
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/utils/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAarE"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateLoggerOptions = validateLoggerOptions;
4
+ /**
5
+ * Validates API logger options at construction. Throws if invalid.
6
+ */
7
+ function validateLoggerOptions(options) {
8
+ if (!options.mongoUri || typeof options.mongoUri !== 'string') {
9
+ throw new Error('ApiLoggerOptions.mongoUri is required and must be a non-empty string.');
10
+ }
11
+ if (options.mongoUri.trim().length === 0) {
12
+ throw new Error('ApiLoggerOptions.mongoUri cannot be blank.');
13
+ }
14
+ if (options.databaseName !== undefined && (typeof options.databaseName !== 'string' || options.databaseName.trim().length === 0)) {
15
+ throw new Error('ApiLoggerOptions.databaseName must be a non-empty string when provided.');
16
+ }
17
+ if (options.collectionName !== undefined && (typeof options.collectionName !== 'string' || options.collectionName.trim().length === 0)) {
18
+ throw new Error('ApiLoggerOptions.collectionName must be a non-empty string when provided.');
19
+ }
20
+ }
21
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/utils/validate.ts"],"names":[],"mappings":";;AAKA,sDAaC;AAhBD;;GAEG;AACH,SAAgB,qBAAqB,CAAC,OAAyB;IAC7D,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QACjI,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;IAC7F,CAAC;IACD,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS,IAAI,CAAC,OAAO,OAAO,CAAC,cAAc,KAAK,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QACvI,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;IAC/F,CAAC;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,73 @@
1
+ {
2
+ "name": "api-logger-mongodb",
3
+ "version": "1.0.0",
4
+ "description": "A comprehensive API logging middleware for Node.js applications that logs requests and responses to MongoDB",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "require": "./dist/index.js",
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "dev": "tsc --watch",
17
+ "test": "jest",
18
+ "test:watch": "jest --watch",
19
+ "lint": "eslint src/**/*.ts",
20
+ "lint:fix": "eslint src/**/*.ts --fix",
21
+ "prepublishOnly": "npm run build"
22
+ },
23
+ "keywords": [
24
+ "api-logger",
25
+ "mongodb",
26
+ "express",
27
+ "nestjs",
28
+ "middleware",
29
+ "logging",
30
+ "audit",
31
+ "request-response",
32
+ "typescript"
33
+ ],
34
+ "author": "Sayantan Roy",
35
+ "license": "MIT",
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "https://github.com/rick001/api-logger-mongodb.git"
39
+ },
40
+ "bugs": {
41
+ "url": "https://github.com/rick001/api-logger-mongodb/issues"
42
+ },
43
+ "homepage": "https://github.com/rick001/api-logger-mongodb#readme",
44
+ "dependencies": {
45
+ "mongodb": "^6.3.0"
46
+ },
47
+ "peerDependencies": {
48
+ "express": ">=4.0.0"
49
+ },
50
+ "devDependencies": {
51
+ "@types/express": "^4.17.21",
52
+ "@types/jest": "^29.5.8",
53
+ "@types/node": "^20.10.0",
54
+ "@typescript-eslint/eslint-plugin": "^8.56.0",
55
+ "@typescript-eslint/parser": "^8.56.0",
56
+ "eslint": "^8.54.0",
57
+ "express": "^4.22.0",
58
+ "jest": "^29.7.0",
59
+ "ts-jest": "^29.1.1",
60
+ "typescript": "^5.3.2"
61
+ },
62
+ "engines": {
63
+ "node": ">=16.0.0"
64
+ },
65
+ "files": [
66
+ "dist",
67
+ "README.md",
68
+ "LICENSE"
69
+ ],
70
+ "publishConfig": {
71
+ "access": "public"
72
+ }
73
+ }