Skip to content

Commit 484cc8f

Browse files
Merge branch 'main' into trace_drilldown_search_1076
2 parents 58c5efd + 594a8db commit 484cc8f

40 files changed

+3277
-2210
lines changed

package-lock.json

Lines changed: 2535 additions & 2125 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,13 @@
3636
"@angular/platform-browser": "^12.2.1",
3737
"@angular/platform-browser-dynamic": "^12.2.1",
3838
"@angular/router": "^12.2.1",
39-
"@apollo/client": "^3.4.8",
39+
"@apollo/client": "^3.4.13",
4040
"@hypertrace/hyperdash": "^1.2.1",
4141
"@hypertrace/hyperdash-angular": "^2.6.0",
4242
"@types/d3-hierarchy": "^2.0.0",
4343
"@types/d3-transition": "1.1.5",
4444
"apollo-angular": "^2.6.0",
45-
"core-js": "^3.16.1",
45+
"core-js": "^3.18.0",
4646
"d3-array": "^2.12.0",
4747
"d3-axis": "^2.1.0",
4848
"d3-brush": "^1.1.6",
@@ -58,7 +58,7 @@
5858
"d3-shape": "^1.3.5",
5959
"d3-transition": "^1.2.0",
6060
"d3-zoom": "^1.8.3",
61-
"graphql": "^15.5.2",
61+
"graphql": "^15.5.3",
6262
"graphql-tag": "^2.12.5",
6363
"iso8601-duration": "^1.3.0",
6464
"lodash-es": "^4.17.21",
@@ -73,8 +73,8 @@
7373
"@angular/cli": "12.2.1",
7474
"@angular/compiler-cli": "~12.2.1",
7575
"@angular/language-service": "~12.2.1",
76-
"@commitlint/cli": "^12.1.4",
77-
"@commitlint/config-conventional": "^12.1.4",
76+
"@commitlint/cli": "^13.1.0",
77+
"@commitlint/config-conventional": "^13.1.0",
7878
"@compodoc/compodoc": "^1.1.14",
7979
"@ngneat/spectator": "^8.0.4",
8080
"@types/d3-array": "^2.9.0",
@@ -90,24 +90,24 @@
9090
"@types/d3-zoom": "^1.7.5",
9191
"@types/jest": "^26.0.24",
9292
"@types/lodash-es": "^4.17.4",
93-
"@types/node": "^16.7.7",
93+
"@types/node": "^16.7.10",
9494
"@types/uuid": "^8.3.1",
9595
"@types/webpack-env": "^1.16.2",
9696
"codelyzer": "^6.0.2",
9797
"commitizen": "^4.2.4",
9898
"cz-conventional-changelog": "^3.3.0",
9999
"husky": "^7.0.0",
100100
"jest": "^26.6.3",
101-
"jest-config": "^27.0.4",
101+
"jest-config": "^27.2.0",
102102
"jest-html-reporter": "^3.4.1",
103103
"jest-junit": "^12.2.0",
104104
"jest-preset-angular": "^8.4.0",
105105
"lodash": "^4.17.21",
106106
"ng-mocks": "^12.4.0",
107-
"ng-packagr": "^12.2.0",
107+
"ng-packagr": "^12.2.1",
108108
"prettier": "^2.2.1",
109109
"pretty-quick": "^3.1.1",
110-
"ts-node": "~10.0.0",
110+
"ts-node": "~10.2.1",
111111
"tslint": "~6.1.3",
112112
"tslint-config-prettier": "^1.18.0",
113113
"typescript": "~4.3.5",
Lines changed: 3 additions & 0 deletions
Loading

projects/assets-library/assets/styles/_font.scss

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ $font-family: 'Work Sans', sans-serif;
2121
letter-spacing: -0.02em;
2222
}
2323

