@interfere/react 8.1.0 → 8.1.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"error-boundary.d.mts","names":[],"sources":["../src/error-boundary.tsx"],"mappings":";;;UASiB,kBAAA;EACf,QAAA,EAAU,SAAA;EACV,QAAA,GAAW,SAAA,KAAc,KAAA,EAAO,KAAA,EAAO,KAAA,iBAAsB,SAAA;EAC7D,OAAA,IAAW,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,SAAA;AAAA;AAAA,UAGvB,kBAAA;EACR,KAAA,EAAO,KAAA;AAAA;;;;;;;;cAUI,aAAA,SAAsB,SAAA,CACjC,kBAAA,EACA,kBAAA;EAES,KAAA,EAAO,kBAAA;EAAA,OAET,wBAAA,CAAyB,KAAA,EAAO,KAAA,GAAQ,kBAAA;EAItC,iBAAA,CAAkB,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,SAAA;EAAA,iBAiB9B,KAAA;EAIR,MAAA,CAAA,GAAM,SAAA;AAAA"}
1
+ {"version":3,"file":"error-boundary.d.mts","names":[],"sources":["../src/error-boundary.tsx"],"mappings":";;;UAYiB,kBAAA;EACf,QAAA,EAAU,SAAA;EACV,QAAA,GAAW,SAAA,KAAc,KAAA,EAAO,KAAA,EAAO,KAAA,iBAAsB,SAAA;EAC7D,OAAA,IAAW,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,SAAA;AAAA;AAAA,UAGvB,kBAAA;EACR,KAAA,EAAO,KAAA;AAAA;;;;;;;;cAUI,aAAA,SAAsB,SAAA,CACjC,kBAAA,EACA,kBAAA;EAES,KAAA,EAAO,kBAAA;EAAA,OAET,wBAAA,CAAyB,KAAA,EAAO,KAAA,GAAQ,kBAAA;EAItC,iBAAA,CAAkB,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,SAAA;EAAA,iBAqB9B,KAAA;EAIR,MAAA,CAAA,GAAM,SAAA;AAAA"}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { seen } from "./internal/errors.mjs";
3
3
  import { getClient } from "./internal/client.mjs";
4
- import { toExceptions } from "@interfere/types/sdk/errors";
4
+ import { shouldDropBrowserExtensionNoise, toExceptions } from "@interfere/types/sdk/errors";
5
5
  import { Component } from "react";
6
6
  //#region src/error-boundary.tsx
