@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.
@@ -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-HVSD45YR.js.map
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 replayEvents = [];
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
- replayEvents,
1308
+ replayBuffer,
1267
1309
  stopReplay: null
1268
1310
  };
1269
1311
  if (enableReplay && _replayRecorder) {
1270
- _replayRecorder((event) => {
1271
- replayEvents.push(event);
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 ? [...instance.replayEvents] : [];
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