@interfere/nest 0.0.1-canary.4 → 0.1.0-canary.10

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 (33) hide show
  1. package/README.md +59 -14
  2. package/dist/_virtual/{_@oxc-project_runtime@0.132.0/helpers → _@oxc-project_runtime@0.137.0/helpers/esm}/decorate.cjs +1 -1
  3. package/dist/_virtual/{_@oxc-project_runtime@0.132.0/helpers → _@oxc-project_runtime@0.137.0/helpers/esm}/decorate.mjs +1 -1
  4. package/dist/_virtual/{_@oxc-project_runtime@0.132.0/helpers/decorateMetadata.mjs → _@oxc-project_runtime@0.137.0/helpers/esm/decorateMetadata.cjs} +1 -1
  5. package/dist/_virtual/{_@oxc-project_runtime@0.132.0/helpers/decorateMetadata.cjs → _@oxc-project_runtime@0.137.0/helpers/esm/decorateMetadata.mjs} +1 -1
  6. package/dist/_virtual/_@oxc-project_runtime@0.137.0/helpers/esm/decorateParam.cjs +1 -0
  7. package/dist/_virtual/{_@oxc-project_runtime@0.132.0/helpers → _@oxc-project_runtime@0.137.0/helpers/esm}/decorateParam.mjs +1 -1
  8. package/dist/exception-filter.cjs +1 -1
  9. package/dist/exception-filter.d.cts +1 -2
  10. package/dist/exception-filter.d.mts +1 -2
  11. package/dist/exception-filter.mjs +1 -2
  12. package/dist/init.d.cts +1 -2
  13. package/dist/init.d.mts +1 -2
  14. package/dist/init.mjs +1 -2
  15. package/dist/instrument.cjs +1 -0
  16. package/dist/instrument.d.cts +3 -0
  17. package/dist/instrument.d.mts +3 -0
  18. package/dist/instrument.mjs +1 -0
  19. package/dist/module-entry.cjs +1 -0
  20. package/dist/module-entry.d.cts +3 -0
  21. package/dist/module-entry.d.mts +3 -0
  22. package/dist/module-entry.mjs +1 -0
  23. package/dist/module.cjs +1 -1
  24. package/dist/module.d.cts +1 -2
  25. package/dist/module.d.mts +1 -2
  26. package/dist/module.mjs +1 -2
  27. package/dist/nest-instrumentation.d.cts +1 -2
  28. package/dist/nest-instrumentation.d.mts +1 -2
  29. package/dist/nest-instrumentation.mjs +1 -2
  30. package/dist/package.cjs +1 -1
  31. package/dist/package.mjs +1 -2
  32. package/package.json +34 -12
  33. package/dist/_virtual/_@oxc-project_runtime@0.132.0/helpers/decorateParam.cjs +0 -1
package/README.md CHANGED
@@ -1,26 +1,46 @@
1
1
  # @interfere/nest
2
2
 
