@amplitude/plugin-page-view-tracking-browser 0.3.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/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.
@@ -0,0 +1,3 @@
1
+ export { pageViewTrackingPlugin } from './page-view-tracking';
2
+ export * as Types from './typings/page-view-tracking';
3
+ //# 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,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,KAAK,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,7 @@
1
+ Object.defineProperty(exports, "__esModule", { value: true });
2
+ exports.Types = exports.pageViewTrackingPlugin = void 0;
3
+ var tslib_1 = require("tslib");
4
+ var page_view_tracking_1 = require("./page-view-tracking");
5
+ Object.defineProperty(exports, "pageViewTrackingPlugin", { enumerable: true, get: function () { return page_view_tracking_1.pageViewTrackingPlugin; } });
6
+ exports.Types = (0, tslib_1.__importStar)(require("./typings/page-view-tracking"));
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,2DAA8D;AAArD,4HAAA,sBAAsB,OAAA;AAC/B,mFAAsD","sourcesContent":["export { pageViewTrackingPlugin } from './page-view-tracking';\nexport * as Types from './typings/page-view-tracking';\n"]}
@@ -0,0 +1,5 @@
1
+ import { BrowserClient, EnrichmentPlugin } from '@amplitude/analytics-types';
2
+ import { Options } from './typings/page-view-tracking';
3
+ export declare const pageViewTrackingPlugin: (client: BrowserClient, options?: Options) => EnrichmentPlugin;
4
+ export declare const shouldTrackHistoryPageView: (trackingOption: Options['trackHistoryChanges'], newURL: string, oldURL: string) => boolean;
5
+ //# sourceMappingURL=page-view-tracking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-view-tracking.d.ts","sourceRoot":"","sources":["../../src/page-view-tracking.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,aAAa,EAEb,gBAAgB,EAMjB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAGvD,eAAO,MAAM,sBAAsB,WAAY,aAAa,YAAW,OAAO,KAAQ,gBAoFrF,CAAC;AA8BF,eAAO,MAAM,0BAA0B,mBACrB,OAAO,CAAC,qBAAqB,CAAC,UACtC,MAAM,UACN,MAAM,KACb,OAOF,CAAC"}
@@ -0,0 +1,152 @@
1
+ var _this = this;
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.shouldTrackHistoryPageView = exports.pageViewTrackingPlugin = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var analytics_client_common_1 = require("@amplitude/analytics-client-common");
6
+ var analytics_types_1 = require("@amplitude/analytics-types");
7
+ var analytics_client_common_2 = require("@amplitude/analytics-client-common");
8
+ var utils_1 = require("./utils");
9
+ var pageViewTrackingPlugin = function (client, options) {
10
+ if (options === void 0) { options = {}; }
11
+ var loggerProvider = undefined;
12
+ var shouldTrackOnPageLoad = function () {
13
+ return typeof options.trackOn === 'undefined' || (typeof options.trackOn === 'function' && options.trackOn());
14
+ };
15
+ var previousURL = null;
16
+ var trackHistoryPageView = function () { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () {
17
+ var newURL, _a, _b;
18
+ return (0, tslib_1.__generator)(this, function (_c) {
19
+ switch (_c.label) {
20
+ case 0:
21
+ newURL = location.href;
22
+ if (!((0, exports.shouldTrackHistoryPageView)(options.trackHistoryChanges, newURL, previousURL || '') && shouldTrackOnPageLoad())) return [3 /*break*/, 2];
23
+ /* istanbul ignore next */
24
+ loggerProvider === null || loggerProvider === void 0 ? void 0 : loggerProvider.log('Tracking page view event');
25
+ _b = (_a = client).track;
26
+ return [4 /*yield*/, createPageViewEvent()];
27
+ case 1:
28
+ _b.apply(_a, [_c.sent()]);
29
+ _c.label = 2;
30
+ case 2:
31
+ previousURL = newURL;
32
+ return [2 /*return*/];
33
+ }
34
+ });
35
+ }); };
36
+ var plugin = {
37
+ name: 'page-view-tracking',
38
+ type: analytics_types_1.PluginType.ENRICHMENT,
39
+ setup: function (config) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () {
40
+ var _a, _b;
41
+ var _c, _d;
42
+ return (0, tslib_1.__generator)(this, function (_e) {
43
+ switch (_e.label) {
44
+ case 0:
45
+ loggerProvider = config.loggerProvider;
46
+ loggerProvider.log('Installing @amplitude/plugin-page-view-tracking-browser');
47
+ options.trackOn = ((_c = config.attribution) === null || _c === void 0 ? void 0 : _c.trackPageViews) ? 'attribution' : options.trackOn;
48
+ // Turn off sending page view event by "runAttributionStrategy" function
49
+ if ((_d = config.attribution) === null || _d === void 0 ? void 0 : _d.trackPageViews) {
50
+ loggerProvider.warn('@amplitude/plugin-page-view-tracking-browser overrides page view tracking behavior defined in @amplitude/analytics-browser');
51
+ config.attribution.trackPageViews = false;
52
+ }
53
+ if (options.trackHistoryChanges) {
54
+ /* istanbul ignore next */
55
+ window.addEventListener('popstate', function () {
56
+ void trackHistoryPageView();
57
+ });
58
+ /* istanbul ignore next */
59
+ // There is no global browser listener for changes to history, so we have
60
+ // to modify pushState directly.
61
+ // https://stackoverflow.com/a/64927639
62
+ // eslint-disable-next-line @typescript-eslint/unbound-method
63
+ window.history.pushState = new Proxy(window.history.pushState, {
64
+ apply: function (target, thisArg, _a) {
65
+ var _b = (0, tslib_1.__read)(_a, 3), state = _b[0], unused = _b[1], url = _b[2];
66
+ void trackHistoryPageView();
67
+ return target.apply(thisArg, [state, unused, url]);
68
+ },
69
+ });
70
+ }
71
+ if (!shouldTrackOnPageLoad()) return [3 /*break*/, 2];
72
+ loggerProvider.log('Tracking page view event');
73
+ _b = (_a = client).track;
74
+ return [4 /*yield*/, createPageViewEvent()];
75
+ case 1:
76
+ _b.apply(_a, [_e.sent()]);
77
+ _e.label = 2;
78
+ case 2: return [2 /*return*/];
79
+ }
80
+ });
81
+ }); },
82
+ execute: function (event) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () {
83
+ var pageViewEvent;
84
+ return (0, tslib_1.__generator)(this, function (_a) {
85
+ switch (_a.label) {
86
+ case 0:
87
+ if (!(options.trackOn === 'attribution' && isCampaignEvent(event))) return [3 /*break*/, 2];
88
+ /* istanbul ignore next */ // loggerProvider should be defined by the time execute is invoked
89
+ loggerProvider === null || loggerProvider === void 0 ? void 0 : loggerProvider.log('Enriching campaign event to page view event with campaign parameters');
90
+ return [4 /*yield*/, createPageViewEvent()];
91
+ case 1:
92
+ pageViewEvent = _a.sent();
93
+ event.event_type = pageViewEvent.event_type;
94
+ event.event_properties = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, event.event_properties), pageViewEvent.event_properties);
95
+ _a.label = 2;
96
+ case 2: return [2 /*return*/, event];
97
+ }
98
+ });
99
+ }); },
100
+ };
101
+ // Required for unit tests
102
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
103
+ plugin.__trackHistoryPageView = trackHistoryPageView;
104
+ return plugin;
105
+ };
106
+ exports.pageViewTrackingPlugin = pageViewTrackingPlugin;
107
+ var getCampaignParams = function () { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () { var _a; return (0, tslib_1.__generator)(this, function (_b) {
108
+ switch (_b.label) {
109
+ case 0:
110
+ _a = utils_1.omitUndefined;
111
+ return [4 /*yield*/, new analytics_client_common_1.CampaignParser().parse()];
112
+ case 1: return [2 /*return*/, _a.apply(void 0, [_b.sent()])];
113
+ }
114
+ }); }); };
115
+ var createPageViewEvent = function () { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () {
116
+ var pageViewEvent, _a;
117
+ var _b;
118
+ return (0, tslib_1.__generator)(this, function (_c) {
119
+ switch (_c.label) {
120
+ case 0:
121
+ _b = {
122
+ event_type: 'Page View'
123
+ };
124
+ _a = [{}];
125
+ return [4 /*yield*/, getCampaignParams()];
126
+ case 1:
127
+ pageViewEvent = (_b.event_properties = tslib_1.__assign.apply(void 0, [tslib_1.__assign.apply(void 0, _a.concat([(_c.sent())])), { page_domain: /* istanbul ignore next */ (typeof location !== 'undefined' && location.hostname) || '', page_location: /* istanbul ignore next */ (typeof location !== 'undefined' && location.href) || '', page_path: /* istanbul ignore next */ (typeof location !== 'undefined' && location.pathname) || '', page_title: /* istanbul ignore next */ (typeof document !== 'undefined' && document.title) || '', page_url: /* istanbul ignore next */ (typeof location !== 'undefined' && location.href.split('?')[0]) || '' }]),
128
+ _b);
129
+ return [2 /*return*/, pageViewEvent];
130
+ }
131
+ });
132
+ }); };
133
+ var isCampaignEvent = function (event) {
134
+ if (event.event_type === '$identify' && event.user_properties) {
135
+ var properties = event.user_properties;
136
+ var $set = properties[analytics_types_1.IdentifyOperation.SET] || {};
137
+ var $unset = properties[analytics_types_1.IdentifyOperation.UNSET] || {};
138
+ var userProperties_1 = (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(Object.keys($set)), false), (0, tslib_1.__read)(Object.keys($unset)), false);
139
+ return Object.keys(analytics_client_common_2.BASE_CAMPAIGN).every(function (value) { return userProperties_1.includes(value); });
140
+ }
141
+ return false;
142
+ };
143
+ var shouldTrackHistoryPageView = function (trackingOption, newURL, oldURL) {
144
+ switch (trackingOption) {
145
+ case 'pathOnly':
146
+ return newURL.split('?')[0] !== oldURL.split('?')[0];
147
+ default:
148
+ return newURL !== oldURL;
149
+ }
150
+ };
151
+ exports.shouldTrackHistoryPageView = shouldTrackHistoryPageView;
152
+ //# sourceMappingURL=page-view-tracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-view-tracking.js","sourceRoot":"","sources":["../../src/page-view-tracking.ts"],"names":[],"mappings":"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","sourcesContent":["import { CampaignParser } from '@amplitude/analytics-client-common';\nimport {\n BaseEvent,\n BrowserClient,\n BrowserConfig,\n EnrichmentPlugin,\n Event,\n IdentifyOperation,\n IdentifyUserProperties,\n Logger,\n PluginType,\n} from '@amplitude/analytics-types';\nimport { BASE_CAMPAIGN } from '@amplitude/analytics-client-common';\nimport { Options } from './typings/page-view-tracking';\nimport { omitUndefined } from './utils';\n\nexport const pageViewTrackingPlugin = (client: BrowserClient, options: Options = {}): EnrichmentPlugin => {\n let loggerProvider: Logger | undefined = undefined;\n\n const shouldTrackOnPageLoad = () =>\n typeof options.trackOn === 'undefined' || (typeof options.trackOn === 'function' && options.trackOn());\n\n let previousURL: string | null = null;\n\n const trackHistoryPageView = async (): Promise<void> => {\n const newURL = location.href;\n\n if (shouldTrackHistoryPageView(options.trackHistoryChanges, newURL, previousURL || '') && shouldTrackOnPageLoad()) {\n /* istanbul ignore next */\n loggerProvider?.log('Tracking page view event');\n client.track(await createPageViewEvent());\n }\n previousURL = newURL;\n };\n\n const plugin = {\n name: 'page-view-tracking',\n type: PluginType.ENRICHMENT as const,\n\n setup: async (config: BrowserConfig) => {\n loggerProvider = config.loggerProvider;\n loggerProvider.log('Installing @amplitude/plugin-page-view-tracking-browser');\n\n options.trackOn = config.attribution?.trackPageViews ? 'attribution' : options.trackOn;\n\n // Turn off sending page view event by \"runAttributionStrategy\" function\n if (config.attribution?.trackPageViews) {\n loggerProvider.warn(\n '@amplitude/plugin-page-view-tracking-browser overrides page view tracking behavior defined in @amplitude/analytics-browser',\n );\n config.attribution.trackPageViews = false;\n }\n\n if (options.trackHistoryChanges) {\n /* istanbul ignore next */\n window.addEventListener('popstate', () => {\n void trackHistoryPageView();\n });\n\n /* istanbul ignore next */\n // There is no global browser listener for changes to history, so we have\n // to modify pushState directly.\n // https://stackoverflow.com/a/64927639\n // eslint-disable-next-line @typescript-eslint/unbound-method\n window.history.pushState = new Proxy(window.history.pushState, {\n apply: (target, thisArg, [state, unused, url]) => {\n void trackHistoryPageView();\n\n return target.apply(thisArg, [state, unused, url]);\n },\n });\n }\n\n if (shouldTrackOnPageLoad()) {\n loggerProvider.log('Tracking page view event');\n\n client.track(await createPageViewEvent());\n }\n },\n\n execute: async (event: Event) => {\n if (options.trackOn === 'attribution' && isCampaignEvent(event)) {\n /* istanbul ignore next */ // loggerProvider should be defined by the time execute is invoked\n loggerProvider?.log('Enriching campaign event to page view event with campaign parameters');\n const pageViewEvent = await createPageViewEvent();\n event.event_type = pageViewEvent.event_type;\n event.event_properties = {\n ...event.event_properties,\n ...pageViewEvent.event_properties,\n };\n }\n return event;\n },\n };\n\n // Required for unit tests\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (plugin as any).__trackHistoryPageView = trackHistoryPageView;\n\n return plugin;\n};\n\nconst getCampaignParams = async () => omitUndefined(await new CampaignParser().parse());\n\nconst createPageViewEvent = async (): Promise<Event> => {\n const pageViewEvent: BaseEvent = {\n event_type: 'Page View',\n event_properties: {\n ...(await getCampaignParams()),\n page_domain: /* istanbul ignore next */ (typeof location !== 'undefined' && location.hostname) || '',\n page_location: /* istanbul ignore next */ (typeof location !== 'undefined' && location.href) || '',\n page_path: /* istanbul ignore next */ (typeof location !== 'undefined' && location.pathname) || '',\n page_title: /* istanbul ignore next */ (typeof document !== 'undefined' && document.title) || '',\n page_url: /* istanbul ignore next */ (typeof location !== 'undefined' && location.href.split('?')[0]) || '',\n },\n };\n return pageViewEvent;\n};\n\nconst isCampaignEvent = (event: Event) => {\n if (event.event_type === '$identify' && event.user_properties) {\n const properties = event.user_properties as IdentifyUserProperties;\n const $set = properties[IdentifyOperation.SET] || {};\n const $unset = properties[IdentifyOperation.UNSET] || {};\n const userProperties = [...Object.keys($set), ...Object.keys($unset)];\n return Object.keys(BASE_CAMPAIGN).every((value) => userProperties.includes(value));\n }\n return false;\n};\n\nexport const shouldTrackHistoryPageView = (\n trackingOption: Options['trackHistoryChanges'],\n newURL: string,\n oldURL: string,\n): boolean => {\n switch (trackingOption) {\n case 'pathOnly':\n return newURL.split('?')[0] !== oldURL.split('?')[0];\n default:\n return newURL !== oldURL;\n }\n};\n"]}
@@ -0,0 +1,7 @@
1
+ export interface Options {
2
+ trackOn?: PageTrackingTrackOn;
3
+ trackHistoryChanges?: PageTrackingHistoryChanges;
4
+ }
5
+ export declare type PageTrackingTrackOn = 'attribution' | (() => boolean);
6
+ export declare type PageTrackingHistoryChanges = 'all' | 'pathOnly';
7
+ //# sourceMappingURL=page-view-tracking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-view-tracking.d.ts","sourceRoot":"","sources":["../../../src/typings/page-view-tracking.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,mBAAmB,CAAC,EAAE,0BAA0B,CAAC;CAClD;AAED,oBAAY,mBAAmB,GAAG,aAAa,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC;AAElE,oBAAY,0BAA0B,GAAG,KAAK,GAAG,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports, "__esModule", { value: true });
2
+ //# sourceMappingURL=page-view-tracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-view-tracking.js","sourceRoot":"","sources":["../../../src/typings/page-view-tracking.ts"],"names":[],"mappings":"","sourcesContent":["export interface Options {\n trackOn?: PageTrackingTrackOn;\n trackHistoryChanges?: PageTrackingHistoryChanges;\n}\n\nexport type PageTrackingTrackOn = 'attribution' | (() => boolean);\n\nexport type PageTrackingHistoryChanges = 'all' | 'pathOnly';\n"]}
@@ -0,0 +1,2 @@
1
+ export declare const omitUndefined: (input: Record<string, string | undefined>) => Record<string, string>;
2
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,UAAW,OAAO,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,2BAStE,CAAC"}
@@ -0,0 +1,14 @@
1
+ Object.defineProperty(exports, "__esModule", { value: true });
2
+ exports.omitUndefined = void 0;
3
+ var omitUndefined = function (input) {
4
+ var obj = {};
5
+ for (var key in input) {
6
+ var val = input[key];
7
+ if (val) {
8
+ obj[key] = val;
9
+ }
10
+ }
11
+ return obj;
12
+ };
13
+ exports.omitUndefined = omitUndefined;
14
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":";;AAAO,IAAM,aAAa,GAAG,UAAC,KAAyC;IACrE,IAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,IAAM,GAAG,IAAI,KAAK,EAAE;QACvB,IAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,GAAG,EAAE;YACP,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;SAChB;KACF;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AATW,QAAA,aAAa,iBASxB","sourcesContent":["export const omitUndefined = (input: Record<string, string | undefined>) => {\n const obj: Record<string, string> = {};\n for (const key in input) {\n const val = input[key];\n if (val) {\n obj[key] = val;\n }\n }\n return obj;\n};\n"]}
@@ -0,0 +1,3 @@
1
+ export { pageViewTrackingPlugin } from './page-view-tracking';
2
+ export * as Types from './typings/page-view-tracking';
3
+ //# 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,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,KAAK,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { pageViewTrackingPlugin } from './page-view-tracking';
2
+ import * as Types_1 from './typings/page-view-tracking';
3
+ export { Types_1 as Types };
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;yBACvC,8BAA8B;oBAAzC,KAAK","sourcesContent":["export { pageViewTrackingPlugin } from './page-view-tracking';\nexport * as Types from './typings/page-view-tracking';\n"]}
@@ -0,0 +1,5 @@
1
+ import { BrowserClient, EnrichmentPlugin } from '@amplitude/analytics-types';
2
+ import { Options } from './typings/page-view-tracking';
3
+ export declare const pageViewTrackingPlugin: (client: BrowserClient, options?: Options) => EnrichmentPlugin;
4
+ export declare const shouldTrackHistoryPageView: (trackingOption: Options['trackHistoryChanges'], newURL: string, oldURL: string) => boolean;
5
+ //# sourceMappingURL=page-view-tracking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-view-tracking.d.ts","sourceRoot":"","sources":["../../src/page-view-tracking.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,aAAa,EAEb,gBAAgB,EAMjB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAGvD,eAAO,MAAM,sBAAsB,WAAY,aAAa,YAAW,OAAO,KAAQ,gBAoFrF,CAAC;AA8BF,eAAO,MAAM,0BAA0B,mBACrB,OAAO,CAAC,qBAAqB,CAAC,UACtC,MAAM,UACN,MAAM,KACb,OAOF,CAAC"}
@@ -0,0 +1,147 @@
1
+ import { __assign, __awaiter, __generator, __read, __spreadArray } from "tslib";
2
+ import { CampaignParser } from '@amplitude/analytics-client-common';
3
+ import { IdentifyOperation, PluginType, } from '@amplitude/analytics-types';
4
+ import { BASE_CAMPAIGN } from '@amplitude/analytics-client-common';
5
+ import { omitUndefined } from './utils';
6
+ export var pageViewTrackingPlugin = function (client, options) {
7
+ if (options === void 0) { options = {}; }
8
+ var loggerProvider = undefined;
9
+ var shouldTrackOnPageLoad = function () {
10
+ return typeof options.trackOn === 'undefined' || (typeof options.trackOn === 'function' && options.trackOn());
11
+ };
12
+ var previousURL = null;
13
+ var trackHistoryPageView = function () { return __awaiter(void 0, void 0, void 0, function () {
14
+ var newURL, _a, _b;
15
+ return __generator(this, function (_c) {
16
+ switch (_c.label) {
17
+ case 0:
18
+ newURL = location.href;
19
+ if (!(shouldTrackHistoryPageView(options.trackHistoryChanges, newURL, previousURL || '') && shouldTrackOnPageLoad())) return [3 /*break*/, 2];
20
+ /* istanbul ignore next */
21
+ loggerProvider === null || loggerProvider === void 0 ? void 0 : loggerProvider.log('Tracking page view event');
22
+ _b = (_a = client).track;
23
+ return [4 /*yield*/, createPageViewEvent()];
24
+ case 1:
25
+ _b.apply(_a, [_c.sent()]);
26
+ _c.label = 2;
27
+ case 2:
28
+ previousURL = newURL;
29
+ return [2 /*return*/];
30
+ }
31
+ });
32
+ }); };
33
+ var plugin = {
34
+ name: 'page-view-tracking',
35
+ type: PluginType.ENRICHMENT,
36
+ setup: function (config) { return __awaiter(void 0, void 0, void 0, function () {
37
+ var _a, _b;
38
+ var _c, _d;
39
+ return __generator(this, function (_e) {
40
+ switch (_e.label) {
41
+ case 0:
42
+ loggerProvider = config.loggerProvider;
43
+ loggerProvider.log('Installing @amplitude/plugin-page-view-tracking-browser');
44
+ options.trackOn = ((_c = config.attribution) === null || _c === void 0 ? void 0 : _c.trackPageViews) ? 'attribution' : options.trackOn;
45
+ // Turn off sending page view event by "runAttributionStrategy" function
46
+ if ((_d = config.attribution) === null || _d === void 0 ? void 0 : _d.trackPageViews) {
47
+ loggerProvider.warn('@amplitude/plugin-page-view-tracking-browser overrides page view tracking behavior defined in @amplitude/analytics-browser');
48
+ config.attribution.trackPageViews = false;
49
+ }
50
+ if (options.trackHistoryChanges) {
51
+ /* istanbul ignore next */
52
+ window.addEventListener('popstate', function () {
53
+ void trackHistoryPageView();
54
+ });
55
+ /* istanbul ignore next */
56
+ // There is no global browser listener for changes to history, so we have
57
+ // to modify pushState directly.
58
+ // https://stackoverflow.com/a/64927639
59
+ // eslint-disable-next-line @typescript-eslint/unbound-method
60
+ window.history.pushState = new Proxy(window.history.pushState, {
61
+ apply: function (target, thisArg, _a) {
62
+ var _b = __read(_a, 3), state = _b[0], unused = _b[1], url = _b[2];
63
+ void trackHistoryPageView();
64
+ return target.apply(thisArg, [state, unused, url]);
65
+ },
66
+ });
67
+ }
68
+ if (!shouldTrackOnPageLoad()) return [3 /*break*/, 2];
69
+ loggerProvider.log('Tracking page view event');
70
+ _b = (_a = client).track;
71
+ return [4 /*yield*/, createPageViewEvent()];
72
+ case 1:
73
+ _b.apply(_a, [_e.sent()]);
74
+ _e.label = 2;
75
+ case 2: return [2 /*return*/];
76
+ }
77
+ });
78
+ }); },
79
+ execute: function (event) { return __awaiter(void 0, void 0, void 0, function () {
80
+ var pageViewEvent;
81
+ return __generator(this, function (_a) {
82
+ switch (_a.label) {
83
+ case 0:
84
+ if (!(options.trackOn === 'attribution' && isCampaignEvent(event))) return [3 /*break*/, 2];
85
+ /* istanbul ignore next */ // loggerProvider should be defined by the time execute is invoked
86
+ loggerProvider === null || loggerProvider === void 0 ? void 0 : loggerProvider.log('Enriching campaign event to page view event with campaign parameters');
87
+ return [4 /*yield*/, createPageViewEvent()];
88
+ case 1:
89
+ pageViewEvent = _a.sent();
90
+ event.event_type = pageViewEvent.event_type;
91
+ event.event_properties = __assign(__assign({}, event.event_properties), pageViewEvent.event_properties);
92
+ _a.label = 2;
93
+ case 2: return [2 /*return*/, event];
94
+ }
95
+ });
96
+ }); },
97
+ };
98
+ // Required for unit tests
99
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
100
+ plugin.__trackHistoryPageView = trackHistoryPageView;
101
+ return plugin;
102
+ };
103
+ var getCampaignParams = function () { return __awaiter(void 0, void 0, void 0, function () { var _a; return __generator(this, function (_b) {
104
+ switch (_b.label) {
105
+ case 0:
106
+ _a = omitUndefined;
107
+ return [4 /*yield*/, new CampaignParser().parse()];
108
+ case 1: return [2 /*return*/, _a.apply(void 0, [_b.sent()])];
109
+ }
110
+ }); }); };
111
+ var createPageViewEvent = function () { return __awaiter(void 0, void 0, void 0, function () {
112
+ var pageViewEvent, _a;
113
+ var _b;
114
+ return __generator(this, function (_c) {
115
+ switch (_c.label) {
116
+ case 0:
117
+ _b = {
118
+ event_type: 'Page View'
119
+ };
120
+ _a = [{}];
121
+ return [4 /*yield*/, getCampaignParams()];
122
+ case 1:
123
+ pageViewEvent = (_b.event_properties = __assign.apply(void 0, [__assign.apply(void 0, _a.concat([(_c.sent())])), { page_domain: /* istanbul ignore next */ (typeof location !== 'undefined' && location.hostname) || '', page_location: /* istanbul ignore next */ (typeof location !== 'undefined' && location.href) || '', page_path: /* istanbul ignore next */ (typeof location !== 'undefined' && location.pathname) || '', page_title: /* istanbul ignore next */ (typeof document !== 'undefined' && document.title) || '', page_url: /* istanbul ignore next */ (typeof location !== 'undefined' && location.href.split('?')[0]) || '' }]),
124
+ _b);
125
+ return [2 /*return*/, pageViewEvent];
126
+ }
127
+ });
128
+ }); };
129
+ var isCampaignEvent = function (event) {
130
+ if (event.event_type === '$identify' && event.user_properties) {
131
+ var properties = event.user_properties;
132
+ var $set = properties[IdentifyOperation.SET] || {};
133
+ var $unset = properties[IdentifyOperation.UNSET] || {};
134
+ var userProperties_1 = __spreadArray(__spreadArray([], __read(Object.keys($set)), false), __read(Object.keys($unset)), false);
135
+ return Object.keys(BASE_CAMPAIGN).every(function (value) { return userProperties_1.includes(value); });
136
+ }
137
+ return false;
138
+ };
139
+ export var shouldTrackHistoryPageView = function (trackingOption, newURL, oldURL) {
140
+ switch (trackingOption) {
141
+ case 'pathOnly':
142
+ return newURL.split('?')[0] !== oldURL.split('?')[0];
143
+ default:
144
+ return newURL !== oldURL;
145
+ }
146
+ };
147
+ //# sourceMappingURL=page-view-tracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-view-tracking.js","sourceRoot":"","sources":["../../src/page-view-tracking.ts"],"names":[],"mappings":"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","sourcesContent":["import { CampaignParser } from '@amplitude/analytics-client-common';\nimport {\n BaseEvent,\n BrowserClient,\n BrowserConfig,\n EnrichmentPlugin,\n Event,\n IdentifyOperation,\n IdentifyUserProperties,\n Logger,\n PluginType,\n} from '@amplitude/analytics-types';\nimport { BASE_CAMPAIGN } from '@amplitude/analytics-client-common';\nimport { Options } from './typings/page-view-tracking';\nimport { omitUndefined } from './utils';\n\nexport const pageViewTrackingPlugin = (client: BrowserClient, options: Options = {}): EnrichmentPlugin => {\n let loggerProvider: Logger | undefined = undefined;\n\n const shouldTrackOnPageLoad = () =>\n typeof options.trackOn === 'undefined' || (typeof options.trackOn === 'function' && options.trackOn());\n\n let previousURL: string | null = null;\n\n const trackHistoryPageView = async (): Promise<void> => {\n const newURL = location.href;\n\n if (shouldTrackHistoryPageView(options.trackHistoryChanges, newURL, previousURL || '') && shouldTrackOnPageLoad()) {\n /* istanbul ignore next */\n loggerProvider?.log('Tracking page view event');\n client.track(await createPageViewEvent());\n }\n previousURL = newURL;\n };\n\n const plugin = {\n name: 'page-view-tracking',\n type: PluginType.ENRICHMENT as const,\n\n setup: async (config: BrowserConfig) => {\n loggerProvider = config.loggerProvider;\n loggerProvider.log('Installing @amplitude/plugin-page-view-tracking-browser');\n\n options.trackOn = config.attribution?.trackPageViews ? 'attribution' : options.trackOn;\n\n // Turn off sending page view event by \"runAttributionStrategy\" function\n if (config.attribution?.trackPageViews) {\n loggerProvider.warn(\n '@amplitude/plugin-page-view-tracking-browser overrides page view tracking behavior defined in @amplitude/analytics-browser',\n );\n config.attribution.trackPageViews = false;\n }\n\n if (options.trackHistoryChanges) {\n /* istanbul ignore next */\n window.addEventListener('popstate', () => {\n void trackHistoryPageView();\n });\n\n /* istanbul ignore next */\n // There is no global browser listener for changes to history, so we have\n // to modify pushState directly.\n // https://stackoverflow.com/a/64927639\n // eslint-disable-next-line @typescript-eslint/unbound-method\n window.history.pushState = new Proxy(window.history.pushState, {\n apply: (target, thisArg, [state, unused, url]) => {\n void trackHistoryPageView();\n\n return target.apply(thisArg, [state, unused, url]);\n },\n });\n }\n\n if (shouldTrackOnPageLoad()) {\n loggerProvider.log('Tracking page view event');\n\n client.track(await createPageViewEvent());\n }\n },\n\n execute: async (event: Event) => {\n if (options.trackOn === 'attribution' && isCampaignEvent(event)) {\n /* istanbul ignore next */ // loggerProvider should be defined by the time execute is invoked\n loggerProvider?.log('Enriching campaign event to page view event with campaign parameters');\n const pageViewEvent = await createPageViewEvent();\n event.event_type = pageViewEvent.event_type;\n event.event_properties = {\n ...event.event_properties,\n ...pageViewEvent.event_properties,\n };\n }\n return event;\n },\n };\n\n // Required for unit tests\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (plugin as any).__trackHistoryPageView = trackHistoryPageView;\n\n return plugin;\n};\n\nconst getCampaignParams = async () => omitUndefined(await new CampaignParser().parse());\n\nconst createPageViewEvent = async (): Promise<Event> => {\n const pageViewEvent: BaseEvent = {\n event_type: 'Page View',\n event_properties: {\n ...(await getCampaignParams()),\n page_domain: /* istanbul ignore next */ (typeof location !== 'undefined' && location.hostname) || '',\n page_location: /* istanbul ignore next */ (typeof location !== 'undefined' && location.href) || '',\n page_path: /* istanbul ignore next */ (typeof location !== 'undefined' && location.pathname) || '',\n page_title: /* istanbul ignore next */ (typeof document !== 'undefined' && document.title) || '',\n page_url: /* istanbul ignore next */ (typeof location !== 'undefined' && location.href.split('?')[0]) || '',\n },\n };\n return pageViewEvent;\n};\n\nconst isCampaignEvent = (event: Event) => {\n if (event.event_type === '$identify' && event.user_properties) {\n const properties = event.user_properties as IdentifyUserProperties;\n const $set = properties[IdentifyOperation.SET] || {};\n const $unset = properties[IdentifyOperation.UNSET] || {};\n const userProperties = [...Object.keys($set), ...Object.keys($unset)];\n return Object.keys(BASE_CAMPAIGN).every((value) => userProperties.includes(value));\n }\n return false;\n};\n\nexport const shouldTrackHistoryPageView = (\n trackingOption: Options['trackHistoryChanges'],\n newURL: string,\n oldURL: string,\n): boolean => {\n switch (trackingOption) {\n case 'pathOnly':\n return newURL.split('?')[0] !== oldURL.split('?')[0];\n default:\n return newURL !== oldURL;\n }\n};\n"]}
@@ -0,0 +1,7 @@
1
+ export interface Options {
2
+ trackOn?: PageTrackingTrackOn;
3
+ trackHistoryChanges?: PageTrackingHistoryChanges;
4
+ }
5
+ export declare type PageTrackingTrackOn = 'attribution' | (() => boolean);
6
+ export declare type PageTrackingHistoryChanges = 'all' | 'pathOnly';
7
+ //# sourceMappingURL=page-view-tracking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-view-tracking.d.ts","sourceRoot":"","sources":["../../../src/typings/page-view-tracking.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,mBAAmB,CAAC,EAAE,0BAA0B,CAAC;CAClD;AAED,oBAAY,mBAAmB,GAAG,aAAa,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC;AAElE,oBAAY,0BAA0B,GAAG,KAAK,GAAG,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=page-view-tracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-view-tracking.js","sourceRoot":"","sources":["../../../src/typings/page-view-tracking.ts"],"names":[],"mappings":"","sourcesContent":["export interface Options {\n trackOn?: PageTrackingTrackOn;\n trackHistoryChanges?: PageTrackingHistoryChanges;\n}\n\nexport type PageTrackingTrackOn = 'attribution' | (() => boolean);\n\nexport type PageTrackingHistoryChanges = 'all' | 'pathOnly';\n"]}
@@ -0,0 +1,2 @@
1
+ export declare const omitUndefined: (input: Record<string, string | undefined>) => Record<string, string>;
2
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,UAAW,OAAO,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,2BAStE,CAAC"}
@@ -0,0 +1,11 @@
1
+ export var omitUndefined = function (input) {
2
+ var obj = {};
3
+ for (var key in input) {
4
+ var val = input[key];
5
+ if (val) {
6
+ obj[key] = val;
7
+ }
8
+ }
9
+ return obj;
10
+ };
11
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,IAAM,aAAa,GAAG,UAAC,KAAyC;IACrE,IAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,IAAM,GAAG,IAAI,KAAK,EAAE;QACvB,IAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,GAAG,EAAE;YACP,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;SAChB;KACF;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC","sourcesContent":["export const omitUndefined = (input: Record<string, string | undefined>) => {\n const obj: Record<string, string> = {};\n for (const key in input) {\n const val = input[key];\n if (val) {\n obj[key] = val;\n }\n }\n return obj;\n};\n"]}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@amplitude/plugin-page-view-tracking-browser",
3
+ "version": "0.3.1",
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
+ "publishConfig": {
12
+ "access": "public"
13
+ },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/amplitude/Amplitude-TypeScript.git"
17
+ },
18
+ "scripts": {
19
+ "build": "yarn build:es5 && yarn build:esm",
20
+ "build:es5": "tsc -p ./tsconfig.es5.json",
21
+ "build:esm": "tsc -p ./tsconfig.esm.json",
22
+ "clean": "rimraf node_modules lib coverage",
23
+ "fix": "yarn fix:eslint & yarn fix:prettier",
24
+ "fix:eslint": "eslint '{src,test}/**/*.ts' --fix",
25
+ "fix:prettier": "prettier --write \"{src,test}/**/*.ts\"",
26
+ "lint": "yarn lint:eslint & yarn lint:prettier",
27
+ "lint:eslint": "eslint '{src,test}/**/*.ts'",
28
+ "lint:prettier": "prettier --check \"{src,test}/**/*.ts\"",
29
+ "test": "jest",
30
+ "typecheck": "tsc -p ./tsconfig.json"
31
+ },
32
+ "bugs": {
33
+ "url": "https://github.com/amplitude/Amplitude-TypeScript/issues"
34
+ },
35
+ "dependencies": {
36
+ "@amplitude/analytics-browser": "^1.5.0",
37
+ "@amplitude/analytics-client-common": "^0.2.1",
38
+ "@amplitude/analytics-types": "^0.10.2",
39
+ "tslib": "^2.3.1"
40
+ },
41
+ "files": [
42
+ "lib"
43
+ ],
44
+ "gitHead": "d5d22e7f4f52d5ed816cd473acc4c9e57a9e61dd"
45
+ }