From b17454521f75fbdea8ef57f953def3027ca81cee Mon Sep 17 00:00:00 2001 From: Khushi Patel Date: Mon, 1 Jun 2026 09:15:35 -0400 Subject: [PATCH 1/2] feat: capture page url --- dist/types/src/kitBlocking.d.ts | 2 + dist/types/src/sdkRuntimeModels.d.ts | 1 + package-lock.json | 8 ++- package.json | 4 +- src/sdkRuntimeModels.ts | 1 + src/sdkToEventsApiConverter.ts | 3 +- src/serverModel.ts | 1 + test/src/tests-runtimeToBatchEventsDTO.ts | 80 +++++++++++++++++++++++ test/src/tests-serverModel.ts | 19 ++++++ 9 files changed, 113 insertions(+), 6 deletions(-) diff --git a/dist/types/src/kitBlocking.d.ts b/dist/types/src/kitBlocking.d.ts index 6904cfa26..cf3c3e2a7 100644 --- a/dist/types/src/kitBlocking.d.ts +++ b/dist/types/src/kitBlocking.d.ts @@ -66,6 +66,7 @@ export default class KitBlocker { LaunchReferral?: string; ExpandedEventCount: number; ActiveTimeOnSite: number; + PageUrl?: string; IsBackgroundAST?: boolean; AlreadySentToForwarders?: boolean; }; @@ -110,6 +111,7 @@ export default class KitBlocker { LaunchReferral?: string; ExpandedEventCount: number; ActiveTimeOnSite: number; + PageUrl?: string; IsBackgroundAST?: boolean; AlreadySentToForwarders?: boolean; }; diff --git a/dist/types/src/sdkRuntimeModels.d.ts b/dist/types/src/sdkRuntimeModels.d.ts index f6c912f72..1afc4c141 100644 --- a/dist/types/src/sdkRuntimeModels.d.ts +++ b/dist/types/src/sdkRuntimeModels.d.ts @@ -60,6 +60,7 @@ export interface SDKEvent { LaunchReferral?: string; ExpandedEventCount: number; ActiveTimeOnSite: number; + PageUrl?: string; IsBackgroundAST?: boolean; AlreadySentToForwarders?: boolean; } diff --git a/package-lock.json b/package-lock.json index 6ea39e6f6..f01081801 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "@babel/preset-env": "^7.6.0", "@babel/preset-typescript": "^7.6.0", "@mparticle/data-planning-models": "^0.1.0", - "@mparticle/event-models": "^1.1.9", + "@mparticle/event-models": "^1.3.0", "@rollup/plugin-babel": "6.0.3", "@rollup/plugin-commonjs": "25.0.4", "@rollup/plugin-json": "^5.0.2", @@ -77,7 +77,7 @@ "webpack-cli": "^5.0.2" }, "peerDependencies": { - "@mparticle/event-models": "^1.1.9" + "@mparticle/event-models": "^1.3.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -2732,7 +2732,9 @@ } }, "node_modules/@mparticle/event-models": { - "version": "1.1.9", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@mparticle/event-models/-/event-models-1.3.0.tgz", + "integrity": "sha512-WTQmaFffUETMP7dGwrBK4og/Wjj6gpb7hj7jNVJ9AP/9uz20FckfZm5u8NwlTtRCz2kVKxPpf/QEl1VnuENB+A==", "dev": true, "license": "Apache-2.0" }, diff --git a/package.json b/package.json index 6ae8cfcb5..77b456c3f 100644 --- a/package.json +++ b/package.json @@ -103,7 +103,7 @@ "@babel/preset-env": "^7.6.0", "@babel/preset-typescript": "^7.6.0", "@mparticle/data-planning-models": "^0.1.0", - "@mparticle/event-models": "^1.1.9", + "@mparticle/event-models": "^1.3.0", "@rollup/plugin-babel": "6.0.3", "@rollup/plugin-commonjs": "25.0.4", "@rollup/plugin-json": "^5.0.2", @@ -159,7 +159,7 @@ "webpack-cli": "^5.0.2" }, "peerDependencies": { - "@mparticle/event-models": "^1.1.9" + "@mparticle/event-models": "^1.3.0" }, "dependencies": { "@babel/runtime": "^7.23.2" diff --git a/src/sdkRuntimeModels.ts b/src/sdkRuntimeModels.ts index 5d48953ab..888944290 100644 --- a/src/sdkRuntimeModels.ts +++ b/src/sdkRuntimeModels.ts @@ -94,6 +94,7 @@ export interface SDKEvent { LaunchReferral?: string; ExpandedEventCount: number; ActiveTimeOnSite: number; + PageUrl?: string; IsBackgroundAST?: boolean; AlreadySentToForwarders?: boolean; } diff --git a/src/sdkToEventsApiConverter.ts b/src/sdkToEventsApiConverter.ts index 16bb339fa..1731f4bfe 100644 --- a/src/sdkToEventsApiConverter.ts +++ b/src/sdkToEventsApiConverter.ts @@ -663,7 +663,8 @@ export function convertBaseEventData( custom_attributes: sdkEvent.EventAttributes, location: convertSDKLocation(sdkEvent.Location), source_message_id: sdkEvent.SourceMessageId, - active_time_on_site_ms: sdkEvent.ActiveTimeOnSite + active_time_on_site_ms: sdkEvent.ActiveTimeOnSite, + page_url: sdkEvent.PageUrl, }; return commonEventData; diff --git a/src/serverModel.ts b/src/serverModel.ts index c21663c9a..80aad760b 100644 --- a/src/serverModel.ts +++ b/src/serverModel.ts @@ -310,6 +310,7 @@ export default function ServerModel( event.name ), ActiveTimeOnSite: mpInstance._timeOnSiteTimer?.getTimeInForeground(), + PageUrl: window.location.href || null, SourceMessageId: event.sourceMessageId || mpInstance._Helpers.generateUniqueId(), diff --git a/test/src/tests-runtimeToBatchEventsDTO.ts b/test/src/tests-runtimeToBatchEventsDTO.ts index d09246482..3a9455c14 100644 --- a/test/src/tests-runtimeToBatchEventsDTO.ts +++ b/test/src/tests-runtimeToBatchEventsDTO.ts @@ -510,4 +510,84 @@ describe('Old model to batch model conversion', () => { // set screen back on window.screen = originalScreen; }); + + it('propagates PageUrl to page_url on the converted event', () => { + const sdkEvent: SDKEvent = { + EventName: 'Page View', + EventCategory: Types.EventType.Navigation, + ExpandedEventCount: 0, + EventDataType: Types.MessageType.PageEvent, + EventAttributes: null, + ConsentState: null, + CurrencyCode: null, + CustomFlags: {}, + DataPlan: {}, + Debug: true, + DeviceId: '0edd580e-d887-44e4-89ae-cd65aa0ee933', + Location: null, + MPID: '-8433569646818451201', + OptOut: null, + SDKVersion: '2.11.15', + SourceMessageId: 'testSMID', + SessionId: '64102C03-592F-440D-8BCC-1D27AAA6B188', + SessionStartDate: 1603211322698, + Timestamp: 1603212299414, + ActiveTimeOnSite: 10, + PageUrl: 'https://example.com/checkout?utm=should-be-stripped-server-side', + UserAttributes: {}, + UserIdentities: [], + IsFirstRun: true, + }; + + const batch = Converter.convertEvents( + '-8433569646818451201', + [sdkEvent], + window.mParticle.getInstance() + ); + + expect(batch).to.be.ok; + expect(batch.events.length).to.equal(1); + const event = batch.events[0] as EventsApi.CustomEvent; + expect(event.data.page_url).to.equal( + 'https://example.com/checkout?utm=should-be-stripped-server-side' + ); + }); + + it('omits page_url when PageUrl is not set on the SDK event', () => { + const sdkEvent: SDKEvent = { + EventName: 'Page View', + EventCategory: Types.EventType.Navigation, + ExpandedEventCount: 0, + EventDataType: Types.MessageType.PageEvent, + EventAttributes: null, + ConsentState: null, + CurrencyCode: null, + CustomFlags: {}, + DataPlan: {}, + Debug: true, + DeviceId: '0edd580e-d887-44e4-89ae-cd65aa0ee933', + Location: null, + MPID: '-8433569646818451201', + OptOut: null, + SDKVersion: '2.11.15', + SourceMessageId: 'testSMID', + SessionId: '64102C03-592F-440D-8BCC-1D27AAA6B188', + SessionStartDate: 1603211322698, + Timestamp: 1603212299414, + ActiveTimeOnSite: 10, + UserAttributes: {}, + UserIdentities: [], + IsFirstRun: true, + }; + + const batch = Converter.convertEvents( + '-8433569646818451201', + [sdkEvent], + window.mParticle.getInstance() + ); + + expect(batch).to.be.ok; + const event = batch.events[0] as EventsApi.CustomEvent; + expect(event.data.page_url).to.equal(undefined); + }); }); \ No newline at end of file diff --git a/test/src/tests-serverModel.ts b/test/src/tests-serverModel.ts index 4afabdbfe..2c51031b1 100644 --- a/test/src/tests-serverModel.ts +++ b/test/src/tests-serverModel.ts @@ -297,6 +297,25 @@ describe('ServerModel', () => { ); }); + it('should capture window.location.href as PageUrl', () => { + const event: BaseEvent = { + name: 'Test Event', + messageType: Types.MessageType.PageEvent, + eventType: Types.EventType.Navigation, + data: { foo: 'bar' }, + sourceMessageId: 'test-source-message-id', + customFlags: {}, + }; + + const actualEventObject = mParticle + .getInstance() + ._ServerModel.createEventObject(event) as IUploadObject; + + expect(actualEventObject.PageUrl, 'PageUrl').to.equal( + window.location.href + ); + }); + it('should create an event object with a user', () => { const event: BaseEvent = { name: 'Test Event', From 8f5a1803acc9a347c199948437ca2d04c3a20d98 Mon Sep 17 00:00:00 2001 From: Khushi Patel Date: Mon, 1 Jun 2026 10:20:27 -0400 Subject: [PATCH 2/2] feat: capture page_url in background AST events --- src/batchUploader.ts | 1 + test/src/tests-batchUploader.ts | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/batchUploader.ts b/src/batchUploader.ts index 8b1ab4974..d785b9ace 100644 --- a/src/batchUploader.ts +++ b/src/batchUploader.ts @@ -193,6 +193,7 @@ export class BatchUploader { SessionStartDate: sessionStartDate?.getTime() || now, Debug: SDKConfig.isDevelopmentMode, ActiveTimeOnSite: _timeOnSiteTimer?.getTimeInForeground() || 0, + PageUrl: window.location.href || null, IsBackgroundAST: true } as SDKEvent; diff --git a/test/src/tests-batchUploader.ts b/test/src/tests-batchUploader.ts index f3f65e705..c57f9de57 100644 --- a/test/src/tests-batchUploader.ts +++ b/test/src/tests-batchUploader.ts @@ -241,6 +241,7 @@ describe('batch uploader', () => { expect(astEvent.event_type).to.equal('application_state_transition'); expect(astEvent.data.active_time_on_site_ms).to.be.a('number'); + expect(astEvent.data.page_url).to.equal(window.location.href); expect(astEvent.data.application_transition_type).to.equal('application_background'); expect(astEvent.data.custom_attributes).to.exist; expect(astEvent.data.is_first_run).to.be.a('boolean'); @@ -335,6 +336,7 @@ describe('batch uploader', () => { expect(astEvent.event_type).to.equal('application_state_transition'); expect(astEvent.data.active_time_on_site_ms).to.be.a('number'); + expect(astEvent.data.page_url).to.equal(window.location.href); expect(astEvent.data.application_transition_type).to.equal('application_background'); expect(astEvent.data.custom_attributes).to.exist; expect(astEvent.data.is_first_run).to.be.a('boolean');