Skip to content

Commit 5f6ab99

Browse files
Add integration nanigans This commit copies the content of the integration repo into the "integrations" folder. Original repo: https://github.com/segment-integrations/analytics.js-integration-nanigans Readme: https://github.com/segment-integrations/analytics.js-integration-nanigans/blob/master/README.md
1 parent 50d2834 commit 5f6ab99

File tree

6 files changed

+525
-0
lines changed

6 files changed

+525
-0
lines changed

integrations/nanigans/HISTORY.md

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
2.1.1 / 2018-02-23
2+
==================
3+
4+
* Prep for mixed component migration
5+
6+
2.1.0 / 2016-11-09
7+
==================
8+
9+
* Make it so user_id is only passed in the pixel querystring when it is available.
10+
11+
2.0.0 / 2016-06-21
12+
==================
13+
14+
* Remove Duo compatibility
15+
* Add CI setup (coverage, linting, cross-browser compatibility, etc.)
16+
* Update eslint configuration
17+
18+
1.1.1 / 2016-05-07
19+
==================
20+
21+
* Bump Analytics.js core, tester, integration to use Facade 2.x
22+
23+
1.1.0 / 2015-09-08
24+
==================
25+
26+
* add experimental support for interpolated event names
27+
28+
1.0.3 / 2015-06-30
29+
==================
30+
31+
* Replace analytics.js dependency with analytics.js-core
32+
33+
1.0.2 / 2015-06-24
34+
==================
35+
36+
* Bump analytics.js-integration version
37+
38+
1.0.1 / 2015-06-24
39+
==================
40+
41+
* Bump analytics.js-integration version
42+
43+
1.0.0 / 2015-06-09
44+
==================
45+
46+
* Initial commit :sparkles:

integrations/nanigans/README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# analytics.js-integration-nanigans [![Build Status][ci-badge]][ci-link]
2+
3+
Nanigans integration for [Analytics.js][].
4+
5+
## License
6+
7+
Released under the [MIT license](LICENSE).
8+
9+
10+
[Analytics.js]: https://segment.com/docs/libraries/analytics.js/
11+
[ci-link]: https://circleci.com/gh/segment-integrations/analytics.js-integration-nanigans
12+
[ci-badge]: https://circleci.com/gh/segment-integrations/analytics.js-integration-nanigans.svg?style=svg&circle-token=2a4685afe1b2189622be320bc4e636ee15512c7d

integrations/nanigans/lib/index.js

