@debugkit/sdk 0.1.0 → 0.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 +55 -3
- package/dist/chunk-5PCBQL5S.js +655 -0
- package/dist/chunk-5PCBQL5S.js.map +1 -0
- package/dist/{chunk-KUJ4EW3D.cjs → chunk-EH2FC54I.cjs} +10 -10
- package/dist/chunk-EH2FC54I.cjs.map +1 -0
- package/dist/{chunk-NSWUGBA2.cjs → chunk-JWCGEOCU.cjs} +20 -12
- package/dist/chunk-JWCGEOCU.cjs.map +1 -0
- package/dist/chunk-Q33W6RAG.cjs +667 -0
- package/dist/chunk-Q33W6RAG.cjs.map +1 -0
- package/dist/{chunk-BD2FNVCP.js → chunk-T56RQGKR.js} +15 -7
- package/dist/chunk-T56RQGKR.js.map +1 -0
- package/dist/{chunk-3UN5VMQU.js → chunk-TRUHD4EU.js} +5 -5
- package/dist/chunk-TRUHD4EU.js.map +1 -0
- package/dist/client-VakEOlcU.d.cts +222 -0
- package/dist/client-VakEOlcU.d.ts +222 -0
- package/dist/expo-router.cjs +4 -4
- package/dist/expo-router.d.cts +1 -1
- package/dist/expo-router.d.ts +1 -1
- package/dist/expo-router.js +2 -2
- package/dist/expo.cjs +13 -13
- package/dist/expo.d.cts +1 -1
- package/dist/expo.d.ts +1 -1
- package/dist/expo.js +5 -5
- package/dist/index.cjs +12 -8
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/node.cjs +69 -14
- package/dist/node.cjs.map +1 -1
- package/dist/node.d.cts +4 -7
- package/dist/node.d.ts +4 -7
- package/dist/node.js +55 -5
- package/dist/node.js.map +1 -1
- package/dist/react-native.cjs +10 -10
- package/dist/react-native.d.cts +1 -1
- package/dist/react-native.d.ts +1 -1
- package/dist/react-native.js +3 -3
- package/dist/react.cjs +6 -6
- package/dist/react.d.cts +1 -1
- package/dist/react.d.ts +1 -1
- package/dist/react.js +2 -2
- package/package.json +2 -2
- package/dist/chunk-3UN5VMQU.js.map +0 -1
- package/dist/chunk-BD2FNVCP.js.map +0 -1
- package/dist/chunk-KUJ4EW3D.cjs.map +0 -1
- package/dist/chunk-NSWUGBA2.cjs.map +0 -1
- package/dist/chunk-VIJ5USKQ.js +0 -300
- package/dist/chunk-VIJ5USKQ.js.map +0 -1
- package/dist/chunk-XEFWRCN4.cjs +0 -311
- package/dist/chunk-XEFWRCN4.cjs.map +0 -1
- package/dist/client-drmb0n15.d.cts +0 -103
- package/dist/client-drmb0n15.d.ts +0 -103
package/dist/node.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { deBug } from './index.js';
|
|
2
|
-
import { I as InitOptions, D as DebugClient, C as ContextPatch } from './client-
|
|
3
|
-
export { E as EventMeta, Q as QueueStorage, S as SDK_NAME, a as SDK_VERSION, b as browserContext, m as mergeContext } from './client-
|
|
2
|
+
import { I as InitOptions, D as DebugClient, C as ContextPatch } from './client-VakEOlcU.js';
|
|
3
|
+
export { A as AutoCaptureOptions, E as EventMeta, N as NetworkOptions, Q as QueueStorage, S as SDK_NAME, a as SDK_VERSION, b as browserContext, m as mergeContext, n as normaliseUrl } from './client-VakEOlcU.js';
|
|
4
4
|
export { Breadcrumb, EventInput, Severity, StackFrame, parseStack } from '@debugkit/schema/core';
|
|
5
5
|
|
|
6
6
|
/** Context for Node servers (TanStack Start server functions, Next API routes, Express ...). */
|
|
@@ -10,14 +10,11 @@ interface NodeInitOptions extends InitOptions {
|
|
|
10
10
|
captureProcessErrors?: boolean;
|
|
11
11
|
/** Max time to wait for a final flush before exiting on a fatal error. Default 2000ms. */
|
|
12
12
|
shutdownTimeoutMs?: number;
|
|
13
|
+
/** Report responses your server sends with a 5xx status. Default true (needs `autoCapture.network`). */
|
|
14
|
+
captureServerErrors?: boolean;
|
|
13
15
|
}
|
|
14
16
|
/** Initialise deBug on a Node server. */
|
|
15
17
|
declare function initNode(options: NodeInitOptions, client?: DebugClient): DebugClient;
|
|
16
|
-
/**
|
|
17
|
-
* Wrap a server handler so any error it throws is reported (and re-thrown).
|
|
18
|
-
* Good for TanStack Start server functions and route handlers:
|
|
19
|
-
* .handler(withDebug("checkout.payment", async ({ data }) => { ... }))
|
|
20
|
-
*/
|
|
21
18
|
declare function withDebug<A extends unknown[], R>(flow: string, fn: (...args: A) => Promise<R>, client?: DebugClient): (...args: A) => Promise<R>;
|
|
22
19
|
|
|
23
20
|
export { ContextPatch, DebugClient, InitOptions, type NodeInitOptions, initNode, nodeContext, withDebug };
|
package/dist/node.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { deBug, timezone, mergeContext } from './chunk-
|
|
2
|
-
export { DebugClient, SDK_NAME, SDK_VERSION, browserContext, deBug, mergeContext, parseStack } from './chunk-
|
|
1
|
+
import { deBug, timezone, mergeContext, normaliseUrl } from './chunk-5PCBQL5S.js';
|
|
2
|
+
export { DebugClient, SDK_NAME, SDK_VERSION, browserContext, deBug, mergeContext, normaliseUrl, parseStack } from './chunk-5PCBQL5S.js';
|
|
3
|
+
import dc from 'diagnostics_channel';
|
|
3
4
|
import os from 'os';
|
|
4
5
|
|
|
5
6
|
function nodeContext() {
|
|
@@ -12,9 +13,11 @@ function nodeContext() {
|
|
|
12
13
|
}
|
|
13
14
|
var installed = false;
|
|
14
15
|
function initNode(options, client = deBug) {
|
|
15
|
-
var _a;
|
|
16
|
+
var _a, _b;
|
|
16
17
|
const { captureProcessErrors = true, shutdownTimeoutMs = 2e3, ...rest } = options;
|
|
17
|
-
|
|
18
|
+
const auto = rest.autoCapture === false ? false : { console: false, ...typeof rest.autoCapture === "object" ? rest.autoCapture : {} };
|
|
19
|
+
client.init({ ...rest, autoCapture: auto === false ? false : { ...auto, errors: false }, context: mergeContext(nodeContext(), (_a = rest.context) != null ? _a : {}) });
|
|
20
|
+
if (client.autoCapture.network) instrumentNodeHttp(client, (_b = rest.captureServerErrors) != null ? _b : true);
|
|
18
21
|
if (!captureProcessErrors || installed) return client;
|
|
19
22
|
installed = true;
|
|
20
23
|
const flushThenExit = async (err) => {
|
|
@@ -23,7 +26,7 @@ function initNode(options, client = deBug) {
|
|
|
23
26
|
process.exit(1);
|
|
24
27
|
};
|
|
25
28
|
process.on("uncaughtException", (err) => {
|
|
26
|
-
client.error(err, { handled: false,
|
|
29
|
+
client.error(err, { handled: false, fatal: true, tags: { source: "uncaughtException" } });
|
|
27
30
|
void flushThenExit(err);
|
|
28
31
|
});
|
|
29
32
|
process.on("unhandledRejection", (reason) => {
|
|
@@ -33,6 +36,53 @@ function initNode(options, client = deBug) {
|
|
|
33
36
|
process.on("beforeExit", () => void client.flush());
|
|
34
37
|
return client;
|
|
35
38
|
}
|
|
39
|
+
var httpInstrumented = false;
|
|
40
|
+
function instrumentNodeHttp(client, captureServer) {
|
|
41
|
+
var _a;
|
|
42
|
+
if (httpInstrumented || typeof ((_a = dc) == null ? void 0 : _a.subscribe) !== "function") return;
|
|
43
|
+
httpInstrumented = true;
|
|
44
|
+
const sink = client.sink();
|
|
45
|
+
const urlOf = (r) => {
|
|
46
|
+
var _a2, _b, _c, _d, _e;
|
|
47
|
+
return `${(_a2 = r.protocol) != null ? _a2 : "http:"}//${String((_d = (_c = (_b = r.getHeader) == null ? void 0 : _b.call(r, "host")) != null ? _c : r.host) != null ? _d : "")}${(_e = r.path) != null ? _e : ""}`;
|
|
48
|
+
};
|
|
49
|
+
dc.subscribe("http.client.request.start", (m) => {
|
|
50
|
+
const r = m.request;
|
|
51
|
+
r.__debugStart = Date.now();
|
|
52
|
+
r.__debugStack = new Error().stack;
|
|
53
|
+
});
|
|
54
|
+
dc.subscribe("http.client.response.finish", (m) => {
|
|
55
|
+
var _a2, _b;
|
|
56
|
+
const { request: r, response } = m;
|
|
57
|
+
const url = urlOf(r);
|
|
58
|
+
if (sink.ignored(url)) return;
|
|
59
|
+
sink.request({ method: (_a2 = r.method) != null ? _a2 : "GET", url, status: response.statusCode, durationMs: Date.now() - ((_b = r.__debugStart) != null ? _b : Date.now()), stack: r.__debugStack });
|
|
60
|
+
});
|
|
61
|
+
dc.subscribe("http.client.request.error", (m) => {
|
|
62
|
+
var _a2, _b;
|
|
63
|
+
const { request: r, error } = m;
|
|
64
|
+
const url = urlOf(r);
|
|
65
|
+
if (sink.ignored(url)) return;
|
|
66
|
+
sink.request({ method: (_a2 = r.method) != null ? _a2 : "GET", url, error, durationMs: Date.now() - ((_b = r.__debugStart) != null ? _b : Date.now()), stack: r.__debugStack });
|
|
67
|
+
});
|
|
68
|
+
if (!captureServer) return;
|
|
69
|
+
dc.subscribe("http.server.request.start", (m) => {
|
|
70
|
+
m.request.__debugStart = Date.now();
|
|
71
|
+
});
|
|
72
|
+
dc.subscribe("http.server.response.finish", (m) => {
|
|
73
|
+
var _a2, _b, _c, _d;
|
|
74
|
+
const { request: r, response } = m;
|
|
75
|
+
const status = (_a2 = response.statusCode) != null ? _a2 : 0;
|
|
76
|
+
if (status < 500) return;
|
|
77
|
+
const url = normaliseUrl((_b = r.url) != null ? _b : "/");
|
|
78
|
+
const method = ((_c = r.method) != null ? _c : "GET").toUpperCase();
|
|
79
|
+
client.captureError(
|
|
80
|
+
{ name: "HttpServerError", message: `${method} ${url} responded ${status}`, frames: [] },
|
|
81
|
+
{ handled: true, tags: { source: "http-server" } },
|
|
82
|
+
{ method, url, status, durationMs: Date.now() - ((_d = r.__debugStart) != null ? _d : Date.now()) }
|
|
83
|
+
);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
36
86
|
function withDebug(flow, fn, client = deBug) {
|
|
37
87
|
return async (...args) => {
|
|
38
88
|
try {
|
package/dist/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/node.ts"],"names":[],"mappings":";;;;AAKO,SAAS,WAAA,GAA4B;AAC1C,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,EAAE,IAAA,EAAM,EAAA,CAAG,UAAS,EAAG,OAAA,EAAS,EAAA,CAAG,OAAA,EAAQ,EAAE;AAAA,IACjD,SAAS,EAAE,IAAA,EAAM,QAAQ,OAAA,EAAS,OAAA,CAAQ,SAAS,IAAA,EAAK;AAAA,IACxD,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,QAAA,EAAS,GAAI,IAAA,GAAO,IAAI,CAAA,EAAE;AAAA,IAC7E,UAAU,QAAA;AAAS,GACrB;AACF;AASA,IAAI,SAAA,GAAY,KAAA;AAGT,SAAS,QAAA,CAAS,OAAA,EAA0B,MAAA,GAAsB,KAAA,EAAoB;AAxB7F,EAAA,IAAA,EAAA;AAyBE,EAAA,MAAM,EAAE,oBAAA,GAAuB,IAAA,EAAM,oBAAoB,GAAA,EAAM,GAAG,MAAK,GAAI,OAAA;AAC3E,EAAA,MAAA,CAAO,KAAK,EAAE,GAAG,IAAA,EAAM,mBAAA,EAAqB,OAAO,OAAA,EAAS,YAAA,CAAa,WAAA,EAAY,EAAA,CAAG,UAAK,OAAA,KAAL,IAAA,GAAA,EAAA,GAAgB,EAAE,GAAG,CAAA;AAC7G,EAAA,IAAI,CAAC,oBAAA,IAAwB,SAAA,EAAW,OAAO,MAAA;AAC/C,EAAA,SAAA,GAAY,IAAA;AAEZ,EAAA,MAAM,aAAA,GAAgB,OAAO,GAAA,KAAiB;AAC5C,IAAA,MAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAA,CAAO,OAAM,EAAG,IAAI,OAAA,CAAQ,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,iBAAiB,CAAC,CAAC,CAAC,CAAA;AACzF,IAAA,OAAA,CAAQ,MAAM,GAAG,CAAA;AACjB,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB,CAAA;AAEA,EAAA,OAAA,CAAQ,EAAA,CAAG,mBAAA,EAAqB,CAAC,GAAA,KAAQ;AACvC,IAAA,MAAA,CAAO,KAAA,CAAM,GAAA,EAAK,EAAE,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,UAAA,EAAY,IAAA,EAAM,EAAE,MAAA,EAAQ,mBAAA,EAAoB,EAAG,CAAA;AACjG,IAAA,KAAK,cAAc,GAAG,CAAA;AAAA,EACxB,CAAC,CAAA;AACD,EAAA,OAAA,CAAQ,EAAA,CAAG,oBAAA,EAAsB,CAAC,MAAA,KAAW;AAC3C,IAAA,MAAA,CAAO,KAAA,CAAM,MAAA,EAAQ,EAAE,OAAA,EAAS,KAAA,EAAO,MAAM,EAAE,MAAA,EAAQ,oBAAA,EAAqB,EAAG,CAAA;AAC/E,IAAA,IAAI,QAAQ,aAAA,CAAc,oBAAoB,MAAM,CAAA,EAAG,KAAK,cAAc,MAAM,CAAA;AAAA,EAClF,CAAC,CAAA;AACD,EAAA,OAAA,CAAQ,GAAG,YAAA,EAAc,MAAM,KAAK,MAAA,CAAO,OAAO,CAAA;AAClD,EAAA,OAAO,MAAA;AACT;AAOO,SAAS,SAAA,CAAkC,IAAA,EAAc,EAAA,EAAgC,MAAA,GAAsB,KAAA,EAAO;AAC3H,EAAA,OAAO,UAAU,IAAA,KAAwB;AACvC,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,CAAG,GAAG,IAAI,CAAA;AAAA,IACzB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAA,CAAO,MAAM,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,CAAA;AAC1C,MAAA,MAAM,OAAO,KAAA,EAAM;AACnB,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF,CAAA;AACF","file":"node.js","sourcesContent":["import os from \"node:os\";\nimport { deBug, type DebugClient, type InitOptions } from \"./index\";\nimport { mergeContext, timezone, type ContextPatch } from \"./context\";\n\n/** Context for Node servers (TanStack Start server functions, Next API routes, Express ...). */\nexport function nodeContext(): ContextPatch {\n return {\n os: { name: os.platform(), version: os.release() },\n runtime: { name: \"node\", version: process.versions.node },\n device: { type: \"unknown\", memoryMb: Math.round(os.totalmem() / 1024 / 1024) },\n timezone: timezone(),\n };\n}\n\nexport interface NodeInitOptions extends InitOptions {\n /** Capture uncaught exceptions and unhandled rejections, then exit like Node would. Default true. */\n captureProcessErrors?: boolean;\n /** Max time to wait for a final flush before exiting on a fatal error. Default 2000ms. */\n shutdownTimeoutMs?: number;\n}\n\nlet installed = false;\n\n/** Initialise deBug on a Node server. */\nexport function initNode(options: NodeInitOptions, client: DebugClient = deBug): DebugClient {\n const { captureProcessErrors = true, shutdownTimeoutMs = 2000, ...rest } = options;\n client.init({ ...rest, captureGlobalErrors: false, context: mergeContext(nodeContext(), rest.context ?? {}) });\n if (!captureProcessErrors || installed) return client;\n installed = true;\n\n const flushThenExit = async (err: unknown) => {\n await Promise.race([client.flush(), new Promise((r) => setTimeout(r, shutdownTimeoutMs))]);\n console.error(err);\n process.exit(1);\n };\n // Adding these listeners disables Node's default crash, so we re-create it after flushing.\n process.on(\"uncaughtException\", (err) => {\n client.error(err, { handled: false, severity: \"critical\", tags: { source: \"uncaughtException\" } });\n void flushThenExit(err);\n });\n process.on(\"unhandledRejection\", (reason) => {\n client.error(reason, { handled: false, tags: { source: \"unhandledRejection\" } });\n if (process.listenerCount(\"unhandledRejection\") === 1) void flushThenExit(reason);\n });\n process.on(\"beforeExit\", () => void client.flush());\n return client;\n}\n\n/**\n * Wrap a server handler so any error it throws is reported (and re-thrown).\n * Good for TanStack Start server functions and route handlers:\n * .handler(withDebug(\"checkout.payment\", async ({ data }) => { ... }))\n */\nexport function withDebug<A extends unknown[], R>(flow: string, fn: (...args: A) => Promise<R>, client: DebugClient = deBug) {\n return async (...args: A): Promise<R> => {\n try {\n return await fn(...args);\n } catch (err) {\n client.error(err, { flow, handled: false });\n await client.flush();\n throw err;\n }\n };\n}\n\nexport * from \"./index\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/node.ts"],"names":["_a"],"mappings":"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","file":"node.js","sourcesContent":["import dc from \"node:diagnostics_channel\";\nimport os from \"node:os\";\nimport { deBug, type DebugClient, type InitOptions } from \"./index\";\nimport { mergeContext, timezone, type ContextPatch } from \"./context\";\nimport { normaliseUrl } from \"./auto\";\n\n/** Context for Node servers (TanStack Start server functions, Next API routes, Express ...). */\nexport function nodeContext(): ContextPatch {\n return {\n os: { name: os.platform(), version: os.release() },\n runtime: { name: \"node\", version: process.versions.node },\n device: { type: \"unknown\", memoryMb: Math.round(os.totalmem() / 1024 / 1024) },\n timezone: timezone(),\n };\n}\n\nexport interface NodeInitOptions extends InitOptions {\n /** Capture uncaught exceptions and unhandled rejections, then exit like Node would. Default true. */\n captureProcessErrors?: boolean;\n /** Max time to wait for a final flush before exiting on a fatal error. Default 2000ms. */\n shutdownTimeoutMs?: number;\n /** Report responses your server sends with a 5xx status. Default true (needs `autoCapture.network`). */\n captureServerErrors?: boolean;\n}\n\nlet installed = false;\n\n/** Initialise deBug on a Node server. */\nexport function initNode(options: NodeInitOptions, client: DebugClient = deBug): DebugClient {\n const { captureProcessErrors = true, shutdownTimeoutMs = 2000, ...rest } = options;\n const auto = rest.autoCapture === false ? false : { console: false, ...(typeof rest.autoCapture === \"object\" ? rest.autoCapture : {}) };\n // Process-level hooks below replace the browser-style global handlers.\n client.init({ ...rest, autoCapture: auto === false ? false : { ...auto, errors: false }, context: mergeContext(nodeContext(), rest.context ?? {}) });\n if (client.autoCapture.network) instrumentNodeHttp(client, rest.captureServerErrors ?? true);\n if (!captureProcessErrors || installed) return client;\n installed = true;\n\n const flushThenExit = async (err: unknown) => {\n await Promise.race([client.flush(), new Promise((r) => setTimeout(r, shutdownTimeoutMs))]);\n console.error(err);\n process.exit(1);\n };\n // Adding these listeners disables Node's default crash, so we re-create it after flushing.\n process.on(\"uncaughtException\", (err) => {\n client.error(err, { handled: false, fatal: true, tags: { source: \"uncaughtException\" } });\n void flushThenExit(err);\n });\n process.on(\"unhandledRejection\", (reason) => {\n client.error(reason, { handled: false, tags: { source: \"unhandledRejection\" } });\n if (process.listenerCount(\"unhandledRejection\") === 1) void flushThenExit(reason);\n });\n process.on(\"beforeExit\", () => void client.flush());\n return client;\n}\n\n/**\n * Wrap a server handler so any error it throws is reported (and re-thrown).\n * Good for TanStack Start server functions and route handlers:\n * .handler(withDebug(\"checkout.payment\", async ({ data }) => { ... }))\n */\ntype ClientReq = { method?: string; protocol?: string; host?: string; path?: string; getHeader?(n: string): unknown; __debugStart?: number; __debugStack?: string };\ntype ServerReq = { method?: string; url?: string; __debugStart?: number };\nlet httpInstrumented = false;\n\n/**\n * Outgoing requests made with node:http/https (axios, got, SDKs) and responses this server\n * sends, through Node's diagnostics channels. `fetch` is covered by the shared instrumentation.\n */\nfunction instrumentNodeHttp(client: DebugClient, captureServer: boolean) {\n if (httpInstrumented || typeof dc?.subscribe !== \"function\") return;\n httpInstrumented = true;\n const sink = client.sink();\n // The Host header keeps a non-default port; request.host doesn't.\n const urlOf = (r: ClientReq) => `${r.protocol ?? \"http:\"}//${String(r.getHeader?.(\"host\") ?? r.host ?? \"\")}${r.path ?? \"\"}`;\n dc.subscribe(\"http.client.request.start\", (m) => {\n const r = (m as { request: ClientReq }).request;\n r.__debugStart = Date.now();\n r.__debugStack = new Error().stack;\n });\n dc.subscribe(\"http.client.response.finish\", (m) => {\n const { request: r, response } = m as { request: ClientReq; response: { statusCode?: number } };\n const url = urlOf(r);\n if (sink.ignored(url)) return;\n sink.request({ method: r.method ?? \"GET\", url, status: response.statusCode, durationMs: Date.now() - (r.__debugStart ?? Date.now()), stack: r.__debugStack });\n });\n dc.subscribe(\"http.client.request.error\", (m) => {\n const { request: r, error } = m as { request: ClientReq; error: unknown };\n const url = urlOf(r);\n if (sink.ignored(url)) return;\n sink.request({ method: r.method ?? \"GET\", url, error, durationMs: Date.now() - (r.__debugStart ?? Date.now()), stack: r.__debugStack });\n });\n if (!captureServer) return;\n dc.subscribe(\"http.server.request.start\", (m) => {\n (m as { request: ServerReq }).request.__debugStart = Date.now();\n });\n dc.subscribe(\"http.server.response.finish\", (m) => {\n const { request: r, response } = m as { request: ServerReq; response: { statusCode?: number } };\n const status = response.statusCode ?? 0;\n if (status < 500) return;\n const url = normaliseUrl(r.url ?? \"/\");\n const method = (r.method ?? \"GET\").toUpperCase();\n client.captureError(\n { name: \"HttpServerError\", message: `${method} ${url} responded ${status}`, frames: [] },\n { handled: true, tags: { source: \"http-server\" } },\n { method, url, status, durationMs: Date.now() - (r.__debugStart ?? Date.now()) },\n );\n });\n}\n\nexport function withDebug<A extends unknown[], R>(flow: string, fn: (...args: A) => Promise<R>, client: DebugClient = deBug) {\n return async (...args: A): Promise<R> => {\n try {\n return await fn(...args);\n } catch (err) {\n client.error(err, { flow, handled: false });\n await client.flush();\n throw err;\n }\n };\n}\n\nexport * from \"./index\";\n"]}
|
package/dist/react-native.cjs
CHANGED
|
@@ -1,38 +1,38 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
3
|
+
var chunkJWCGEOCU_cjs = require('./chunk-JWCGEOCU.cjs');
|
|
4
|
+
var chunkEH2FC54I_cjs = require('./chunk-EH2FC54I.cjs');
|
|
5
|
+
var chunkQ33W6RAG_cjs = require('./chunk-Q33W6RAG.cjs');
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
Object.defineProperty(exports, "initReactNative", {
|
|
10
10
|
enumerable: true,
|
|
11
|
-
get: function () { return
|
|
11
|
+
get: function () { return chunkJWCGEOCU_cjs.initReactNative; }
|
|
12
12
|
});
|
|
13
13
|
Object.defineProperty(exports, "nativeContext", {
|
|
14
14
|
enumerable: true,
|
|
15
|
-
get: function () { return
|
|
15
|
+
get: function () { return chunkJWCGEOCU_cjs.nativeContext; }
|
|
16
16
|
});
|
|
17
17
|
Object.defineProperty(exports, "trackReactNavigation", {
|
|
18
18
|
enumerable: true,
|
|
19
|
-
get: function () { return
|
|
19
|
+
get: function () { return chunkJWCGEOCU_cjs.trackReactNavigation; }
|
|
20
20
|
});
|
|
21
21
|
Object.defineProperty(exports, "DebugErrorBoundary", {
|
|
22
22
|
enumerable: true,
|
|
23
|
-
get: function () { return
|
|
23
|
+
get: function () { return chunkEH2FC54I_cjs.DebugErrorBoundary; }
|
|
24
24
|
});
|
|
25
25
|
Object.defineProperty(exports, "trackTanStackRouter", {
|
|
26
26
|
enumerable: true,
|
|
27
|
-
get: function () { return
|
|
27
|
+
get: function () { return chunkEH2FC54I_cjs.trackTanStackRouter; }
|
|
28
28
|
});
|
|
29
29
|
Object.defineProperty(exports, "useDebugNavigation", {
|
|
30
30
|
enumerable: true,
|
|
31
|
-
get: function () { return
|
|
31
|
+
get: function () { return chunkEH2FC54I_cjs.useDebugNavigation; }
|
|
32
32
|
});
|
|
33
33
|
Object.defineProperty(exports, "deBug", {
|
|
34
34
|
enumerable: true,
|
|
35
|
-
get: function () { return
|
|
35
|
+
get: function () { return chunkQ33W6RAG_cjs.deBug; }
|
|
36
36
|
});
|
|
37
37
|
//# sourceMappingURL=react-native.cjs.map
|
|
38
38
|
//# sourceMappingURL=react-native.cjs.map
|
package/dist/react-native.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { deBug } from './index.cjs';
|
|
2
|
-
import { I as InitOptions, D as DebugClient, C as ContextPatch } from './client-
|
|
2
|
+
import { I as InitOptions, D as DebugClient, C as ContextPatch } from './client-VakEOlcU.cjs';
|
|
3
3
|
export { DebugErrorBoundary, DebugErrorBoundaryProps, trackTanStackRouter, useDebugNavigation } from './react.cjs';
|
|
4
4
|
import '@debugkit/schema/core';
|
|
5
5
|
import 'react';
|
package/dist/react-native.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { deBug } from './index.js';
|
|
2
|
-
import { I as InitOptions, D as DebugClient, C as ContextPatch } from './client-
|
|
2
|
+
import { I as InitOptions, D as DebugClient, C as ContextPatch } from './client-VakEOlcU.js';
|
|
3
3
|
export { DebugErrorBoundary, DebugErrorBoundaryProps, trackTanStackRouter, useDebugNavigation } from './react.js';
|
|
4
4
|
import '@debugkit/schema/core';
|
|
5
5
|
import 'react';
|
package/dist/react-native.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { initReactNative, nativeContext, trackReactNavigation } from './chunk-
|
|
2
|
-
export { DebugErrorBoundary, trackTanStackRouter, useDebugNavigation } from './chunk-
|
|
3
|
-
export { deBug } from './chunk-
|
|
1
|
+
export { initReactNative, nativeContext, trackReactNavigation } from './chunk-T56RQGKR.js';
|
|
2
|
+
export { DebugErrorBoundary, trackTanStackRouter, useDebugNavigation } from './chunk-TRUHD4EU.js';
|
|
3
|
+
export { deBug } from './chunk-5PCBQL5S.js';
|
|
4
4
|
//# sourceMappingURL=react-native.js.map
|
|
5
5
|
//# sourceMappingURL=react-native.js.map
|
package/dist/react.cjs
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var chunkEH2FC54I_cjs = require('./chunk-EH2FC54I.cjs');
|
|
4
|
+
var chunkQ33W6RAG_cjs = require('./chunk-Q33W6RAG.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
Object.defineProperty(exports, "DebugErrorBoundary", {
|
|
9
9
|
enumerable: true,
|
|
10
|
-
get: function () { return
|
|
10
|
+
get: function () { return chunkEH2FC54I_cjs.DebugErrorBoundary; }
|
|
11
11
|
});
|
|
12
12
|
Object.defineProperty(exports, "trackTanStackRouter", {
|
|
13
13
|
enumerable: true,
|
|
14
|
-
get: function () { return
|
|
14
|
+
get: function () { return chunkEH2FC54I_cjs.trackTanStackRouter; }
|
|
15
15
|
});
|
|
16
16
|
Object.defineProperty(exports, "useDebugNavigation", {
|
|
17
17
|
enumerable: true,
|
|
18
|
-
get: function () { return
|
|
18
|
+
get: function () { return chunkEH2FC54I_cjs.useDebugNavigation; }
|
|
19
19
|
});
|
|
20
20
|
Object.defineProperty(exports, "deBug", {
|
|
21
21
|
enumerable: true,
|
|
22
|
-
get: function () { return
|
|
22
|
+
get: function () { return chunkQ33W6RAG_cjs.deBug; }
|
|
23
23
|
});
|
|
24
24
|
//# sourceMappingURL=react.cjs.map
|
|
25
25
|
//# sourceMappingURL=react.cjs.map
|
package/dist/react.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Component, ReactNode, ErrorInfo } from 'react';
|
|
2
2
|
export { deBug } from './index.cjs';
|
|
3
|
-
import { D as DebugClient } from './client-
|
|
3
|
+
import { D as DebugClient } from './client-VakEOlcU.cjs';
|
|
4
4
|
import '@debugkit/schema/core';
|
|
5
5
|
|
|
6
6
|
interface DebugErrorBoundaryProps {
|
package/dist/react.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Component, ReactNode, ErrorInfo } from 'react';
|
|
2
2
|
export { deBug } from './index.js';
|
|
3
|
-
import { D as DebugClient } from './client-
|
|
3
|
+
import { D as DebugClient } from './client-VakEOlcU.js';
|
|
4
4
|
import '@debugkit/schema/core';
|
|
5
5
|
|
|
6
6
|
interface DebugErrorBoundaryProps {
|
package/dist/react.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { DebugErrorBoundary, trackTanStackRouter, useDebugNavigation } from './chunk-
|
|
2
|
-
export { deBug } from './chunk-
|
|
1
|
+
export { DebugErrorBoundary, trackTanStackRouter, useDebugNavigation } from './chunk-TRUHD4EU.js';
|
|
2
|
+
export { deBug } from './chunk-5PCBQL5S.js';
|
|
3
3
|
//# sourceMappingURL=react.js.map
|
|
4
4
|
//# sourceMappingURL=react.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@debugkit/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"./package.json": "./package.json"
|
|
61
61
|
},
|
|
62
62
|
"dependencies": {
|
|
63
|
-
"@debugkit/schema": "^0.
|
|
63
|
+
"@debugkit/schema": "^0.3.0"
|
|
64
64
|
},
|
|
65
65
|
"description": "deBug SDK: log errors and events from React, React Native, Expo and Node into your own cloud.",
|
|
66
66
|
"license": "MIT",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react.tsx"],"names":[],"mappings":";;;AAqBO,IAAM,kBAAA,GAAN,cAAiC,SAAA,CAA0C;AAAA,EAA3E,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AACL,IAAA,aAAA,CAAA,IAAA,EAAA,OAAA,EAAe,EAAE,OAAO,IAAA,EAAK,CAAA;AAgB7B,IAAA,aAAA,CAAA,IAAA,EAAA,OAAA,EAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,EAAE,KAAA,EAAO,MAAM,CAAA,CAAA;AAAA,EAAA;AAAA,EAd3C,OAAO,yBAAyB,KAAA,EAAqB;AACnD,IAAA,OAAO,EAAE,KAAA,EAAM;AAAA,EACjB;AAAA,EAEA,iBAAA,CAAkB,OAAc,IAAA,EAAiB;AA5BnD,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA6BI,IAAA,MAAM,MAAA,GAAA,CAAS,EAAA,GAAA,IAAA,CAAK,KAAA,CAAM,MAAA,KAAX,IAAA,GAAA,EAAA,GAAqB,KAAA;AACpC,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,MAAA,CAAO,UAAA,CAAW,IAAA,EAAM,oBAAA,EAAsB,EAAE,gBAAgB,IAAA,CAAK,cAAA,CAAe,IAAA,EAAK,CAAE,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,IAAK,OAAO,CAAA;AAAA,IACtH;AACA,IAAA,MAAA,CAAO,KAAA,CAAM,KAAA,EAAO,EAAE,IAAA,EAAM,KAAK,KAAA,CAAM,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,IAAA,EAAM,EAAE,MAAA,EAAQ,gBAAA,IAAoB,CAAA;AACjG,IAAA,KAAK,OAAO,KAAA,EAAM;AAClB,IAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,KAAA,EAAM,OAAA,KAAX,IAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAqB,KAAA,EAAO,IAAA,CAAA;AAAA,EAC9B;AAAA,EAIA,MAAA,GAAS;AACP,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,IAAA,CAAK,KAAA;AACvB,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA;AAC9B,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,IAAA,CAAK,KAAA;AAC1B,IAAA,OAAO,OAAO,QAAA,KAAa,UAAA,GAAa,QAAA,CAAS,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,CAAA,GAAK,QAAA,IAAA,IAAA,GAAA,QAAA,GAAY,IAAA;AAAA,EAChG;AACF;AAGO,SAAS,kBAAA,CAAmB,IAAA,EAA0B,MAAA,GAAsB,KAAA,EAAO;AACxF,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAA,EAAM,MAAA,CAAO,UAAA,CAAW,YAAA,EAAc,IAAI,CAAA;AAAA,EAChD,CAAA,EAAG,CAAC,IAAA,EAAM,MAAM,CAAC,CAAA;AACnB;AAYO,SAAS,mBAAA,CAAoB,MAAA,EAAoB,MAAA,GAAsB,KAAA,EAAO;AACnF,EAAA,OAAO,MAAA,CAAO,SAAA,CAAU,YAAA,EAAc,CAAC,EAAE,UAAA,EAAW,KAAM,MAAA,CAAO,UAAA,CAAW,YAAA,EAAc,UAAA,CAAW,QAAQ,CAAC,CAAA;AAChH","file":"chunk-3UN5VMQU.js","sourcesContent":["import { Component, useEffect, type ErrorInfo, type ReactNode } from \"react\";\nimport { deBug, type DebugClient } from \"./index\";\n\nexport interface DebugErrorBoundaryProps {\n children?: ReactNode;\n /** What to render after a crash. A function gets the error and a reset callback. */\n fallback?: ReactNode | ((props: { error: Error; reset: () => void }) => ReactNode);\n /** Part of the app this boundary protects, e.g. \"checkout\". */\n flow?: string;\n client?: DebugClient;\n onError?: (error: Error, info: ErrorInfo) => void;\n}\n\ninterface State {\n error: Error | null;\n}\n\n/**\n * Catches render errors that React would otherwise swallow (or turn into a white/red screen)\n * and reports them. Works in React DOM and React Native.\n */\nexport class DebugErrorBoundary extends Component<DebugErrorBoundaryProps, State> {\n state: State = { error: null };\n\n static getDerivedStateFromError(error: Error): State {\n return { error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n const client = this.props.client ?? deBug;\n if (info.componentStack) {\n client.breadcrumb(\"ui\", \"React render error\", { componentStack: info.componentStack.trim().slice(0, 1500) }, \"error\");\n }\n client.error(error, { flow: this.props.flow, handled: false, tags: { source: \"error-boundary\" } });\n void client.flush();\n this.props.onError?.(error, info);\n }\n\n reset = () => this.setState({ error: null });\n\n render() {\n const { error } = this.state;\n if (!error) return this.props.children;\n const { fallback } = this.props;\n return typeof fallback === \"function\" ? fallback({ error, reset: this.reset }) : (fallback ?? null);\n }\n}\n\n/** Adds a navigation breadcrumb whenever `path` changes. Works with any router. */\nexport function useDebugNavigation(path: string | undefined, client: DebugClient = deBug) {\n useEffect(() => {\n if (path) client.breadcrumb(\"navigation\", path);\n }, [path, client]);\n}\n\n/** Minimal shape of a TanStack Router instance (avoids a hard dependency). */\ninterface RouterLike {\n subscribe(event: \"onResolved\", fn: (e: { toLocation: { pathname: string; href?: string } }) => void): () => void;\n}\n\n/**\n * Records a breadcrumb for every navigation in a TanStack Router app:\n * const router = createRouter({ routeTree }); trackTanStackRouter(router);\n * Returns an unsubscribe function.\n */\nexport function trackTanStackRouter(router: RouterLike, client: DebugClient = deBug) {\n return router.subscribe(\"onResolved\", ({ toLocation }) => client.breadcrumb(\"navigation\", toLocation.pathname));\n}\n\nexport { deBug } from \"./index\";\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react-native.ts"],"names":[],"mappings":"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","file":"chunk-BD2FNVCP.js","sourcesContent":["import { AppState, Platform } from \"react-native\";\nimport { deBug, type DebugClient, type InitOptions } from \"./index\";\nimport { locale, mergeContext, timezone, type ContextPatch } from \"./context\";\n\nexport * from \"./react\";\n\n/** The subset of react-native-device-info we read. Pass the module itself: `import DeviceInfo from \"react-native-device-info\"`. */\nexport interface DeviceInfoModule {\n getModel(): string;\n getBrand(): string;\n getVersion(): string;\n getBuildNumber(): string;\n isTablet(): boolean;\n getManufacturerSync?(): string;\n isEmulatorSync?(): boolean;\n getTotalMemorySync?(): number;\n}\n\ntype RNConstants = {\n Release?: string;\n Model?: string;\n Brand?: string;\n Manufacturer?: string;\n Fingerprint?: string;\n reactNativeVersion?: { major: number; minor: number; patch: number };\n};\n\n/**\n * Context for bare React Native. Reads what `react-native` exposes on its own; pass\n * react-native-device-info for model, app version and memory on both platforms.\n */\nexport function nativeContext(opts: { deviceInfo?: DeviceInfoModule } = {}): ContextPatch {\n const c = (Platform.constants ?? {}) as RNConstants;\n const di = opts.deviceInfo;\n const rn = c.reactNativeVersion;\n const hermes = typeof (globalThis as { HermesInternal?: unknown }).HermesInternal !== \"undefined\";\n const call = <T,>(fn?: () => T) => {\n try {\n return fn?.();\n } catch {\n return undefined;\n }\n };\n const totalMemory = call(di?.getTotalMemorySync?.bind(di));\n return {\n os: { name: Platform.OS, version: Platform.OS === \"android\" ? (c.Release ?? String(Platform.Version)) : String(Platform.Version) },\n runtime: { name: \"react-native\", version: rn ? `${rn.major}.${rn.minor}.${rn.patch}` : undefined, engine: hermes ? \"hermes\" : \"jsc\" },\n device: {\n model: call(di?.getModel.bind(di)) ?? c.Model,\n brand: call(di?.getBrand.bind(di)) ?? c.Brand,\n manufacturer: call(di?.getManufacturerSync?.bind(di)) ?? c.Manufacturer,\n isEmulator: call(di?.isEmulatorSync?.bind(di)) ?? (c.Fingerprint ? /generic|emulator/i.test(c.Fingerprint) : undefined),\n memoryMb: totalMemory ? Math.round(totalMemory / 1024 / 1024) : undefined,\n type: di ? (call(di.isTablet.bind(di)) ? \"tablet\" : \"phone\") : Platform.OS === \"ios\" && (Platform as { isPad?: boolean }).isPad ? \"tablet\" : \"phone\",\n },\n app: { version: call(di?.getVersion.bind(di)), build: call(di?.getBuildNumber.bind(di)) } as ContextPatch[\"app\"],\n locale: locale(),\n timezone: timezone(),\n };\n}\n\nexport interface ReactNativeInitOptions extends InitOptions {\n deviceInfo?: DeviceInfoModule;\n /**\n * Report unhandled promise rejections (Hermes). Default \"production\": in development React\n * Native's own yellow-box warning keeps working. `true` captures in development too.\n */\n captureUnhandledRejections?: boolean | \"production\";\n}\n\ndeclare const __DEV__: boolean | undefined;\n\n/** Initialise deBug in a React Native app (bare or Expo). Fills in device context and flushes when the app is backgrounded. */\nexport function initReactNative(options: ReactNativeInitOptions, client: DebugClient = deBug): DebugClient {\n const { deviceInfo, captureUnhandledRejections = \"production\", ...rest } = options;\n const base = nativeContext({ deviceInfo });\n client.init({\n ...rest,\n app: { ...(base.app as object), ...rest.app },\n context: mergeContext(base, rest.context ?? {}),\n });\n\n AppState.addEventListener(\"change\", (state) => {\n if (state !== \"active\") void client.flush();\n });\n\n const dev = typeof __DEV__ !== \"undefined\" && __DEV__;\n const tracker = (globalThis as { HermesInternal?: { enablePromiseRejectionTracker?: (o: object) => void } }).HermesInternal\n ?.enablePromiseRejectionTracker;\n if (tracker && (captureUnhandledRejections === true || (captureUnhandledRejections === \"production\" && !dev))) {\n tracker({\n allRejections: true,\n onUnhandled: (_id: number, reason: unknown) => client.error(reason, { handled: false, tags: { source: \"unhandled-rejection\" } }),\n onHandled: () => {},\n });\n }\n return client;\n}\n\n/** Minimal shape of a React Navigation container ref. */\ninterface NavigationRefLike {\n getCurrentRoute(): { name: string } | undefined;\n}\n\n/**\n * Breadcrumbs for React Navigation. Spread the result onto your container:\n * const nav = useNavigationContainerRef();\n * <NavigationContainer ref={nav} {...trackReactNavigation(nav)}>\n */\nexport function trackReactNavigation(ref: NavigationRefLike, client: DebugClient = deBug) {\n let last: string | undefined;\n const record = () => {\n const name = ref.getCurrentRoute()?.name;\n if (name && name !== last) client.breadcrumb(\"navigation\", last ? `${last} → ${name}` : name);\n last = name ?? last;\n };\n return { onReady: record, onStateChange: record };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react.tsx"],"names":["Component","__publicField","deBug","useEffect"],"mappings":";;;;;AAqBO,IAAM,kBAAA,GAAN,cAAiCA,eAAA,CAA0C;AAAA,EAA3E,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AACL,IAAAC,+BAAA,CAAA,IAAA,EAAA,OAAA,EAAe,EAAE,OAAO,IAAA,EAAK,CAAA;AAgB7B,IAAAA,+BAAA,CAAA,IAAA,EAAA,OAAA,EAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,EAAE,KAAA,EAAO,MAAM,CAAA,CAAA;AAAA,EAAA;AAAA,EAd3C,OAAO,yBAAyB,KAAA,EAAqB;AACnD,IAAA,OAAO,EAAE,KAAA,EAAM;AAAA,EACjB;AAAA,EAEA,iBAAA,CAAkB,OAAc,IAAA,EAAiB;AA5BnD,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA6BI,IAAA,MAAM,MAAA,GAAA,CAAS,EAAA,GAAA,IAAA,CAAK,KAAA,CAAM,MAAA,KAAX,IAAA,GAAA,EAAA,GAAqBC,uBAAA;AACpC,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,MAAA,CAAO,UAAA,CAAW,IAAA,EAAM,oBAAA,EAAsB,EAAE,gBAAgB,IAAA,CAAK,cAAA,CAAe,IAAA,EAAK,CAAE,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,IAAK,OAAO,CAAA;AAAA,IACtH;AACA,IAAA,MAAA,CAAO,KAAA,CAAM,KAAA,EAAO,EAAE,IAAA,EAAM,KAAK,KAAA,CAAM,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,IAAA,EAAM,EAAE,MAAA,EAAQ,gBAAA,IAAoB,CAAA;AACjG,IAAA,KAAK,OAAO,KAAA,EAAM;AAClB,IAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,KAAA,EAAM,OAAA,KAAX,IAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAqB,KAAA,EAAO,IAAA,CAAA;AAAA,EAC9B;AAAA,EAIA,MAAA,GAAS;AACP,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,IAAA,CAAK,KAAA;AACvB,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA;AAC9B,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,IAAA,CAAK,KAAA;AAC1B,IAAA,OAAO,OAAO,QAAA,KAAa,UAAA,GAAa,QAAA,CAAS,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,CAAA,GAAK,QAAA,IAAA,IAAA,GAAA,QAAA,GAAY,IAAA;AAAA,EAChG;AACF;AAGO,SAAS,kBAAA,CAAmB,IAAA,EAA0B,MAAA,GAAsBA,uBAAA,EAAO;AACxF,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAA,EAAM,MAAA,CAAO,UAAA,CAAW,YAAA,EAAc,IAAI,CAAA;AAAA,EAChD,CAAA,EAAG,CAAC,IAAA,EAAM,MAAM,CAAC,CAAA;AACnB;AAYO,SAAS,mBAAA,CAAoB,MAAA,EAAoB,MAAA,GAAsBD,uBAAA,EAAO;AACnF,EAAA,OAAO,MAAA,CAAO,SAAA,CAAU,YAAA,EAAc,CAAC,EAAE,UAAA,EAAW,KAAM,MAAA,CAAO,UAAA,CAAW,YAAA,EAAc,UAAA,CAAW,QAAQ,CAAC,CAAA;AAChH","file":"chunk-KUJ4EW3D.cjs","sourcesContent":["import { Component, useEffect, type ErrorInfo, type ReactNode } from \"react\";\nimport { deBug, type DebugClient } from \"./index\";\n\nexport interface DebugErrorBoundaryProps {\n children?: ReactNode;\n /** What to render after a crash. A function gets the error and a reset callback. */\n fallback?: ReactNode | ((props: { error: Error; reset: () => void }) => ReactNode);\n /** Part of the app this boundary protects, e.g. \"checkout\". */\n flow?: string;\n client?: DebugClient;\n onError?: (error: Error, info: ErrorInfo) => void;\n}\n\ninterface State {\n error: Error | null;\n}\n\n/**\n * Catches render errors that React would otherwise swallow (or turn into a white/red screen)\n * and reports them. Works in React DOM and React Native.\n */\nexport class DebugErrorBoundary extends Component<DebugErrorBoundaryProps, State> {\n state: State = { error: null };\n\n static getDerivedStateFromError(error: Error): State {\n return { error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n const client = this.props.client ?? deBug;\n if (info.componentStack) {\n client.breadcrumb(\"ui\", \"React render error\", { componentStack: info.componentStack.trim().slice(0, 1500) }, \"error\");\n }\n client.error(error, { flow: this.props.flow, handled: false, tags: { source: \"error-boundary\" } });\n void client.flush();\n this.props.onError?.(error, info);\n }\n\n reset = () => this.setState({ error: null });\n\n render() {\n const { error } = this.state;\n if (!error) return this.props.children;\n const { fallback } = this.props;\n return typeof fallback === \"function\" ? fallback({ error, reset: this.reset }) : (fallback ?? null);\n }\n}\n\n/** Adds a navigation breadcrumb whenever `path` changes. Works with any router. */\nexport function useDebugNavigation(path: string | undefined, client: DebugClient = deBug) {\n useEffect(() => {\n if (path) client.breadcrumb(\"navigation\", path);\n }, [path, client]);\n}\n\n/** Minimal shape of a TanStack Router instance (avoids a hard dependency). */\ninterface RouterLike {\n subscribe(event: \"onResolved\", fn: (e: { toLocation: { pathname: string; href?: string } }) => void): () => void;\n}\n\n/**\n * Records a breadcrumb for every navigation in a TanStack Router app:\n * const router = createRouter({ routeTree }); trackTanStackRouter(router);\n * Returns an unsubscribe function.\n */\nexport function trackTanStackRouter(router: RouterLike, client: DebugClient = deBug) {\n return router.subscribe(\"onResolved\", ({ toLocation }) => client.breadcrumb(\"navigation\", toLocation.pathname));\n}\n\nexport { deBug } from \"./index\";\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react-native.ts"],"names":["Platform","locale","timezone","deBug","mergeContext","AppState"],"mappings":"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","file":"chunk-NSWUGBA2.cjs","sourcesContent":["import { AppState, Platform } from \"react-native\";\nimport { deBug, type DebugClient, type InitOptions } from \"./index\";\nimport { locale, mergeContext, timezone, type ContextPatch } from \"./context\";\n\nexport * from \"./react\";\n\n/** The subset of react-native-device-info we read. Pass the module itself: `import DeviceInfo from \"react-native-device-info\"`. */\nexport interface DeviceInfoModule {\n getModel(): string;\n getBrand(): string;\n getVersion(): string;\n getBuildNumber(): string;\n isTablet(): boolean;\n getManufacturerSync?(): string;\n isEmulatorSync?(): boolean;\n getTotalMemorySync?(): number;\n}\n\ntype RNConstants = {\n Release?: string;\n Model?: string;\n Brand?: string;\n Manufacturer?: string;\n Fingerprint?: string;\n reactNativeVersion?: { major: number; minor: number; patch: number };\n};\n\n/**\n * Context for bare React Native. Reads what `react-native` exposes on its own; pass\n * react-native-device-info for model, app version and memory on both platforms.\n */\nexport function nativeContext(opts: { deviceInfo?: DeviceInfoModule } = {}): ContextPatch {\n const c = (Platform.constants ?? {}) as RNConstants;\n const di = opts.deviceInfo;\n const rn = c.reactNativeVersion;\n const hermes = typeof (globalThis as { HermesInternal?: unknown }).HermesInternal !== \"undefined\";\n const call = <T,>(fn?: () => T) => {\n try {\n return fn?.();\n } catch {\n return undefined;\n }\n };\n const totalMemory = call(di?.getTotalMemorySync?.bind(di));\n return {\n os: { name: Platform.OS, version: Platform.OS === \"android\" ? (c.Release ?? String(Platform.Version)) : String(Platform.Version) },\n runtime: { name: \"react-native\", version: rn ? `${rn.major}.${rn.minor}.${rn.patch}` : undefined, engine: hermes ? \"hermes\" : \"jsc\" },\n device: {\n model: call(di?.getModel.bind(di)) ?? c.Model,\n brand: call(di?.getBrand.bind(di)) ?? c.Brand,\n manufacturer: call(di?.getManufacturerSync?.bind(di)) ?? c.Manufacturer,\n isEmulator: call(di?.isEmulatorSync?.bind(di)) ?? (c.Fingerprint ? /generic|emulator/i.test(c.Fingerprint) : undefined),\n memoryMb: totalMemory ? Math.round(totalMemory / 1024 / 1024) : undefined,\n type: di ? (call(di.isTablet.bind(di)) ? \"tablet\" : \"phone\") : Platform.OS === \"ios\" && (Platform as { isPad?: boolean }).isPad ? \"tablet\" : \"phone\",\n },\n app: { version: call(di?.getVersion.bind(di)), build: call(di?.getBuildNumber.bind(di)) } as ContextPatch[\"app\"],\n locale: locale(),\n timezone: timezone(),\n };\n}\n\nexport interface ReactNativeInitOptions extends InitOptions {\n deviceInfo?: DeviceInfoModule;\n /**\n * Report unhandled promise rejections (Hermes). Default \"production\": in development React\n * Native's own yellow-box warning keeps working. `true` captures in development too.\n */\n captureUnhandledRejections?: boolean | \"production\";\n}\n\ndeclare const __DEV__: boolean | undefined;\n\n/** Initialise deBug in a React Native app (bare or Expo). Fills in device context and flushes when the app is backgrounded. */\nexport function initReactNative(options: ReactNativeInitOptions, client: DebugClient = deBug): DebugClient {\n const { deviceInfo, captureUnhandledRejections = \"production\", ...rest } = options;\n const base = nativeContext({ deviceInfo });\n client.init({\n ...rest,\n app: { ...(base.app as object), ...rest.app },\n context: mergeContext(base, rest.context ?? {}),\n });\n\n AppState.addEventListener(\"change\", (state) => {\n if (state !== \"active\") void client.flush();\n });\n\n const dev = typeof __DEV__ !== \"undefined\" && __DEV__;\n const tracker = (globalThis as { HermesInternal?: { enablePromiseRejectionTracker?: (o: object) => void } }).HermesInternal\n ?.enablePromiseRejectionTracker;\n if (tracker && (captureUnhandledRejections === true || (captureUnhandledRejections === \"production\" && !dev))) {\n tracker({\n allRejections: true,\n onUnhandled: (_id: number, reason: unknown) => client.error(reason, { handled: false, tags: { source: \"unhandled-rejection\" } }),\n onHandled: () => {},\n });\n }\n return client;\n}\n\n/** Minimal shape of a React Navigation container ref. */\ninterface NavigationRefLike {\n getCurrentRoute(): { name: string } | undefined;\n}\n\n/**\n * Breadcrumbs for React Navigation. Spread the result onto your container:\n * const nav = useNavigationContainerRef();\n * <NavigationContainer ref={nav} {...trackReactNavigation(nav)}>\n */\nexport function trackReactNavigation(ref: NavigationRefLike, client: DebugClient = deBug) {\n let last: string | undefined;\n const record = () => {\n const name = ref.getCurrentRoute()?.name;\n if (name && name !== last) client.breadcrumb(\"navigation\", last ? `${last} → ${name}` : name);\n last = name ?? last;\n };\n return { onReady: record, onStateChange: record };\n}\n"]}
|