@crashlensorg/nestjs 0.1.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.
@@ -0,0 +1,70 @@
1
+ import { DynamicModule, ExceptionFilter, ArgumentsHost, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
2
+ import { NodeInitOptions, CrashLens } from '@crashlensorg/node';
3
+ export { Breadcrumb, CaptureParams, CrashLens, CrashLensUser, CrashOptions, DeviceInfo, NodeInitOptions, Severity, initNode } from '@crashlensorg/node';
4
+ import { BaseExceptionFilter } from '@nestjs/core';
5
+ import { Observable } from 'rxjs';
6
+
7
+ interface CrashLensConfig extends NodeInitOptions {
8
+ /** URL base da API CrashLens. */
9
+ baseUrl?: string;
10
+ /** Versão da release do app. */
11
+ release?: string;
12
+ /** Ambiente: "production", "staging", etc. */
13
+ environment?: string;
14
+ /** Tags globais. */
15
+ tags?: Record<string, unknown>;
16
+ /** Extra global. */
17
+ extra?: Record<string, unknown>;
18
+ }
19
+ /**
20
+ * Serviço que mantém o cliente CrashLens e expõe a API de captura.
21
+ * Pode ser injetado em qualquer controller/service.
22
+ */
23
+ declare class CrashLensService {
24
+ private readonly client?;
25
+ constructor(options?: CrashLensConfig);
26
+ get isInitialized(): boolean;
27
+ captureException(error: unknown, params?: Parameters<CrashLens['captureException']>[1]): void;
28
+ captureMessage(message: string, params?: Parameters<CrashLens['captureMessage']>[1]): void;
29
+ captureEvent(params: Parameters<CrashLens['captureEvent']>[0]): void;
30
+ addBreadcrumb(breadcrumb: Parameters<CrashLens['addBreadcrumb']>[0]): void;
31
+ setUser(user: Parameters<CrashLens['setUser']>[0]): void;
32
+ setTag(key: string, value: unknown): void;
33
+ get clientInstance(): CrashLens | undefined;
34
+ }
35
+
36
+ interface CrashLensModuleOptions extends CrashLensConfig {
37
+ /** Registra o filtro global de exceções (padrão: true). */
38
+ globalFilter?: boolean;
39
+ /** Registra o interceptor global de requests (padrão: true). */
40
+ globalInterceptor?: boolean;
41
+ }
42
+ /**
43
+ * Módulo do CrashLens para NestJS.
44
+ *
45
+ * @Module({ imports: [CrashLensModule.forRoot({ apiKey: 'cl_live_xxx' }) ] })
46
+ */
47
+ declare class CrashLensModule {
48
+ static forRoot(options: CrashLensModuleOptions): DynamicModule;
49
+ }
50
+
51
+ /**
52
+ * Captura todas as exceções não tratadas e as envia ao CrashLens,
53
+ * preservando o comportamento padrão do NestJS.
54
+ */
55
+ declare class CrashLensFilter extends BaseExceptionFilter implements ExceptionFilter {
56
+ private readonly crashLens;
57
+ constructor(crashLens: CrashLensService);
58
+ catch(exception: unknown, host: ArgumentsHost): void;
59
+ }
60
+
61
+ /**
62
+ * Interceptor que adiciona breadcrumbs de request e captura erros dos handlers.
63
+ */
64
+ declare class CrashLensInterceptor implements NestInterceptor {
65
+ private readonly crashLens;
66
+ constructor(crashLens: CrashLensService);
67
+ intercept(context: ExecutionContext, next: CallHandler): Observable<unknown>;
68
+ }
69
+
70
+ export { type CrashLensConfig, CrashLensFilter, CrashLensInterceptor, CrashLensModule, type CrashLensModuleOptions, CrashLensService };
@@ -0,0 +1,70 @@
1
+ import { DynamicModule, ExceptionFilter, ArgumentsHost, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
2
+ import { NodeInitOptions, CrashLens } from '@crashlensorg/node';
3
+ export { Breadcrumb, CaptureParams, CrashLens, CrashLensUser, CrashOptions, DeviceInfo, NodeInitOptions, Severity, initNode } from '@crashlensorg/node';
4
+ import { BaseExceptionFilter } from '@nestjs/core';
5
+ import { Observable } from 'rxjs';
6
+
7
+ interface CrashLensConfig extends NodeInitOptions {
8
+ /** URL base da API CrashLens. */
9
+ baseUrl?: string;
10
+ /** Versão da release do app. */
11
+ release?: string;
12
+ /** Ambiente: "production", "staging", etc. */
13
+ environment?: string;
14
+ /** Tags globais. */
15
+ tags?: Record<string, unknown>;
16
+ /** Extra global. */
17
+ extra?: Record<string, unknown>;
18
+ }
19
+ /**
20
+ * Serviço que mantém o cliente CrashLens e expõe a API de captura.
21
+ * Pode ser injetado em qualquer controller/service.
22
+ */
23
+ declare class CrashLensService {
24
+ private readonly client?;
25
+ constructor(options?: CrashLensConfig);
26
+ get isInitialized(): boolean;
27
+ captureException(error: unknown, params?: Parameters<CrashLens['captureException']>[1]): void;
28
+ captureMessage(message: string, params?: Parameters<CrashLens['captureMessage']>[1]): void;
29
+ captureEvent(params: Parameters<CrashLens['captureEvent']>[0]): void;
30
+ addBreadcrumb(breadcrumb: Parameters<CrashLens['addBreadcrumb']>[0]): void;
31
+ setUser(user: Parameters<CrashLens['setUser']>[0]): void;
32
+ setTag(key: string, value: unknown): void;
33
+ get clientInstance(): CrashLens | undefined;
34
+ }
35
+
36
+ interface CrashLensModuleOptions extends CrashLensConfig {
37
+ /** Registra o filtro global de exceções (padrão: true). */
38
+ globalFilter?: boolean;
39
+ /** Registra o interceptor global de requests (padrão: true). */
40
+ globalInterceptor?: boolean;
41
+ }
42
+ /**
43
+ * Módulo do CrashLens para NestJS.
44
+ *
45
+ * @Module({ imports: [CrashLensModule.forRoot({ apiKey: 'cl_live_xxx' }) ] })
46
+ */
47
+ declare class CrashLensModule {
48
+ static forRoot(options: CrashLensModuleOptions): DynamicModule;
49
+ }
50
+
51
+ /**
52
+ * Captura todas as exceções não tratadas e as envia ao CrashLens,
53
+ * preservando o comportamento padrão do NestJS.
54
+ */
55
+ declare class CrashLensFilter extends BaseExceptionFilter implements ExceptionFilter {
56
+ private readonly crashLens;
57
+ constructor(crashLens: CrashLensService);
58
+ catch(exception: unknown, host: ArgumentsHost): void;
59
+ }
60
+
61
+ /**
62
+ * Interceptor que adiciona breadcrumbs de request e captura erros dos handlers.
63
+ */
64
+ declare class CrashLensInterceptor implements NestInterceptor {
65
+ private readonly crashLens;
66
+ constructor(crashLens: CrashLensService);
67
+ intercept(context: ExecutionContext, next: CallHandler): Observable<unknown>;
68
+ }
69
+
70
+ export { type CrashLensConfig, CrashLensFilter, CrashLensInterceptor, CrashLensModule, type CrashLensModuleOptions, CrashLensService };
package/dist/index.js ADDED
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var __decorateClass = (decorators, target, key, kind) => {
20
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
21
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
22
+ if (decorator = decorators[i])
23
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
24
+ if (kind && result) __defProp(target, key, result);
25
+ return result;
26
+ };
27
+ var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
28
+
29
+ // src/index.ts
30
+ var index_exports = {};
31
+ __export(index_exports, {
32
+ CrashLens: () => import_node3.CrashLens,
33
+ CrashLensFilter: () => CrashLensFilter,
34
+ CrashLensInterceptor: () => CrashLensInterceptor,
35
+ CrashLensModule: () => CrashLensModule,
36
+ CrashLensService: () => CrashLensService,
37
+ initNode: () => import_node2.initNode
38
+ });
39
+ module.exports = __toCommonJS(index_exports);
40
+
41
+ // src/crash-lens.module.ts
42
+ var import_common4 = require("@nestjs/common");
43
+ var import_core2 = require("@nestjs/core");
44
+
45
+ // src/crash-lens.service.ts
46
+ var import_common = require("@nestjs/common");
47
+ var import_node = require("@crashlensorg/node");
48
+ var CrashLensService = class {
49
+ constructor(options) {
50
+ if (!options) return;
51
+ this.client = (0, import_node.initNode)({
52
+ ...options,
53
+ enableGlobalHandlers: options.enableGlobalHandlers ?? false,
54
+ collectRuntimeInfo: options.collectRuntimeInfo ?? true,
55
+ enableSessionTracking: options.enableSessionTracking ?? false
56
+ });
57
+ if (options.tags) {
58
+ for (const [k, v] of Object.entries(options.tags)) {
59
+ this.client.setTag(k, v);
60
+ }
61
+ }
62
+ if (options.extra) {
63
+ for (const [k, v] of Object.entries(options.extra)) {
64
+ this.client.setExtra(k, v);
65
+ }
66
+ }
67
+ }
68
+ get isInitialized() {
69
+ return this.client?.isInitialized ?? false;
70
+ }
71
+ captureException(error, params) {
72
+ this.client?.captureException(error, params);
73
+ }
74
+ captureMessage(message, params) {
75
+ this.client?.captureMessage(message, params);
76
+ }
77
+ captureEvent(params) {
78
+ this.client?.captureEvent(params);
79
+ }
80
+ addBreadcrumb(breadcrumb) {
81
+ this.client?.addBreadcrumb(breadcrumb);
82
+ }
83
+ setUser(user) {
84
+ this.client?.setUser(user);
85
+ }
86
+ setTag(key, value) {
87
+ this.client?.setTag(key, value);
88
+ }
89
+ get clientInstance() {
90
+ return this.client;
91
+ }
92
+ };
93
+ CrashLensService = __decorateClass([
94
+ (0, import_common.Injectable)(),
95
+ __decorateParam(0, (0, import_common.Optional)()),
96
+ __decorateParam(0, (0, import_common.Inject)(CRASH_LENS_OPTIONS))
97
+ ], CrashLensService);
98
+
99
+ // src/crash-lens.filter.ts
100
+ var import_common2 = require("@nestjs/common");
101
+ var import_core = require("@nestjs/core");
102
+ var CrashLensFilter = class extends import_core.BaseExceptionFilter {
103
+ constructor(crashLens) {
104
+ super();
105
+ this.crashLens = crashLens;
106
+ }
107
+ catch(exception, host) {
108
+ const status = exception instanceof import_common2.HttpException ? exception.getStatus() : import_common2.HttpStatus.INTERNAL_SERVER_ERROR;
109
+ const request = host.switchToHttp().getRequest();
110
+ const message = exception instanceof Error ? exception.message : String(exception);
111
+ this.crashLens.captureException(exception, {
112
+ context: "nestjs-exception-filter",
113
+ handled: false,
114
+ tags: {
115
+ httpStatus: String(status),
116
+ httpMethod: request?.method
117
+ },
118
+ extra: {
119
+ url: request?.url,
120
+ method: request?.method,
121
+ statusCode: status,
122
+ error: message
123
+ }
124
+ });
125
+ super.catch(exception, host);
126
+ }
127
+ };
128
+ CrashLensFilter = __decorateClass([
129
+ (0, import_common2.Catch)()
130
+ ], CrashLensFilter);
131
+
132
+ // src/crash-lens.interceptor.ts
133
+ var import_common3 = require("@nestjs/common");
134
+ var import_rxjs = require("rxjs");
135
+ var import_operators = require("rxjs/operators");
136
+ var CrashLensInterceptor = class {
137
+ constructor(crashLens) {
138
+ this.crashLens = crashLens;
139
+ }
140
+ intercept(context, next) {
141
+ const request = context.switchToHttp().getRequest();
142
+ if (request) {
143
+ this.crashLens.addBreadcrumb({
144
+ message: `${request.method ?? "GET"} ${request.url ?? "/"}`,
145
+ type: "request",
146
+ category: "http",
147
+ data: { method: request.method, url: request.url }
148
+ });
149
+ }
150
+ return next.handle().pipe(
151
+ (0, import_operators.tap)({
152
+ error: (error) => {
153
+ this.crashLens.captureException(error, {
154
+ handled: false,
155
+ context: "context.interceptor",
156
+ tags: { httpMethod: request?.method },
157
+ extra: { url: request?.url }
158
+ });
159
+ }
160
+ }),
161
+ (0, import_operators.catchError)((error) => (0, import_rxjs.throwError)(() => error))
162
+ );
163
+ }
164
+ };
165
+ CrashLensInterceptor = __decorateClass([
166
+ (0, import_common3.Injectable)()
167
+ ], CrashLensInterceptor);
168
+
169
+ // src/crash-lens.module.ts
170
+ var CRASH_LENS_OPTIONS = /* @__PURE__ */ Symbol("CRASH_LENS_OPTIONS");
171
+ var CrashLensModule = class {
172
+ static forRoot(options) {
173
+ const providers = [
174
+ { provide: CRASH_LENS_OPTIONS, useValue: options },
175
+ CrashLensService
176
+ ];
177
+ if (options.globalFilter !== false) {
178
+ providers.push({ provide: import_core2.APP_FILTER, useClass: CrashLensFilter });
179
+ }
180
+ if (options.globalInterceptor !== false) {
181
+ providers.push({ provide: import_core2.APP_INTERCEPTOR, useClass: CrashLensInterceptor });
182
+ }
183
+ return {
184
+ module: CrashLensModule,
185
+ global: true,
186
+ providers,
187
+ exports: [CrashLensService]
188
+ };
189
+ }
190
+ };
191
+ CrashLensModule = __decorateClass([
192
+ (0, import_common4.Global)()
193
+ ], CrashLensModule);
194
+
195
+ // src/index.ts
196
+ var import_node2 = require("@crashlensorg/node");
197
+ var import_node3 = require("@crashlensorg/node");
198
+ // Annotate the CommonJS export names for ESM import in node:
199
+ 0 && (module.exports = {
200
+ CrashLens,
201
+ CrashLensFilter,
202
+ CrashLensInterceptor,
203
+ CrashLensModule,
204
+ CrashLensService,
205
+ initNode
206
+ });
package/dist/index.mjs ADDED
@@ -0,0 +1,177 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __decorateClass = (decorators, target, key, kind) => {
4
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
5
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
6
+ if (decorator = decorators[i])
7
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
8
+ if (kind && result) __defProp(target, key, result);
9
+ return result;
10
+ };
11
+ var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
12
+
13
+ // src/crash-lens.module.ts
14
+ import { Global } from "@nestjs/common";
15
+ import { APP_FILTER, APP_INTERCEPTOR } from "@nestjs/core";
16
+
17
+ // src/crash-lens.service.ts
18
+ import { Inject, Injectable, Optional } from "@nestjs/common";
19
+ import { initNode } from "@crashlensorg/node";
20
+ var CrashLensService = class {
21
+ constructor(options) {
22
+ if (!options) return;
23
+ this.client = initNode({
24
+ ...options,
25
+ enableGlobalHandlers: options.enableGlobalHandlers ?? false,
26
+ collectRuntimeInfo: options.collectRuntimeInfo ?? true,
27
+ enableSessionTracking: options.enableSessionTracking ?? false
28
+ });
29
+ if (options.tags) {
30
+ for (const [k, v] of Object.entries(options.tags)) {
31
+ this.client.setTag(k, v);
32
+ }
33
+ }
34
+ if (options.extra) {
35
+ for (const [k, v] of Object.entries(options.extra)) {
36
+ this.client.setExtra(k, v);
37
+ }
38
+ }
39
+ }
40
+ get isInitialized() {
41
+ return this.client?.isInitialized ?? false;
42
+ }
43
+ captureException(error, params) {
44
+ this.client?.captureException(error, params);
45
+ }
46
+ captureMessage(message, params) {
47
+ this.client?.captureMessage(message, params);
48
+ }
49
+ captureEvent(params) {
50
+ this.client?.captureEvent(params);
51
+ }
52
+ addBreadcrumb(breadcrumb) {
53
+ this.client?.addBreadcrumb(breadcrumb);
54
+ }
55
+ setUser(user) {
56
+ this.client?.setUser(user);
57
+ }
58
+ setTag(key, value) {
59
+ this.client?.setTag(key, value);
60
+ }
61
+ get clientInstance() {
62
+ return this.client;
63
+ }
64
+ };
65
+ CrashLensService = __decorateClass([
66
+ Injectable(),
67
+ __decorateParam(0, Optional()),
68
+ __decorateParam(0, Inject(CRASH_LENS_OPTIONS))
69
+ ], CrashLensService);
70
+
71
+ // src/crash-lens.filter.ts
72
+ import { Catch, HttpException, HttpStatus } from "@nestjs/common";
73
+ import { BaseExceptionFilter } from "@nestjs/core";
74
+ var CrashLensFilter = class extends BaseExceptionFilter {
75
+ constructor(crashLens) {
76
+ super();
77
+ this.crashLens = crashLens;
78
+ }
79
+ catch(exception, host) {
80
+ const status = exception instanceof HttpException ? exception.getStatus() : HttpStatus.INTERNAL_SERVER_ERROR;
81
+ const request = host.switchToHttp().getRequest();
82
+ const message = exception instanceof Error ? exception.message : String(exception);
83
+ this.crashLens.captureException(exception, {
84
+ context: "nestjs-exception-filter",
85
+ handled: false,
86
+ tags: {
87
+ httpStatus: String(status),
88
+ httpMethod: request?.method
89
+ },
90
+ extra: {
91
+ url: request?.url,
92
+ method: request?.method,
93
+ statusCode: status,
94
+ error: message
95
+ }
96
+ });
97
+ super.catch(exception, host);
98
+ }
99
+ };
100
+ CrashLensFilter = __decorateClass([
101
+ Catch()
102
+ ], CrashLensFilter);
103
+
104
+ // src/crash-lens.interceptor.ts
105
+ import { Injectable as Injectable2 } from "@nestjs/common";
106
+ import { throwError } from "rxjs";
107
+ import { catchError, tap } from "rxjs/operators";
108
+ var CrashLensInterceptor = class {
109
+ constructor(crashLens) {
110
+ this.crashLens = crashLens;
111
+ }
112
+ intercept(context, next) {
113
+ const request = context.switchToHttp().getRequest();
114
+ if (request) {
115
+ this.crashLens.addBreadcrumb({
116
+ message: `${request.method ?? "GET"} ${request.url ?? "/"}`,
117
+ type: "request",
118
+ category: "http",
119
+ data: { method: request.method, url: request.url }
120
+ });
121
+ }
122
+ return next.handle().pipe(
123
+ tap({
124
+ error: (error) => {
125
+ this.crashLens.captureException(error, {
126
+ handled: false,
127
+ context: "context.interceptor",
128
+ tags: { httpMethod: request?.method },
129
+ extra: { url: request?.url }
130
+ });
131
+ }
132
+ }),
133
+ catchError((error) => throwError(() => error))
134
+ );
135
+ }
136
+ };
137
+ CrashLensInterceptor = __decorateClass([
138
+ Injectable2()
139
+ ], CrashLensInterceptor);
140
+
141
+ // src/crash-lens.module.ts
142
+ var CRASH_LENS_OPTIONS = /* @__PURE__ */ Symbol("CRASH_LENS_OPTIONS");
143
+ var CrashLensModule = class {
144
+ static forRoot(options) {
145
+ const providers = [
146
+ { provide: CRASH_LENS_OPTIONS, useValue: options },
147
+ CrashLensService
148
+ ];
149
+ if (options.globalFilter !== false) {
150
+ providers.push({ provide: APP_FILTER, useClass: CrashLensFilter });
151
+ }
152
+ if (options.globalInterceptor !== false) {
153
+ providers.push({ provide: APP_INTERCEPTOR, useClass: CrashLensInterceptor });
154
+ }
155
+ return {
156
+ module: CrashLensModule,
157
+ global: true,
158
+ providers,
159
+ exports: [CrashLensService]
160
+ };
161
+ }
162
+ };
163
+ CrashLensModule = __decorateClass([
164
+ Global()
165
+ ], CrashLensModule);
166
+
167
+ // src/index.ts
168
+ import { initNode as initNode2 } from "@crashlensorg/node";
169
+ import { CrashLens as CrashLens2 } from "@crashlensorg/node";
170
+ export {
171
+ CrashLens2 as CrashLens,
172
+ CrashLensFilter,
173
+ CrashLensInterceptor,
174
+ CrashLensModule,
175
+ CrashLensService,
176
+ initNode2 as initNode
177
+ };
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@crashlensorg/nestjs",
3
+ "version": "0.1.0",
4
+ "description": "CrashLens integração com NestJS — módulo, filtro global de exceções e interceptor HTTP",
5
+ "license": "MIT",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.mjs",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.mjs",
13
+ "require": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": ["dist"],
17
+ "publishConfig": {
18
+ "access": "public"
19
+ },
20
+ "scripts": {
21
+ "build": "tsup src/index.ts --format cjs,esm --dts --clean --external @nestjs/common --external @nestjs/core --external @nestjs/platform-express --external @nestjs/websockets --external @nestjs/microservices --external rxjs --external reflect-metadata",
22
+ "typecheck": "tsc --noEmit"
23
+ },
24
+ "dependencies": {
25
+ "@crashlensorg/node": "0.1.0"
26
+ },
27
+ "peerDependencies": {
28
+ "@nestjs/common": "^9.0.0 || ^10.0.0 || ^11.0.0",
29
+ "reflect-metadata": "^0.2.0",
30
+ "rxjs": "^7.0.0"
31
+ },
32
+ "devDependencies": {
33
+ "@nestjs/common": "^10.4.0",
34
+ "@nestjs/core": "^10.4.0",
35
+ "reflect-metadata": "^0.2.2",
36
+ "rxjs": "^7.8.0"
37
+ },
38
+ "keywords": ["crashlens", "nestjs", "error-monitoring", "crash-reporting", "sentry-alternative"]
39
+ }