@diegotsi/flint-core 1.8.0 → 1.9.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.
- package/dist/{chunk-HVSD45YR.js → chunk-SO6WYKFF.js} +15 -2
- package/dist/{chunk-HVSD45YR.js.map → chunk-SO6WYKFF.js.map} +1 -1
- package/dist/datadog-FLEAFTUB.js +11 -0
- package/dist/index.cjs +51 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +33 -3
- package/dist/index.d.ts +33 -3
- package/dist/index.js +39 -13
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/datadog-I3QKI6Q3.js +0 -9
- /package/dist/{datadog-I3QKI6Q3.js.map → datadog-FLEAFTUB.js.map} +0 -0
|
@@ -21,9 +21,22 @@ function createDatadogReplayProvider(site) {
|
|
|
21
21
|
return void 0;
|
|
22
22
|
};
|
|
23
23
|
}
|
|
24
|
+
function trackDatadogBugReported(meta) {
|
|
25
|
+
try {
|
|
26
|
+
const ddRum = window.DD_RUM;
|
|
27
|
+
ddRum?.addAction?.("flint.bug_reported", {
|
|
28
|
+
bug_id: meta.bugId,
|
|
29
|
+
severity: meta.severity,
|
|
30
|
+
url: meta.url,
|
|
31
|
+
title: meta.title
|
|
32
|
+
});
|
|
33
|
+
} catch {
|
|
34
|
+
}
|
|
35
|
+
}
|
|
24
36
|
|
|
25
37
|
export {
|
|
26
38
|
DATADOG_BLOCKED_HOSTS,
|
|
27
|
-
createDatadogReplayProvider
|
|
39
|
+
createDatadogReplayProvider,
|
|
40
|
+
trackDatadogBugReported
|
|
28
41
|
};
|
|
29
|
-
//# sourceMappingURL=chunk-
|
|
42
|
+
//# sourceMappingURL=chunk-SO6WYKFF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/integrations/datadog.ts"],"sourcesContent":["/**\n * Datadog RUM integration — opt-in helper.\n *\n * Usage:\n * import { Flint } from \"@diegotsi/flint-core\";\n * import { createDatadogReplayProvider, DATADOG_BLOCKED_HOSTS } from \"@diegotsi/flint-core\";\n *\n * Flint.init({\n * projectKey: \"...\",\n * serverUrl: \"...\",\n * externalReplayProvider: createDatadogReplayProvider(\"app.datadoghq.com\"),\n * blockedHosts: DATADOG_BLOCKED_HOSTS,\n * });\n */\n\n/** Datadog intake hosts to exclude from network capture. */\nexport const DATADOG_BLOCKED_HOSTS = [\n \"browser-intake-datadoghq.com\",\n \"rum.browser-intake-datadoghq.com\",\n \"logs.browser-intake-datadoghq.com\",\n \"session-replay.browser-intake-datadoghq.com\",\n];\n\n/**\n * Creates an `externalReplayProvider` that reads the current Datadog RUM\n * session and returns a deep link to the Session Replay viewer.\n */\nexport function createDatadogReplayProvider(site: string): () => string | undefined {\n return () => {\n try {\n const ddRum = (window as unknown as Record<string, unknown>).DD_RUM as\n | { getInternalContext?: () => { session_id?: string } | undefined }\n | undefined;\n const ctx = ddRum?.getInternalContext?.();\n if (ctx?.session_id) {\n const ts = Date.now();\n const fromTs = ts - 30_000;\n const toTs = ts + 5_000;\n return `https://${site}/rum/replay/sessions/${ctx.session_id}?from_ts=${fromTs}&to_ts=${toTs}&tab=replay&live=false`;\n }\n } catch {\n // DD_RUM not available — silently skip\n }\n return undefined;\n };\n}\n"],"mappings":";AAgBO,IAAM,wBAAwB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMO,SAAS,4BAA4B,MAAwC;AAClF,SAAO,MAAM;AACX,QAAI;AACF,YAAM,QAAS,OAA8C;AAG7D,YAAM,MAAM,OAAO,qBAAqB;AACxC,UAAI,KAAK,YAAY;AACnB,cAAM,KAAK,KAAK,IAAI;AACpB,cAAM,SAAS,KAAK;AACpB,cAAM,OAAO,KAAK;AAClB,eAAO,WAAW,IAAI,wBAAwB,IAAI,UAAU,YAAY,MAAM,UAAU,IAAI;AAAA,MAC9F;AAAA,IACF,QAAQ;AAAA,IAER;AACA,WAAO;AAAA,EACT;AACF;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/integrations/datadog.ts"],"sourcesContent":["/**\n * Datadog RUM integration — opt-in helper.\n *\n * Usage:\n * import { Flint } from \"@diegotsi/flint-core\";\n * import { createDatadogReplayProvider, DATADOG_BLOCKED_HOSTS } from \"@diegotsi/flint-core\";\n *\n * Flint.init({\n * projectKey: \"...\",\n * serverUrl: \"...\",\n * externalReplayProvider: createDatadogReplayProvider(\"app.datadoghq.com\"),\n * blockedHosts: DATADOG_BLOCKED_HOSTS,\n * });\n */\n\n/** Datadog intake hosts to exclude from network capture. */\nexport const DATADOG_BLOCKED_HOSTS = [\n \"browser-intake-datadoghq.com\",\n \"rum.browser-intake-datadoghq.com\",\n \"logs.browser-intake-datadoghq.com\",\n \"session-replay.browser-intake-datadoghq.com\",\n];\n\n/**\n * Creates an `externalReplayProvider` that reads the current Datadog RUM\n * session and returns a deep link to the Session Replay viewer.\n */\nexport function createDatadogReplayProvider(site: string): () => string | undefined {\n return () => {\n try {\n const ddRum = (window as unknown as Record<string, unknown>).DD_RUM as\n | { getInternalContext?: () => { session_id?: string } | undefined }\n | undefined;\n const ctx = ddRum?.getInternalContext?.();\n if (ctx?.session_id) {\n const ts = Date.now();\n const fromTs = ts - 30_000;\n const toTs = ts + 5_000;\n return `https://${site}/rum/replay/sessions/${ctx.session_id}?from_ts=${fromTs}&to_ts=${toTs}&tab=replay&live=false`;\n }\n } catch {\n // DD_RUM not available — silently skip\n }\n return undefined;\n };\n}\n\n/**\n * Emits a custom Datadog RUM action at the moment a bug is reported, so it\n * shows up as a clickable marker on the Session Replay timeline — making the\n * report moment easy to find in long sessions.\n *\n * No-op when Datadog RUM (`window.DD_RUM`) is not present on the page.\n */\nexport function trackDatadogBugReported(meta: {\n bugId: string;\n severity?: string;\n url?: string;\n title?: string;\n}): void {\n try {\n const ddRum = (window as unknown as Record<string, unknown>).DD_RUM as\n | { addAction?: (name: string, context?: Record<string, unknown>) => void }\n | undefined;\n ddRum?.addAction?.(\"flint.bug_reported\", {\n bug_id: meta.bugId,\n severity: meta.severity,\n url: meta.url,\n title: meta.title,\n });\n } catch {\n // DD_RUM not available — silently skip\n }\n}\n"],"mappings":";AAgBO,IAAM,wBAAwB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMO,SAAS,4BAA4B,MAAwC;AAClF,SAAO,MAAM;AACX,QAAI;AACF,YAAM,QAAS,OAA8C;AAG7D,YAAM,MAAM,OAAO,qBAAqB;AACxC,UAAI,KAAK,YAAY;AACnB,cAAM,KAAK,KAAK,IAAI;AACpB,cAAM,SAAS,KAAK;AACpB,cAAM,OAAO,KAAK;AAClB,eAAO,WAAW,IAAI,wBAAwB,IAAI,UAAU,YAAY,MAAM,UAAU,IAAI;AAAA,MAC9F;AAAA,IACF,QAAQ;AAAA,IAER;AACA,WAAO;AAAA,EACT;AACF;AASO,SAAS,wBAAwB,MAK/B;AACP,MAAI;AACF,UAAM,QAAS,OAA8C;AAG7D,WAAO,YAAY,sBAAsB;AAAA,MACvC,QAAQ,KAAK;AAAA,MACb,UAAU,KAAK;AAAA,MACf,KAAK,KAAK;AAAA,MACV,OAAO,KAAK;AAAA,IACd,CAAC;AAAA,EACH,QAAQ;AAAA,EAER;AACF;","names":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DATADOG_BLOCKED_HOSTS,
|
|
3
|
+
createDatadogReplayProvider,
|
|
4
|
+
trackDatadogBugReported
|
|
5
|
+
} from "./chunk-SO6WYKFF.js";
|
|
6
|
+
export {
|
|
7
|
+
DATADOG_BLOCKED_HOSTS,
|
|
8
|
+
createDatadogReplayProvider,
|
|
9
|
+
trackDatadogBugReported
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=datadog-FLEAFTUB.js.map
|
package/dist/index.cjs
CHANGED
|
@@ -24,7 +24,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
24
24
|
var datadog_exports = {};
|
|
25
25
|
__export(datadog_exports, {
|
|
26
26
|
DATADOG_BLOCKED_HOSTS: () => DATADOG_BLOCKED_HOSTS,
|
|
27
|
-
createDatadogReplayProvider: () => createDatadogReplayProvider
|
|
27
|
+
createDatadogReplayProvider: () => createDatadogReplayProvider,
|
|
28
|
+
trackDatadogBugReported: () => trackDatadogBugReported
|
|
28
29
|
});
|
|
29
30
|
function createDatadogReplayProvider(site) {
|
|
30
31
|
return () => {
|
|
@@ -42,6 +43,18 @@ function createDatadogReplayProvider(site) {
|
|
|
42
43
|
return void 0;
|
|
43
44
|
};
|
|
44
45
|
}
|
|
46
|
+
function trackDatadogBugReported(meta) {
|
|
47
|
+
try {
|
|
48
|
+
const ddRum = window.DD_RUM;
|
|
49
|
+
ddRum?.addAction?.("flint.bug_reported", {
|
|
50
|
+
bug_id: meta.bugId,
|
|
51
|
+
severity: meta.severity,
|
|
52
|
+
url: meta.url,
|
|
53
|
+
title: meta.title
|
|
54
|
+
});
|
|
55
|
+
} catch {
|
|
56
|
+
}
|
|
57
|
+
}
|
|
45
58
|
var DATADOG_BLOCKED_HOSTS;
|
|
46
59
|
var init_datadog = __esm({
|
|
47
60
|
"src/integrations/datadog.ts"() {
|
|
@@ -72,7 +85,8 @@ __export(index_exports, {
|
|
|
72
85
|
resolveTheme: () => resolveTheme,
|
|
73
86
|
submitReplay: () => submitReplay,
|
|
74
87
|
submitReport: () => submitReport,
|
|
75
|
-
subscribe: () => subscribe
|
|
88
|
+
subscribe: () => subscribe,
|
|
89
|
+
trackDatadogBugReported: () => trackDatadogBugReported
|
|
76
90
|
});
|
|
77
91
|
module.exports = __toCommonJS(index_exports);
|
|
78
92
|
|
|
@@ -1132,6 +1146,34 @@ function createNetworkCollector(extraBlockedHosts = []) {
|
|
|
1132
1146
|
// src/index.ts
|
|
1133
1147
|
init_datadog();
|
|
1134
1148
|
|
|
1149
|
+
// src/replayBuffer.ts
|
|
1150
|
+
function createReplayBuffer(replayBufferMs, now = Date.now) {
|
|
1151
|
+
const events = [];
|
|
1152
|
+
let checkoutSeen = false;
|
|
1153
|
+
let recentCheckoutIdx = 0;
|
|
1154
|
+
return {
|
|
1155
|
+
push(event, isCheckout) {
|
|
1156
|
+
if (isCheckout) {
|
|
1157
|
+
checkoutSeen = true;
|
|
1158
|
+
if (events.length > 0) {
|
|
1159
|
+
events.splice(0, recentCheckoutIdx);
|
|
1160
|
+
recentCheckoutIdx = events.length;
|
|
1161
|
+
}
|
|
1162
|
+
}
|
|
1163
|
+
events.push(event);
|
|
1164
|
+
if (!checkoutSeen) {
|
|
1165
|
+
const cutoff = now() - replayBufferMs;
|
|
1166
|
+
while (events.length > 0 && events[0].timestamp < cutoff) {
|
|
1167
|
+
events.shift();
|
|
1168
|
+
}
|
|
1169
|
+
}
|
|
1170
|
+
},
|
|
1171
|
+
getEvents() {
|
|
1172
|
+
return [...events];
|
|
1173
|
+
}
|
|
1174
|
+
};
|
|
1175
|
+
}
|
|
1176
|
+
|
|
1135
1177
|
// src/store.ts
|
|
1136
1178
|
var formErrorCollectorRef = null;
|
|
1137
1179
|
function _setFormErrorCollector(collector) {
|
|
@@ -1247,7 +1289,7 @@ function init(config) {
|
|
|
1247
1289
|
if (config.user) {
|
|
1248
1290
|
flint.setUser(config.user);
|
|
1249
1291
|
}
|
|
1250
|
-
const
|
|
1292
|
+
const replayBuffer = createReplayBuffer(replayBufferMs);
|
|
1251
1293
|
let stopReplay = null;
|
|
1252
1294
|
debugLog(config, "Collectors started", {
|
|
1253
1295
|
console: !!consoleCol,
|
|
@@ -1263,16 +1305,12 @@ function init(config) {
|
|
|
1263
1305
|
formErrors: formErrorsCol,
|
|
1264
1306
|
frustration: frustrationCol,
|
|
1265
1307
|
errorCapture: errorCaptureCol,
|
|
1266
|
-
|
|
1308
|
+
replayBuffer,
|
|
1267
1309
|
stopReplay: null
|
|
1268
1310
|
};
|
|
1269
1311
|
if (enableReplay && _replayRecorder) {
|
|
1270
|
-
_replayRecorder((event) => {
|
|
1271
|
-
|
|
1272
|
-
const cutoff = Date.now() - replayBufferMs;
|
|
1273
|
-
while (replayEvents.length > 0 && replayEvents[0].timestamp < cutoff) {
|
|
1274
|
-
replayEvents.shift();
|
|
1275
|
-
}
|
|
1312
|
+
_replayRecorder((event, isCheckout) => {
|
|
1313
|
+
replayBuffer.push(event, isCheckout);
|
|
1276
1314
|
}).then((stop) => {
|
|
1277
1315
|
stopReplay = stop ?? null;
|
|
1278
1316
|
if (instance) instance.stopReplay = stopReplay;
|
|
@@ -1364,7 +1402,7 @@ function getMeta(extraMeta) {
|
|
|
1364
1402
|
};
|
|
1365
1403
|
}
|
|
1366
1404
|
function getReplayEvents() {
|
|
1367
|
-
return instance ?
|
|
1405
|
+
return instance ? instance.replayBuffer.getEvents() : [];
|
|
1368
1406
|
}
|
|
1369
1407
|
function getConfig() {
|
|
1370
1408
|
return instance?.config ?? null;
|
|
@@ -1443,6 +1481,7 @@ function resolveTheme(theme) {
|
|
|
1443
1481
|
resolveTheme,
|
|
1444
1482
|
submitReplay,
|
|
1445
1483
|
submitReport,
|
|
1446
|
-
subscribe
|
|
1484
|
+
subscribe,
|
|
1485
|
+
trackDatadogBugReported
|
|
1447
1486
|
});
|
|
1448
1487
|
//# sourceMappingURL=index.cjs.map
|