@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 +21 -0
- package/lib/cjs/index.d.ts +3 -0
- package/lib/cjs/index.d.ts.map +1 -0
- package/lib/cjs/index.js +7 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/cjs/page-view-tracking.d.ts +5 -0
- package/lib/cjs/page-view-tracking.d.ts.map +1 -0
- package/lib/cjs/page-view-tracking.js +152 -0
- package/lib/cjs/page-view-tracking.js.map +1 -0
- package/lib/cjs/typings/page-view-tracking.d.ts +7 -0
- package/lib/cjs/typings/page-view-tracking.d.ts.map +1 -0
- package/lib/cjs/typings/page-view-tracking.js +2 -0
- package/lib/cjs/typings/page-view-tracking.js.map +1 -0
- package/lib/cjs/utils.d.ts +2 -0
- package/lib/cjs/utils.d.ts.map +1 -0
- package/lib/cjs/utils.js +14 -0
- package/lib/cjs/utils.js.map +1 -0
- package/lib/esm/index.d.ts +3 -0
- package/lib/esm/index.d.ts.map +1 -0
- package/lib/esm/index.js +4 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/page-view-tracking.d.ts +5 -0
- package/lib/esm/page-view-tracking.d.ts.map +1 -0
- package/lib/esm/page-view-tracking.js +147 -0
- package/lib/esm/page-view-tracking.js.map +1 -0
- package/lib/esm/typings/page-view-tracking.d.ts +7 -0
- package/lib/esm/typings/page-view-tracking.d.ts.map +1 -0
- package/lib/esm/typings/page-view-tracking.js +2 -0
- package/lib/esm/typings/page-view-tracking.js.map +1 -0
- package/lib/esm/utils.d.ts +2 -0
- package/lib/esm/utils.d.ts.map +1 -0
- package/lib/esm/utils.js +11 -0
- package/lib/esm/utils.js.map +1 -0
- package/package.json +45 -0
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 @@
|
|
|
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"}
|
package/lib/cjs/index.js
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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"}
|
package/lib/cjs/utils.js
ADDED
|
@@ -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 @@
|
|
|
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"}
|
package/lib/esm/index.js
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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"}
|
package/lib/esm/utils.js
ADDED
|
@@ -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
|
+
}
|