Lines changed: 203 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
1+
'use strict';
2+
3+
/**
4+
* Module dependencies.
5+
*/
6+
7+
var Identify = require('segmentio-facade').Identify;
8+
var Track = require('segmentio-facade').Track;
9+
var integration = require('@segment/analytics.js-integration');
10+
var normalize = require('to-no-case');
11+
var qs = require('component-querystring');
12+
var sha256 = require('js-sha256');
13+
14+
/**
15+
* Expose `Nanigans`.
16+
*/
17+
18+
var Nanigans = module.exports = integration('Nanigans')
19+
.option('appId', '')
20+
.option('events', {})
21+
.tag('page', '<img src="//api.nanigans.com/event.php?app_id={{ appId }}&type=visit&name=landing">')
22+
.tag('track', '<img src="//api.nanigans.com/event.php?app_id={{ appId }}&type={{ type }}&name={{ name }}&user_id={{ userId }}&ut1={{ ut1 }}">')
23+
.tag('track_no_user_id', '<img src="//api.nanigans.com/event.php?app_id={{ appId }}&type={{ type }}&name={{ name }}&ut1={{ ut1 }}">')
24+
.tag('product', '<img src="//api.nanigans.com/event.php?app_id={{ appId }}&type=purchase&name={{ name }}&user_id={{ userId }}&ut1={{ ut1 }}&sku={{ sku }}">')
25+
.tag('add_to_cart', '<img src="//api.nanigans.com/event.php?app_id={{ appId }}&type=user&name={{ name }}&user_id={{ userId }}&ut1={{ ut1 }}&{{ products }}">')
26+
.tag('add_to_cart_no_user_id', '<img src="//api.nanigans.com/event.php?app_id={{ appId }}&type=user&name={{ name }}&ut1={{ ut1 }}&{{ products }}">')
27+
.tag('purchase', '<img src="//api.nanigans.com/event.php?app_id={{ appId }}&type={{ type }}&name={{ name }}&user_id={{ userId }}&ut1={{ ut1 }}&unique={{ orderId }}&{{ products }}">')
28+
.tag('purchase_no_user_id', '<img src="//api.nanigans.com/event.php?app_id={{ appId }}&type={{ type }}&name={{ name }}&ut1={{ ut1 }}&unique={{ orderId }}&{{ products }}">');
29+
30+
/**
31+
* Initialize.
32+
*
33+
* https://s3.amazonaws.com/segmentio/docs/integrations/nanigans/docs.html
34+
*
35+
* @api public
36+
*/
37+
38+
Nanigans.prototype.initialize = function() {
39+
// TODO: assert nan_pid URL parameter is present.
40+
this.ready();
41+
};
42+
43+
/**
44+
* Loaded?
45+
*
46+
* @api public
47+
* @return {boolean}
48+
*/
49+
50+
Nanigans.prototype.loaded = function() {
51+
// We load Nanigans pixels on conversions, so we don't need to preload anything
52+
return true;
53+
};
54+
55+
/**
56+
* Page.
57+
*
58+
* @api public
59+
* @param {Page} page
60+
*/
61+
62+
Nanigans.prototype.page = function() {
63+
this.load('page');
64+
};
65+
66+
/**
67+
* Track.
68+
*
69+
* @api public
70+
* @param {Track} track
71+
*/
72+
73+
Nanigans.prototype.track = function(track) {
74+
var user = this.analytics.user();
75+
76+
var events = get(this.options.events, track.event());
77+
if (!events.length) return;
78+
var products = track.products();
79+
var data = {};
80+
81+
data.app_id = this.options.appId;
82+
data.user_id = user.id();
83+
data.unique = track.orderId();
84+
data.sku = Array(products.length);
85+
data.qty = Array(products.length);
86+
data.value = Array(products.length);
87+
88+
// see readme comment
89+
if (email(user) != null) {
90+
data.ut1 = sha256(email(user));
91+
}
92+
93+
for (var i = 0; i < products.length; i++) {
94+
var item = new Track({ properties: products[i] });
95+
data.qty[i] = item.quantity();
96+
data.sku[i] = item.sku();
97+
data.value[i] = item.price();
98+
}
99+
100+
// some events may create multiple pixels.
101+
for (var j = 0; j < events.length; j++) {
102+
var event = events[j];
103+
var params = {
104+
appId: data.app_id,
105+
name: renderByProxy(event.name, track),
106+
type: event.type,
107+
ut1: data.ut1,
108+
products: {}
109+
};
110+
if (data.user_id) params.userId = data.user_id;
111+
112+
switch (event.type) {
113+
case 'purchase':
114+
params.orderId = data.unique;
115+
params.products.qty = data.qty;
116+
params.products.value = data.value;
117+
params.products.sku = data.sku;
118+
params.products = qs.stringify(params.products);
119+
params.userId ? this.load('purchase', params) : this.load('purchase_no_user_id', params);
120+
break;
121+
case 'user':
122+
switch (event.name) {
123+
case 'product':
124+
params.sku = data.sku;
125+
break;
126+
case 'add_to_cart':
127+
params.products.qty = data.qty;
128+
params.products.value = data.value;
129+
params.products.sku = data.sku;
130+
params.products = qs.stringify(params.products);
131+
params.userId ? this.load('add_to_cart', params) : this.load('add_to_cart_no_user_id', params);
132+
break;
133+
default:
134+
params.userId ? this.load('track', params) : this.load('track_no_user_id', params);
135+
break;
136+
}
137+
break;
138+
default:
139+
params.userId ? this.load('track', params) : this.load('track_no_user_id', params);
140+
break;
141+
}
142+
}
143+
};
144+
145+
/**
146+
* Get an event of `name`.
147+
*
148+
* Given something like this:
149+
*
150+
* [
151+
* { key: 'a', value: { type: 'user', name: 'register' } }
152+
* { key: 'a', value: { type: 'user', name: 'invite' } }
153+
* { key: 'b', value: { type: 'purchase', name: 'main' } }
154+
* ]
155+
*
156+
* If you do `get(events, 'a')`, it wll give you:
157+
*
158+
* [
159+
* { type: 'user', name: 'register' },
160+
* { type: 'user', name: 'invite' }
161+
* ]
162+
*
163+
* @param {Array} events
164+
* @param {String} name
165+
* @return {Object}
166+
*/
167+
168+
function get(events, name) {
169+
var a = normalize(name);
170+
var ret = [];
171+
172+
for (var i = 0; i < events.length; ++i) {
173+
var b = normalize(events[i].key || events[i].event);
174+
if (b === a) ret.push(events[i].value || events[i]);
175+
}
176+
177+
return ret;
178+
}
179+
180+
/**
181+
* Get email from user.
182+
*
183+
* @param {Object} user
184+
* @return {String}
185+
*/
186+
187+
function email(user) {
188+
var identify = new Identify({ userId: user.id(), traits: user.traits() });
189+
return identify.email();
190+
}
191+
192+
/**
193+
* Render Nanigans event name from template.
194+
*
195+
* @param {Object} user
196+
* @return {String}
197+
*/
198+
199+
function renderByProxy(template, facade) {
200+
return template.replace(/\{\{\ *(\w+?[\.\w+]*?)\ *\}\}/g, function(_, $1) {
201+
return facade.proxy($1) || '';
202+
});
203+
}

