@mx-cartographer/experiences 9.4.19 → 9.4.20

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/CHANGELOG.md CHANGED
@@ -1,4 +1,8 @@
1
- ## [9.4.19] - TBD
1
+ ## [9.4.20] - 09-15-2026
2
+
3
+ - **ADDED** - DataDog RUM for Pulse and MDB
4
+
5
+ ## [9.4.19] - 09-15-2026
2
6
 
3
7
  - **ADDED** - insights-v2 `ObsolesceBanner` component: presentational banner displaying beat obsolescence states (refresh_available, refreshing, updated, not_refreshable, hidden) with smooth Collapse animation, proper ARIA labels, and state-appropriate icons (Sync/CheckCircle/Cancel) and actions (Update/Dismiss buttons). Exported from insights-v2 with full TypeScript types (`ObsolesceBannerProps`, `ObsolesceBannerState`, `ObsolesceBannerCopy`). Component accepts state + callbacks + copy as props; host owns data logic (WEC-1766)
4
8
  - **CHANGED** - `ObsolesceBanner` reuses existing `insights_feed.general` copy keys (`dismiss`, `insight_no_longer_applicable`, `insight_updated`, `new_information_available`, `update`, `updating`) rather than introducing a dedicated copy section — matches the copy already consumed by the legacy `ObsoleteManager` and defined in mrs_content, avoiding duplicate keys and translations. `GeneralInsightsFeedCopy` extended with these keys; `BaseLayout` passes `copy.insights_feed.general` straight through (WEC-1766)
@@ -6,7 +10,7 @@
6
10
  - **ADDED** - Comprehensive test coverage: 20 `ObsolesceBanner` tests (all 5 states, button interactions, copy variations, state transitions, callback isolation) plus `BaseLayout` obsolete tests (banner render, dimming overlay, click blocking, callbacks) (WEC-1766)
7
11
  - **ADDED** - Storybook stories for `ObsolesceBanner`: 5 static state stories plus 1 interactive state-machine story with debug panel and automatic transitions (WEC-1766)
8
12
 
9
- ## [9.4.18] - TBD
13
+ ## [9.4.18] - 09-11-2026
10
14
 
11
15
  - **CHANGED** - insights-v2 feedback UI cleanup: removed verbose comments and section dividers from `BaseLayout`, `FeedbackDialog`, `FeedbackBar`, `HiddenConfirmationCard`, `DismissInsightDialog`, `InsightOptionsMenu`, and `useBeatFeedbackFlow`; code is now self-documenting with brief one-line descriptions only where complexity warrants explanation. Minimal comment philosophy applied throughout (WEC-1766)
12
16
  - **CHANGED** - insights-v2 dismiss flow simplified: replaced controlled `dismissState` prop with direct `beat.is_dismissed` observation paired with local `hasClosedConfirmation` state in `useBeatFeedbackFlow`; `cardState` now derived via `useMemo` from these two sources. Eliminates need for parent-managed dismiss state while maintaining clean separation: Pulse owns persistence (`is_dismissed` property), experiences owns transient UI state (confirmation visibility). Survives navigation and handles API failures gracefully (WEC-1766)
