suomifi-piwik-react-router 22.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.
Potentially problematic release.
This version of suomifi-piwik-react-router might be problematic. Click here for more details.
- package/README.md +16 -0
- package/index.js +297 -0
- package/package.json +12 -0
- package/preinst.sh +3 -0
package/README.md
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# suomifi-piwik-react-router
|
2
|
+
|
3
|
+
`suomifi-piwik-react-router` is a Node.js module designed to simplify the integration of Piwik (now known as Matomo) with React Router in your web applications. This module provides an easy-to-use interface for tracking page views and other custom events in your single-page applications using Piwik.
|
4
|
+
|
5
|
+
## Features
|
6
|
+
|
7
|
+
- Automatically track page views when routing changes in a React application.
|
8
|
+
- Support for custom event tracking, including goals and conversions.
|
9
|
+
|
10
|
+
## Installation
|
11
|
+
|
12
|
+
You can install `suomifi-piwik-react-router` using npm or yarn:
|
13
|
+
|
14
|
+
```bash
|
15
|
+
npm install suomifi-piwik-react-router --save
|
16
|
+
```
|
package/index.js
ADDED
@@ -0,0 +1,297 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
var warning = require('warning');
|
4
|
+
var urljoin = require('url-join');
|
5
|
+
|
6
|
+
// api shim. used for serverside rendering and misconfigured tracker instances
|
7
|
+
var apiShim = {
|
8
|
+
_isShim: true,
|
9
|
+
track: function () {},
|
10
|
+
push: function (args) {},
|
11
|
+
pushTag: function (args) {},
|
12
|
+
setUserId: function (userId) {},
|
13
|
+
trackError: function (e) {},
|
14
|
+
connectToHistory: function (history, modifier) { return history; },
|
15
|
+
disconnectFromHistory: function () {}
|
16
|
+
};
|
17
|
+
|
18
|
+
var previousPath = null;
|
19
|
+
var unlistenFromHistory = null;
|
20
|
+
|
21
|
+
var PiwikTracker = function(opts) {
|
22
|
+
var getEnvironment = function () {
|
23
|
+
return process && process.env && process.env.NODE_ENV ? process.env.NODE_ENV.toLowerCase() : 'development';
|
24
|
+
};
|
25
|
+
|
26
|
+
var getBaseUrl = function () {
|
27
|
+
var u = ''
|
28
|
+
var url = opts.url;
|
29
|
+
|
30
|
+
if (url.indexOf('http://') !== -1 || url.indexOf('https://') !== -1) {
|
31
|
+
u = url + '/';
|
32
|
+
}
|
33
|
+
else {
|
34
|
+
u = (('https:' == document.location.protocol) ? 'https://' + url + '/' : 'http://' + url + '/');
|
35
|
+
}
|
36
|
+
|
37
|
+
return u;
|
38
|
+
}
|
39
|
+
|
40
|
+
var piwikIsAlreadyInitialized = function () {
|
41
|
+
if (typeof window._paq === 'undefined' || typeof window._paq.push !== 'function') {
|
42
|
+
return false;
|
43
|
+
}
|
44
|
+
|
45
|
+
var hasSiteId = false;
|
46
|
+
var hasTrackerUrl = false;
|
47
|
+
|
48
|
+
if (window._paq.length === undefined) {
|
49
|
+
// piwik seems to have replaced the array by the TrackerProxy
|
50
|
+
// @see https://github.com/piwik/piwik/blob/3.x-dev/js/piwik.js#L7050
|
51
|
+
// @see https://github.com/piwik/piwik/blob/3.x-dev/js/piwik.js#L7115
|
52
|
+
return true;
|
53
|
+
}
|
54
|
+
|
55
|
+
for (var j = 0, l = window._paq.length; j < l; j++) {
|
56
|
+
if (~window._paq[j].indexOf('setSiteId')) {
|
57
|
+
hasSiteId = true
|
58
|
+
}
|
59
|
+
|
60
|
+
if (~window._paq[j].indexOf('setTrackerUrl')) {
|
61
|
+
hasTrackerUrl = true
|
62
|
+
}
|
63
|
+
|
64
|
+
if (hasTrackerUrl && hasSiteId) {
|
65
|
+
return true
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
return false;
|
70
|
+
};
|
71
|
+
|
72
|
+
window.currentTitle = window.currentTitle || ""
|
73
|
+
window.tagManagerInitialized = window.tagManagerInitialized || false
|
74
|
+
|
75
|
+
opts = opts || {};
|
76
|
+
opts.trackErrors = ((opts.trackErrors !== undefined) ? opts.trackErrors : false);
|
77
|
+
opts.trackErrorHandler = ((opts.trackErrorHandler !== undefined) ? opts.trackErrorHandler : trackError);
|
78
|
+
opts.enableLinkTracking = ((opts.enableLinkTracking !== undefined) ? opts.enableLinkTracking : true);
|
79
|
+
opts.updateDocumentTitle = ((opts.updateDocumentTitle !== undefined) ? opts.updateDocumentTitle : true);
|
80
|
+
opts.ignoreInitialVisit = ((opts.ignoreInitialVisit !== undefined) ? opts.ignoreInitialVisit : false);
|
81
|
+
opts.injectScript = ((opts.injectScript !== undefined) ? opts.injectScript : true);
|
82
|
+
opts.clientTrackerName = ((opts.clientTrackerName !== undefined) ? opts.clientTrackerName : 'piwik.js');
|
83
|
+
opts.serverTrackerName = ((opts.serverTrackerName !== undefined) ? opts.serverTrackerName : 'piwik.php');
|
84
|
+
opts.optionalTrackers = ((opts.optionalTrackers !== undefined) ? opts.optionalTrackers : []);
|
85
|
+
opts.optionalTrackersWebsiteId = ((opts.optionalTrackersWebsiteId !== undefined) ? opts.optionalTrackersWebsiteId : []);
|
86
|
+
|
87
|
+
var alreadyInitialized = piwikIsAlreadyInitialized();
|
88
|
+
|
89
|
+
window._paq = window['_paq'] || [];
|
90
|
+
|
91
|
+
var piwikWithoutUrlOrSiteId = (!opts.url || !opts.siteId) && !alreadyInitialized;
|
92
|
+
var piwikWithoutInjectScript = !opts.injectScript && !alreadyInitialized;
|
93
|
+
|
94
|
+
if (piwikWithoutUrlOrSiteId || piwikWithoutInjectScript) {
|
95
|
+
// Only return warning if this is not in the test environment as it can break the Tests/CI.
|
96
|
+
if (getEnvironment() !== 'test') {
|
97
|
+
warning(null, 'PiwikTracker cannot be initialized! You haven\'t passed a url and siteId to it.');
|
98
|
+
}
|
99
|
+
|
100
|
+
return apiShim;
|
101
|
+
}
|
102
|
+
|
103
|
+
/**
|
104
|
+
* Adds a page view for the given location
|
105
|
+
*/
|
106
|
+
var track = function track (loc) {
|
107
|
+
var currentPath;
|
108
|
+
|
109
|
+
if (loc.path) {
|
110
|
+
currentPath = loc.path;
|
111
|
+
} else if (loc.basename) {
|
112
|
+
currentPath = urljoin(loc.basename, loc.pathname, loc.search);
|
113
|
+
} else {
|
114
|
+
currentPath = urljoin(loc.pathname, loc.search);
|
115
|
+
}
|
116
|
+
|
117
|
+
if (previousPath === currentPath) {
|
118
|
+
return;
|
119
|
+
}
|
120
|
+
|
121
|
+
if (opts.updateDocumentTitle) {
|
122
|
+
push(['setDocumentTitle', document.title]);
|
123
|
+
}
|
124
|
+
push(['setCustomUrl', currentPath]);
|
125
|
+
push(['trackPageView']);
|
126
|
+
|
127
|
+
previousPath = currentPath;
|
128
|
+
};
|
129
|
+
|
130
|
+
/*
|
131
|
+
* Pushes the specified args to the piwik tracker.
|
132
|
+
* You can use this method as the low-level api to call methods from the piwik API or call custom functions
|
133
|
+
*
|
134
|
+
* @see https://developer.piwik.org/guides/tracking-javascript-guide
|
135
|
+
*/
|
136
|
+
var push = function push (args) {
|
137
|
+
window._paq.push(args);
|
138
|
+
};
|
139
|
+
|
140
|
+
var pushTag = function pushTag (args) {
|
141
|
+
window._mtm.push(args);
|
142
|
+
};
|
143
|
+
|
144
|
+
/**
|
145
|
+
* Sets a user ID to the piwik tracker.
|
146
|
+
* This method can be used after PiwikReactRouter is instantiated, for example after a user has logged in
|
147
|
+
*
|
148
|
+
* @see https://developer.piwik.org/guides/tracking-javascript-guide#user-id
|
149
|
+
*/
|
150
|
+
var setUserId = function setUserId (userId) {
|
151
|
+
window._paq.push(['setUserId', userId])
|
152
|
+
};
|
153
|
+
|
154
|
+
/**
|
155
|
+
* Tracks occurring javascript errors as a `JavaScript Error` piwik event.
|
156
|
+
*
|
157
|
+
* @see http://davidwalsh.name/track-errors-google-analytics
|
158
|
+
*/
|
159
|
+
function trackError (e, eventName) {
|
160
|
+
eventName = eventName || 'JavaScript Error';
|
161
|
+
|
162
|
+
push([
|
163
|
+
'trackEvent',
|
164
|
+
eventName,
|
165
|
+
e.message,
|
166
|
+
e.filename + ': ' + e.lineno
|
167
|
+
]);
|
168
|
+
};
|
169
|
+
|
170
|
+
/**
|
171
|
+
* Connects to the given history
|
172
|
+
*/
|
173
|
+
var connectToHistory = function (history, modifier) {
|
174
|
+
modifier = (typeof modifier === 'function') ? modifier : function (location) { return location; };
|
175
|
+
|
176
|
+
var applyModifierAndTrackLocation = function (modifier, location) {
|
177
|
+
var modifiedLocation = modifier(location);
|
178
|
+
|
179
|
+
if (modifiedLocation !== undefined) {
|
180
|
+
track(modifiedLocation);
|
181
|
+
}
|
182
|
+
else if (getEnvironment() === 'development') {
|
183
|
+
warning(null, 'The modifier given to .connectToHistory did not return any object. Please make sure to return the modified location object in your modifier.');
|
184
|
+
}
|
185
|
+
}
|
186
|
+
|
187
|
+
unlistenFromHistory = history.listen(function (location) {
|
188
|
+
applyModifierAndTrackLocation(modifier, location);
|
189
|
+
});
|
190
|
+
|
191
|
+
var initialLocation
|
192
|
+
if (history.location) {
|
193
|
+
initialLocation = history.location
|
194
|
+
} else if (typeof history.getCurrentLocation === 'function') {
|
195
|
+
initialLocation = history.getCurrentLocation()
|
196
|
+
}
|
197
|
+
|
198
|
+
if (!opts.ignoreInitialVisit && initialLocation) {
|
199
|
+
applyModifierAndTrackLocation(modifier, initialLocation);
|
200
|
+
}
|
201
|
+
|
202
|
+
return history;
|
203
|
+
};
|
204
|
+
|
205
|
+
/**
|
206
|
+
* Disconnects from a previous connected history
|
207
|
+
*/
|
208
|
+
var disconnectFromHistory = function () {
|
209
|
+
if (unlistenFromHistory) {
|
210
|
+
unlistenFromHistory();
|
211
|
+
return true;
|
212
|
+
}
|
213
|
+
|
214
|
+
return false;
|
215
|
+
};
|
216
|
+
|
217
|
+
if (opts.trackErrors) {
|
218
|
+
if (window.addEventListener) {
|
219
|
+
window.addEventListener('error', opts.trackErrorHandler, false);
|
220
|
+
}
|
221
|
+
else if (window.attachEvent) {
|
222
|
+
window.attachEvent('onerror', opts.trackErrorHandler);
|
223
|
+
}
|
224
|
+
else {
|
225
|
+
window.onerror = opts.trackErrorHandler;
|
226
|
+
}
|
227
|
+
}
|
228
|
+
|
229
|
+
// piwik initializer
|
230
|
+
(function() {
|
231
|
+
var alreadyInitialized = piwikIsAlreadyInitialized();
|
232
|
+
|
233
|
+
if (!alreadyInitialized) {
|
234
|
+
var u = getBaseUrl();
|
235
|
+
|
236
|
+
push(['setSiteId', opts.siteId]);
|
237
|
+
push(['setTrackerUrl', u + opts.serverTrackerName]);
|
238
|
+
|
239
|
+
if (opts.optionalTrackers.length && opts.optionalTrackersWebsiteId.length ) {
|
240
|
+
for (var i in opts.optionalTrackers) {
|
241
|
+
push(['addTracker', opts.optionalTrackers[i], opts.optionalTrackersWebsiteId[i]]);
|
242
|
+
}
|
243
|
+
}
|
244
|
+
}
|
245
|
+
|
246
|
+
if (opts.userId) {
|
247
|
+
setUserId(opts.userId);
|
248
|
+
}
|
249
|
+
|
250
|
+
if (opts.enableLinkTracking) {
|
251
|
+
push(['enableLinkTracking']);
|
252
|
+
}
|
253
|
+
if (opts.injectScript && !alreadyInitialized) {
|
254
|
+
injectCode(u + opts.clientTrackerName)
|
255
|
+
}
|
256
|
+
|
257
|
+
if(opts.enableTagManager && !window.tagManagerInitialized){
|
258
|
+
window._mtm = [
|
259
|
+
{'mtm.startTime': (new Date().getTime()), 'event': 'mtm.Start'}
|
260
|
+
];
|
261
|
+
injectCode(opts.tagManagerSrc)
|
262
|
+
window.tagManagerInitialized = true
|
263
|
+
}
|
264
|
+
})();
|
265
|
+
|
266
|
+
function injectCode(src){
|
267
|
+
if(src && src.length > 0) {
|
268
|
+
const d = document;
|
269
|
+
const g = d.createElement('script');
|
270
|
+
const s = d.getElementsByTagName('script')[0];
|
271
|
+
g.async = true;
|
272
|
+
g.src = src;
|
273
|
+
s.parentNode.insertBefore(g, s);
|
274
|
+
}
|
275
|
+
}
|
276
|
+
|
277
|
+
// return api
|
278
|
+
return {
|
279
|
+
_isShim: false,
|
280
|
+
track: track,
|
281
|
+
push: push,
|
282
|
+
pushTag: pushTag,
|
283
|
+
setUserId: setUserId,
|
284
|
+
trackError: opts.trackErrorHandler,
|
285
|
+
connectToHistory: connectToHistory,
|
286
|
+
disconnectFromHistory: disconnectFromHistory
|
287
|
+
};
|
288
|
+
};
|
289
|
+
|
290
|
+
if (typeof window === 'undefined') {
|
291
|
+
module.exports = function() {
|
292
|
+
return apiShim;
|
293
|
+
};
|
294
|
+
}
|
295
|
+
else {
|
296
|
+
module.exports = PiwikTracker;
|
297
|
+
}
|
package/package.json
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
{
|
2
|
+
"name": "suomifi-piwik-react-router",
|
3
|
+
"version": "22.1.0",
|
4
|
+
"description": "Suomifi Piwik React Router",
|
5
|
+
"main": "index.js",
|
6
|
+
"author": "Kaarme Kaja",
|
7
|
+
"license": "BSD",
|
8
|
+
"scripts": {
|
9
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
10
|
+
"preinstall": "./preinst.sh"
|
11
|
+
}
|
12
|
+
}
|
package/preinst.sh
ADDED