integrations/nanigans/package.json

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
{
2+
"name": "@segment/analytics.js-integration-nanigans",
3+
"description": "The Nanigans analytics.js integration.",
4+
"version": "2.1.1",
5+
"keywords": [
6+
"analytics.js",
7+
"analytics.js-integration",
8+
"segment",
9+
"nanigans"
10+
],
11+
"main": "lib/index.js",
12+
"scripts": {
13+
"test": "make test"
14+
},
15+
"author": "Segment \u003c[email protected]\u003e",
16+
"license": "SEE LICENSE IN LICENSE",
17+
"homepage": "https://github.com/segmentio/analytics.js-integrations/blob/master/integrations/nanigans#readme",
18+
"bugs": {
19+
"url": "https://github.com/segmentio/analytics.js-integrations/issues"
20+
},
21+
"repository": {
22+
"type": "git",
23+
"url": "git+https://github.com/segmentio/analytics.js-integrations.git"
24+
},
25+
"dependencies": {
26+
"@segment/analytics.js-integration": "^2.1.0",
27+
"component-querystring": "^2.0.0",
28+
"js-sha256": "^0.3.0",
29+
"segmentio-facade": "^3.0.3",
30+
"to-no-case": "^1.0.1"
31+
},
32+
"devDependencies": {
33+
"@segment/analytics.js-core": "^3.0.0",
34+
"@segment/analytics.js-integration-tester": "^3.1.0",
35+
"@segment/clear-env": "^2.0.0",
36+
"@segment/eslint-config": "^3.1.1",
37+
"browserify": "^13.0.0",
38+
"browserify-istanbul": "^2.0.0",
39+
"eslint": "^2.9.0",
40+
"eslint-plugin-mocha": "^2.2.0",
41+
"eslint-plugin-require-path-exists": "^1.1.5",
42+
"istanbul": "^0.4.3",
43+
"karma": "1.3.0",
44+
"karma-browserify": "^5.0.4",
45+
"karma-chrome-launcher": "^1.0.1",
46+
"karma-coverage": "^1.0.0",
47+
"karma-junit-reporter": "^1.0.0",
48+
"karma-mocha": "1.0.1",
49+
"karma-phantomjs-launcher": "^1.0.0",
50+
"karma-sauce-launcher": "^1.0.0",
51+
"karma-spec-reporter": "0.0.26",
52+
"mocha": "^2.2.5",
53+
"npm-check": "^5.2.1",
54+
"phantomjs-prebuilt": "^2.1.7",
55+
"watchify": "^3.7.0"
56+
}
57+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"extends": "@segment/eslint-config/mocha"
3+
}

0 commit comments

Comments
 (0)