Skip to content

Commit 5056215

Browse files
committed
feat: pass globalData to segment factories
1 parent 6e1701a commit 5056215

File tree

2 files changed

+207
-22
lines changed

2 files changed

+207
-22
lines changed

src/index.js

+25-18
Original file line numberDiff line numberDiff line change
@@ -6,42 +6,47 @@ function firstCharToLower(string) {
66
}
77

88
// Create the track() function
9-
function trackFactory(key) {
9+
export function trackFactory(key, globalData) {
1010
return async (...data) => {
1111
const { track } = await loadScript(key);
12-
return track(...data);
12+
const compoundedData = Object.assign({}, globalData, ...data);
13+
return track(compoundedData);
1314
};
1415
}
1516

1617
// Create the identify() function
17-
function identifyFactory(key) {
18+
export function identifyFactory(key, globalData) {
1819
return async (...data) => {
1920
const { identify } = await loadScript(key);
20-
return identify(...data);
21+
const compoundedData = Object.assign({}, globalData, ...data);
22+
return identify(compoundedData);
2123
};
2224
}
2325

2426
// Create the page() functino
25-
function pageFactory(key) {
27+
export function pageFactory(key, globalData) {
2628
return async (...data) => {
2729
const { page } = await loadScript(key);
28-
return page(...data);
30+
const compoundedData = Object.assign({}, globalData, ...data);
31+
return page(compoundedData);
2932
};
3033
}
3134

3235
// create the group() functino
33-
function groupFactory(key) {
36+
export function groupFactory(key, globalData) {
3437
return async (...data) => {
3538
const { group } = await loadScript(key);
36-
return group(...data);
39+
const compoundedData = Object.assign({}, globalData, ...data);
40+
return group(compoundedData);
3741
};
3842
}
3943

4044
// create the alias() function
41-
function aliasFactory(key) {
45+
export function aliasFactory(key, globalData) {
4246
return async (...data) => {
4347
const { alias } = await loadScript(key);
44-
return alias(...data);
48+
const compoundedData = Object.assign({}, globalData, ...data);
49+
return alias(compoundedData);
4550
};
4651
}
4752

@@ -63,7 +68,7 @@ async function eventHandle(track, key, e) {
6368
const payloadData = Object.keys(data).reduce((result, propName) => {
6469
if (propName.startsWith('analytics')) {
6570
const strippedPropName = firstCharToLower(
66-
propName.replace('analytics', ''),
71+
propName.replace('analytics', '')
6772
);
6873
result[strippedPropName] = data[propName]; // eslint-disable-line no-param-reassign
6974
}
@@ -82,15 +87,15 @@ const defaultConfig = {
8287
};
8388

8489
// Export out init() function that kicks everything off
85-
export default function init(key, config = defaultConfig) {
90+
export default function init(key, config = defaultConfig, getGlobalData) {
8691
if (!key) {
8792
throw new Error('A segment key must be passed to init');
8893
}
8994

9095
if (typeof window === 'undefined') {
9196
const errorFunction = message => () => {
9297
throw new Error(
93-
`analytics function '${message}' called in non browser environment`,
98+
`analytics function '${message}' called in non browser environment`
9499
);
95100
};
96101
return {
@@ -102,7 +107,9 @@ export default function init(key, config = defaultConfig) {
102107
};
103108
}
104109

105-
const track = trackFactory(key);
110+
const globalData = getGlobalData ? getGlobalData() : {};
111+
112+
const track = trackFactory(key, globalData);
106113

107114
// Listen to all click events in a page and track if enabled
108115
if (config.trackClicks) {
@@ -111,9 +118,9 @@ export default function init(key, config = defaultConfig) {
111118

112119
return {
113120
track,
114-
identify: identifyFactory(key),
115-
page: pageFactory(key),
116-
group: groupFactory(key),
117-
alias: aliasFactory(key),
121+
identify: identifyFactory(key, globalData),
122+
page: pageFactory(key, globalData),
123+
group: groupFactory(key, globalData),
124+
alias: aliasFactory(key, globalData),
118125
};
119126
}

src/index.test.js

+182-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,21 @@
1-
jest.mock('./load-script', () => ({
2-
loadScript: () => Promise.resolve(jest.fn()),
3-
}));
1+
jest.mock('./load-script', () => () =>
2+
Promise.resolve({
3+
track: param => param,
4+
identify: param => param,
5+
page: param => param,
6+
group: param => param,
7+
alias: param => param,
8+
})
9+
);
410

5-
import init from './'; // eslint-disable-line import/first
11+
// eslint-disable-next-line import/first
12+
import init, {
13+
trackFactory,
14+
identifyFactory,
15+
pageFactory,
16+
groupFactory,
17+
aliasFactory,
18+
} from './';
619

720
const KEY = 'test';
821

@@ -64,3 +77,168 @@ describe('init', () => {
6477
expect(spy).not.toHaveBeenCalled();
6578
});
6679
});
80+
81+
describe('trackFactory', () => {
82+
it('should call track with globalData and any extra data', async () => {
83+
const tracked = await trackFactory('myKey', {
84+
globalData: 'global-data',
85+
})({ extraData: 'extra-data' });
86+
87+
expect(tracked).toEqual({
88+
globalData: 'global-data',
89+
extraData: 'extra-data',
90+
});
91+
});
92+
93+
it('should call track with just globalData if no extra data', async () => {
94+
const tracked = await trackFactory('myKey', {
95+
globalData: 'global-data',
96+
})({});
97+
98+
expect(tracked).toEqual({
99+
globalData: 'global-data',
100+
});
101+
});
102+
103+
it('should call track with just extra data if no globalData', async () => {
104+
const tracked = await trackFactory('myKey', {})({
105+
extraData: 'extra-data',
106+
});
107+
108+
expect(tracked).toEqual({
109+
extraData: 'extra-data',
110+
});
111+
});
112+
});
113+
114+
describe('identifyFactory', () => {
115+
it('should call identify with globalData and any extra data', async () => {
116+
const identified = await identifyFactory('myKey', {
117+
globalData: 'global-data',
118+
})({ extraData: 'extra-data' });
119+
120+
expect(identified).toEqual({
121+
globalData: 'global-data',
122+
extraData: 'extra-data',
123+
});
124+
});
125+
126+
it('should call identify with just globalData if no extra data', async () => {
127+
const identified = await identifyFactory('myKey', {
128+
globalData: 'global-data',
129+
})({});
130+
131+
expect(identified).toEqual({
132+
globalData: 'global-data',
133+
});
134+
});
135+
136+
it('should call identify with just extra data if no globalData', async () => {
137+
const identified = await identifyFactory('myKey', {})({
138+
extraData: 'extra-data',
139+
});
140+
141+
expect(identified).toEqual({
142+
extraData: 'extra-data',
143+
});
144+
});
145+
});
146+
147+
describe('pageFactory', () => {
148+
it('should call page with globalData and any extra data', async () => {
149+
const paged = await pageFactory('myKey', {
150+
globalData: 'global-data',
151+
})({ extraData: 'extra-data' });
152+
153+
expect(paged).toEqual({
154+
globalData: 'global-data',
155+
extraData: 'extra-data',
156+
});
157+
});
158+
159+
it('should call page with just globalData if no extra data', async () => {
160+
const paged = await pageFactory('myKey', {
161+
globalData: 'global-data',
162+
})({});
163+
164+
expect(paged).toEqual({
165+
globalData: 'global-data',
166+
});
167+
});
168+
169+
it('should call page with just extra data if no globalData', async () => {
170+
const paged = await pageFactory('myKey', {})({
171+
extraData: 'extra-data',
172+
});
173+
174+
expect(paged).toEqual({
175+
extraData: 'extra-data',
176+
});
177+
});
178+
});
179+
180+
describe('groupFactory', () => {
181+
it('should call group with globalData and any extra data', async () => {
182+
const grouped = await groupFactory('myKey', {
183+
globalData: 'global-data',
184+
})({ extraData: 'extra-data' });
185+
186+
expect(grouped).toEqual({
187+
globalData: 'global-data',
188+
extraData: 'extra-data',
189+
});
190+
});
191+
192+
it('should call group with just globalData if no extra data', async () => {
193+
const grouped = await groupFactory('myKey', {
194+
globalData: 'global-data',
195+
})({});
196+
197+
expect(grouped).toEqual({
198+
globalData: 'global-data',
199+
});
200+
});
201+
202+
it('should call group with just extra data if no globalData', async () => {
203+
const grouped = await groupFactory('myKey', {})({
204+
extraData: 'extra-data',
205+
});
206+
207+
expect(grouped).toEqual({
208+
extraData: 'extra-data',
209+
});
210+
});
211+
});
212+
213+
describe('aliasFactory', () => {
214+
it('should call alias with globalData and any extra data', async () => {
215+
const aliased = await aliasFactory('myKey', {
216+
globalData: 'global-data',
217+
})({ extraData: 'extra-data' });
218+
219+
expect(aliased).toEqual({
220+
globalData: 'global-data',
221+
extraData: 'extra-data',
222+
});
223+
});
224+
225+
it('should call alias with just globalData if no extra data', async () => {
226+
const aliased = await aliasFactory('myKey', {
227+
globalData: 'global-data',
228+
})({});
229+
230+
expect(aliased).toEqual({
231+
globalData: 'global-data',
232+
});
233+
});
234+
235+
it('should call alias with just extra data if no globalData', async () => {
236+
const aliased = await aliasFactory('myKey', {})({
237+
extraData: 'extra-data',
238+
});
239+
240+
expect(aliased).toEqual({
241+
extraData: 'extra-data',
242+
});
243+
});
244+
});

0 commit comments

Comments
 (0)