3
- > **Status: canary.** Pre-1.0 API, expect breaking changes. Pin to a specific `10.0.0-canary.N` in CI.
4
-
5
- NestJS SDK for [Interfere](https://interfere.com). Wraps [`@interfere/node`](../node) with a global exception filter and OTel auto-instrumentation for controllers, guards, pipes, interceptors, and middleware.
3
+ NestJS SDK for [Interfere](https://interfere.com). Auto-captures uncaught exceptions and creates per-request spans for controllers, guards, pipes, interceptors, and middleware.
6
4
 
7
5
  ## Install
8
6
 
9
7
  ```sh
8
+ npm install @interfere/nest
9
+ # or
10
10
  bun add @interfere/nest
11
+ # or
12
+ pnpm add @interfere/nest
11
13
  ```
12
14
 
13
- ## Usage
15
+ ## Setup
16
+
17
+ The SDK uses two subpath imports to avoid loading `@nestjs/*` before instrumentation hooks are registered:
18
+
19
+ - `@interfere/nest/instrument` — SDK init, error capture, span utilities (no `@nestjs/*` imports)
20
+ - `@interfere/nest/module` — `InterfereModule` and `InterfereExceptionFilter` (imports `@nestjs/*`)
21
+
22
+ ### 1. Create `instrument.ts`
23
+
24
+ This file must be imported before any `@nestjs/*` module. It registers OTel instrumentation hooks that patch NestJS internals for automatic span creation.
14
25
 
15
26
  ```ts
16
- // instrument.ts — must run before @nestjs/core is imported
17
- import { init } from "@interfere/nest";
18
- init({ serviceName: "my-api", debug: true });
27
+ // src/instrument.ts
28
+ import { init } from "@interfere/nest/instrument";
29
+
30
+ init({
31
+ serviceName: "my-api",
32
+ debug: true, // logs init status and exporter results to stdout
33
+ });
19
34
  ```
20
35
 
36
+ `init()` is synchronous and works in both ESM and CJS projects.
37
+
38
+ ### 2. Import it first in `main.ts`
39
+
21
40
  ```ts
22
- // main.ts
41
+ // src/main.ts
23
42
  import "./instrument";
43
+
24
44
  import { NestFactory } from "@nestjs/core";
25
45
  import { AppModule } from "./app.module";
26
46
 
@@ -31,10 +51,14 @@ async function bootstrap() {
31
51
  bootstrap();
32
52
  ```
33
53
 
54
+ ### 3. Register the module in `app.module.ts`
55
+
56
+ `InterfereModule.forRoot()` registers a global exception filter that captures 5xx errors and uncaught throws. 4xx responses (client errors) are not reported — they still produce OTel request spans but don't create error events.
57
+
34
58
  ```ts
35
- // app.module.ts
59
+ // src/app.module.ts
36
60
  import { Module } from "@nestjs/common";
37
- import { InterfereModule } from "@interfere/nest";
61
+ import { InterfereModule } from "@interfere/nest/module";
38
62
 
39
63
  @Module({ imports: [InterfereModule.forRoot()] })
40
64
  export class AppModule {}
@@ -42,7 +66,11 @@ export class AppModule {}
42
66
 
43
67
  ## Build & Deploy
44
68
 
45
- Add a `postbuild` script so source maps are uploaded and the release is registered with the collector:
69
+ Install [`@interfere/cli`](../cli) as a dev dependency and add a `postbuild` script so source maps are uploaded and the release is registered with the collector. Without this step, the collector will reject spans from production deployments.
70
+
71
+ ```sh
72
+ npm install -D @interfere/cli
73
+ ```
46
74
 
47
75
  ```json
48
76
  {
@@ -53,11 +81,28 @@ Add a `postbuild` script so source maps are uploaded and the release is register
53
81
  }
54
82
  ```
55
83
 
84
+ The CLI derives the release slug from the same commit SHA the SDK uses at runtime (`INTERFERE_SOURCE_ID`, `GITHUB_SHA`, `VERCEL_GIT_COMMIT_SHA`, or `git rev-parse HEAD`). Both must see the same SHA for the slugs to match. See the [`@interfere/cli` README](../cli) for full options, Docker examples, and CI setup.
85
+
56
86
  ## Environment Variables
57
87
 
58
88
  | Variable | Where | Purpose |
59
89
  |---|---|---|
60
- | `INTERFERE_PUBLIC_KEY` | Runtime | Routes spans to your surface (`interfere_pk_*`) |
61
- | `INTERFERE_API_KEY` | CI / Build | Uploads source maps and registers releases (`interfere_ak_*`) |
90
+ | `INTERFERE_PUBLIC_KEY` | Runtime | Routes spans to your surface (`interfere_pub_us_*` or `interfere_pub_eu_*`) |
91
+ | `INTERFERE_API_KEY` | CI / Build | Authenticates source map uploads and release registration (`interfere_secret_us_*` or `interfere_secret_eu_*`) |
92
+ | `INTERFERE_SOURCE_ID` | Both | Override the commit SHA used to derive the release slug. Falls back to `GITHUB_SHA`, `VERCEL_GIT_COMMIT_SHA`, or `git rev-parse HEAD`. |
93
+ | `INTERFERE_DEBUG` | Runtime | Set to `1` to enable debug logging without changing code. Equivalent to `debug: true` in `init()`. |
94
+
95
+ ## What gets captured
96
+
97
+ | Signal | When | Subpath |
98
+ |---|---|---|
99
+ | Request spans (middleware, guards, pipes, interceptors) | Every HTTP request | `@interfere/nest/instrument` |
100
+ | Error events (5xx, uncaught throws) | Exceptions that reach the global filter | `@interfere/nest/module` |
101
+ | Manual spans (`withSpan`, `captureError`) | Anywhere in your code | `@interfere/nest/instrument` |
102
+
103
+ ## Compatibility
62
104
 
63
- Full docs at <https://interfere.com/docs>.
105
+ - NestJS 10.x and 11.x
106
+ - Node.js >= 18.19.0
107
+ - Works with Express (default) and Fastify adapters
108
+ - CJS and ESM projects
@@ -1 +1 @@
1
- function __decorate(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect==`object`&&typeof Reflect.decorate==`function`)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r}exports.__decorate=__decorate;
1
+ function __decorate(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect==`object`&&typeof Reflect.decorate==`function`)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r}exports.default=__decorate;
@@ -1 +1 @@
1
- function __decorate(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect==`object`&&typeof Reflect.decorate==`function`)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r}export{__decorate};
1
+ function __decorate(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect==`object`&&typeof Reflect.decorate==`function`)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r}export{__decorate as default};
@@ -1 +1 @@
1
- function __decorateMetadata(k,v){if(typeof Reflect==`object`&&typeof Reflect.metadata==`function`)return Reflect.metadata(k,v)}export{__decorateMetadata};
1
+ function __decorateMetadata(k,v){if(typeof Reflect==`object`&&typeof Reflect.metadata==`function`)return Reflect.metadata(k,v)}exports.default=__decorateMetadata;
@@ -1 +1 @@
1
- function __decorateMetadata(k,v){if(typeof Reflect==`object`&&typeof Reflect.metadata==`function`)return Reflect.metadata(k,v)}exports.__decorateMetadata=__decorateMetadata;
1
+ function __decorateMetadata(k,v){if(typeof Reflect==`object`&&typeof Reflect.metadata==`function`)return Reflect.metadata(k,v)}export{__decorateMetadata as default};
@@ -0,0 +1 @@
1
+ function __decorateParam(paramIndex,decorator){return function(target,key){decorator(target,key,paramIndex)}}exports.default=__decorateParam;
@@ -1 +1 @@
1
- function __decorateParam(paramIndex,decorator){return function(target,key){decorator(target,key,paramIndex)}}export{__decorateParam};
1
+ function __decorateParam(paramIndex,decorator){return function(target,key){decorator(target,key,paramIndex)}}export{__decorateParam as default};
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const require_decorateMetadata=require("./_virtual/_@oxc-project_runtime@0.132.0/helpers/decorateMetadata.cjs"),require_decorateParam=require("./_virtual/_@oxc-project_runtime@0.132.0/helpers/decorateParam.cjs"),require_decorate=require("./_virtual/_@oxc-project_runtime@0.132.0/helpers/decorate.cjs");let _interfere_node=require("@interfere/node"),_nestjs_common=require("@nestjs/common"),_nestjs_core=require("@nestjs/core");var _ref;let InterfereExceptionFilter=class extends _nestjs_core.BaseExceptionFilter{constructor(adapterHost){super(adapterHost?.httpAdapter)}catch(exception,host){this.shouldReport(exception)&&(0,_interfere_node.captureError)(exception,this.extractRequest(host)),super.catch(exception,host)}shouldReport(exception){return exception instanceof _nestjs_common.HttpException?exception.getStatus()>=500:!0}extractRequest(host){if(host.getType()===`http`)return host.switchToHttp().getRequest()}};InterfereExceptionFilter=require_decorate.__decorate([(0,_nestjs_common.Catch)(),require_decorateParam.__decorateParam(0,(0,_nestjs_common.Optional)()),require_decorateParam.__decorateParam(0,(0,_nestjs_common.Inject)(_nestjs_core.HttpAdapterHost)),require_decorateMetadata.__decorateMetadata(`design:paramtypes`,[typeof(_ref=_nestjs_core.HttpAdapterHost!==void 0&&_nestjs_core.HttpAdapterHost)==`function`?_ref:Object])],InterfereExceptionFilter),Object.defineProperty(exports,"InterfereExceptionFilter",{enumerable:!0,get:function(){return InterfereExceptionFilter}});
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const require_decorateMetadata=require("./_virtual/_@oxc-project_runtime@0.137.0/helpers/esm/decorateMetadata.cjs"),require_decorateParam=require("./_virtual/_@oxc-project_runtime@0.137.0/helpers/esm/decorateParam.cjs"),require_decorate=require("./_virtual/_@oxc-project_runtime@0.137.0/helpers/esm/decorate.cjs");let _interfere_node=require("@interfere/node"),_nestjs_common=require("@nestjs/common"),_nestjs_core=require("@nestjs/core"),InterfereExceptionFilter=class extends _nestjs_core.BaseExceptionFilter{constructor(adapterHost){super(adapterHost?.httpAdapter)}catch(exception,host){this.shouldReport(exception)&&(0,_interfere_node.captureError)(exception,this.extractRequest(host)),super.catch(exception,host)}shouldReport(exception){return exception instanceof _nestjs_common.HttpException?exception.getStatus()>=500:!0}extractRequest(host){if(host.getType()===`http`)return host.switchToHttp().getRequest()}};InterfereExceptionFilter=require_decorate.default([(0,_nestjs_common.Catch)(),require_decorateParam.default(0,(0,_nestjs_common.Optional)()),require_decorateParam.default(0,(0,_nestjs_common.Inject)(_nestjs_core.HttpAdapterHost)),require_decorateMetadata.default(`design:paramtypes`,[_nestjs_core.HttpAdapterHost===void 0?Object:_nestjs_core.HttpAdapterHost])],InterfereExceptionFilter),Object.defineProperty(exports,"InterfereExceptionFilter",{enumerable:!0,get:function(){return InterfereExceptionFilter}});
@@ -15,5 +15,4 @@ declare class InterfereExceptionFilter extends BaseExceptionFilter implements Ex
15
15
  private extractRequest;
16
16
  }
17
17
  //#endregion
18
- export { InterfereExceptionFilter };
19
- //# sourceMappingURL=exception-filter.d.cts.map
18
+ export { InterfereExceptionFilter };
@@ -15,5 +15,4 @@ declare class InterfereExceptionFilter extends BaseExceptionFilter implements Ex
15
15
  private extractRequest;
16
16
  }
17
17
  //#endregion
18
- export { InterfereExceptionFilter };
19
- //# sourceMappingURL=exception-filter.d.mts.map
18
+ export { InterfereExceptionFilter };
@@ -1,2 +1 @@
1
- import{__decorateMetadata}from"./_virtual/_@oxc-project_runtime@0.132.0/helpers/decorateMetadata.mjs";import{__decorateParam}from"./_virtual/_@oxc-project_runtime@0.132.0/helpers/decorateParam.mjs";import{__decorate}from"./_virtual/_@oxc-project_runtime@0.132.0/helpers/decorate.mjs";import{captureError}from"@interfere/node";import{Catch,HttpException,Inject,Optional}from"@nestjs/common";import{BaseExceptionFilter,HttpAdapterHost}from"@nestjs/core";var _ref;let InterfereExceptionFilter=class extends BaseExceptionFilter{constructor(adapterHost){super(adapterHost?.httpAdapter)}catch(exception,host){this.shouldReport(exception)&&captureError(exception,this.extractRequest(host)),super.catch(exception,host)}shouldReport(exception){return exception instanceof HttpException?exception.getStatus()>=500:!0}extractRequest(host){if(host.getType()===`http`)return host.switchToHttp().getRequest()}};InterfereExceptionFilter=__decorate([Catch(),__decorateParam(0,Optional()),__decorateParam(0,Inject(HttpAdapterHost)),__decorateMetadata(`design:paramtypes`,[typeof(_ref=HttpAdapterHost!==void 0&&HttpAdapterHost)==`function`?_ref:Object])],InterfereExceptionFilter);export{InterfereExceptionFilter};
2
- //# sourceMappingURL=exception-filter.mjs.map
1
+ import __decorateMetadata from"./_virtual/_@oxc-project_runtime@0.137.0/helpers/esm/decorateMetadata.mjs";import __decorateParam from"./_virtual/_@oxc-project_runtime@0.137.0/helpers/esm/decorateParam.mjs";import __decorate from"./_virtual/_@oxc-project_runtime@0.137.0/helpers/esm/decorate.mjs";import{captureError}from"@interfere/node";import{Catch,HttpException,Inject,Optional}from"@nestjs/common";import{BaseExceptionFilter,HttpAdapterHost}from"@nestjs/core";let InterfereExceptionFilter=class extends BaseExceptionFilter{constructor(adapterHost){super(adapterHost?.httpAdapter)}catch(exception,host){this.shouldReport(exception)&&captureError(exception,this.extractRequest(host)),super.catch(exception,host)}shouldReport(exception){return exception instanceof HttpException?exception.getStatus()>=500:!0}extractRequest(host){if(host.getType()===`http`)return host.switchToHttp().getRequest()}};InterfereExceptionFilter=__decorate([Catch(),__decorateParam(0,Optional()),__decorateParam(0,Inject(HttpAdapterHost)),__decorateMetadata(`design:paramtypes`,[HttpAdapterHost===void 0?Object:HttpAdapterHost])],InterfereExceptionFilter);export{InterfereExceptionFilter};
package/dist/init.d.cts CHANGED
@@ -17,5 +17,4 @@ import { InitOptions, InitOptions as InitOptions$1 } from "@interfere/node";
17
17
  */
18
18
  declare function init(options?: InitOptions$1): void;
19
19
  //#endregion
20
- export { type InitOptions, init };
21
- //# sourceMappingURL=init.d.cts.map
20
+ export { type InitOptions, init };
package/dist/init.d.mts CHANGED
@@ -17,5 +17,4 @@ import { InitOptions, InitOptions as InitOptions$1 } from "@interfere/node";
17
17
  */
18
18
  declare function init(options?: InitOptions$1): void;
19
19
  //#endregion
20
- export { type InitOptions, init };
21
- //# sourceMappingURL=init.d.mts.map
20
+ export { type InitOptions, init };
package/dist/init.mjs CHANGED
@@ -1,2 +1 @@
1
- import{InterfereNestInstrumentation}from"./nest-instrumentation.mjs";import{register}from"node:module";import{init as init$1}from"@interfere/node";import{registerInstrumentations}from"@opentelemetry/instrumentation";import{NestInstrumentation}from"@opentelemetry/instrumentation-nestjs-core";const INIT_KEY=`__interfereNestInitialized__`,g=globalThis;function init(options={}){g[INIT_KEY]||(typeof register==`function`&&register(`import-in-the-middle/hook.mjs`,import.meta.url),init$1(options),registerInstrumentations({instrumentations:[new NestInstrumentation,new InterfereNestInstrumentation]}),g[INIT_KEY]=!0)}export{init};
2
- //# sourceMappingURL=init.mjs.map
1
+ import{InterfereNestInstrumentation}from"./nest-instrumentation.mjs";import{register}from"node:module";import{init as init$1}from"@interfere/node";import{registerInstrumentations}from"@opentelemetry/instrumentation";import{NestInstrumentation}from"@opentelemetry/instrumentation-nestjs-core";const INIT_KEY=`__interfereNestInitialized__`,g=globalThis;function init(options={}){g[INIT_KEY]||(typeof register==`function`&&register(`import-in-the-middle/hook.mjs`,import.meta.url),init$1(options),registerInstrumentations({instrumentations:[new NestInstrumentation,new InterfereNestInstrumentation]}),g[INIT_KEY]=!0)}export{init};
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const require_init=require("./init.cjs");let _interfere_node=require("@interfere/node");Object.defineProperty(exports,"captureError",{enumerable:!0,get:function(){return _interfere_node.captureError}}),Object.defineProperty(exports,"captureMessage",{enumerable:!0,get:function(){return _interfere_node.captureMessage}}),Object.defineProperty(exports,"close",{enumerable:!0,get:function(){return _interfere_node.close}}),Object.defineProperty(exports,"flush",{enumerable:!0,get:function(){return _interfere_node.flush}}),exports.init=require_init.init,Object.defineProperty(exports,"withSpan",{enumerable:!0,get:function(){return _interfere_node.withSpan}});
@@ -0,0 +1,3 @@
1
+ import { InitOptions, init } from "./init.cjs";
2
+ import { CaptureErrorContext, captureError, captureMessage, close, flush, withSpan } from "@interfere/node";
3
+ export { type CaptureErrorContext, type InitOptions, captureError, captureMessage, close, flush, init, withSpan };
@@ -0,0 +1,3 @@
1
+ import { InitOptions, init } from "./init.mjs";
2
+ import { CaptureErrorContext, captureError, captureMessage, close, flush, withSpan } from "@interfere/node";
3
+ export { type CaptureErrorContext, type InitOptions, captureError, captureMessage, close, flush, init, withSpan };
@@ -0,0 +1 @@
1
+ import{init}from"./init.mjs";import{captureError,captureMessage,close,flush,withSpan}from"@interfere/node";export{captureError,captureMessage,close,flush,init,withSpan};
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const require_exception_filter=require("./exception-filter.cjs"),require_module=require("./module.cjs");Object.defineProperty(exports,"InterfereExceptionFilter",{enumerable:!0,get:function(){return require_exception_filter.InterfereExceptionFilter}}),Object.defineProperty(exports,"InterfereModule",{enumerable:!0,get:function(){return require_module.InterfereModule}});
@@ -0,0 +1,3 @@
1
+ import { InterfereExceptionFilter } from "./exception-filter.cjs";
2
+ import { InterfereModule } from "./module.cjs";
3
+ export { InterfereExceptionFilter, InterfereModule };
@@ -0,0 +1,3 @@
1
+ import { InterfereExceptionFilter } from "./exception-filter.mjs";
2
+ import { InterfereModule } from "./module.mjs";
3
+ export { InterfereExceptionFilter, InterfereModule };
@@ -0,0 +1 @@
1
+ import{InterfereExceptionFilter}from"./exception-filter.mjs";import{InterfereModule}from"./module.mjs";export{InterfereExceptionFilter,InterfereModule};
package/dist/module.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const require_decorate=require("./_virtual/_@oxc-project_runtime@0.132.0/helpers/decorate.cjs"),require_exception_filter=require("./exception-filter.cjs");let _nestjs_common=require("@nestjs/common"),_nestjs_core=require("@nestjs/core");var _InterfereModule;let InterfereModule=_InterfereModule=class{static forRoot(){return{module:_InterfereModule,providers:[{provide:_nestjs_core.APP_FILTER,useClass:require_exception_filter.InterfereExceptionFilter}]}}};InterfereModule=_InterfereModule=require_decorate.__decorate([(0,_nestjs_common.Module)({})],InterfereModule),Object.defineProperty(exports,"InterfereModule",{enumerable:!0,get:function(){return InterfereModule}});
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const require_decorate=require("./_virtual/_@oxc-project_runtime@0.137.0/helpers/esm/decorate.cjs"),require_exception_filter=require("./exception-filter.cjs");let _nestjs_common=require("@nestjs/common"),_nestjs_core=require("@nestjs/core");var _InterfereModule;let InterfereModule=_InterfereModule=class{static forRoot(){return{module:_InterfereModule,providers:[{provide:_nestjs_core.APP_FILTER,useClass:require_exception_filter.InterfereExceptionFilter}]}}};InterfereModule=_InterfereModule=require_decorate.default([(0,_nestjs_common.Module)({})],InterfereModule),Object.defineProperty(exports,"InterfereModule",{enumerable:!0,get:function(){return InterfereModule}});
package/dist/module.d.cts CHANGED
@@ -10,5 +10,4 @@ declare class InterfereModule {
10
10
  static forRoot(): DynamicModule;
11
11
  }
12
12
  //#endregion
13
- export { InterfereModule };
14
- //# sourceMappingURL=module.d.cts.map
13
+ export { InterfereModule };
package/dist/module.d.mts CHANGED
@@ -10,5 +10,4 @@ declare class InterfereModule {
10
10
  static forRoot(): DynamicModule;
11
11
  }
12
12
  //#endregion
13
- export { InterfereModule };
14
- //# sourceMappingURL=module.d.mts.map
13
+ export { InterfereModule };
package/dist/module.mjs CHANGED
@@ -1,2 +1 @@
1
- import{__decorate}from"./_virtual/_@oxc-project_runtime@0.132.0/helpers/decorate.mjs";import{InterfereExceptionFilter}from"./exception-filter.mjs";import{Module}from"@nestjs/common";import{APP_FILTER}from"@nestjs/core";var _InterfereModule;let InterfereModule=_InterfereModule=class{static forRoot(){return{module:_InterfereModule,providers:[{provide:APP_FILTER,useClass:InterfereExceptionFilter}]}}};InterfereModule=_InterfereModule=__decorate([Module({})],InterfereModule);export{InterfereModule};
2
- //# sourceMappingURL=module.mjs.map
1
+ import __decorate from"./_virtual/_@oxc-project_runtime@0.137.0/helpers/esm/decorate.mjs";import{InterfereExceptionFilter}from"./exception-filter.mjs";import{Module}from"@nestjs/common";import{APP_FILTER}from"@nestjs/core";var _InterfereModule;let InterfereModule=_InterfereModule=class{static forRoot(){return{module:_InterfereModule,providers:[{provide:APP_FILTER,useClass:InterfereExceptionFilter}]}}};InterfereModule=_InterfereModule=__decorate([Module({})],InterfereModule);export{InterfereModule};
@@ -8,5 +8,4 @@ declare class InterfereNestInstrumentation extends InstrumentationBase {
8
8
  private wrapInjectable;
9
9
  }
10
10
  //#endregion
11
- export { InterfereNestInstrumentation };
12
- //# sourceMappingURL=nest-instrumentation.d.cts.map
11
+ export { InterfereNestInstrumentation };
@@ -8,5 +8,4 @@ declare class InterfereNestInstrumentation extends InstrumentationBase {
8
8
  private wrapInjectable;
9
9
  }
10
10
  //#endregion
11
- export { InterfereNestInstrumentation };
12
- //# sourceMappingURL=nest-instrumentation.d.mts.map
11
+ export { InterfereNestInstrumentation };
@@ -1,2 +1 @@
1
- import{name,version}from"./package.mjs";import{InstrumentationBase,InstrumentationNodeModuleDefinition,InstrumentationNodeModuleFile,isWrapped}from"@opentelemetry/instrumentation";import{SpanKind,SpanStatusCode,context,trace}from"@opentelemetry/api";const SUPPORTED_VERSIONS=[`>=8.0.0 <12`],COMPONENT=`@nestjs/common`;var InterfereNestInstrumentation=class extends InstrumentationBase{constructor(config={}){super(name,version,config)}init(){let moduleDef=new InstrumentationNodeModuleDefinition(COMPONENT,SUPPORTED_VERSIONS);return moduleDef.files.push(this.getInjectableInstrumentation(SUPPORTED_VERSIONS)),moduleDef}getInjectableInstrumentation(versions){return new InstrumentationNodeModuleFile(`@nestjs/common/decorators/core/injectable.decorator.js`,versions,moduleExports=>(isWrapped(moduleExports.Injectable)&&this._unwrap(moduleExports,`Injectable`),this._wrap(moduleExports,`Injectable`,original=>this.wrapInjectable(original)),moduleExports),moduleExports=>{this._unwrap(moduleExports,`Injectable`)})}wrapInjectable(original){let tracer=this.tracer;return function(options){return target=>target.__INTERFERE_PATCHED__?original(options)(target):(target.__INTERFERE_PATCHED__=!0,typeof target.prototype.use==`function`&&patchMethod(tracer,target,`use`,`middleware.nestjs`),typeof target.prototype.canActivate==`function`&&patchMethod(tracer,target,`canActivate`,`guard.nestjs`),typeof target.prototype.transform==`function`&&patchMethod(tracer,target,`transform`,`pipe.nestjs`),typeof target.prototype.intercept==`function`&&patchMethod(tracer,target,`intercept`,`interceptor.nestjs`),original(options)(target))}}};function patchMethod(tracer,target,method,op){let original=target.prototype[method];target.prototype[method]=function(...args){let span=tracer.startSpan(`${target.name}.${method}`,{kind:SpanKind.INTERNAL,attributes:{component:COMPONENT,"nestjs.type":op,"nestjs.callback":method,"nestjs.controller":target.name}}),ctx=trace.setSpan(context.active(),span);return context.with(ctx,()=>{try{let result=original.apply(this,args);return result&&typeof result.then==`function`?result.then(v=>(span.end(),v),err=>{throw span.recordException(err),span.setStatus({code:SpanStatusCode.ERROR}),span.end(),err}):(span.end(),result)}catch(err){throw span.recordException(err),span.setStatus({code:SpanStatusCode.ERROR}),span.end(),err}})}}export{InterfereNestInstrumentation};
2
- //# sourceMappingURL=nest-instrumentation.mjs.map
1
+ import{name,version}from"./package.mjs";import{InstrumentationBase,InstrumentationNodeModuleDefinition,InstrumentationNodeModuleFile,isWrapped}from"@opentelemetry/instrumentation";import{SpanKind,SpanStatusCode,context,trace}from"@opentelemetry/api";const SUPPORTED_VERSIONS=[`>=8.0.0 <12`],COMPONENT=`@nestjs/common`;var InterfereNestInstrumentation=class extends InstrumentationBase{constructor(config={}){super(name,version,config)}init(){let moduleDef=new InstrumentationNodeModuleDefinition(COMPONENT,SUPPORTED_VERSIONS);return moduleDef.files.push(this.getInjectableInstrumentation(SUPPORTED_VERSIONS)),moduleDef}getInjectableInstrumentation(versions){return new InstrumentationNodeModuleFile(`@nestjs/common/decorators/core/injectable.decorator.js`,versions,moduleExports=>(isWrapped(moduleExports.Injectable)&&this._unwrap(moduleExports,`Injectable`),this._wrap(moduleExports,`Injectable`,original=>this.wrapInjectable(original)),moduleExports),moduleExports=>{this._unwrap(moduleExports,`Injectable`)})}wrapInjectable(original){let tracer=this.tracer;return function(options){return target=>target.__INTERFERE_PATCHED__?original(options)(target):(target.__INTERFERE_PATCHED__=!0,typeof target.prototype.use==`function`&&patchMethod(tracer,target,`use`,`middleware.nestjs`),typeof target.prototype.canActivate==`function`&&patchMethod(tracer,target,`canActivate`,`guard.nestjs`),typeof target.prototype.transform==`function`&&patchMethod(tracer,target,`transform`,`pipe.nestjs`),typeof target.prototype.intercept==`function`&&patchMethod(tracer,target,`intercept`,`interceptor.nestjs`),original(options)(target))}}};function patchMethod(tracer,target,method,op){let original=target.prototype[method];target.prototype[method]=function(...args){let span=tracer.startSpan(`${target.name}.${method}`,{kind:SpanKind.INTERNAL,attributes:{component:COMPONENT,"nestjs.type":op,"nestjs.callback":method,"nestjs.controller":target.name}}),ctx=trace.setSpan(context.active(),span);return context.with(ctx,()=>{try{let result=original.apply(this,args);return result&&typeof result.then==`function`?result.then(v=>(span.end(),v),err=>{throw span.recordException(err),span.setStatus({code:SpanStatusCode.ERROR}),span.end(),err}):(span.end(),result)}catch(err){throw span.recordException(err),span.setStatus({code:SpanStatusCode.ERROR}),span.end(),err}})}}export{InterfereNestInstrumentation};
package/dist/package.cjs CHANGED
@@ -1 +1 @@
1
- var name=`@interfere/nest`,version=`0.0.1-canary.4`;Object.defineProperty(exports,"name",{enumerable:!0,get:function(){return name}}),Object.defineProperty(exports,"version",{enumerable:!0,get:function(){return version}});
1
+ Object.defineProperty(exports,"name",{enumerable:!0,get:function(){return`@interfere/nest`}}),Object.defineProperty(exports,"version",{enumerable:!0,get:function(){return`0.1.0-canary.10`}});
package/dist/package.mjs CHANGED
@@ -1,2 +1 @@
1
- var name=`@interfere/nest`,version=`0.0.1-canary.4`;export{name,version};
2
- //# sourceMappingURL=package.mjs.map
1
+ var name=`@interfere/nest`,version=`0.1.0-canary.10`;export{name,version};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@interfere/nest",
3
- "version": "0.0.1-canary.4",
3
+ "version": "0.1.0-canary.10",
4
4
  "license": "MIT",
5
5
  "description": "NestJS SDK for Interfere. Auto-captures uncaught exceptions from controllers, providers, and middleware via a global ExceptionFilter, plus re-exports the @interfere/node OTel instrumentation.",
6
6
  "keywords": [
@@ -18,7 +18,7 @@
18
18
  "author": "Interfere <support@interfere.com> (https://interfere.com)",
19
19
  "repository": {
20
20
  "type": "git",
21
- "url": "git+https://github.com/interfere-inc/interfere.git",
21
+ "url": "git+https://interfere.ghe.com/interfere/interfere.git",
22
22
  "directory": "src/packages/public/nest"
23
23
  },
24
24
  "files": [
@@ -43,6 +43,28 @@
43
43
  "types": "./dist/index.d.cts",
44
44
  "default": "./dist/index.cjs"
45
45
  }
46
+ },
47
+ "./instrument": {
48
+ "monorepo": "./src/instrument.ts",
49
+ "import": {
50
+ "types": "./dist/instrument.d.mts",
51
+ "default": "./dist/instrument.mjs"
52
+ },
53
+ "require": {
54
+ "types": "./dist/instrument.d.cts",
55
+ "default": "./dist/instrument.cjs"
56
+ }
57
+ },
58
+ "./module": {
59
+ "monorepo": "./src/module-entry.ts",
60
+ "import": {
61
+ "types": "./dist/module-entry.d.mts",
62
+ "default": "./dist/module-entry.mjs"
63
+ },
64
+ "require": {
65
+ "types": "./dist/module-entry.d.cts",
66
+ "default": "./dist/module-entry.cjs"
67
+ }
46
68
  }
47
69
  },
48
70
  "sideEffects": false,
@@ -52,28 +74,28 @@
52
74
  "scripts": {
53
75
  "build": "tsdown",
54
76
  "test": "vitest run --passWithNoTests",
55
- "typecheck": "tsc --noEmit --incremental"
77
+ "typecheck": "tsc --noEmit"
56
78
  },
57
79
  "dependencies": {
58
- "@interfere/node": "^0.0.1-canary.4",
80
+ "@interfere/node": "^0.1.0-canary.10",
59
81
  "@opentelemetry/api": "^1.9.1",
60
- "@opentelemetry/instrumentation": "^0.218.0",
61
- "@opentelemetry/instrumentation-nestjs-core": "^0.64.0"
82
+ "@opentelemetry/instrumentation": "^0.219.0",
83
+ "@opentelemetry/instrumentation-nestjs-core": "^0.65.0"
62
84
  },
63
85
  "peerDependencies": {
64
86
  "@nestjs/common": "^10.0.0 || ^11.0.0",
65
87
  "@nestjs/core": "^10.0.0 || ^11.0.0"
66
88
  },
67
89
  "devDependencies": {
68
- "@interfere/test-utils": "^9.0.0",
69
- "@interfere/typescript-config": "^9.0.0",
90
+ "@interfere/test-utils": "^9.0.1-canary.1",
91
+ "@interfere/typescript-config": "^9.0.1-canary.1",
70
92
  "@nestjs/common": "^10.0.0 || ^11.0.0",
71
93
  "@nestjs/core": "^10.0.0 || ^11.0.0",
72
- "@types/node": "^24.12.0",
73
- "@vitest/coverage-v8": "^4.1.6",
94
+ "@types/node": "^26.1.0",
95
+ "@vitest/coverage-v8": "4.1.9",
74
96
  "reflect-metadata": "^0.2",
75
- "tsdown": "^0.22.0",
97
+ "tsdown": "^0.22.2",
76
98
  "typescript": "^6.0.3",
77
- "vitest": "^4.1.6"
99
+ "vitest": "4.1.9"
78
100
  }
79
101
  }
@@ -1 +0,0 @@
1
- function __decorateParam(paramIndex,decorator){return function(target,key){decorator(target,key,paramIndex)}}exports.__decorateParam=__decorateParam;