24+
@mixin font-section-heading($color: $gray-7) {
25+
@extend %semibold;
26+
color: $color;
27+
font-size: 32px;
28+
line-height: 40px;
29+
}
30+
2431
@mixin font-heading($color: $gray-7) {
2532
color: $color;
2633
font-weight: 500;

projects/assets-library/assets/styles/_layout.scss

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ $paginator-height: 48px;
4646
border: 1px solid $color-border;
4747
}
4848

49+
@mixin frame-box-shadow {
50+
border-radius: 10px;
51+
box-shadow: 0 1px 3px rgba(63, 71, 74, 0.16), 0 2px 2px rgba(63, 71, 74, 0.12), 0 0 2px rgba(63, 71, 74, 0.16);
52+
}
53+
4954
@mixin vertical-divider($height: 16px) {
5055
height: $height;
5156
margin: 0 2px;

projects/assets-library/src/icons/icon-library.module.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ const iconsRootPath = 'assets/icons';
7878
{ key: IconType.Search, url: `${iconsRootPath}/search.svg` },
7979
{ key: IconType.SidebarCollapse, url: `${iconsRootPath}/sidebar-collapse.svg` },
8080
{ key: IconType.SidebarExpand, url: `${iconsRootPath}/sidebar-expand.svg` },
81+
{ key: IconType.SidebarLeft, url: `${iconsRootPath}/sidebar-left.svg` },
8182
{ key: IconType.Sort, url: `${iconsRootPath}/sort.svg` },
8283
{ key: IconType.Slack, url: `${iconsRootPath}/slack.svg` },
8384
{ key: IconType.Spinner, url: `${iconsRootPath}/spinner.svg` },

projects/assets-library/src/icons/icon-type.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ export const enum IconType {
9999
Share = 'share',
100100
SidebarCollapse = 'svg:sidebar-collapse',
101101
SidebarExpand = 'svg:sidebar-expand',
102+
SidebarLeft = 'svg:sidebar-left',
102103
Slack = 'svg:slack',
103104
Sort = 'svg:sort',
104105
SpanId = 'bookmark_border',
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { ProviderToken } from '@angular/core';
2+
import { Dictionary } from './../utilities/types/types';
3+
4+
export interface UserTelemetryRegistrationConfig<TInitConfig> {
5+
telemetryProvider: ProviderToken<UserTelemetryProvider<TInitConfig>>;
6+
initConfig: TInitConfig;
7+
enablePageTracking: boolean;
8+
enableEventTracking: boolean;
9+
enableErrorTracking: boolean;
10+
}
11+
12+
export interface UserTelemetryProvider<TInitConfig = unknown> {
13+
initialize(config: TInitConfig): void;
14+
identify(userTraits: UserTraits): void;
15+
trackEvent?(name: string, eventData: Dictionary<unknown>): void;
16+
trackPage?(url: string, eventData: Dictionary<unknown>): void;
17+
trackError?(error: string, eventData: Dictionary<unknown>): void;
18+
shutdown?(): void;
19+
}
20+
21+
export interface TelemetryProviderConfig {
22+
orgId: string;
23+
}
24+
25+
export interface UserTraits extends Dictionary<unknown> {
26+
email?: string;
27+
companyName?: string;
28+
name?: string;
29+
displayName?: string;
30+
}
Lines changed: 221 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,221 @@
1+
import { InjectionToken } from '@angular/core';
2+
import { Router } from '@angular/router';
3+
import { createServiceFactory, mockProvider } from '@ngneat/spectator/jest';
4+
import { of } from 'rxjs';
5+
import { TelemetryProviderConfig, UserTelemetryProvider, UserTelemetryRegistrationConfig } from './telemetry';
6+
import { UserTelemetryHelperService } from './user-telemetry-helper.service';
7+
8+
describe('User Telemetry helper service', () => {
9+
const injectionToken = new InjectionToken('test-token');
10+
let telemetryProvider: UserTelemetryProvider;
11+
let registrationConfig: UserTelemetryRegistrationConfig<TelemetryProviderConfig>;
12+
13+
const createService = createServiceFactory({
14+
service: UserTelemetryHelperService,
15+
providers: [
16+
mockProvider(Router, {
17+
events: of({})
18+
})
19+
]
20+
});
21+
22+
test('should delegate to telemetry provider after registration', () => {
23+
registrationConfig = {
24+
telemetryProvider: injectionToken,
25+
initConfig: { orgId: 'test-id' },
26+
enablePageTracking: true,
27+
enableEventTracking: true,
28+
enableErrorTracking: true
29+
};
30+
31+
telemetryProvider = {
32+
initialize: jest.fn(),
33+
identify: jest.fn(),
34+
trackEvent: jest.fn(),
35+
trackPage: jest.fn(),
36+
trackError: jest.fn(),
37+
shutdown: jest.fn()
38+
};
39+
40+
const spectator = createService({
41+
providers: [
42+
{
43+
provide: injectionToken,
44+
useValue: telemetryProvider
45+
}
46+
]
47+
});
48+
49+
spectator.service.register(registrationConfig);
50+
51+
// Initialize
52+
spectator.service.initialize();
53+
expect(telemetryProvider.initialize).toHaveBeenCalledWith({ orgId: 'test-id' });
54+
55+
// Identify
56+
spectator.service.identify({ email: 'test@email.com' });
57+
expect(telemetryProvider.identify).toHaveBeenCalledWith({ email: 'test@email.com' });
58+
59+
// TrackEvent
60+
spectator.service.trackEvent('eventA', { target: 'unknown' });
61+
expect(telemetryProvider.trackEvent).toHaveBeenCalledWith('eventA', { target: 'unknown' });
62+
63+
// TrackPage
64+
spectator.service.trackPageEvent('/abs', { target: 'unknown' });
65+
expect(telemetryProvider.trackPage).toHaveBeenCalledWith('/abs', { target: 'unknown' });
66+
67+
// TrackError
68+
spectator.service.trackErrorEvent('console error', { target: 'unknown' });
69+
expect(telemetryProvider.trackError).toHaveBeenCalledWith('Error: console error', { target: 'unknown' });
70+
});
71+
72+
test('should not capture events if event tracking is disabled', () => {
73+
registrationConfig = {
74+
telemetryProvider: injectionToken,
75+
initConfig: { orgId: 'test-id' },
76+
enablePageTracking: true,
77+
enableEventTracking: false,
78+
enableErrorTracking: true
79+
};
80+
81+
telemetryProvider = {
82+
initialize: jest.fn(),
83+
identify: jest.fn(),
84+
trackEvent: jest.fn(),
85+
trackPage: jest.fn(),
86+
trackError: jest.fn(),
87+
shutdown: jest.fn()
88+
};
89+
90+
const spectator = createService({
91+
providers: [
92+
{
93+
provide: injectionToken,
94+
useValue: telemetryProvider
95+
}
96+
]
97+
});
98+
99+
spectator.service.register(registrationConfig);
100+
101+
// Initialize
102+
spectator.service.initialize();
103+
expect(telemetryProvider.initialize).toHaveBeenCalledWith({ orgId: 'test-id' });
104+
105+
// Identify
106+
spectator.service.identify({ email: 'test@email.com' });
107+
expect(telemetryProvider.identify).toHaveBeenCalledWith({ email: 'test@email.com' });
108+
109+
// TrackEvent
110+
spectator.service.trackEvent('eventA', { target: 'unknown' });
111+
expect(telemetryProvider.trackEvent).not.toHaveBeenCalled();
112+
113+
// TrackPage
114+
spectator.service.trackPageEvent('/abs', { target: 'unknown' });
115+
expect(telemetryProvider.trackPage).toHaveBeenCalledWith('/abs', { target: 'unknown' });
116+
117+
// TrackError
118+
spectator.service.trackErrorEvent('console error', { target: 'unknown' });
119+
expect(telemetryProvider.trackError).toHaveBeenCalledWith('Error: console error', { target: 'unknown' });
120+
});
121+
122+
test('should not capture page events if page event tracking is disabled', () => {
123+
registrationConfig = {
124+
telemetryProvider: injectionToken,
125+
initConfig: { orgId: 'test-id' },
126+
enablePageTracking: false,
127+
enableEventTracking: true,
128+
enableErrorTracking: true
129+
};
130+
131+
telemetryProvider = {
132+
initialize: jest.fn(),
133+
identify: jest.fn(),
134+
trackEvent: jest.fn(),
135+
trackPage: jest.fn(),
136+
trackError: jest.fn(),
137+
shutdown: jest.fn()
138+
};
139+
140+
const spectator = createService({
141+
providers: [
142+
{
143+
provide: injectionToken,
144+
useValue: telemetryProvider
145+
}
146+
]
147+
});
148+
149+
spectator.service.register(registrationConfig);
150+
151+
// Initialize
152+
spectator.service.initialize();
153+
expect(telemetryProvider.initialize).toHaveBeenCalledWith({ orgId: 'test-id' });
154+
155+
// Identify
156+
spectator.service.identify({ email: 'test@email.com' });
157+
expect(telemetryProvider.identify).toHaveBeenCalledWith({ email: 'test@email.com' });
158+
159+
// TrackEvent
160+
spectator.service.trackEvent('eventA', { target: 'unknown' });
161+
expect(telemetryProvider.trackEvent).toHaveBeenCalledWith('eventA', { target: 'unknown' });
162+
163+
// TrackPage
164+
spectator.service.trackPageEvent('/abs', { target: 'unknown' });
165+
expect(telemetryProvider.trackPage).not.toHaveBeenCalled();
166+
167+
// TrackError
168+
spectator.service.trackErrorEvent('console error', { target: 'unknown' });
169+
expect(telemetryProvider.trackError).toHaveBeenCalledWith('Error: console error', { target: 'unknown' });
170+
});
171+
172+
test('should not capture error events if eror event tracking is disabled', () => {
173+
registrationConfig = {
174+
telemetryProvider: injectionToken,
175+
initConfig: { orgId: 'test-id' },
176+
enablePageTracking: true,
177+
enableEventTracking: true,
178+
enableErrorTracking: false
179+
};
180+
181+
telemetryProvider = {
182+
initialize: jest.fn(),
183+
identify: jest.fn(),
184+
trackEvent: jest.fn(),
185+
trackPage: jest.fn(),
186+
trackError: jest.fn(),
187+
shutdown: jest.fn()
188+
};
189+
190+
const spectator = createService({
191+
providers: [
192+
{
193+
provide: injectionToken,
194+
useValue: telemetryProvider
195+
}
196+
]
197+
});
198+
199+
spectator.service.register(registrationConfig);
200+
201+
// Initialize
202+
spectator.service.initialize();
203+
expect(telemetryProvider.initialize).toHaveBeenCalledWith({ orgId: 'test-id' });
204+
205+
// Identify
206+
spectator.service.identify({ email: 'test@email.com' });
207+
expect(telemetryProvider.identify).toHaveBeenCalledWith({ email: 'test@email.com' });
208+
209+
// TrackEvent
210+
spectator.service.trackEvent('eventA', { target: 'unknown' });
211+
expect(telemetryProvider.trackEvent).toHaveBeenCalledWith('eventA', { target: 'unknown' });
212+
213+
// TrackPage
214+
spectator.service.trackPageEvent('/abs', { target: 'unknown' });
215+
expect(telemetryProvider.trackPage).toHaveBeenCalledWith('/abs', { target: 'unknown' });
216+
217+
// TrackError
218+
spectator.service.trackPageEvent('console error', { target: 'unknown' });
219+
expect(telemetryProvider.trackError).not.toHaveBeenCalled();
220+
});
221+
});

0 commit comments

Comments
 (0)