7
7
  /**
@@ -20,10 +20,11 @@ var ErrorBoundary = class extends Component {
20
20
  if (seen.has(error)) return;
21
21
  seen.add(error);
22
22
  try {
23
- getClient().capture("error", { exceptions: toExceptions(error, {
23
+ const exceptions = toExceptions(error, {
24
24
  type: "react",
25
25
  handled: true
26
- }) });
26
+ });
27
+ if (!shouldDropBrowserExtensionNoise(exceptions)) getClient().capture("error", { exceptions });
27
28
  } catch {}
28
29
  this.props.onError?.(error, info);
29
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"error-boundary.mjs","names":[],"sources":["../src/error-boundary.tsx"],"sourcesContent":["\"use client\";\n\nimport { toExceptions } from \"@interfere/types/sdk/errors\";\n\nimport { Component, type ErrorInfo, type ReactNode } from \"react\";\n\nimport { getClient } from \"./internal/client.js\";\nimport { seen } from \"./internal/errors.js\";\n\nexport interface ErrorBoundaryProps {\n children: ReactNode;\n fallback?: ReactNode | ((error: Error, reset: () => void) => ReactNode);\n onError?: (error: Error, info: ErrorInfo) => void;\n}\n\ninterface ErrorBoundaryState {\n error: Error | null;\n}\n\n/**\n * Catches render-phase React errors, reports them to the SDK, and renders a\n * fallback. Requires the SDK to be bootstrapped via `init()` before React\n * renders so `capture` has an active runtime.\n *\n * Class component required — React has no hook-based error boundary API.\n */\nexport class ErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n override state: ErrorBoundaryState = { error: null };\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { error };\n }\n\n override componentDidCatch(error: Error, info: ErrorInfo) {\n if (seen.has(error)) {\n return;\n }\n seen.add(error);\n\n try {\n getClient().capture(\"error\", {\n exceptions: toExceptions(error, { type: \"react\", handled: true }),\n });\n } catch {\n // SDK not initialized — error boundary still renders fallback\n }\n\n this.props.onError?.(error, info);\n }\n\n private readonly reset = () => {\n this.setState({ error: null });\n };\n\n override render() {\n const { error } = this.state;\n\n if (error) {\n const { fallback } = this.props;\n if (typeof fallback === \"function\") {\n return fallback(error, this.reset);\n }\n return fallback ?? null;\n }\n\n return this.props.children;\n }\n}\n"],"mappings":";;;;;;;;;;;;;AA0BA,IAAa,gBAAb,cAAmC,UAGjC;CACA,QAAqC,EAAE,OAAO,MAAM;CAEpD,OAAO,yBAAyB,OAAkC;AAChE,SAAO,EAAE,OAAO;;CAGlB,kBAA2B,OAAc,MAAiB;AACxD,MAAI,KAAK,IAAI,MAAM,CACjB;AAEF,OAAK,IAAI,MAAM;AAEf,MAAI;AACF,cAAW,CAAC,QAAQ,SAAS,EAC3B,YAAY,aAAa,OAAO;IAAE,MAAM;IAAS,SAAS;IAAM,CAAC,EAClE,CAAC;UACI;AAIR,OAAK,MAAM,UAAU,OAAO,KAAK;;CAGnC,cAA+B;AAC7B,OAAK,SAAS,EAAE,OAAO,MAAM,CAAC;;CAGhC,SAAkB;EAChB,MAAM,EAAE,UAAU,KAAK;AAEvB,MAAI,OAAO;GACT,MAAM,EAAE,aAAa,KAAK;AAC1B,OAAI,OAAO,aAAa,WACtB,QAAO,SAAS,OAAO,KAAK,MAAM;AAEpC,UAAO,YAAY;;AAGrB,SAAO,KAAK,MAAM"}
1
+ {"version":3,"file":"error-boundary.mjs","names":[],"sources":["../src/error-boundary.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n shouldDropBrowserExtensionNoise,\n toExceptions,\n} from \"@interfere/types/sdk/errors\";\n\nimport { Component, type ErrorInfo, type ReactNode } from \"react\";\n\nimport { getClient } from \"./internal/client.js\";\nimport { seen } from \"./internal/errors.js\";\n\nexport interface ErrorBoundaryProps {\n children: ReactNode;\n fallback?: ReactNode | ((error: Error, reset: () => void) => ReactNode);\n onError?: (error: Error, info: ErrorInfo) => void;\n}\n\ninterface ErrorBoundaryState {\n error: Error | null;\n}\n\n/**\n * Catches render-phase React errors, reports them to the SDK, and renders a\n * fallback. Requires the SDK to be bootstrapped via `init()` before React\n * renders so `capture` has an active runtime.\n *\n * Class component required — React has no hook-based error boundary API.\n */\nexport class ErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n override state: ErrorBoundaryState = { error: null };\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { error };\n }\n\n override componentDidCatch(error: Error, info: ErrorInfo) {\n if (seen.has(error)) {\n return;\n }\n seen.add(error);\n\n try {\n const exceptions = toExceptions(error, {\n type: \"react\",\n handled: true,\n });\n if (!shouldDropBrowserExtensionNoise(exceptions)) {\n getClient().capture(\"error\", { exceptions });\n }\n } catch {\n // SDK not initialized — error boundary still renders fallback\n }\n\n this.props.onError?.(error, info);\n }\n\n private readonly reset = () => {\n this.setState({ error: null });\n };\n\n override render() {\n const { error } = this.state;\n\n if (error) {\n const { fallback } = this.props;\n if (typeof fallback === \"function\") {\n return fallback(error, this.reset);\n }\n return fallback ?? null;\n }\n\n return this.props.children;\n }\n}\n"],"mappings":";;;;;;;;;;;;;AA6BA,IAAa,gBAAb,cAAmC,UAGjC;CACA,QAAqC,EAAE,OAAO,MAAM;CAEpD,OAAO,yBAAyB,OAAkC;AAChE,SAAO,EAAE,OAAO;;CAGlB,kBAA2B,OAAc,MAAiB;AACxD,MAAI,KAAK,IAAI,MAAM,CACjB;AAEF,OAAK,IAAI,MAAM;AAEf,MAAI;GACF,MAAM,aAAa,aAAa,OAAO;IACrC,MAAM;IACN,SAAS;IACV,CAAC;AACF,OAAI,CAAC,gCAAgC,WAAW,CAC9C,YAAW,CAAC,QAAQ,SAAS,EAAE,YAAY,CAAC;UAExC;AAIR,OAAK,MAAM,UAAU,OAAO,KAAK;;CAGnC,cAA+B;AAC7B,OAAK,SAAS,EAAE,OAAO,MAAM,CAAC;;CAGhC,SAAkB;EAChB,MAAM,EAAE,UAAU,KAAK;AAEvB,MAAI,OAAO;GACT,MAAM,EAAE,aAAa,KAAK;AAC1B,OAAI,OAAO,aAAa,WACtB,QAAO,SAAS,OAAO,KAAK,MAAM;AAEpC,UAAO,YAAY;;AAGrB,SAAO,KAAK,MAAM"}
package/dist/package.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  //#region package.json
2
2
  var name = "@interfere/react";
3
- var version = "8.1.0";
3
+ var version = "8.1.1";
4
4
  //#endregion
5
5
  export { name, version };
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.mts","names":[],"sources":["../../src/plugins/errors.ts"],"mappings":";;;cA2Ba,YAAA,EAAc,MAAA"}
1
+ {"version":3,"file":"errors.d.mts","names":[],"sources":["../../src/plugins/errors.ts"],"mappings":";;;cAgCa,YAAA,EAAc,MAAA"}
@@ -1,5 +1,5 @@
1
1
  import { seen } from "../internal/errors.mjs";
2
- import { toExceptions } from "@interfere/types/sdk/errors";
2
+ import { shouldDropBrowserExtensionNoise, toExceptions } from "@interfere/types/sdk/errors";
3
3
  //#region src/plugins/errors.ts
4
4
  let capturing = false;
5
5
  function capture(ctx, opts) {
@@ -7,7 +7,9 @@ function capture(ctx, opts) {
7
7
  seen.add(opts.error);
8
8
  capturing = true;
9
9
  try {
10
- ctx.capture("error", { exceptions: toExceptions(opts.error, opts.mechanism) });
10
+ const exceptions = toExceptions(opts.error, opts.mechanism);
11
+ if (shouldDropBrowserExtensionNoise(exceptions)) return;
12
+ ctx.capture("error", { exceptions });
11
13
  } finally {
12
14
  capturing = false;
13
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"errors.mjs","names":[],"sources":["../../src/plugins/errors.ts"],"sourcesContent":["import { toExceptions } from \"@interfere/types/sdk/errors\";\nimport type { ErrorMechanism } from \"@interfere/types/sdk/plugins/payload/errors\";\n\nimport { seen } from \"../internal/errors.js\";\nimport type { Plugin, PluginContext } from \"./lib/types.js\";\n\nlet capturing = false;\n\nfunction capture(\n ctx: PluginContext,\n opts: { error: Error; mechanism: ErrorMechanism }\n) {\n if (capturing || seen.has(opts.error)) {\n return;\n }\n\n seen.add(opts.error);\n capturing = true;\n try {\n ctx.capture(\"error\", {\n exceptions: toExceptions(opts.error, opts.mechanism),\n });\n } finally {\n capturing = false;\n }\n}\n\nexport const errorsPlugin: Plugin = {\n name: \"errors\",\n\n setup(ctx) {\n const originalOnError = globalThis.onerror;\n const originalConsoleError = globalThis.console.error;\n\n globalThis.onerror = (msg, source, line, col, error) => {\n if (error instanceof Error) {\n capture(ctx, {\n error,\n mechanism: { type: \"onerror\", handled: false },\n });\n }\n if (typeof originalOnError === \"function\") {\n return originalOnError.call(globalThis, msg, source, line, col, error);\n }\n return false;\n };\n\n const onUnhandledRejection = (event: PromiseRejectionEvent) => {\n if (event.reason instanceof Error) {\n capture(ctx, {\n error: event.reason,\n mechanism: { type: \"unhandledrejection\", handled: false },\n });\n }\n };\n globalThis.addEventListener(\"unhandledrejection\", onUnhandledRejection);\n\n globalThis.console.error = (...args: unknown[]) => {\n originalConsoleError.apply(globalThis.console, args);\n if (args[0] instanceof Error) {\n capture(ctx, {\n error: args[0],\n mechanism: { type: \"console.error\", handled: true },\n });\n }\n };\n\n return () => {\n globalThis.onerror = originalOnError;\n globalThis.removeEventListener(\n \"unhandledrejection\",\n onUnhandledRejection\n );\n globalThis.console.error = originalConsoleError;\n };\n },\n};\n\nexport default errorsPlugin;\n"],"mappings":";;;AAMA,IAAI,YAAY;AAEhB,SAAS,QACP,KACA,MACA;AACA,KAAI,aAAa,KAAK,IAAI,KAAK,MAAM,CACnC;AAGF,MAAK,IAAI,KAAK,MAAM;AACpB,aAAY;AACZ,KAAI;AACF,MAAI,QAAQ,SAAS,EACnB,YAAY,aAAa,KAAK,OAAO,KAAK,UAAU,EACrD,CAAC;WACM;AACR,cAAY;;;AAIhB,MAAa,eAAuB;CAClC,MAAM;CAEN,MAAM,KAAK;EACT,MAAM,kBAAkB,WAAW;EACnC,MAAM,uBAAuB,WAAW,QAAQ;AAEhD,aAAW,WAAW,KAAK,QAAQ,MAAM,KAAK,UAAU;AACtD,OAAI,iBAAiB,MACnB,SAAQ,KAAK;IACX;IACA,WAAW;KAAE,MAAM;KAAW,SAAS;KAAO;IAC/C,CAAC;AAEJ,OAAI,OAAO,oBAAoB,WAC7B,QAAO,gBAAgB,KAAK,YAAY,KAAK,QAAQ,MAAM,KAAK,MAAM;AAExE,UAAO;;EAGT,MAAM,wBAAwB,UAAiC;AAC7D,OAAI,MAAM,kBAAkB,MAC1B,SAAQ,KAAK;IACX,OAAO,MAAM;IACb,WAAW;KAAE,MAAM;KAAsB,SAAS;KAAO;IAC1D,CAAC;;AAGN,aAAW,iBAAiB,sBAAsB,qBAAqB;AAEvE,aAAW,QAAQ,SAAS,GAAG,SAAoB;AACjD,wBAAqB,MAAM,WAAW,SAAS,KAAK;AACpD,OAAI,KAAK,cAAc,MACrB,SAAQ,KAAK;IACX,OAAO,KAAK;IACZ,WAAW;KAAE,MAAM;KAAiB,SAAS;KAAM;IACpD,CAAC;;AAIN,eAAa;AACX,cAAW,UAAU;AACrB,cAAW,oBACT,sBACA,qBACD;AACD,cAAW,QAAQ,QAAQ;;;CAGhC"}
1
+ {"version":3,"file":"errors.mjs","names":[],"sources":["../../src/plugins/errors.ts"],"sourcesContent":["import {\n shouldDropBrowserExtensionNoise,\n toExceptions,\n} from \"@interfere/types/sdk/errors\";\nimport type { ErrorMechanism } from \"@interfere/types/sdk/plugins/payload/errors\";\n\nimport { seen } from \"../internal/errors.js\";\nimport type { Plugin, PluginContext } from \"./lib/types.js\";\n\nlet capturing = false;\n\nfunction capture(\n ctx: PluginContext,\n opts: { error: Error; mechanism: ErrorMechanism }\n) {\n if (capturing || seen.has(opts.error)) {\n return;\n }\n\n seen.add(opts.error);\n capturing = true;\n try {\n const exceptions = toExceptions(opts.error, opts.mechanism);\n if (shouldDropBrowserExtensionNoise(exceptions)) {\n return;\n }\n ctx.capture(\"error\", { exceptions });\n } finally {\n capturing = false;\n }\n}\n\nexport const errorsPlugin: Plugin = {\n name: \"errors\",\n\n setup(ctx) {\n const originalOnError = globalThis.onerror;\n const originalConsoleError = globalThis.console.error;\n\n globalThis.onerror = (msg, source, line, col, error) => {\n if (error instanceof Error) {\n capture(ctx, {\n error,\n mechanism: { type: \"onerror\", handled: false },\n });\n }\n if (typeof originalOnError === \"function\") {\n return originalOnError.call(globalThis, msg, source, line, col, error);\n }\n return false;\n };\n\n const onUnhandledRejection = (event: PromiseRejectionEvent) => {\n if (event.reason instanceof Error) {\n capture(ctx, {\n error: event.reason,\n mechanism: { type: \"unhandledrejection\", handled: false },\n });\n }\n };\n globalThis.addEventListener(\"unhandledrejection\", onUnhandledRejection);\n\n globalThis.console.error = (...args: unknown[]) => {\n originalConsoleError.apply(globalThis.console, args);\n if (args[0] instanceof Error) {\n capture(ctx, {\n error: args[0],\n mechanism: { type: \"console.error\", handled: true },\n });\n }\n };\n\n return () => {\n globalThis.onerror = originalOnError;\n globalThis.removeEventListener(\n \"unhandledrejection\",\n onUnhandledRejection\n );\n globalThis.console.error = originalConsoleError;\n };\n },\n};\n\nexport default errorsPlugin;\n"],"mappings":";;;AASA,IAAI,YAAY;AAEhB,SAAS,QACP,KACA,MACA;AACA,KAAI,aAAa,KAAK,IAAI,KAAK,MAAM,CACnC;AAGF,MAAK,IAAI,KAAK,MAAM;AACpB,aAAY;AACZ,KAAI;EACF,MAAM,aAAa,aAAa,KAAK,OAAO,KAAK,UAAU;AAC3D,MAAI,gCAAgC,WAAW,CAC7C;AAEF,MAAI,QAAQ,SAAS,EAAE,YAAY,CAAC;WAC5B;AACR,cAAY;;;AAIhB,MAAa,eAAuB;CAClC,MAAM;CAEN,MAAM,KAAK;EACT,MAAM,kBAAkB,WAAW;EACnC,MAAM,uBAAuB,WAAW,QAAQ;AAEhD,aAAW,WAAW,KAAK,QAAQ,MAAM,KAAK,UAAU;AACtD,OAAI,iBAAiB,MACnB,SAAQ,KAAK;IACX;IACA,WAAW;KAAE,MAAM;KAAW,SAAS;KAAO;IAC/C,CAAC;AAEJ,OAAI,OAAO,oBAAoB,WAC7B,QAAO,gBAAgB,KAAK,YAAY,KAAK,QAAQ,MAAM,KAAK,MAAM;AAExE,UAAO;;EAGT,MAAM,wBAAwB,UAAiC;AAC7D,OAAI,MAAM,kBAAkB,MAC1B,SAAQ,KAAK;IACX,OAAO,MAAM;IACb,WAAW;KAAE,MAAM;KAAsB,SAAS;KAAO;IAC1D,CAAC;;AAGN,aAAW,iBAAiB,sBAAsB,qBAAqB;AAEvE,aAAW,QAAQ,SAAS,GAAG,SAAoB;AACjD,wBAAqB,MAAM,WAAW,SAAS,KAAK;AACpD,OAAI,KAAK,cAAc,MACrB,SAAQ,KAAK;IACX,OAAO,KAAK;IACZ,WAAW;KAAE,MAAM;KAAiB,SAAS;KAAM;IACpD,CAAC;;AAIN,eAAa;AACX,cAAW,UAAU;AACrB,cAAW,oBACT,sBACA,qBACD;AACD,cAAW,QAAQ,QAAQ;;;CAGhC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@interfere/react",
3
- "version": "8.1.0",
3
+ "version": "8.1.1",
4
4
  "license": "MIT",
5
5
  "description": "Client-side React SDK for Interfere. Error tracking, session replay, and analytics.",
6
6
  "keywords": [
@@ -52,9 +52,9 @@
52
52
  "typecheck": "tsc --noEmit --incremental"
53
53
  },
54
54
  "dependencies": {
55
- "@fingerprintjs/fingerprintjs": "^5.1.0",
55
+ "@fingerprintjs/fingerprintjs": "^5.2.0",
56
56
  "@interfere/constants": "^8.1.0",
57
- "@interfere/types": "^8.1.0",
57
+ "@interfere/types": "^8.1.1",
58
58
  "@ua-parser-js/pro-enterprise": "^2.0.6",
59
59
  "rrweb": "2.0.0-alpha.4",
60
60
  "uuid": "^13.0.0"
@@ -64,20 +64,20 @@
64
64
  "react-dom": ">=19"
65
65
  },
66
66
  "devDependencies": {
67
- "@interfere/typescript-config": "^8.1.0",
68
67
  "@interfere/test-utils": "^1.0.0",
68
+ "@interfere/typescript-config": "^8.1.0",
69
69
  "@rrweb/types": "2.0.0-alpha.20",
70
70
  "@types/node": "^24.12.0",
71
71
  "@types/react": "19.2.14",
72
72
  "@types/react-dom": "19.2.3",
73
73
  "@vitejs/plugin-react": "^6.0.1",
74
- "@vitest/browser": "4.1.2",
75
- "@vitest/browser-playwright": "4.1.2",
76
- "@vitest/coverage-v8": "^4.1.2",
74
+ "@vitest/browser": "4.1.3",
75
+ "@vitest/browser-playwright": "4.1.3",
76
+ "@vitest/coverage-v8": "^4.1.3",
77
77
  "playwright": "^1.59.0",
78
- "tsdown": "^0.21.6",
78
+ "tsdown": "^0.21.7",
79
79
  "typescript": "6.0.2",
80
- "vitest": "^4.1.2",
81
- "vitest-browser-react": "2.1.0"
80
+ "vitest": "^4.1.3",
81
+ "vitest-browser-react": "2.2.0"
82
82
  }
83
83
  }