@amplitude/plugin-event-property-attribution-browser 0.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022 Amplitude Analytics
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # @amplitude/plugin-event-property-attribution-browser
2
+
3
+ Event property attribution enrichment plugin for the Amplitude Browser SDK.
@@ -0,0 +1,3 @@
1
+ import { AttributionOptions, BrowserClient, BrowserConfig, EnrichmentPlugin } from '@amplitude/analytics-core';
2
+ export declare const eventPropertyTrackingPlugin: (options?: AttributionOptions) => EnrichmentPlugin<BrowserClient, BrowserConfig>;
3
+ //# sourceMappingURL=event-property-tracking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-property-tracking.d.ts","sourceRoot":"","sources":["../../src/event-property-tracking.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,aAAa,EAGb,gBAAgB,EAMjB,MAAM,2BAA2B,CAAC;AAYnC,eAAO,MAAM,2BAA2B,aAC7B,kBAAkB,KAC1B,iBAAiB,aAAa,EAAE,aAAa,CA0H/C,CAAC"}
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.eventPropertyTrackingPlugin = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var analytics_core_1 = require("@amplitude/analytics-core");
6
+ var ATTRIBUTION_EVENT_TYPE = '[Amplitude] Attribution';
7
+ var EVENT_PROPERTY_EXCLUDED_EVENT_TYPES = new Set([
8
+ analytics_core_1.SpecialEventType.IDENTIFY,
9
+ analytics_core_1.SpecialEventType.GROUP_IDENTIFY,
10
+ ]);
11
+ var toEventPropertyCampaign = function (campaign) { return (0, analytics_core_1.omitUndefined)(campaign); };
12
+ var eventPropertyTrackingPlugin = function (options) {
13
+ var _a;
14
+ if (options === void 0) { options = {}; }
15
+ var fallbackAttributionEvent = (_a = options.fallbackAttributionEvent) !== null && _a !== void 0 ? _a : false;
16
+ var globalScope = (0, analytics_core_1.getGlobalScope)();
17
+ var amplitude;
18
+ var loggerProvider;
19
+ var eventPropertyCampaign = {};
20
+ var isTracking = false;
21
+ var isProxied = false;
22
+ var originalPushState;
23
+ var originalReplaceState;
24
+ var installedPushState;
25
+ var installedReplaceState;
26
+ var updateCampaignState = function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
27
+ var currentCampaign;
28
+ return tslib_1.__generator(this, function (_a) {
29
+ switch (_a.label) {
30
+ case 0: return [4 /*yield*/, new analytics_core_1.CampaignParser().parse()];
31
+ case 1:
32
+ currentCampaign = _a.sent();
33
+ eventPropertyCampaign = toEventPropertyCampaign(currentCampaign);
34
+ if (fallbackAttributionEvent) {
35
+ /* istanbul ignore next */
36
+ loggerProvider === null || loggerProvider === void 0 ? void 0 : loggerProvider.log('Tracking attribution fallback event.');
37
+ /* istanbul ignore next */
38
+ amplitude === null || amplitude === void 0 ? void 0 : amplitude.track(ATTRIBUTION_EVENT_TYPE, eventPropertyCampaign);
39
+ }
40
+ return [2 /*return*/];
41
+ }
42
+ });
43
+ }); };
44
+ var onHistoryChange = function () {
45
+ // CampaignParser.parse() is async by type, but its current implementation computes synchronously.
46
+ // In the Browser SDK, this history-triggered refresh starts immediately and reaches its continuation
47
+ // before Timeline.scheduleApply(0) runs event enrichment, so pushState()/replaceState() followed by
48
+ // track() in the same tick does not currently race. Revisit this assumption if campaign parsing or
49
+ // timeline scheduling becomes truly async in the future.
50
+ void updateCampaignState();
51
+ };
52
+ var createHistoryStateProxy = function (method) {
53
+ return new Proxy(method, {
54
+ apply: function (target, thisArg, args) {
55
+ Reflect.apply(target, thisArg, args);
56
+ if (isTracking) {
57
+ onHistoryChange();
58
+ }
59
+ },
60
+ });
61
+ };
62
+ return {
63
+ name: '@amplitude/plugin-event-property-attribution-browser',
64
+ type: 'enrichment',
65
+ setup: function (config, client) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
66
+ return tslib_1.__generator(this, function (_a) {
67
+ switch (_a.label) {
68
+ case 0:
69
+ amplitude = client;
70
+ loggerProvider = config.loggerProvider;
71
+ isTracking = true;
72
+ loggerProvider.log('Installing event property attribution tracking.');
73
+ return [4 /*yield*/, updateCampaignState()];
74
+ case 1:
75
+ _a.sent();
76
+ if (!globalScope) {
77
+ return [2 /*return*/];
78
+ }
79
+ globalScope.addEventListener('popstate', onHistoryChange);
80
+ if (!isProxied) {
81
+ // There is no global browser listener for history mutations, so proxy both methods.
82
+ originalPushState = Reflect.get(globalScope.history, 'pushState');
83
+ originalReplaceState = Reflect.get(globalScope.history, 'replaceState');
84
+ /* istanbul ignore next */
85
+ if (!originalPushState || !originalReplaceState) {
86
+ return [2 /*return*/];
87
+ }
88
+ installedPushState = createHistoryStateProxy(originalPushState);
89
+ globalScope.history.pushState = installedPushState;
90
+ installedReplaceState = createHistoryStateProxy(originalReplaceState);
91
+ globalScope.history.replaceState = installedReplaceState;
92
+ isProxied = true;
93
+ }
94
+ return [2 /*return*/];
95
+ }
96
+ });
97
+ }); },
98
+ execute: function (event) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
99
+ return tslib_1.__generator(this, function (_a) {
100
+ if (EVENT_PROPERTY_EXCLUDED_EVENT_TYPES.has(event.event_type)) {
101
+ return [2 /*return*/, event];
102
+ }
103
+ event.event_properties = tslib_1.__assign(tslib_1.__assign({}, eventPropertyCampaign), event.event_properties);
104
+ return [2 /*return*/, event];
105
+ });
106
+ }); },
107
+ teardown: function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
108
+ var currentPushState, currentReplaceState;
109
+ return tslib_1.__generator(this, function (_a) {
110
+ if (globalScope) {
111
+ globalScope.removeEventListener('popstate', onHistoryChange);
112
+ currentPushState = Reflect.get(globalScope.history, 'pushState');
113
+ currentReplaceState = Reflect.get(globalScope.history, 'replaceState');
114
+ if (isProxied && currentPushState === installedPushState && originalPushState) {
115
+ globalScope.history.pushState = originalPushState;
116
+ }
117
+ if (isProxied && currentReplaceState === installedReplaceState && originalReplaceState) {
118
+ globalScope.history.replaceState = originalReplaceState;
119
+ }
120
+ }
121
+ isTracking = false;
122
+ isProxied = false;
123
+ originalPushState = undefined;
124
+ originalReplaceState = undefined;
125
+ installedPushState = undefined;
126
+ installedReplaceState = undefined;
127
+ eventPropertyCampaign = {};
128
+ return [2 /*return*/];
129
+ });
130
+ }); },
131
+ };
132
+ };
133
+ exports.eventPropertyTrackingPlugin = eventPropertyTrackingPlugin;
134
+ //# sourceMappingURL=event-property-tracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-property-tracking.js","sourceRoot":"","sources":["../../src/event-property-tracking.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AttributionOptions,\n BrowserClient,\n BrowserConfig,\n Campaign,\n CampaignParser,\n EnrichmentPlugin,\n Event,\n getGlobalScope,\n ILogger,\n omitUndefined,\n SpecialEventType,\n} from '@amplitude/analytics-core';\n\nconst ATTRIBUTION_EVENT_TYPE = '[Amplitude] Attribution';\nconst EVENT_PROPERTY_EXCLUDED_EVENT_TYPES = new Set<string>([\n SpecialEventType.IDENTIFY,\n SpecialEventType.GROUP_IDENTIFY,\n]);\n\ntype HistoryStateMethod = History['pushState'];\n\nconst toEventPropertyCampaign = (campaign: Campaign): Partial<Campaign> => omitUndefined(campaign);\n\nexport const eventPropertyTrackingPlugin = (\n options: AttributionOptions = {},\n): EnrichmentPlugin<BrowserClient, BrowserConfig> => {\n const fallbackAttributionEvent = options.fallbackAttributionEvent ?? false;\n const globalScope = getGlobalScope();\n let amplitude: BrowserClient | undefined;\n let loggerProvider: ILogger | undefined;\n let eventPropertyCampaign: Partial<Campaign> = {};\n let isTracking = false;\n let isProxied = false;\n let originalPushState: History['pushState'] | undefined;\n let originalReplaceState: History['replaceState'] | undefined;\n let installedPushState: History['pushState'] | undefined;\n let installedReplaceState: History['replaceState'] | undefined;\n\n const updateCampaignState = async () => {\n const currentCampaign = await new CampaignParser().parse();\n eventPropertyCampaign = toEventPropertyCampaign(currentCampaign);\n\n if (fallbackAttributionEvent) {\n /* istanbul ignore next */\n loggerProvider?.log('Tracking attribution fallback event.');\n /* istanbul ignore next */\n amplitude?.track(ATTRIBUTION_EVENT_TYPE, eventPropertyCampaign);\n }\n };\n\n const onHistoryChange = () => {\n // CampaignParser.parse() is async by type, but its current implementation computes synchronously.\n // In the Browser SDK, this history-triggered refresh starts immediately and reaches its continuation\n // before Timeline.scheduleApply(0) runs event enrichment, so pushState()/replaceState() followed by\n // track() in the same tick does not currently race. Revisit this assumption if campaign parsing or\n // timeline scheduling becomes truly async in the future.\n void updateCampaignState();\n };\n\n const createHistoryStateProxy = (method: HistoryStateMethod): HistoryStateMethod =>\n new Proxy(method, {\n apply: (target, thisArg, args: Parameters<HistoryStateMethod>) => {\n Reflect.apply(target, thisArg, args);\n if (isTracking) {\n onHistoryChange();\n }\n },\n });\n\n return {\n name: '@amplitude/plugin-event-property-attribution-browser',\n type: 'enrichment',\n\n setup: async (config, client) => {\n amplitude = client;\n loggerProvider = config.loggerProvider;\n isTracking = true;\n\n loggerProvider.log('Installing event property attribution tracking.');\n await updateCampaignState();\n\n if (!globalScope) {\n return;\n }\n\n globalScope.addEventListener('popstate', onHistoryChange);\n\n if (!isProxied) {\n // There is no global browser listener for history mutations, so proxy both methods.\n originalPushState = Reflect.get(globalScope.history, 'pushState') as History['pushState'] | undefined;\n originalReplaceState = Reflect.get(globalScope.history, 'replaceState') as History['replaceState'] | undefined;\n\n /* istanbul ignore next */\n if (!originalPushState || !originalReplaceState) {\n return;\n }\n\n installedPushState = createHistoryStateProxy(originalPushState);\n globalScope.history.pushState = installedPushState;\n\n installedReplaceState = createHistoryStateProxy(originalReplaceState);\n globalScope.history.replaceState = installedReplaceState;\n\n isProxied = true;\n }\n },\n\n execute: async (event: Event) => {\n if (EVENT_PROPERTY_EXCLUDED_EVENT_TYPES.has(event.event_type)) {\n return event;\n }\n\n event.event_properties = {\n ...eventPropertyCampaign,\n ...event.event_properties,\n };\n\n return event;\n },\n\n teardown: async () => {\n if (globalScope) {\n globalScope.removeEventListener('popstate', onHistoryChange);\n\n const currentPushState = Reflect.get(globalScope.history, 'pushState') as History['pushState'] | undefined;\n const currentReplaceState = Reflect.get(globalScope.history, 'replaceState') as\n | History['replaceState']\n | undefined;\n\n if (isProxied && currentPushState === installedPushState && originalPushState) {\n globalScope.history.pushState = originalPushState;\n }\n\n if (isProxied && currentReplaceState === installedReplaceState && originalReplaceState) {\n globalScope.history.replaceState = originalReplaceState;\n }\n }\n\n isTracking = false;\n isProxied = false;\n originalPushState = undefined;\n originalReplaceState = undefined;\n installedPushState = undefined;\n installedReplaceState = undefined;\n eventPropertyCampaign = {};\n },\n };\n};\n"]}
@@ -0,0 +1,2 @@
1
+ export { eventPropertyTrackingPlugin } from './event-property-tracking';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.eventPropertyTrackingPlugin = void 0;
4
+ var event_property_tracking_1 = require("./event-property-tracking");
5
+ Object.defineProperty(exports, "eventPropertyTrackingPlugin", { enumerable: true, get: function () { return event_property_tracking_1.eventPropertyTrackingPlugin; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,qEAAwE;AAA/D,sIAAA,2BAA2B,OAAA","sourcesContent":["export { eventPropertyTrackingPlugin } from './event-property-tracking';\n"]}
@@ -0,0 +1,3 @@
1
+ import { AttributionOptions, BrowserClient, BrowserConfig, EnrichmentPlugin } from '@amplitude/analytics-core';
2
+ export declare const eventPropertyTrackingPlugin: (options?: AttributionOptions) => EnrichmentPlugin<BrowserClient, BrowserConfig>;
3
+ //# sourceMappingURL=event-property-tracking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-property-tracking.d.ts","sourceRoot":"","sources":["../../src/event-property-tracking.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,aAAa,EAGb,gBAAgB,EAMjB,MAAM,2BAA2B,CAAC;AAYnC,eAAO,MAAM,2BAA2B,aAC7B,kBAAkB,KAC1B,iBAAiB,aAAa,EAAE,aAAa,CA0H/C,CAAC"}
@@ -0,0 +1,130 @@
1
+ import { __assign, __awaiter, __generator } from "tslib";
2
+ import { CampaignParser, getGlobalScope, omitUndefined, SpecialEventType, } from '@amplitude/analytics-core';
3
+ var ATTRIBUTION_EVENT_TYPE = '[Amplitude] Attribution';
4
+ var EVENT_PROPERTY_EXCLUDED_EVENT_TYPES = new Set([
5
+ SpecialEventType.IDENTIFY,
6
+ SpecialEventType.GROUP_IDENTIFY,
7
+ ]);
8
+ var toEventPropertyCampaign = function (campaign) { return omitUndefined(campaign); };
9
+ export var eventPropertyTrackingPlugin = function (options) {
10
+ var _a;
11
+ if (options === void 0) { options = {}; }
12
+ var fallbackAttributionEvent = (_a = options.fallbackAttributionEvent) !== null && _a !== void 0 ? _a : false;
13
+ var globalScope = getGlobalScope();
14
+ var amplitude;
15
+ var loggerProvider;
16
+ var eventPropertyCampaign = {};
17
+ var isTracking = false;
18
+ var isProxied = false;
19
+ var originalPushState;
20
+ var originalReplaceState;
21
+ var installedPushState;
22
+ var installedReplaceState;
23
+ var updateCampaignState = function () { return __awaiter(void 0, void 0, void 0, function () {
24
+ var currentCampaign;
25
+ return __generator(this, function (_a) {
26
+ switch (_a.label) {
27
+ case 0: return [4 /*yield*/, new CampaignParser().parse()];
28
+ case 1:
29
+ currentCampaign = _a.sent();
30
+ eventPropertyCampaign = toEventPropertyCampaign(currentCampaign);
31
+ if (fallbackAttributionEvent) {
32
+ /* istanbul ignore next */
33
+ loggerProvider === null || loggerProvider === void 0 ? void 0 : loggerProvider.log('Tracking attribution fallback event.');
34
+ /* istanbul ignore next */
35
+ amplitude === null || amplitude === void 0 ? void 0 : amplitude.track(ATTRIBUTION_EVENT_TYPE, eventPropertyCampaign);
36
+ }
37
+ return [2 /*return*/];
38
+ }
39
+ });
40
+ }); };
41
+ var onHistoryChange = function () {
42
+ // CampaignParser.parse() is async by type, but its current implementation computes synchronously.
43
+ // In the Browser SDK, this history-triggered refresh starts immediately and reaches its continuation
44
+ // before Timeline.scheduleApply(0) runs event enrichment, so pushState()/replaceState() followed by
45
+ // track() in the same tick does not currently race. Revisit this assumption if campaign parsing or
46
+ // timeline scheduling becomes truly async in the future.
47
+ void updateCampaignState();
48
+ };
49
+ var createHistoryStateProxy = function (method) {
50
+ return new Proxy(method, {
51
+ apply: function (target, thisArg, args) {
52
+ Reflect.apply(target, thisArg, args);
53
+ if (isTracking) {
54
+ onHistoryChange();
55
+ }
56
+ },
57
+ });
58
+ };
59
+ return {
60
+ name: '@amplitude/plugin-event-property-attribution-browser',
61
+ type: 'enrichment',
62
+ setup: function (config, client) { return __awaiter(void 0, void 0, void 0, function () {
63
+ return __generator(this, function (_a) {
64
+ switch (_a.label) {
65
+ case 0:
66
+ amplitude = client;
67
+ loggerProvider = config.loggerProvider;
68
+ isTracking = true;
69
+ loggerProvider.log('Installing event property attribution tracking.');
70
+ return [4 /*yield*/, updateCampaignState()];
71
+ case 1:
72
+ _a.sent();
73
+ if (!globalScope) {
74
+ return [2 /*return*/];
75
+ }
76
+ globalScope.addEventListener('popstate', onHistoryChange);
77
+ if (!isProxied) {
78
+ // There is no global browser listener for history mutations, so proxy both methods.
79
+ originalPushState = Reflect.get(globalScope.history, 'pushState');
80
+ originalReplaceState = Reflect.get(globalScope.history, 'replaceState');
81
+ /* istanbul ignore next */
82
+ if (!originalPushState || !originalReplaceState) {
83
+ return [2 /*return*/];
84
+ }
85
+ installedPushState = createHistoryStateProxy(originalPushState);
86
+ globalScope.history.pushState = installedPushState;
87
+ installedReplaceState = createHistoryStateProxy(originalReplaceState);
88
+ globalScope.history.replaceState = installedReplaceState;
89
+ isProxied = true;
90
+ }
91
+ return [2 /*return*/];
92
+ }
93
+ });
94
+ }); },
95
+ execute: function (event) { return __awaiter(void 0, void 0, void 0, function () {
96
+ return __generator(this, function (_a) {
97
+ if (EVENT_PROPERTY_EXCLUDED_EVENT_TYPES.has(event.event_type)) {
98
+ return [2 /*return*/, event];
99
+ }
100
+ event.event_properties = __assign(__assign({}, eventPropertyCampaign), event.event_properties);
101
+ return [2 /*return*/, event];
102
+ });
103
+ }); },
104
+ teardown: function () { return __awaiter(void 0, void 0, void 0, function () {
105
+ var currentPushState, currentReplaceState;
106
+ return __generator(this, function (_a) {
107
+ if (globalScope) {
108
+ globalScope.removeEventListener('popstate', onHistoryChange);
109
+ currentPushState = Reflect.get(globalScope.history, 'pushState');
110
+ currentReplaceState = Reflect.get(globalScope.history, 'replaceState');
111
+ if (isProxied && currentPushState === installedPushState && originalPushState) {
112
+ globalScope.history.pushState = originalPushState;
113
+ }
114
+ if (isProxied && currentReplaceState === installedReplaceState && originalReplaceState) {
115
+ globalScope.history.replaceState = originalReplaceState;
116
+ }
117
+ }
118
+ isTracking = false;
119
+ isProxied = false;
120
+ originalPushState = undefined;
121
+ originalReplaceState = undefined;
122
+ installedPushState = undefined;
123
+ installedReplaceState = undefined;
124
+ eventPropertyCampaign = {};
125
+ return [2 /*return*/];
126
+ });
127
+ }); },
128
+ };
129
+ };
130
+ //# sourceMappingURL=event-property-tracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-property-tracking.js","sourceRoot":"","sources":["../../src/event-property-tracking.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AttributionOptions,\n BrowserClient,\n BrowserConfig,\n Campaign,\n CampaignParser,\n EnrichmentPlugin,\n Event,\n getGlobalScope,\n ILogger,\n omitUndefined,\n SpecialEventType,\n} from '@amplitude/analytics-core';\n\nconst ATTRIBUTION_EVENT_TYPE = '[Amplitude] Attribution';\nconst EVENT_PROPERTY_EXCLUDED_EVENT_TYPES = new Set<string>([\n SpecialEventType.IDENTIFY,\n SpecialEventType.GROUP_IDENTIFY,\n]);\n\ntype HistoryStateMethod = History['pushState'];\n\nconst toEventPropertyCampaign = (campaign: Campaign): Partial<Campaign> => omitUndefined(campaign);\n\nexport const eventPropertyTrackingPlugin = (\n options: AttributionOptions = {},\n): EnrichmentPlugin<BrowserClient, BrowserConfig> => {\n const fallbackAttributionEvent = options.fallbackAttributionEvent ?? false;\n const globalScope = getGlobalScope();\n let amplitude: BrowserClient | undefined;\n let loggerProvider: ILogger | undefined;\n let eventPropertyCampaign: Partial<Campaign> = {};\n let isTracking = false;\n let isProxied = false;\n let originalPushState: History['pushState'] | undefined;\n let originalReplaceState: History['replaceState'] | undefined;\n let installedPushState: History['pushState'] | undefined;\n let installedReplaceState: History['replaceState'] | undefined;\n\n const updateCampaignState = async () => {\n const currentCampaign = await new CampaignParser().parse();\n eventPropertyCampaign = toEventPropertyCampaign(currentCampaign);\n\n if (fallbackAttributionEvent) {\n /* istanbul ignore next */\n loggerProvider?.log('Tracking attribution fallback event.');\n /* istanbul ignore next */\n amplitude?.track(ATTRIBUTION_EVENT_TYPE, eventPropertyCampaign);\n }\n };\n\n const onHistoryChange = () => {\n // CampaignParser.parse() is async by type, but its current implementation computes synchronously.\n // In the Browser SDK, this history-triggered refresh starts immediately and reaches its continuation\n // before Timeline.scheduleApply(0) runs event enrichment, so pushState()/replaceState() followed by\n // track() in the same tick does not currently race. Revisit this assumption if campaign parsing or\n // timeline scheduling becomes truly async in the future.\n void updateCampaignState();\n };\n\n const createHistoryStateProxy = (method: HistoryStateMethod): HistoryStateMethod =>\n new Proxy(method, {\n apply: (target, thisArg, args: Parameters<HistoryStateMethod>) => {\n Reflect.apply(target, thisArg, args);\n if (isTracking) {\n onHistoryChange();\n }\n },\n });\n\n return {\n name: '@amplitude/plugin-event-property-attribution-browser',\n type: 'enrichment',\n\n setup: async (config, client) => {\n amplitude = client;\n loggerProvider = config.loggerProvider;\n isTracking = true;\n\n loggerProvider.log('Installing event property attribution tracking.');\n await updateCampaignState();\n\n if (!globalScope) {\n return;\n }\n\n globalScope.addEventListener('popstate', onHistoryChange);\n\n if (!isProxied) {\n // There is no global browser listener for history mutations, so proxy both methods.\n originalPushState = Reflect.get(globalScope.history, 'pushState') as History['pushState'] | undefined;\n originalReplaceState = Reflect.get(globalScope.history, 'replaceState') as History['replaceState'] | undefined;\n\n /* istanbul ignore next */\n if (!originalPushState || !originalReplaceState) {\n return;\n }\n\n installedPushState = createHistoryStateProxy(originalPushState);\n globalScope.history.pushState = installedPushState;\n\n installedReplaceState = createHistoryStateProxy(originalReplaceState);\n globalScope.history.replaceState = installedReplaceState;\n\n isProxied = true;\n }\n },\n\n execute: async (event: Event) => {\n if (EVENT_PROPERTY_EXCLUDED_EVENT_TYPES.has(event.event_type)) {\n return event;\n }\n\n event.event_properties = {\n ...eventPropertyCampaign,\n ...event.event_properties,\n };\n\n return event;\n },\n\n teardown: async () => {\n if (globalScope) {\n globalScope.removeEventListener('popstate', onHistoryChange);\n\n const currentPushState = Reflect.get(globalScope.history, 'pushState') as History['pushState'] | undefined;\n const currentReplaceState = Reflect.get(globalScope.history, 'replaceState') as\n | History['replaceState']\n | undefined;\n\n if (isProxied && currentPushState === installedPushState && originalPushState) {\n globalScope.history.pushState = originalPushState;\n }\n\n if (isProxied && currentReplaceState === installedReplaceState && originalReplaceState) {\n globalScope.history.replaceState = originalReplaceState;\n }\n }\n\n isTracking = false;\n isProxied = false;\n originalPushState = undefined;\n originalReplaceState = undefined;\n installedPushState = undefined;\n installedReplaceState = undefined;\n eventPropertyCampaign = {};\n },\n };\n};\n"]}
@@ -0,0 +1,2 @@
1
+ export { eventPropertyTrackingPlugin } from './event-property-tracking';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { eventPropertyTrackingPlugin } from './event-property-tracking';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC","sourcesContent":["export { eventPropertyTrackingPlugin } from './event-property-tracking';\n"]}
@@ -0,0 +1 @@
1
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).amplitude={})}(this,function(t){"use strict";var e,n,r=function(){return r=Object.assign||function(t){for(var e,n=1,r=arguments.length;n<r;n++)for(var i in e=arguments[n])Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t},r.apply(this,arguments)};function i(t,e,n,r){return new(n||(n=Promise))(function(i,o){function u(t){try{c(r.next(t))}catch(t){o(t)}}function a(t){try{c(r.throw(t))}catch(t){o(t)}}function c(t){var e;t.done?i(t.value):(e=t.value,e instanceof n?e:new n(function(t){t(e)})).then(u,a)}c((r=r.apply(t,e||[])).next())})}function o(t,e){var n,r,i,o={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]},u=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return u.next=a(0),u.throw=a(1),u.return=a(2),"function"==typeof Symbol&&(u[Symbol.iterator]=function(){return this}),u;function a(a){return function(c){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;u&&(u=0,a[0]&&(o=0)),o;)try{if(n=1,r&&(i=2&a[0]?r.return:a[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,a[1])).done)return i;switch(r=0,i&&(a=[2&a[0],i.value]),a[0]){case 0:case 1:i=a;break;case 4:return o.label++,{value:a[1],done:!1};case 5:o.label++,r=a[1],a=[0];continue;case 7:a=o.ops.pop(),o.trys.pop();continue;default:if(!(i=o.trys,(i=i.length>0&&i[i.length-1])||6!==a[0]&&2!==a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]<i[3])){o.label=a[1];break}if(6===a[0]&&o.label<i[1]){o.label=i[1],i=a;break}if(i&&o.label<i[2]){o.label=i[2],o.ops.push(a);break}i[2]&&o.ops.pop(),o.trys.pop();continue}a=e.call(t,o)}catch(t){a=[6,t],r=0}finally{n=i=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,c])}}}"function"==typeof SuppressedError&&SuppressedError,function(t){t.SET="$set",t.SET_ONCE="$setOnce",t.ADD="$add",t.APPEND="$append",t.PREPEND="$prepend",t.REMOVE="$remove",t.PREINSERT="$preInsert",t.POSTINSERT="$postInsert",t.UNSET="$unset",t.CLEAR_ALL="$clearAll"}(e||(e={})),function(t){t.IDENTIFY="$identify",t.GROUP_IDENTIFY="$groupidentify",t.REVENUE="revenue_amount"}(n||(n={}));var u="dclid",a="fbclid",c="gbraid",d="gclid",l="ko_click_id",f="li_fat_id",s="msclkid",p="rdt_cid",v="ttclid",h="twclid",m="wbraid",y={utm_campaign:void 0,utm_content:void 0,utm_id:void 0,utm_medium:void 0,utm_source:void 0,utm_term:void 0,referrer:void 0,referring_domain:void 0,dclid:void 0,gbraid:void 0,gclid:void 0,fbclid:void 0,ko_click_id:void 0,li_fat_id:void 0,msclkid:void 0,rdt_cid:void 0,ttclid:void 0,twclid:void 0,wbraid:void 0},g=function(){var t="ampIntegrationContext";return"undefined"!=typeof globalThis&&void 0!==globalThis[t]?globalThis[t]:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof self?self:"undefined"!=typeof global?global:void 0},b=function(){var t,e=g();return(null===(t=null==e?void 0:e.location)||void 0===t?void 0:t.search)?e.location.search.substring(1).split("&").filter(Boolean).reduce(function(t,e){var n=e.split("=",2),r=_(n[0]),i=_(n[1]);return i?(t[r]=i,t):t},{}):{}},_=function(t){void 0===t&&(t="");try{return decodeURIComponent(t)}catch(t){return""}},w=function(){function t(){}return t.prototype.parse=function(){return i(this,void 0,void 0,function(){return o(this,function(t){return[2,r(r(r(r({},y),this.getUtmParam()),this.getReferrer()),this.getClickIds())]})})},t.prototype.getUtmParam=function(){var t=b();return{utm_campaign:t.utm_campaign,utm_content:t.utm_content,utm_id:t.utm_id,utm_medium:t.utm_medium,utm_source:t.utm_source,utm_term:t.utm_term}},t.prototype.getReferrer=function(){var t,e,n={referrer:void 0,referring_domain:void 0};try{n.referrer=document.referrer||void 0,n.referring_domain=null!==(e=null===(t=n.referrer)||void 0===t?void 0:t.split("/")[2])&&void 0!==e?e:void 0}catch(t){}return n},t.prototype.getClickIds=function(){var t,e=b();return(t={})[u]=e[u],t[a]=e[a],t[c]=e[c],t[d]=e[d],t[l]=e[l],t[f]=e[f],t[s]=e[s],t[p]=e[p],t[v]=e[v],t[h]=e[h],t[m]=e[m],t},t}(),E=new Set([n.IDENTIFY,n.GROUP_IDENTIFY]);t.eventPropertyTrackingPlugin=function(t){var e;void 0===t&&(t={});var n,u,a,c,d,l,f=null!==(e=t.fallbackAttributionEvent)&&void 0!==e&&e,s=g(),p={},v=!1,h=!1,m=function(){return i(void 0,void 0,void 0,function(){var t;return o(this,function(e){switch(e.label){case 0:return[4,(new w).parse()];case 1:return t=e.sent(),p=function(t){var e={};for(var n in t){var r=t[n];r&&(e[n]=r)}return e}(t),f&&(null==u||u.log("Tracking attribution fallback event."),null==n||n.track("[Amplitude] Attribution",p)),[2]}})})},y=function(){m()},b=function(t){return new Proxy(t,{apply:function(t,e,n){Reflect.apply(t,e,n),v&&y()}})};return{name:"@amplitude/plugin-event-property-attribution-browser",type:"enrichment",setup:function(t,e){return i(void 0,void 0,void 0,function(){return o(this,function(r){switch(r.label){case 0:return n=e,u=t.loggerProvider,v=!0,u.log("Installing event property attribution tracking."),[4,m()];case 1:if(r.sent(),!s)return[2];if(s.addEventListener("popstate",y),!h){if(a=Reflect.get(s.history,"pushState"),c=Reflect.get(s.history,"replaceState"),!a||!c)return[2];d=b(a),s.history.pushState=d,l=b(c),s.history.replaceState=l,h=!0}return[2]}})})},execute:function(t){return i(void 0,void 0,void 0,function(){return o(this,function(e){return E.has(t.event_type)||(t.event_properties=r(r({},p),t.event_properties)),[2,t]})})},teardown:function(){return i(void 0,void 0,void 0,function(){var t,e;return o(this,function(n){return s&&(s.removeEventListener("popstate",y),t=Reflect.get(s.history,"pushState"),e=Reflect.get(s.history,"replaceState"),h&&t===d&&a&&(s.history.pushState=a),h&&e===l&&c&&(s.history.replaceState=c)),v=!1,h=!1,a=void 0,c=void 0,d=void 0,l=void 0,p={},[2]})})}}},Object.defineProperty(t,"__esModule",{value:!0})});
@@ -0,0 +1,3 @@
1
+ import { AttributionOptions, BrowserClient, BrowserConfig, EnrichmentPlugin } from '@amplitude/analytics-core';
2
+ export declare const eventPropertyTrackingPlugin: (options?: AttributionOptions) => EnrichmentPlugin<BrowserClient, BrowserConfig>;
3
+ //# sourceMappingURL=event-property-tracking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-property-tracking.d.ts","sourceRoot":"","sources":["../../src/event-property-tracking.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,aAAa,EAGb,gBAAgB,EAMjB,MAAM,2BAA2B,CAAC;AAYnC,eAAO,MAAM,2BAA2B,GACtC,UAAS,kBAAuB,KAC/B,gBAAgB,CAAC,aAAa,EAAE,aAAa,CA0H/C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { eventPropertyTrackingPlugin } from './event-property-tracking';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@amplitude/plugin-event-property-attribution-browser",
3
+ "version": "0.1.0",
4
+ "description": "",
5
+ "author": "Amplitude Inc",
6
+ "homepage": "https://github.com/amplitude/Amplitude-TypeScript",
7
+ "license": "MIT",
8
+ "main": "lib/cjs/index.js",
9
+ "module": "lib/esm/index.js",
10
+ "types": "lib/esm/index.d.ts",
11
+ "sideEffects": false,
12
+ "publishConfig": {
13
+ "access": "public",
14
+ "tag": "latest"
15
+ },
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/amplitude/Amplitude-TypeScript.git"
19
+ },
20
+ "bugs": {
21
+ "url": "https://github.com/amplitude/Amplitude-TypeScript/issues"
22
+ },
23
+ "dependencies": {
24
+ "tslib": "^2.4.1",
25
+ "@amplitude/analytics-core": "2.46.0"
26
+ },
27
+ "devDependencies": {
28
+ "@rollup/plugin-commonjs": "^23.0.4",
29
+ "@rollup/plugin-node-resolve": "^15.0.1",
30
+ "@rollup/plugin-typescript": "^10.0.1",
31
+ "rollup": "^2.79.1",
32
+ "rollup-plugin-execute": "^1.1.1",
33
+ "rollup-plugin-gzip": "^3.1.0",
34
+ "rollup-plugin-terser": "^7.0.2"
35
+ },
36
+ "files": [
37
+ "lib"
38
+ ],
39
+ "scripts": {
40
+ "build": "pnpm bundle && pnpm build:es5 && pnpm build:esm",
41
+ "bundle": "rollup --config rollup.config.js",
42
+ "build:es5": "tsc -p ./tsconfig.es5.json",
43
+ "build:esm": "tsc -p ./tsconfig.esm.json",
44
+ "watch": "tsc -p ./tsconfig.esm.json --watch",
45
+ "clean": "rimraf node_modules lib coverage",
46
+ "fix": "pnpm fix:eslint & pnpm fix:prettier",
47
+ "fix:eslint": "eslint '{src,test}/**/*.ts' --fix",
48
+ "fix:prettier": "prettier --write \"{src,test}/**/*.ts\"",
49
+ "lint": "pnpm lint:eslint & pnpm lint:prettier",
50
+ "lint:eslint": "eslint '{src,test}/**/*.ts'",
51
+ "lint:prettier": "prettier --check \"{src,test}/**/*.ts\"",
52
+ "test": "jest",
53
+ "typecheck": "tsc -p ./tsconfig.json"
54
+ }
55
+ }