@@ -18,6 +18,8 @@ export interface AppConfig {
18
18
  clientConfig?: ClientConfig;
19
19
  clientStyleProfile: ClientStyleProfile;
20
20
  config: Config;
21
+ datadogRumApplicationIdMd?: string;
22
+ datadogRumClientTokenMd?: string;
21
23
  honeyBadgerPublicKey?: string;
22
24
  is_mobile_webview?: boolean;
23
25
  options: Options;
@@ -0,0 +1 @@
1
+ export { buildRumBeforeSend, createRumErrorBuffer, DEFAULT_RUM_ERROR_BUFFER_SIZE, redactSsoPath, type RumBeforeSendOptions, type RumErrorBuffer, } from './rum';
@@ -0,0 +1,7 @@
1
+ import { DEFAULT_RUM_ERROR_BUFFER_SIZE as e, buildRumBeforeSend as R, createRumErrorBuffer as o, redactSsoPath as t } from "./rum.es.js";
2
+ export {
3
+ e as DEFAULT_RUM_ERROR_BUFFER_SIZE,
4
+ R as buildRumBeforeSend,
5
+ o as createRumErrorBuffer,
6
+ t as redactSsoPath
7
+ };
@@ -0,0 +1,13 @@
1
+ import { RumInitConfiguration } from '@datadog/browser-rum';
2
+ export declare const redactSsoPath: <T extends string | undefined>(value: T) => T;
3
+ export interface RumBeforeSendOptions {
4
+ scrubSsoPaths?: boolean;
5
+ }
6
+ export declare function buildRumBeforeSend({ scrubSsoPaths, }?: RumBeforeSendOptions): NonNullable<RumInitConfiguration['beforeSend']>;
7
+ export interface RumErrorBuffer<Context = Record<string, unknown>> {
8
+ push(error: unknown, context?: Context): boolean;
9
+ flush(send: (error: unknown, context?: Context) => void): void;
10
+ readonly size: number;
11
+ }
12
+ export declare const DEFAULT_RUM_ERROR_BUFFER_SIZE = 50;
13
+ export declare function createRumErrorBuffer<Context = Record<string, unknown>>(maxSize?: number): RumErrorBuffer<Context>;
@@ -0,0 +1,37 @@
1
+ var t = /(\/(?:md\/[^/?#]+|login)\/)[^?#]+/g, s = (e) => typeof e == "string" ? e.replace(t, "$1REDACTED") : e;
2
+ function i({ scrubSsoPaths: e = !1 } = {}) {
3
+ return (r) => {
4
+ if (e && (r.view.url = s(r.view.url), r.view.referrer = s(r.view.referrer), r.type === "resource" && (r.resource.url = s(r.resource.url)), r.type === "error" && r.error.resource && (r.error.resource.url = s(r.error.resource.url))), r.type !== "resource" || r.resource.type === "xhr" || r.resource.type === "fetch") return !0;
5
+ const u = r.resource.status_code;
6
+ return !(u !== void 0 && u > 0 && u < 400);
7
+ };
8
+ }
9
+ var c = 50;
10
+ function f(e = 50) {
11
+ const r = [];
12
+ return {
13
+ push(u, o) {
14
+ return r.length >= e ? !1 : (r.push({
15
+ error: u,
16
+ context: o
17
+ }), !0);
18
+ },
19
+ flush(u) {
20
+ for (; r.length > 0; ) {
21
+ const o = r.shift();
22
+ o && u(o.error, o.context);
23
+ }
24
+ },
25
+ get size() {
26
+ return r.length;
27
+ }
28
+ };
29
+ }
30
+ export {
31
+ c as DEFAULT_RUM_ERROR_BUFFER_SIZE,
32
+ i as buildRumBeforeSend,
33
+ f as createRumErrorBuffer,
34
+ s as redactSsoPath
35
+ };
36
+
37
+ //# sourceMappingURL=rum.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rum.es.js","names":[],"sources":["../../src/rum/rum.ts"],"sourcesContent":["import type { RumEvent, RumInitConfiguration } from '@datadog/browser-rum'\n\n// scrub the really long sso token because it's unhelpful and noisy in events\nconst SSO_PATH_PATTERN = /(\\/(?:md\\/[^/?#]+|login)\\/)[^?#]+/g\n\nexport const redactSsoPath = <T extends string | undefined>(value: T): T =>\n typeof value === 'string' ? (value.replace(SSO_PATH_PATTERN, '$1REDACTED') as T) : value\n\nexport interface RumBeforeSendOptions {\n scrubSsoPaths?: boolean\n}\n\n// runs on every RUM event before it is sent to Datadog\nexport function buildRumBeforeSend({\n scrubSsoPaths = false,\n}: RumBeforeSendOptions = {}): NonNullable<RumInitConfiguration['beforeSend']> {\n return (event: RumEvent) => {\n if (scrubSsoPaths) {\n event.view.url = redactSsoPath(event.view.url)\n event.view.referrer = redactSsoPath(event.view.referrer)\n if (event.type === 'resource') event.resource.url = redactSsoPath(event.resource.url)\n if (event.type === 'error' && event.error.resource) {\n event.error.resource.url = redactSsoPath(event.error.resource.url)\n }\n }\n\n if (event.type !== 'resource') return true\n if (event.resource.type === 'xhr' || event.resource.type === 'fetch') return true\n const status = event.resource.status_code\n return !(status !== undefined && status > 0 && status < 400)\n }\n}\n\n// Holds errors that happen before Datadog RUM has started up, so they aren't lost\nexport interface RumErrorBuffer<Context = Record<string, unknown>> {\n push(error: unknown, context?: Context): boolean\n flush(send: (error: unknown, context?: Context) => void): void\n readonly size: number\n}\n\nexport const DEFAULT_RUM_ERROR_BUFFER_SIZE = 50\n\nexport function createRumErrorBuffer<Context = Record<string, unknown>>(\n maxSize: number = DEFAULT_RUM_ERROR_BUFFER_SIZE,\n): RumErrorBuffer<Context> {\n const items: Array<{ error: unknown; context?: Context }> = []\n return {\n push(error, context) {\n if (items.length >= maxSize) return false\n items.push({ error, context })\n return true\n },\n flush(send) {\n while (items.length > 0) {\n const item = items.shift()\n if (item) send(item.error, item.context)\n }\n },\n get size() {\n return items.length\n },\n }\n}\n"],"mappings":"AAGA,IAAM,IAAmB,sCAEZ,IAAA,CAA+C,MAC1D,OAAO,KAAU,WAAY,EAAM,QAAQ,GAAkB,YAAY,IAAU;AAOrF,SAAgB,EAAmB,EACjC,eAAA,IAAgB,GAAA,IACQ,CAAC,GAAoD;AAC7E,SAAA,CAAQ,MAAoB;AAW1B,QAVI,MACF,EAAM,KAAK,MAAM,EAAc,EAAM,KAAK,GAAG,GAC7C,EAAM,KAAK,WAAW,EAAc,EAAM,KAAK,QAAQ,GACnD,EAAM,SAAS,eAAY,EAAM,SAAS,MAAM,EAAc,EAAM,SAAS,GAAG,IAChF,EAAM,SAAS,WAAW,EAAM,MAAM,aACxC,EAAM,MAAM,SAAS,MAAM,EAAc,EAAM,MAAM,SAAS,GAAG,KAIjE,EAAM,SAAS,cACf,EAAM,SAAS,SAAS,SAAS,EAAM,SAAS,SAAS,QAAS,QAAO;AAC7E,UAAM,IAAS,EAAM,SAAS;AAC9B,WAAO,EAAE,MAAW,UAAa,IAAS,KAAK,IAAS;AAAA,EAC1D;AACF;AASA,IAAa,IAAgC;AAE7C,SAAgB,EACd,IAAA,IACyB;AACzB,QAAM,IAAsD,CAAC;AAC7D,SAAO;AAAA,IACL,KAAK,GAAO,GAAS;AACnB,aAAI,EAAM,UAAU,IAAgB,MACpC,EAAM,KAAK;AAAA,QAAE,OAAA;AAAA,QAAO,SAAA;AAAA,MAAQ,CAAC,GACtB;AAAA,IACT;AAAA,IACA,MAAM,GAAM;AACV,aAAO,EAAM,SAAS,KAAG;AACvB,cAAM,IAAO,EAAM,MAAM;AACzB,QAAI,KAAM,EAAK,EAAK,OAAO,EAAK,OAAO;AAAA,MACzC;AAAA,IACF;AAAA,IACA,IAAI,OAAO;AACT,aAAO,EAAM;AAAA,IACf;AAAA,EACF;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mx-cartographer/experiences",
3
- "version": "9.4.19",
3
+ "version": "9.4.20",
4
4
  "description": "Library containing experience widgets",
5
5
  "author": "MX",
6
6
  "license": "MIT",
@@ -104,6 +104,10 @@
104
104
  "./trends": {
105
105
  "import": "./dist/trends/index.es.js",
106
106
  "types": "./dist/trends/index.d.ts"
107
+ },
108
+ "./rum": {
109
+ "import": "./dist/rum/index.es.js",
110
+ "types": "./dist/rum/index.d.ts"
107
111
  }
108
112
  },
109
113
  "typesVersions": {
@@ -179,6 +183,9 @@
179
183
  ],
180
184
  "trends": [
181
185
  "./dist/trends/index.d.ts"
186
+ ],
187
+ "rum": [
188
+ "./dist/rum/index.d.ts"
182
189
  ]
183
190
  }
184
191
  },
@@ -232,6 +239,7 @@
232
239
  },
233
240
  "devDependencies": {
234
241
  "@babel/core": "^7.29.7",
242
+ "@datadog/browser-rum": "7.12.0",
235
243
  "@storybook/addon-a11y": "^10.5.5",
236
244
  "@storybook/addon-docs": "^10.5.5",
237
245
  "@storybook/addon-links": "^10.5.5",
@@ -275,6 +283,7 @@
275
283
  "vitest": "^4.1.10"
276
284
  },
277
285
  "peerDependencies": {
286
+ "@datadog/browser-rum": "^7",
278
287
  "@mui/material": "^7",
279
288
  "@mxenabled/mxui": "^2",
280
289
  "d3": "^7",
@@ -300,5 +309,10 @@
300
309
  "workerDirectory": [
301
310
  ".storybook/static"
302
311
  ]
312
+ },
313
+ "peerDependenciesMeta": {
314
+ "@datadog/browser-rum": {
315
+ "optional": true
316
+ }
303
317
  }
304
318
  }