@dereekb/dbx-analytics 12.6.21 → 13.0.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.
Files changed (35) hide show
  1. package/fesm2022/dereekb-dbx-analytics.mjs +53 -63
  2. package/fesm2022/dereekb-dbx-analytics.mjs.map +1 -1
  3. package/package.json +9 -11
  4. package/types/dereekb-dbx-analytics.d.ts +257 -0
  5. package/esm2022/dereekb-dbx-analytics.mjs +0 -5
  6. package/esm2022/index.mjs +0 -2
  7. package/esm2022/lib/action/analytics.action.directive.mjs +0 -56
  8. package/esm2022/lib/action/analytics.module.mjs +0 -19
  9. package/esm2022/lib/action/index.mjs +0 -3
  10. package/esm2022/lib/analytics/analytics.mjs +0 -2
  11. package/esm2022/lib/analytics/analytics.providers.mjs +0 -23
  12. package/esm2022/lib/analytics/analytics.service.mjs +0 -205
  13. package/esm2022/lib/analytics/analytics.stream.mjs +0 -22
  14. package/esm2022/lib/analytics/index.mjs +0 -5
  15. package/esm2022/lib/index.mjs +0 -4
  16. package/esm2022/lib/providers/index.mjs +0 -2
  17. package/esm2022/lib/providers/segment/index.mjs +0 -4
  18. package/esm2022/lib/providers/segment/segment.listener.service.mjs +0 -99
  19. package/esm2022/lib/providers/segment/segment.providers.mjs +0 -29
  20. package/esm2022/lib/providers/segment/segment.service.mjs +0 -64
  21. package/index.d.ts +0 -1
  22. package/lib/action/analytics.action.directive.d.ts +0 -28
  23. package/lib/action/analytics.module.d.ts +0 -10
  24. package/lib/action/index.d.ts +0 -2
  25. package/lib/analytics/analytics.d.ts +0 -25
  26. package/lib/analytics/analytics.providers.d.ts +0 -16
  27. package/lib/analytics/analytics.service.d.ts +0 -100
  28. package/lib/analytics/analytics.stream.d.ts +0 -26
  29. package/lib/analytics/index.d.ts +0 -4
  30. package/lib/index.d.ts +0 -3
  31. package/lib/providers/index.d.ts +0 -1
  32. package/lib/providers/segment/index.d.ts +0 -3
  33. package/lib/providers/segment/segment.listener.service.d.ts +0 -16
  34. package/lib/providers/segment/segment.providers.d.ts +0 -17
  35. package/lib/providers/segment/segment.service.d.ts +0 -27
@@ -0,0 +1,257 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Injector, EnvironmentProviders, InjectionToken } from '@angular/core';
3
+ import * as rxjs from 'rxjs';
4
+ import { Observable, BehaviorSubject, Subscription } from 'rxjs';
5
+ import { DbxActionContextStoreSourceInstance } from '@dereekb/dbx-core';
6
+ import { PrimativeKey, Maybe, Destroyable, ReadableError } from '@dereekb/util';
7
+ import { AbstractAsyncWindowLoadedService } from '@dereekb/browser';
8
+
9
+ type DbxAnalyticsEventName = string;
10
+ type DbxAnalyticsUserId = string;
11
+ interface DbxAnalyticsUserProperties {
12
+ readonly [key: string]: PrimativeKey | boolean;
13
+ }
14
+ interface DbxAnalyticsUser {
15
+ readonly user: DbxAnalyticsUserId;
16
+ readonly properties?: DbxAnalyticsUserProperties;
17
+ }
18
+ interface DbxAnalyticsEventData {
19
+ readonly [key: string]: PrimativeKey | boolean;
20
+ }
21
+ interface DbxAnalyticsEvent {
22
+ readonly name?: DbxAnalyticsEventName;
23
+ readonly value?: number;
24
+ readonly data?: DbxAnalyticsEventData;
25
+ }
26
+ interface DbxUserAnalyticsEvent extends DbxAnalyticsEvent {
27
+ readonly user?: Maybe<DbxAnalyticsUser>;
28
+ }
29
+ type NewUserRegistrationMethod = 'facebook' | 'google' | 'email' | string;
30
+ interface NewUserAnalyticsEventData extends DbxAnalyticsEventData {
31
+ method: NewUserRegistrationMethod;
32
+ }
33
+
34
+ declare enum DbxAnalyticsStreamEventType {
35
+ PageView = 0,
36
+ /**
37
+ * Emitted any time the user value changes.
38
+ *
39
+ * Can emit when the user goes from defined to undefined.
40
+ */
41
+ UserChange = 1,
42
+ /**
43
+ * Emitted any time the user id changes.
44
+ */
45
+ UserIdChange = 2,
46
+ NewUserEvent = 3,
47
+ UserLoginEvent = 4,
48
+ UserLogoutEvent = 5,
49
+ UserPropertiesEvent = 6,
50
+ Event = 7
51
+ }
52
+ interface DbxAnalyticsStreamEvent {
53
+ readonly type: DbxAnalyticsStreamEventType;
54
+ readonly user?: Maybe<DbxAnalyticsUser>;
55
+ readonly event?: DbxUserAnalyticsEvent;
56
+ readonly userId?: DbxAnalyticsUserId;
57
+ }
58
+
59
+ declare abstract class DbxAnalyticsEventEmitterService {
60
+ abstract sendNewUserEvent(user: DbxAnalyticsUser, data: NewUserAnalyticsEventData): void;
61
+ abstract sendUserLoginEvent(user: DbxAnalyticsUser, data?: DbxAnalyticsEventData): void;
62
+ abstract sendUserLogoutEvent(data?: DbxAnalyticsEventData): void;
63
+ abstract sendUserPropertiesEvent(user: DbxAnalyticsUser, data?: DbxAnalyticsEventData): void;
64
+ abstract sendEventData(name: DbxAnalyticsEventName, data?: DbxAnalyticsEventData): void;
65
+ abstract sendEvent(event: DbxAnalyticsEvent): void;
66
+ abstract sendPageView(page?: string): void;
67
+ }
68
+ declare abstract class DbxAnalyticsEventStreamService {
69
+ abstract readonly events$: Observable<DbxAnalyticsStreamEvent>;
70
+ }
71
+ declare abstract class DbxAnalyticsUserSource {
72
+ abstract readonly analyticsUser$: Observable<Maybe<DbxAnalyticsUser>>;
73
+ }
74
+ declare abstract class DbxAnalyticsServiceListener {
75
+ abstract listenToService(service: DbxAnalyticsService): void;
76
+ }
77
+ /**
78
+ * Abstract AnalyticsServiceListener implementation.
79
+ */
80
+ declare abstract class AbstractDbxAnalyticsServiceListener implements DbxAnalyticsServiceListener, Destroyable {
81
+ private _sub;
82
+ protected _analytics: BehaviorSubject<Maybe<DbxAnalyticsService>>;
83
+ readonly analytics$: Observable<DbxAnalyticsService>;
84
+ readonly analyticsEvents$: Observable<DbxAnalyticsStreamEvent>;
85
+ listenToService(service: DbxAnalyticsService): void;
86
+ protected abstract _initializeServiceSubscription(): Subscription | false;
87
+ destroy(): void;
88
+ }
89
+ declare abstract class DbxAnalyticsServiceConfiguration {
90
+ readonly listeners: DbxAnalyticsServiceListener[];
91
+ readonly isProduction?: boolean;
92
+ readonly logEvents?: boolean;
93
+ readonly userSource?: DbxAnalyticsUserSource;
94
+ }
95
+ interface DbxAnalyticsStreamEventAnalyticsEventWrapper extends DbxAnalyticsStreamEvent {
96
+ readonly event: DbxUserAnalyticsEvent;
97
+ readonly type: DbxAnalyticsStreamEventType;
98
+ readonly user: Maybe<DbxAnalyticsUser>;
99
+ readonly userId: string | undefined;
100
+ }
101
+ declare function dbxAnalyticsStreamEventAnalyticsEventWrapper(event: DbxUserAnalyticsEvent, type?: DbxAnalyticsStreamEventType): {
102
+ event: DbxUserAnalyticsEvent;
103
+ type: DbxAnalyticsStreamEventType;
104
+ user: Maybe<DbxAnalyticsUser>;
105
+ userId: string | undefined;
106
+ };
107
+ /**
108
+ * Primary analytics service that emits analytics events that components can listen to.
109
+ */
110
+ declare class DbxAnalyticsService implements DbxAnalyticsEventStreamService, DbxAnalyticsEventEmitterService, Destroyable {
111
+ private readonly _config;
112
+ static readonly USER_REGISTRATION_EVENT_NAME = "User Registered";
113
+ static readonly USER_LOGIN_EVENT_NAME = "User Login";
114
+ static readonly USER_LOGOUT_EVENT_NAME = "User Logout";
115
+ static readonly USER_PROPERTIES_EVENT_NAME = "User Properties";
116
+ private _subject;
117
+ readonly events$: Observable<DbxAnalyticsStreamEvent>;
118
+ private _userSource;
119
+ readonly user$: Observable<Maybe<DbxAnalyticsUser>>;
120
+ private _userSourceSub;
121
+ private _userIdEventSub;
122
+ private _loggerSub;
123
+ constructor();
124
+ /**
125
+ * Sets the user directly, overridding the UserSource.
126
+ */
127
+ setUser(user: Maybe<DbxAnalyticsUser>): void;
128
+ setUserSource(source: DbxAnalyticsUserSource): void;
129
+ /**
130
+ * Sends an event.
131
+ */
132
+ sendNewUserEvent(user: DbxAnalyticsUser, data: NewUserAnalyticsEventData): void;
133
+ sendUserLoginEvent(user: DbxAnalyticsUser, data?: DbxAnalyticsEventData): void;
134
+ sendUserLogoutEvent(data?: DbxAnalyticsEventData, clearUser?: boolean): void;
135
+ sendUserPropertiesEvent(user: DbxAnalyticsUser, data?: DbxAnalyticsEventData): void;
136
+ sendEventData(name: DbxAnalyticsEventName, data?: DbxAnalyticsEventData): void;
137
+ sendEventType(eventType: DbxAnalyticsEventName): void;
138
+ sendEvent(event: DbxAnalyticsEvent): void;
139
+ sendPageView(page?: string): void;
140
+ /**
141
+ * Sends the next event.
142
+ *
143
+ * @param event
144
+ * @param type
145
+ * @param userOverride Uses this user if set as null or an override value. If undefined the current analytics user is used.
146
+ */
147
+ protected sendNextEvent(event: DbxAnalyticsEvent | undefined, type: DbxAnalyticsStreamEventType, userOverride?: Maybe<DbxAnalyticsUser>): void;
148
+ protected nextEvent(event: DbxUserAnalyticsEvent, type: DbxAnalyticsStreamEventType): void;
149
+ private _init;
150
+ destroy(): void;
151
+ static ɵfac: i0.ɵɵFactoryDeclaration<DbxAnalyticsService, never>;
152
+ static ɵprov: i0.ɵɵInjectableDeclaration<DbxAnalyticsService>;
153
+ }
154
+
155
+ /**
156
+ * DbxActionAnalyticsDirective config
157
+ */
158
+ interface DbxActionAnalyticsConfig<T = unknown, O = unknown> {
159
+ readonly onTriggered?: (service: DbxAnalyticsService) => void;
160
+ readonly onReady?: (service: DbxAnalyticsService, value: T) => void;
161
+ readonly onSuccess?: (service: DbxAnalyticsService, result: Maybe<O>, value: T) => void;
162
+ readonly onError?: (service: DbxAnalyticsService, error: Maybe<ReadableError>) => void;
163
+ }
164
+ /**
165
+ * Used to listen to an ActionContext and send analytical events based on action events.
166
+ */
167
+ declare class DbxActionAnalyticsDirective<T, O> {
168
+ readonly source: DbxActionContextStoreSourceInstance<T, O>;
169
+ readonly analyticsService: DbxAnalyticsService;
170
+ readonly config: i0.InputSignal<Maybe<DbxActionAnalyticsConfig<T, O>>>;
171
+ readonly config$: Observable<DbxActionAnalyticsConfig<T, O>>;
172
+ constructor();
173
+ static ɵfac: i0.ɵɵFactoryDeclaration<DbxActionAnalyticsDirective<any, any>, never>;
174
+ static ɵdir: i0.ɵɵDirectiveDeclaration<DbxActionAnalyticsDirective<any, any>, "[dbxActionAnalytics]", never, { "config": { "alias": "dbxActionAnalytics"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
175
+ }
176
+
177
+ /**
178
+ * @deprecated The exported DbxActionAnalyticsDirective is now a standalone component. Import that instead.
179
+ */
180
+ declare class DbxAnalyticsActionModule {
181
+ static ɵfac: i0.ɵɵFactoryDeclaration<DbxAnalyticsActionModule, never>;
182
+ static ɵmod: i0.ɵɵNgModuleDeclaration<DbxAnalyticsActionModule, never, [typeof DbxActionAnalyticsDirective], [typeof DbxActionAnalyticsDirective]>;
183
+ static ɵinj: i0.ɵɵInjectorDeclaration<DbxAnalyticsActionModule>;
184
+ }
185
+
186
+ type DbxAnalyticsServiceConfigurationFactory = (injector: Injector) => DbxAnalyticsServiceConfiguration;
187
+ /**
188
+ * Configuration for provideDbxAnalyticsService()
189
+ */
190
+ interface ProvideDbxAnalyticsConfig {
191
+ readonly dbxAnalyticsServiceConfigurationFactory: DbxAnalyticsServiceConfigurationFactory;
192
+ }
193
+ /**
194
+ * Creates a EnvironmentProviders that provides a DbxAnalyticsService.
195
+ *
196
+ * @param config Configuration
197
+ * @returns EnvironmentProviders
198
+ */
199
+ declare function provideDbxAnalyticsService(config: ProvideDbxAnalyticsConfig): EnvironmentProviders;
200
+
201
+ /**
202
+ * DbxAnalyticsServiceListener adapter for Segment.
203
+ */
204
+ declare class DbxAnalyticsSegmentServiceListener extends AbstractDbxAnalyticsServiceListener {
205
+ private readonly _segmentApi;
206
+ constructor();
207
+ protected _initializeServiceSubscription(): rxjs.Subscription;
208
+ protected handleStreamEvent(api: SegmentAnalytics.AnalyticsJS, streamEvent: DbxAnalyticsStreamEvent): void;
209
+ protected updateWithNewUserEvent(api: SegmentAnalytics.AnalyticsJS, streamEvent: DbxAnalyticsStreamEvent): void;
210
+ protected updateWithEvent(api: SegmentAnalytics.AnalyticsJS, streamEvent: DbxAnalyticsStreamEvent, name?: string): void;
211
+ private changeUser;
212
+ static ɵfac: i0.ɵɵFactoryDeclaration<DbxAnalyticsSegmentServiceListener, never>;
213
+ static ɵprov: i0.ɵɵInjectableDeclaration<DbxAnalyticsSegmentServiceListener>;
214
+ }
215
+
216
+ declare const PRELOAD_SEGMENT_TOKEN: InjectionToken<string>;
217
+ declare class DbxAnalyticsSegmentApiServiceConfig {
218
+ writeKey: string;
219
+ logging: boolean;
220
+ active: boolean;
221
+ constructor(writeKey: string);
222
+ }
223
+ /**
224
+ * Segment API Service used for waiting/retrieving the segment API from window when initialized.
225
+ *
226
+ * This requires some setup in index.html.
227
+ */
228
+ declare class DbxAnalyticsSegmentApiService extends AbstractAsyncWindowLoadedService<SegmentAnalytics.AnalyticsJS> {
229
+ private readonly _config;
230
+ static readonly SEGMENT_API_WINDOW_KEY = "analytics";
231
+ static readonly SEGMENT_READY_KEY = "SegmentReady";
232
+ constructor();
233
+ get config(): DbxAnalyticsSegmentApiServiceConfig;
234
+ protected _prepareCompleteLoadingService(): Promise<void>;
235
+ protected _initService(service: SegmentAnalytics.AnalyticsJS): Promise<SegmentAnalytics.AnalyticsJS>;
236
+ static ɵfac: i0.ɵɵFactoryDeclaration<DbxAnalyticsSegmentApiService, never>;
237
+ static ɵprov: i0.ɵɵInjectableDeclaration<DbxAnalyticsSegmentApiService>;
238
+ }
239
+
240
+ type DbxAnalyticsSegmentApiServiceConfigFactory = (injector: Injector) => DbxAnalyticsSegmentApiServiceConfig;
241
+ /**
242
+ * Configuration for provideDbxAnalyticsSegmentApiService()
243
+ */
244
+ interface ProvideDbxAnalyticsSegmentModuleConfig {
245
+ readonly preloadSegmentToken?: boolean;
246
+ readonly dbxAnalyticsSegmentApiServiceConfigFactory: DbxAnalyticsSegmentApiServiceConfigFactory;
247
+ }
248
+ /**
249
+ * Creates a EnvironmentProviders that provides a DbxAnalyticsSegmentApiService.
250
+ *
251
+ * @param config Configuration
252
+ * @returns EnvironmentProviders
253
+ */
254
+ declare function provideDbxAnalyticsSegmentApiService(config: ProvideDbxAnalyticsSegmentModuleConfig): EnvironmentProviders;
255
+
256
+ export { AbstractDbxAnalyticsServiceListener, DbxActionAnalyticsDirective, DbxAnalyticsActionModule, DbxAnalyticsEventEmitterService, DbxAnalyticsEventStreamService, DbxAnalyticsSegmentApiService, DbxAnalyticsSegmentApiServiceConfig, DbxAnalyticsSegmentServiceListener, DbxAnalyticsService, DbxAnalyticsServiceConfiguration, DbxAnalyticsServiceListener, DbxAnalyticsStreamEventType, DbxAnalyticsUserSource, PRELOAD_SEGMENT_TOKEN, dbxAnalyticsStreamEventAnalyticsEventWrapper, provideDbxAnalyticsSegmentApiService, provideDbxAnalyticsService };
257
+ export type { DbxActionAnalyticsConfig, DbxAnalyticsEvent, DbxAnalyticsEventData, DbxAnalyticsEventName, DbxAnalyticsSegmentApiServiceConfigFactory, DbxAnalyticsServiceConfigurationFactory, DbxAnalyticsStreamEvent, DbxAnalyticsStreamEventAnalyticsEventWrapper, DbxAnalyticsUser, DbxAnalyticsUserId, DbxAnalyticsUserProperties, DbxUserAnalyticsEvent, NewUserAnalyticsEventData, NewUserRegistrationMethod, ProvideDbxAnalyticsConfig, ProvideDbxAnalyticsSegmentModuleConfig };
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './index';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVyZWVrYi1kYngtYW5hbHl0aWNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWFuYWx5dGljcy9zcmMvZGVyZWVrYi1kYngtYW5hbHl0aWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19
package/esm2022/index.mjs DELETED
@@ -1,2 +0,0 @@
1
- export * from './lib';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtYW5hbHl0aWNzL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLE9BQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliJztcbiJdfQ==
@@ -1,56 +0,0 @@
1
- import { filterMaybe } from '@dereekb/rxjs';
2
- import { switchMap, tap, shareReplay, merge, of } from 'rxjs';
3
- import { Directive, inject, input } from '@angular/core';
4
- import { DbxActionContextStoreSourceInstance, AbstractSubscriptionDirective } from '@dereekb/dbx-core';
5
- import { DbxAnalyticsService } from '../analytics/analytics.service';
6
- import { toObservable } from '@angular/core/rxjs-interop';
7
- import * as i0 from "@angular/core";
8
- /**
9
- * Used to listen to an ActionContext and send analytical events based on action events.
10
- */
11
- export class DbxActionAnalyticsDirective extends AbstractSubscriptionDirective {
12
- source = inject((DbxActionContextStoreSourceInstance), { host: true });
13
- analyticsService = inject(DbxAnalyticsService);
14
- config = input(undefined, { alias: 'dbxActionAnalytics' });
15
- config$ = toObservable(this.config).pipe(filterMaybe(), shareReplay(1));
16
- ngOnInit() {
17
- this.sub = this.config$
18
- .pipe(switchMap(({ onTriggered, onReady, onSuccess, onError }) => {
19
- const triggerObs = [];
20
- if (onTriggered) {
21
- triggerObs.push(this.source.triggered$.pipe(tap(() => onTriggered(this.analyticsService))));
22
- }
23
- if (onReady) {
24
- triggerObs.push(this.source.valueReady$.pipe(tap((value) => onReady(this.analyticsService, value))));
25
- }
26
- if (onSuccess) {
27
- triggerObs.push(this.source.successPair$.pipe(tap(({ result, value }) => onSuccess(this.analyticsService, result, value))));
28
- }
29
- if (onError) {
30
- triggerObs.push(this.source.error$.pipe(filterMaybe(), tap((error) => onError(this.analyticsService, error))));
31
- }
32
- if (triggerObs.length) {
33
- return merge(...triggerObs);
34
- }
35
- else {
36
- return of();
37
- }
38
- }))
39
- .subscribe();
40
- }
41
- ngOnDestroy() {
42
- this.source.lockSet.onNextUnlock(() => {
43
- super.ngOnDestroy();
44
- });
45
- }
46
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxActionAnalyticsDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
47
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.13", type: DbxActionAnalyticsDirective, isStandalone: true, selector: "[dbxActionAnalytics]", inputs: { config: { classPropertyName: "config", publicName: "dbxActionAnalytics", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0 });
48
- }
49
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxActionAnalyticsDirective, decorators: [{
50
- type: Directive,
51
- args: [{
52
- selector: '[dbxActionAnalytics]',
53
- standalone: true
54
- }]
55
- }] });
56
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl0aWNzLmFjdGlvbi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9uL2FuYWx5dGljcy5hY3Rpb24uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUUsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RSxPQUFPLEVBQUUsbUNBQW1DLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBWTFEOztHQUVHO0FBS0gsTUFBTSxPQUFPLDJCQUFrQyxTQUFRLDZCQUE2QjtJQUN6RSxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUEsbUNBQXlDLENBQUEsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzNFLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBRS9DLE1BQU0sR0FBRyxLQUFLLENBQXdDLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxDQUFDLENBQUM7SUFDbEcsT0FBTyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWpGLFFBQVE7UUFDTixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPO2FBQ3BCLElBQUksQ0FDSCxTQUFTLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7WUFDekQsTUFBTSxVQUFVLEdBQTBCLEVBQUUsQ0FBQztZQUU3QyxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNoQixVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlGLENBQUM7WUFFRCxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2RyxDQUFDO1lBRUQsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUgsQ0FBQztZQUVELElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osVUFBVSxDQUFDLElBQUksQ0FDYixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3JCLFdBQVcsRUFBRSxFQUNiLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUN0RCxDQUNGLENBQUM7WUFDSixDQUFDO1lBRUQsSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sS0FBSyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7WUFDOUIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQ0g7YUFDQSxTQUFTLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRVEsV0FBVztRQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFO1lBQ3BDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBaERVLDJCQUEyQjs0RkFBM0IsMkJBQTJCOzs0RkFBM0IsMkJBQTJCO2tCQUp2QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxzQkFBc0I7b0JBQ2hDLFVBQVUsRUFBRSxJQUFJO2lCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZpbHRlck1heWJlIH0gZnJvbSAnQGRlcmVla2Ivcnhqcyc7XG5pbXBvcnQgeyBzd2l0Y2hNYXAsIHRhcCwgc2hhcmVSZXBsYXksIG1lcmdlLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRGlyZWN0aXZlLCBPbkluaXQsIE9uRGVzdHJveSwgaW5qZWN0LCBpbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGJ4QWN0aW9uQ29udGV4dFN0b3JlU291cmNlSW5zdGFuY2UsIEFic3RyYWN0U3Vic2NyaXB0aW9uRGlyZWN0aXZlIH0gZnJvbSAnQGRlcmVla2IvZGJ4LWNvcmUnO1xuaW1wb3J0IHsgRGJ4QW5hbHl0aWNzU2VydmljZSB9IGZyb20gJy4uL2FuYWx5dGljcy9hbmFseXRpY3Muc2VydmljZSc7XG5pbXBvcnQgeyBNYXliZSwgUmVhZGFibGVFcnJvciB9IGZyb20gJ0BkZXJlZWtiL3V0aWwnO1xuaW1wb3J0IHsgdG9PYnNlcnZhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG4vKipcbiAqIERieEFjdGlvbkFuYWx5dGljc0RpcmVjdGl2ZSBjb25maWdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYnhBY3Rpb25BbmFseXRpY3NDb25maWc8VCA9IHVua25vd24sIE8gPSB1bmtub3duPiB7XG4gIG9uVHJpZ2dlcmVkPzogKHNlcnZpY2U6IERieEFuYWx5dGljc1NlcnZpY2UpID0+IHZvaWQ7XG4gIG9uUmVhZHk/OiAoc2VydmljZTogRGJ4QW5hbHl0aWNzU2VydmljZSwgdmFsdWU6IFQpID0+IHZvaWQ7XG4gIG9uU3VjY2Vzcz86IChzZXJ2aWNlOiBEYnhBbmFseXRpY3NTZXJ2aWNlLCByZXN1bHQ6IE1heWJlPE8+LCB2YWx1ZTogVCkgPT4gdm9pZDtcbiAgb25FcnJvcj86IChzZXJ2aWNlOiBEYnhBbmFseXRpY3NTZXJ2aWNlLCBlcnJvcjogTWF5YmU8UmVhZGFibGVFcnJvcj4pID0+IHZvaWQ7XG59XG5cbi8qKlxuICogVXNlZCB0byBsaXN0ZW4gdG8gYW4gQWN0aW9uQ29udGV4dCBhbmQgc2VuZCBhbmFseXRpY2FsIGV2ZW50cyBiYXNlZCBvbiBhY3Rpb24gZXZlbnRzLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbZGJ4QWN0aW9uQW5hbHl0aWNzXScsXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgRGJ4QWN0aW9uQW5hbHl0aWNzRGlyZWN0aXZlPFQsIE8+IGV4dGVuZHMgQWJzdHJhY3RTdWJzY3JpcHRpb25EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHJlYWRvbmx5IHNvdXJjZSA9IGluamVjdChEYnhBY3Rpb25Db250ZXh0U3RvcmVTb3VyY2VJbnN0YW5jZTxULCBPPiwgeyBob3N0OiB0cnVlIH0pO1xuICByZWFkb25seSBhbmFseXRpY3NTZXJ2aWNlID0gaW5qZWN0KERieEFuYWx5dGljc1NlcnZpY2UpO1xuXG4gIHJlYWRvbmx5IGNvbmZpZyA9IGlucHV0PE1heWJlPERieEFjdGlvbkFuYWx5dGljc0NvbmZpZzxULCBPPj4+KHVuZGVmaW5lZCwgeyBhbGlhczogJ2RieEFjdGlvbkFuYWx5dGljcycgfSk7XG4gIHJlYWRvbmx5IGNvbmZpZyQgPSB0b09ic2VydmFibGUodGhpcy5jb25maWcpLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3ViID0gdGhpcy5jb25maWckXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCh7IG9uVHJpZ2dlcmVkLCBvblJlYWR5LCBvblN1Y2Nlc3MsIG9uRXJyb3IgfSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRyaWdnZXJPYnM6IE9ic2VydmFibGU8dW5rbm93bj5bXSA9IFtdO1xuXG4gICAgICAgICAgaWYgKG9uVHJpZ2dlcmVkKSB7XG4gICAgICAgICAgICB0cmlnZ2VyT2JzLnB1c2godGhpcy5zb3VyY2UudHJpZ2dlcmVkJC5waXBlKHRhcCgoKSA9PiBvblRyaWdnZXJlZCh0aGlzLmFuYWx5dGljc1NlcnZpY2UpKSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChvblJlYWR5KSB7XG4gICAgICAgICAgICB0cmlnZ2VyT2JzLnB1c2godGhpcy5zb3VyY2UudmFsdWVSZWFkeSQucGlwZSh0YXAoKHZhbHVlKSA9PiBvblJlYWR5KHRoaXMuYW5hbHl0aWNzU2VydmljZSwgdmFsdWUpKSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChvblN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHRyaWdnZXJPYnMucHVzaCh0aGlzLnNvdXJjZS5zdWNjZXNzUGFpciQucGlwZSh0YXAoKHsgcmVzdWx0LCB2YWx1ZSB9KSA9PiBvblN1Y2Nlc3ModGhpcy5hbmFseXRpY3NTZXJ2aWNlLCByZXN1bHQsIHZhbHVlKSkpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAob25FcnJvcikge1xuICAgICAgICAgICAgdHJpZ2dlck9icy5wdXNoKFxuICAgICAgICAgICAgICB0aGlzLnNvdXJjZS5lcnJvciQucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXJNYXliZSgpLFxuICAgICAgICAgICAgICAgIHRhcCgoZXJyb3IpID0+IG9uRXJyb3IodGhpcy5hbmFseXRpY3NTZXJ2aWNlLCBlcnJvcikpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRyaWdnZXJPYnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2UoLi4udHJpZ2dlck9icyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvZigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc291cmNlLmxvY2tTZXQub25OZXh0VW5sb2NrKCgpID0+IHtcbiAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -1,19 +0,0 @@
1
- import { NgModule } from '@angular/core';
2
- import { DbxActionAnalyticsDirective } from './analytics.action.directive';
3
- import * as i0 from "@angular/core";
4
- /**
5
- * @deprecated The exported DbxActionAnalyticsDirective is now a standalone component. Import that instead.
6
- */
7
- export class DbxAnalyticsActionModule {
8
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxAnalyticsActionModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
9
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: DbxAnalyticsActionModule, imports: [DbxActionAnalyticsDirective], exports: [DbxActionAnalyticsDirective] });
10
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxAnalyticsActionModule });
11
- }
12
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxAnalyticsActionModule, decorators: [{
13
- type: NgModule,
14
- args: [{
15
- imports: [DbxActionAnalyticsDirective],
16
- exports: [DbxActionAnalyticsDirective]
17
- }]
18
- }] });
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl0aWNzLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RieC1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb24vYW5hbHl0aWNzLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDhCQUE4QixDQUFDOztBQUUzRTs7R0FFRztBQUtILE1BQU0sT0FBTyx3QkFBd0I7d0dBQXhCLHdCQUF3Qjt5R0FBeEIsd0JBQXdCLFlBSHpCLDJCQUEyQixhQUMzQiwyQkFBMkI7eUdBRTFCLHdCQUF3Qjs7NEZBQXhCLHdCQUF3QjtrQkFKcEMsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQztvQkFDdEMsT0FBTyxFQUFFLENBQUMsMkJBQTJCLENBQUM7aUJBQ3ZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERieEFjdGlvbkFuYWx5dGljc0RpcmVjdGl2ZSB9IGZyb20gJy4vYW5hbHl0aWNzLmFjdGlvbi5kaXJlY3RpdmUnO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFRoZSBleHBvcnRlZCBEYnhBY3Rpb25BbmFseXRpY3NEaXJlY3RpdmUgaXMgbm93IGEgc3RhbmRhbG9uZSBjb21wb25lbnQuIEltcG9ydCB0aGF0IGluc3RlYWQuXG4gKi9cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtEYnhBY3Rpb25BbmFseXRpY3NEaXJlY3RpdmVdLFxuICBleHBvcnRzOiBbRGJ4QWN0aW9uQW5hbHl0aWNzRGlyZWN0aXZlXVxufSlcbmV4cG9ydCBjbGFzcyBEYnhBbmFseXRpY3NBY3Rpb25Nb2R1bGUge31cbiJdfQ==
@@ -1,3 +0,0 @@
1
- export * from './analytics.action.directive';
2
- export * from './analytics.module';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYyxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYW5hbHl0aWNzLmFjdGlvbi5kaXJlY3RpdmUnO1xuZXhwb3J0ICogZnJvbSAnLi9hbmFseXRpY3MubW9kdWxlJztcbiJdfQ==
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl0aWNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWFuYWx5dGljcy9zcmMvbGliL2FuYWx5dGljcy9hbmFseXRpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgTWF5YmUsIHR5cGUgUHJpbWF0aXZlS2V5IH0gZnJvbSAnQGRlcmVla2IvdXRpbCc7XG5cbmV4cG9ydCB0eXBlIERieEFuYWx5dGljc0V2ZW50TmFtZSA9IHN0cmluZztcbmV4cG9ydCB0eXBlIERieEFuYWx5dGljc1VzZXJJZCA9IHN0cmluZztcblxuZXhwb3J0IGludGVyZmFjZSBEYnhBbmFseXRpY3NVc2VyUHJvcGVydGllcyB7XG4gIHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IFByaW1hdGl2ZUtleSB8IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGJ4QW5hbHl0aWNzVXNlciB7XG4gIHJlYWRvbmx5IHVzZXI6IERieEFuYWx5dGljc1VzZXJJZDtcbiAgcmVhZG9ubHkgcHJvcGVydGllcz86IERieEFuYWx5dGljc1VzZXJQcm9wZXJ0aWVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERieEFuYWx5dGljc0V2ZW50RGF0YSB7XG4gIHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IFByaW1hdGl2ZUtleSB8IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGJ4QW5hbHl0aWNzRXZlbnQge1xuICByZWFkb25seSBuYW1lPzogRGJ4QW5hbHl0aWNzRXZlbnROYW1lO1xuICByZWFkb25seSB2YWx1ZT86IG51bWJlcjtcbiAgcmVhZG9ubHkgZGF0YT86IERieEFuYWx5dGljc0V2ZW50RGF0YTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYnhVc2VyQW5hbHl0aWNzRXZlbnQgZXh0ZW5kcyBEYnhBbmFseXRpY3NFdmVudCB7XG4gIHJlYWRvbmx5IHVzZXI/OiBNYXliZTxEYnhBbmFseXRpY3NVc2VyPjtcbn1cblxuLy8gTUFSSzogTmV3IFVzZXJcbmV4cG9ydCB0eXBlIE5ld1VzZXJSZWdpc3RyYXRpb25NZXRob2QgPSAnZmFjZWJvb2snIHwgJ2dvb2dsZScgfCAnZW1haWwnIHwgc3RyaW5nO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5ld1VzZXJBbmFseXRpY3NFdmVudERhdGEgZXh0ZW5kcyBEYnhBbmFseXRpY3NFdmVudERhdGEge1xuICBtZXRob2Q6IE5ld1VzZXJSZWdpc3RyYXRpb25NZXRob2Q7XG59XG4iXX0=
@@ -1,23 +0,0 @@
1
- import { Injector, makeEnvironmentProviders } from '@angular/core';
2
- import { DbxAnalyticsServiceConfiguration, DbxAnalyticsService } from './analytics.service';
3
- /**
4
- * Creates a EnvironmentProviders that provides a DbxAnalyticsService.
5
- *
6
- * @param config Configuration
7
- * @returns EnvironmentProviders
8
- */
9
- export function provideDbxAnalyticsService(config) {
10
- const { dbxAnalyticsServiceConfigurationFactory } = config;
11
- const providers = [
12
- // configuration
13
- {
14
- provide: DbxAnalyticsServiceConfiguration,
15
- useFactory: dbxAnalyticsServiceConfigurationFactory,
16
- deps: [Injector]
17
- },
18
- // service
19
- DbxAnalyticsService
20
- ];
21
- return makeEnvironmentProviders(providers);
22
- }
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl0aWNzLnByb3ZpZGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RieC1hbmFseXRpY3Mvc3JjL2xpYi9hbmFseXRpY3MvYW5hbHl0aWNzLnByb3ZpZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTZCLFFBQVEsRUFBaUIsd0JBQXdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0csT0FBTyxFQUFFLGdDQUFnQyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFXNUY7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQUMsTUFBaUM7SUFDMUUsTUFBTSxFQUFFLHVDQUF1QyxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBRTNELE1BQU0sU0FBUyxHQUFlO1FBQzVCLGdCQUFnQjtRQUNoQjtZQUNFLE9BQU8sRUFBRSxnQ0FBZ0M7WUFDekMsVUFBVSxFQUFFLHVDQUF1QztZQUNuRCxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDakI7UUFDRCxVQUFVO1FBQ1YsbUJBQW1CO0tBQ3BCLENBQUM7SUFFRixPQUFPLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEVudmlyb25tZW50UHJvdmlkZXJzLCBJbmplY3RvciwgdHlwZSBQcm92aWRlciwgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYnhBbmFseXRpY3NTZXJ2aWNlQ29uZmlndXJhdGlvbiwgRGJ4QW5hbHl0aWNzU2VydmljZSB9IGZyb20gJy4vYW5hbHl0aWNzLnNlcnZpY2UnO1xuXG5leHBvcnQgdHlwZSBEYnhBbmFseXRpY3NTZXJ2aWNlQ29uZmlndXJhdGlvbkZhY3RvcnkgPSAoaW5qZWN0b3I6IEluamVjdG9yKSA9PiBEYnhBbmFseXRpY3NTZXJ2aWNlQ29uZmlndXJhdGlvbjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBwcm92aWRlRGJ4QW5hbHl0aWNzU2VydmljZSgpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlkZURieEFuYWx5dGljc0NvbmZpZyB7XG4gIHJlYWRvbmx5IGRieEFuYWx5dGljc1NlcnZpY2VDb25maWd1cmF0aW9uRmFjdG9yeTogRGJ4QW5hbHl0aWNzU2VydmljZUNvbmZpZ3VyYXRpb25GYWN0b3J5O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBFbnZpcm9ubWVudFByb3ZpZGVycyB0aGF0IHByb3ZpZGVzIGEgRGJ4QW5hbHl0aWNzU2VydmljZS5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIEVudmlyb25tZW50UHJvdmlkZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlRGJ4QW5hbHl0aWNzU2VydmljZShjb25maWc6IFByb3ZpZGVEYnhBbmFseXRpY3NDb25maWcpOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIGNvbnN0IHsgZGJ4QW5hbHl0aWNzU2VydmljZUNvbmZpZ3VyYXRpb25GYWN0b3J5IH0gPSBjb25maWc7XG5cbiAgY29uc3QgcHJvdmlkZXJzOiBQcm92aWRlcltdID0gW1xuICAgIC8vIGNvbmZpZ3VyYXRpb25cbiAgICB7XG4gICAgICBwcm92aWRlOiBEYnhBbmFseXRpY3NTZXJ2aWNlQ29uZmlndXJhdGlvbixcbiAgICAgIHVzZUZhY3Rvcnk6IGRieEFuYWx5dGljc1NlcnZpY2VDb25maWd1cmF0aW9uRmFjdG9yeSxcbiAgICAgIGRlcHM6IFtJbmplY3Rvcl1cbiAgICB9LFxuICAgIC8vIHNlcnZpY2VcbiAgICBEYnhBbmFseXRpY3NTZXJ2aWNlXG4gIF07XG5cbiAgcmV0dXJuIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyhwcm92aWRlcnMpO1xufVxuIl19
@@ -1,205 +0,0 @@
1
- import { Subject, BehaviorSubject, of, first, shareReplay, switchMap, distinctUntilChanged } from 'rxjs';
2
- import { Inject, Injectable, Optional, inject } from '@angular/core';
3
- import { SubscriptionObject, filterMaybe } from '@dereekb/rxjs';
4
- import { DbxAnalyticsStreamEventType } from './analytics.stream';
5
- import { safeCompareEquality } from '@dereekb/util';
6
- import * as i0 from "@angular/core";
7
- export class DbxAnalyticsEventEmitterService {
8
- }
9
- export class DbxAnalyticsEventStreamService {
10
- }
11
- export class DbxAnalyticsUserSource {
12
- }
13
- export class DbxAnalyticsServiceListener {
14
- }
15
- /**
16
- * Abstract AnalyticsServiceListener implementation.
17
- */
18
- export class AbstractDbxAnalyticsServiceListener {
19
- _sub = new SubscriptionObject();
20
- _analytics = new BehaviorSubject(undefined);
21
- analytics$ = this._analytics.pipe(filterMaybe(), shareReplay(1));
22
- analyticsEvents$ = this.analytics$.pipe(switchMap((x) => x.events$), shareReplay(1));
23
- // MARK: AnalyticsServiceListener
24
- listenToService(service) {
25
- this._analytics.next(service);
26
- const sub = this._initializeServiceSubscription();
27
- if (sub !== false) {
28
- this._sub.subscription = sub;
29
- }
30
- }
31
- // MARK: Destroy
32
- destroy() {
33
- this._analytics.complete();
34
- this._sub.destroy();
35
- }
36
- }
37
- export class DbxAnalyticsServiceConfiguration {
38
- listeners = [];
39
- isProduction;
40
- logEvents;
41
- userSource;
42
- }
43
- export function dbxAnalyticsStreamEventAnalyticsEventWrapper(event, type = DbxAnalyticsStreamEventType.Event) {
44
- const { user } = event;
45
- const userId = user ? user.user : undefined;
46
- return {
47
- event,
48
- type,
49
- user,
50
- userId
51
- };
52
- }
53
- /**
54
- * Primary analytics service that emits analytics events that components can listen to.
55
- */
56
- export class DbxAnalyticsService {
57
- _config = inject(DbxAnalyticsServiceConfiguration);
58
- // TODO: Make these configurable.
59
- static USER_REGISTRATION_EVENT_NAME = 'User Registered';
60
- static USER_LOGIN_EVENT_NAME = 'User Login';
61
- static USER_LOGOUT_EVENT_NAME = 'User Logout';
62
- static USER_PROPERTIES_EVENT_NAME = 'User Properties';
63
- _subject = new Subject();
64
- events$ = this._subject.asObservable();
65
- _userSource = new BehaviorSubject(undefined);
66
- user$ = this._userSource.pipe(switchMap((x) => (x ? x.analyticsUser$ : of(undefined))), shareReplay(1));
67
- _userSourceSub = new SubscriptionObject();
68
- _userIdEventSub = new SubscriptionObject();
69
- _loggerSub = new SubscriptionObject();
70
- constructor(userSource) {
71
- this._init();
72
- userSource = userSource || this._config.userSource;
73
- if (userSource) {
74
- this.setUserSource(userSource);
75
- }
76
- }
77
- // MARK: Source
78
- /**
79
- * Sets the user directly, overridding the UserSource.
80
- */
81
- setUser(user) {
82
- let source;
83
- if (user) {
84
- source = { analyticsUser$: of(user) };
85
- }
86
- this._userSource.next(source);
87
- if (this._userSource.value) {
88
- console.warn('DbxAnalyticsService has a userSource that is set. Source is now overridden by setUser() value.');
89
- }
90
- }
91
- setUserSource(source) {
92
- this._userSource.next(source);
93
- }
94
- // MARK: AnalyticsEventEmitterService
95
- /**
96
- * Sends an event.
97
- */
98
- sendNewUserEvent(user, data) {
99
- this.sendNextEvent({
100
- name: DbxAnalyticsService.USER_REGISTRATION_EVENT_NAME,
101
- data
102
- }, DbxAnalyticsStreamEventType.NewUserEvent, user);
103
- }
104
- sendUserLoginEvent(user, data) {
105
- this.sendNextEvent({
106
- name: DbxAnalyticsService.USER_LOGIN_EVENT_NAME,
107
- data
108
- }, DbxAnalyticsStreamEventType.UserLoginEvent, user);
109
- }
110
- sendUserLogoutEvent(data, clearUser = true) {
111
- this.sendNextEvent({
112
- name: DbxAnalyticsService.USER_LOGOUT_EVENT_NAME,
113
- data
114
- }, DbxAnalyticsStreamEventType.UserLogoutEvent);
115
- if (clearUser) {
116
- this.setUser(undefined);
117
- }
118
- }
119
- sendUserPropertiesEvent(user, data) {
120
- this.sendNextEvent({
121
- name: DbxAnalyticsService.USER_PROPERTIES_EVENT_NAME,
122
- data
123
- }, DbxAnalyticsStreamEventType.UserPropertiesEvent, user);
124
- }
125
- sendEventData(name, data) {
126
- return this.sendEvent({
127
- name,
128
- data
129
- });
130
- }
131
- sendEventType(eventType) {
132
- this.sendNextEvent({
133
- name: eventType
134
- }, DbxAnalyticsStreamEventType.Event);
135
- }
136
- sendEvent(event) {
137
- this.sendNextEvent(event, DbxAnalyticsStreamEventType.Event);
138
- }
139
- sendPageView(page) {
140
- this.sendNextEvent({
141
- name: page
142
- }, DbxAnalyticsStreamEventType.PageView);
143
- }
144
- /**
145
- * Sends the next event.
146
- *
147
- * @param event
148
- * @param type
149
- * @param userOverride Uses this user if set as null or an override value. If undefined the current analytics user is used.
150
- */
151
- sendNextEvent(event = {}, type, userOverride) {
152
- this.user$.pipe(first()).subscribe((analyticsUser) => {
153
- const user = userOverride !== undefined ? userOverride : analyticsUser;
154
- const analyticsEvent = { ...event, user };
155
- this.nextEvent(analyticsEvent, type);
156
- });
157
- }
158
- nextEvent(event, type) {
159
- const wrapper = dbxAnalyticsStreamEventAnalyticsEventWrapper(event, type);
160
- this._subject.next(wrapper);
161
- }
162
- // MARK: Internal
163
- _init() {
164
- if (this._config.isProduction) {
165
- // Initialize listeners.
166
- this._config.listeners.forEach((listener) => {
167
- listener.listenToService(this);
168
- });
169
- }
170
- else {
171
- console.warn('AnalyticsService: Analytics not in production mode. All analytics events are ignored.');
172
- }
173
- if (this._config.logEvents || !this._config.isProduction) {
174
- console.log('AnalyticsService: Log analytics events enabled.');
175
- // Create a new subscription
176
- this._loggerSub.subscription = this._subject.subscribe((x) => {
177
- console.log(`AnalyticsService: Analytics Event - ${DbxAnalyticsStreamEventType[x.type]} | User: ${x.userId} | Data: ${JSON.stringify(x.event)}.`);
178
- });
179
- }
180
- this._userSourceSub.subscription = this.user$.subscribe((user) => {
181
- this.sendNextEvent({}, DbxAnalyticsStreamEventType.UserChange, user ?? null);
182
- });
183
- this._userIdEventSub.subscription = this.user$.pipe(distinctUntilChanged((a, b) => safeCompareEquality(a, b, (x, y) => x.user === y.user))).subscribe((user) => {
184
- this.sendNextEvent({}, DbxAnalyticsStreamEventType.UserIdChange, user ?? null);
185
- });
186
- }
187
- destroy() {
188
- this._subject.complete();
189
- this._userSource.complete();
190
- this._userSourceSub.destroy();
191
- this._userIdEventSub.destroy();
192
- this._loggerSub.destroy();
193
- }
194
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxAnalyticsService, deps: [{ token: DbxAnalyticsUserSource, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
195
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxAnalyticsService });
196
- }
197
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxAnalyticsService, decorators: [{
198
- type: Injectable
199
- }], ctorParameters: () => [{ type: undefined, decorators: [{
200
- type: Optional
201
- }, {
202
- type: Inject,
203
- args: [DbxAnalyticsUserSource]
204
- }] }] });
205
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl0aWNzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtYW5hbHl0aWNzL3NyYy9saWIvYW5hbHl0aWNzL2FuYWx5dGljcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxPQUFPLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBZ0IsS0FBSyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbkksT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWhFLE9BQU8sRUFBMkIsMkJBQTJCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRixPQUFPLEVBQXNCLG1CQUFtQixFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUV4RSxNQUFNLE9BQWdCLCtCQUErQjtDQVFwRDtBQUVELE1BQU0sT0FBZ0IsOEJBQThCO0NBRW5EO0FBRUQsTUFBTSxPQUFnQixzQkFBc0I7Q0FFM0M7QUFFRCxNQUFNLE9BQWdCLDJCQUEyQjtDQUVoRDtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixtQ0FBbUM7SUFDL0MsSUFBSSxHQUFHLElBQUksa0JBQWtCLEVBQUUsQ0FBQztJQUM5QixVQUFVLEdBQUcsSUFBSSxlQUFlLENBQTZCLFNBQVMsQ0FBQyxDQUFDO0lBRXpFLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqRSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FDOUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUs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ZSwgU3ViamVjdCwgQmVoYXZpb3JTdWJqZWN0LCBvZiwgU3Vic2NyaXB0aW9uLCBmaXJzdCwgc2hhcmVSZXBsYXksIHN3aXRjaE1hcCwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uT2JqZWN0LCBmaWx0ZXJNYXliZSB9IGZyb20gJ0BkZXJlZWtiL3J4anMnO1xuaW1wb3J0IHsgRGJ4QW5hbHl0aWNzRXZlbnQsIERieEFuYWx5dGljc0V2ZW50RGF0YSwgRGJ4QW5hbHl0aWNzRXZlbnROYW1lLCBEYnhBbmFseXRpY3NVc2VyLCBOZXdVc2VyQW5hbHl0aWNzRXZlbnREYXRhLCBEYnhVc2VyQW5hbHl0aWNzRXZlbnQgfSBmcm9tICcuL2FuYWx5dGljcyc7XG5pbXBvcnQgeyBEYnhBbmFseXRpY3NTdHJlYW1FdmVudCwgRGJ4QW5hbHl0aWNzU3RyZWFtRXZlbnRUeXBlIH0gZnJvbSAnLi9hbmFseXRpY3Muc3RyZWFtJztcbmltcG9ydCB7IE1heWJlLCBEZXN0cm95YWJsZSwgc2FmZUNvbXBhcmVFcXVhbGl0eSB9IGZyb20gJ0BkZXJlZWtiL3V0aWwnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGJ4QW5hbHl0aWNzRXZlbnRFbWl0dGVyU2VydmljZSB7XG4gIGFic3RyYWN0IHNlbmROZXdVc2VyRXZlbnQodXNlcjogRGJ4QW5hbHl0aWNzVXNlciwgZGF0YTogTmV3VXNlckFuYWx5dGljc0V2ZW50RGF0YSk6IHZvaWQ7XG4gIGFic3RyYWN0IHNlbmRVc2VyTG9naW5FdmVudCh1c2VyOiBEYnhBbmFseXRpY3NVc2VyLCBkYXRhPzogRGJ4QW5hbHl0aWNzRXZlbnREYXRhKTogdm9pZDtcbiAgYWJzdHJhY3Qgc2VuZFVzZXJMb2dvdXRFdmVudChkYXRhPzogRGJ4QW5hbHl0aWNzRXZlbnREYXRhKTogdm9pZDtcbiAgYWJzdHJhY3Qgc2VuZFVzZXJQcm9wZXJ0aWVzRXZlbnQodXNlcjogRGJ4QW5hbHl0aWNzVXNlciwgZGF0YT86IERieEFuYWx5dGljc0V2ZW50RGF0YSk6IHZvaWQ7XG4gIGFic3RyYWN0IHNlbmRFdmVudERhdGEobmFtZTogRGJ4QW5hbHl0aWNzRXZlbnROYW1lLCBkYXRhPzogRGJ4QW5hbHl0aWNzRXZlbnREYXRhKTogdm9pZDtcbiAgYWJzdHJhY3Qgc2VuZEV2ZW50KGV2ZW50OiBEYnhBbmFseXRpY3NFdmVudCk6IHZvaWQ7XG4gIGFic3RyYWN0IHNlbmRQYWdlVmlldyhwYWdlPzogc3RyaW5nKTogdm9pZDtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERieEFuYWx5dGljc0V2ZW50U3RyZWFtU2VydmljZSB7XG4gIGFic3RyYWN0IHJlYWRvbmx5IGV2ZW50cyQ6IE9ic2VydmFibGU8RGJ4QW5hbHl0aWNzU3RyZWFtRXZlbnQ+O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGJ4QW5hbHl0aWNzVXNlclNvdXJjZSB7XG4gIGFic3RyYWN0IHJlYWRvbmx5IGFuYWx5dGljc1VzZXIkOiBPYnNlcnZhYmxlPE1heWJlPERieEFuYWx5dGljc1VzZXI+Pjtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERieEFuYWx5dGljc1NlcnZpY2VMaXN0ZW5lciB7XG4gIHB1YmxpYyBhYnN0cmFjdCBsaXN0ZW5Ub1NlcnZpY2Uoc2VydmljZTogRGJ4QW5hbHl0aWNzU2VydmljZSk6IHZvaWQ7XG59XG5cbi8qKlxuICogQWJzdHJhY3QgQW5hbHl0aWNzU2VydmljZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REYnhBbmFseXRpY3NTZXJ2aWNlTGlzdGVuZXIgaW1wbGVtZW50cyBEYnhBbmFseXRpY3NTZXJ2aWNlTGlzdGVuZXIsIERlc3Ryb3lhYmxlIHtcbiAgcHJpdmF0ZSBfc3ViID0gbmV3IFN1YnNjcmlwdGlvbk9iamVjdCgpO1xuICBwcm90ZWN0ZWQgX2FuYWx5dGljcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWF5YmU8RGJ4QW5hbHl0aWNzU2VydmljZT4+KHVuZGVmaW5lZCk7XG5cbiAgcmVhZG9ubHkgYW5hbHl0aWNzJCA9IHRoaXMuX2FuYWx5dGljcy5waXBlKGZpbHRlck1heWJlKCksIHNoYXJlUmVwbGF5KDEpKTtcbiAgcmVhZG9ubHkgYW5hbHl0aWNzRXZlbnRzJCA9IHRoaXMuYW5hbHl0aWNzJC5waXBlKFxuICAgIHN3aXRjaE1hcCgoeCkgPT4geC5ldmVudHMkKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIC8vIE1BUks6IEFuYWx5dGljc1NlcnZpY2VMaXN0ZW5lclxuICBsaXN0ZW5Ub1NlcnZpY2Uoc2VydmljZTogRGJ4QW5hbHl0aWNzU2VydmljZSk6IHZvaWQge1xuICAgIHRoaXMuX2FuYWx5dGljcy5uZXh0KHNlcnZpY2UpO1xuICAgIGNvbnN0IHN1YiA9IHRoaXMuX2luaXRpYWxpemVTZXJ2aWNlU3Vic2NyaXB0aW9uKCk7XG5cbiAgICBpZiAoc3ViICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5fc3ViLnN1YnNjcmlwdGlvbiA9IHN1YjtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgX2luaXRpYWxpemVTZXJ2aWNlU3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB8IGZhbHNlO1xuXG4gIC8vIE1BUks6IERlc3Ryb3lcbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9hbmFseXRpY3MuY29tcGxldGUoKTtcbiAgICB0aGlzLl9zdWIuZGVzdHJveSgpO1xuICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEYnhBbmFseXRpY3NTZXJ2aWNlQ29uZmlndXJhdGlvbiB7XG4gIHJlYWRvbmx5IGxpc3RlbmVyczogRGJ4QW5hbHl0aWNzU2VydmljZUxpc3RlbmVyW10gPSBbXTtcbiAgcmVhZG9ubHkgaXNQcm9kdWN0aW9uPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbG9nRXZlbnRzPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdXNlclNvdXJjZT86IERieEFuYWx5dGljc1VzZXJTb3VyY2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGJ4QW5hbHl0aWNzU3RyZWFtRXZlbnRBbmFseXRpY3NFdmVudFdyYXBwZXIgZXh0ZW5kcyBEYnhBbmFseXRpY3NTdHJlYW1FdmVudCB7XG4gIHJlYWRvbmx5IGV2ZW50OiBEYnhVc2VyQW5hbHl0aWNzRXZlbnQ7XG4gIHJlYWRvbmx5IHR5cGU6IERieEFuYWx5dGljc1N0cmVhbUV2ZW50VHlwZTtcbiAgcmVhZG9ubHkgdXNlcjogTWF5YmU8RGJ4QW5hbHl0aWNzVXNlcj47XG4gIHJlYWRvbmx5IHVzZXJJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGJ4QW5hbHl0aWNzU3RyZWFtRXZlbnRBbmFseXRpY3NFdmVudFdyYXBwZXIoZXZlbnQ6IERieFVzZXJBbmFseXRpY3NFdmVudCwgdHlwZTogRGJ4QW5hbHl0aWNzU3RyZWFtRXZlbnRUeXBlID0gRGJ4QW5hbHl0aWNzU3RyZWFtRXZlbnRUeXBlLkV2ZW50KSB7XG4gIGNvbnN0IHsgdXNlciB9ID0gZXZlbnQ7XG4gIGNvbnN0IHVzZXJJZCA9IHVzZXIgPyB1c2VyLnVzZXIgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICBldmVudCxcbiAgICB0eXBlLFxuICAgIHVzZXIsXG4gICAgdXNlcklkXG4gIH07XG59XG5cbi8qKlxuICogUHJpbWFyeSBhbmFseXRpY3Mgc2VydmljZSB0aGF0IGVtaXRzIGFuYWx5dGljcyBldmVudHMgdGhhdCBjb21wb25lbnRzIGNhbiBsaXN0ZW4gdG8uXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEYnhBbmFseXRpY3NTZXJ2aWNlIGltcGxlbWVudHMgRGJ4QW5hbHl0aWNzRXZlbnRTdHJlYW1TZXJ2aWNlLCBEYnhBbmFseXRpY3NFdmVudEVtaXR0ZXJTZXJ2aWNlLCBEZXN0cm95YWJsZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NvbmZpZyA9IGluamVjdChEYnhBbmFseXRpY3NTZXJ2aWNlQ29uZmlndXJhdGlvbik7XG5cbiAgLy8gVE9ETzogTWFrZSB0aGVzZSBjb25maWd1cmFibGUuXG4gIHN0YXRpYyByZWFkb25seSBVU0VSX1JFR0lTVFJBVElPTl9FVkVOVF9OQU1FID0gJ1VzZXIgUmVnaXN0ZXJlZCc7XG4gIHN0YXRpYyByZWFkb25seSBVU0VSX0xPR0lOX0VWRU5UX05BTUUgPSAnVXNlciBMb2dpbic7XG4gIHN0YXRpYyByZWFkb25seSBVU0VSX0xPR09VVF9FVkVOVF9OQU1FID0gJ1VzZXIgTG9nb3V0JztcbiAgc3RhdGljIHJlYWRvbmx5IFVTRVJfUFJPUEVSVElFU19FVkVOVF9OQU1FID0gJ1VzZXIgUHJvcGVydGllcyc7XG5cbiAgcHJpdmF0ZSBfc3ViamVjdCA9IG5ldyBTdWJqZWN0PERieEFuYWx5dGljc1N0cmVhbUV2ZW50PigpO1xuICByZWFkb25seSBldmVudHMkID0gdGhpcy5fc3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIF91c2VyU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXliZTxEYnhBbmFseXRpY3NVc2VyU291cmNlPj4odW5kZWZpbmVkKTtcblxuICByZWFkb25seSB1c2VyJCA9IHRoaXMuX3VzZXJTb3VyY2UucGlwZShcbiAgICBzd2l0Y2hNYXAoKHgpID0+ICh4ID8geC5hbmFseXRpY3NVc2VyJCA6IG9mKHVuZGVmaW5lZCkpKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHByaXZhdGUgX3VzZXJTb3VyY2VTdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG4gIHByaXZhdGUgX3VzZXJJZEV2ZW50U3ViID0gbmV3IFN1YnNjcmlwdGlvbk9iamVjdCgpO1xuICBwcml2YXRlIF9sb2dnZXJTdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQEluamVjdChEYnhBbmFseXRpY3NVc2VyU291cmNlKSB1c2VyU291cmNlPzogTWF5YmU8RGJ4QW5hbHl0aWNzVXNlclNvdXJjZT4pIHtcbiAgICB0aGlzLl9pbml0KCk7XG5cbiAgICB1c2VyU291cmNlID0gdXNlclNvdXJjZSB8fCB0aGlzLl9jb25maWcudXNlclNvdXJjZTtcbiAgICBpZiAodXNlclNvdXJjZSkge1xuICAgICAgdGhpcy5zZXRVc2VyU291cmNlKHVzZXJTb3VyY2UpO1xuICAgIH1cbiAgfVxuXG4gIC8vIE1BUks6IFNvdXJjZVxuICAvKipcbiAgICogU2V0cyB0aGUgdXNlciBkaXJlY3RseSwgb3ZlcnJpZGRpbmcgdGhlIFVzZXJTb3VyY2UuXG4gICAqL1xuICBwdWJsaWMgc2V0VXNlcih1c2VyOiBNYXliZTxEYnhBbmFseXRpY3NVc2VyPik6IHZvaWQge1xuICAgIGxldCBzb3VyY2U6IE1heWJlPERieEFuYWx5dGljc1VzZXJTb3VyY2U+O1xuXG4gICAgaWYgKHVzZXIpIHtcbiAgICAgIHNvdXJjZSA9IHsgYW5hbHl0aWNzVXNlciQ6IG9mKHVzZXIpIH07XG4gICAgfVxuXG4gICAgdGhpcy5fdXNlclNvdXJjZS5uZXh0KHNvdXJjZSk7XG5cbiAgICBpZiAodGhpcy5fdXNlclNvdXJjZS52YWx1ZSkge1xuICAgICAgY29uc29sZS53YXJuKCdEYnhBbmFseXRpY3NTZXJ2aWNlIGhhcyBhIHVzZXJTb3VyY2UgdGhhdCBpcyBzZXQuIFNvdXJjZSBpcyBub3cgb3ZlcnJpZGRlbiBieSBzZXRVc2VyKCkgdmFsdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldFVzZXJTb3VyY2Uoc291cmNlOiBEYnhBbmFseXRpY3NVc2VyU291cmNlKTogdm9pZCB7XG4gICAgdGhpcy5fdXNlclNvdXJjZS5uZXh0KHNvdXJjZSk7XG4gIH1cblxuICAvLyBNQVJLOiBBbmFseXRpY3NFdmVudEVtaXR0ZXJTZXJ2aWNlXG4gIC8qKlxuICAgKiBTZW5kcyBhbiBldmVudC5cbiAgICovXG4gIHB1YmxpYyBzZW5kTmV3VXNlckV2ZW50KHVzZXI6IERieEFuYWx5dGljc1VzZXIsIGRhdGE6IE5ld1VzZXJBbmFseXRpY3NFdmVudERhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnNlbmROZXh0RXZlbnQoXG4gICAgICB7XG4gICAgICAgIG5hbWU6IERieEFuYWx5dGljc1NlcnZpY2UuVVNFUl9SRUdJU1RSQVRJT05fRVZFTlRfTkFNRSxcbiAgICAgICAgZGF0YVxuICAgICAgfSxcbiAgICAgIERieEFuYWx5dGljc1N0cmVhbUV2ZW50VHlwZS5OZXdVc2VyRXZlbnQsXG4gICAgICB1c2VyXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzZW5kVXNlckxvZ2luRXZlbnQodXNlcjogRGJ4QW5hbHl0aWNzVXNlciwgZGF0YT86IERieEFuYWx5dGljc0V2ZW50RGF0YSk6IHZvaWQge1xuICAgIHRoaXMuc2VuZE5leHRFdmVudChcbiAgICAgIHtcbiAgICAgICAgbmFtZTogRGJ4QW5hbHl0aWNzU2VydmljZS5VU0VSX0xPR0lOX0VWRU5UX05BTUUsXG4gICAgICAgIGRhdGFcbiAgICAgIH0sXG4gICAgICBEYnhBbmFseXRpY3NTdHJlYW1FdmVudFR5cGUuVXNlckxvZ2luRXZlbnQsXG4gICAgICB1c2VyXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzZW5kVXNlckxvZ291dEV2ZW50KGRhdGE/OiBEYnhBbmFseXRpY3NFdmVudERhdGEsIGNsZWFyVXNlciA9IHRydWUpOiB2b2lkIHtcbiAgICB0aGlzLnNlbmROZXh0RXZlbnQoXG4gICAgICB7XG4gICAgICAgIG5hbWU6IERieEFuYWx5dGljc1NlcnZpY2UuVVNFUl9MT0dPVVRfRVZFTlRfTkFNRSxcbiAgICAgICAgZGF0YVxuICAgICAgfSxcbiAgICAgIERieEFuYWx5dGljc1N0cmVhbUV2ZW50VHlwZS5Vc2VyTG9nb3V0RXZlbnRcbiAgICApO1xuXG4gICAgaWYgKGNsZWFyVXNlcikge1xuICAgICAgdGhpcy5zZXRVc2VyKHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNlbmRVc2VyUHJvcGVydGllc0V2ZW50KHVzZXI6IERieEFuYWx5dGljc1VzZXIsIGRhdGE/OiBEYnhBbmFseXRpY3NFdmVudERhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnNlbmROZXh0RXZlbnQoXG4gICAgICB7XG4gICAgICAgIG5hbWU6IERieEFuYWx5dGljc1NlcnZpY2UuVVNFUl9QUk9QRVJUSUVTX0VWRU5UX05BTUUsXG4gICAgICAgIGRhdGFcbiAgICAgIH0sXG4gICAgICBEYnhBbmFseXRpY3NTdHJlYW1FdmVudFR5cGUuVXNlclByb3BlcnRpZXNFdmVudCxcbiAgICAgIHVzZXJcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHNlbmRFdmVudERhdGEobmFtZTogRGJ4QW5hbHl0aWNzRXZlbnROYW1lLCBkYXRhPzogRGJ4QW5hbHl0aWNzRXZlbnREYXRhKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuc2VuZEV2ZW50KHtcbiAgICAgIG5hbWUsXG4gICAgICBkYXRhXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2VuZEV2ZW50VHlwZShldmVudFR5cGU6IERieEFuYWx5dGljc0V2ZW50TmFtZSk6IHZvaWQge1xuICAgIHRoaXMuc2VuZE5leHRFdmVudChcbiAgICAgIHtcbiAgICAgICAgbmFtZTogZXZlbnRUeXBlXG4gICAgICB9LFxuICAgICAgRGJ4QW5hbHl0aWNzU3RyZWFtRXZlbnRUeXBlLkV2ZW50XG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzZW5kRXZlbnQoZXZlbnQ6IERieEFuYWx5dGljc0V2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5zZW5kTmV4dEV2ZW50KGV2ZW50LCBEYnhBbmFseXRpY3NTdHJlYW1FdmVudFR5cGUuRXZlbnQpO1xuICB9XG5cbiAgcHVibGljIHNlbmRQYWdlVmlldyhwYWdlPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZW5kTmV4dEV2ZW50KFxuICAgICAge1xuICAgICAgICBuYW1lOiBwYWdlXG4gICAgICB9LFxuICAgICAgRGJ4QW5hbHl0aWNzU3RyZWFtRXZlbnRUeXBlLlBhZ2VWaWV3XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyB0aGUgbmV4dCBldmVudC5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50XG4gICAqIEBwYXJhbSB0eXBlXG4gICAqIEBwYXJhbSB1c2VyT3ZlcnJpZGUgVXNlcyB0aGlzIHVzZXIgaWYgc2V0IGFzIG51bGwgb3IgYW4gb3ZlcnJpZGUgdmFsdWUuIElmIHVuZGVmaW5lZCB0aGUgY3VycmVudCBhbmFseXRpY3MgdXNlciBpcyB1c2VkLlxuICAgKi9cbiAgcHJvdGVjdGVkIHNlbmROZXh0RXZlbnQoZXZlbnQ6IERieEFuYWx5dGljc0V2ZW50ID0ge30sIHR5cGU6IERieEFuYWx5dGljc1N0cmVhbUV2ZW50VHlwZSwgdXNlck92ZXJyaWRlPzogTWF5YmU8RGJ4QW5hbHl0aWNzVXNlcj4pOiB2b2lkIHtcbiAgICB0aGlzLnVzZXIkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKChhbmFseXRpY3NVc2VyKSA9PiB7XG4gICAgICBjb25zdCB1c2VyOiBNYXliZTxEYnhBbmFseXRpY3NVc2VyPiA9IHVzZXJPdmVycmlkZSAhPT0gdW5kZWZpbmVkID8gdXNlck92ZXJyaWRlIDogYW5hbHl0aWNzVXNlcjtcbiAgICAgIGNvbnN0IGFuYWx5dGljc0V2ZW50OiBEYnhVc2VyQW5hbHl0aWNzRXZlbnQgPSB7IC4uLmV2ZW50LCB1c2VyIH07XG4gICAgICB0aGlzLm5leHRFdmVudChhbmFseXRpY3NFdmVudCwgdHlwZSk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV4dEV2ZW50KGV2ZW50OiBEYnhVc2VyQW5hbHl0aWNzRXZlbnQsIHR5cGU6IERieEFuYWx5dGljc1N0cmVhbUV2ZW50VHlwZSk6IHZvaWQge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBkYnhBbmFseXRpY3NTdHJlYW1FdmVudEFuYWx5dGljc0V2ZW50V3JhcHBlcihldmVudCwgdHlwZSk7XG4gICAgdGhpcy5fc3ViamVjdC5uZXh0KHdyYXBwZXIpO1xuICB9XG5cbiAgLy8gTUFSSzogSW50ZXJuYWxcbiAgcHJpdmF0ZSBfaW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY29uZmlnLmlzUHJvZHVjdGlvbikge1xuICAgICAgLy8gSW5pdGlhbGl6ZSBsaXN0ZW5lcnMuXG4gICAgICB0aGlzLl9jb25maWcubGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgIGxpc3RlbmVyLmxpc3RlblRvU2VydmljZSh0aGlzKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0FuYWx5dGljc1NlcnZpY2U6IEFuYWx5dGljcyBub3QgaW4gcHJvZHVjdGlvbiBtb2RlLiBBbGwgYW5hbHl0aWNzIGV2ZW50cyBhcmUgaWdub3JlZC4nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29uZmlnLmxvZ0V2ZW50cyB8fCAhdGhpcy5fY29uZmlnLmlzUHJvZHVjdGlvbikge1xuICAgICAgY29uc29sZS5sb2coJ0FuYWx5dGljc1NlcnZpY2U6IExvZyBhbmFseXRpY3MgZXZlbnRzIGVuYWJsZWQuJyk7XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBzdWJzY3JpcHRpb25cbiAgICAgIHRoaXMuX2xvZ2dlclN1Yi5zdWJzY3JpcHRpb24gPSB0aGlzLl9zdWJqZWN0LnN1YnNjcmliZSgoeCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgQW5hbHl0aWNzU2VydmljZTogQW5hbHl0aWNzIEV2ZW50IC0gJHtEYnhBbmFseXRpY3NTdHJlYW1FdmVudFR5cGVbeC50eXBlXX0gfCBVc2VyOiAke3gudXNlcklkfSB8IERhdGE6ICR7SlNPTi5zdHJpbmdpZnkoeC5ldmVudCl9LmApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fdXNlclNvdXJjZVN1Yi5zdWJzY3JpcHRpb24gPSB0aGlzLnVzZXIkLnN1YnNjcmliZSgodXNlcikgPT4ge1xuICAgICAgdGhpcy5zZW5kTmV4dEV2ZW50KHt9LCBEYnhBbmFseXRpY3NTdHJlYW1FdmVudFR5cGUuVXNlckNoYW5nZSwgdXNlciA/PyBudWxsKTtcbiAgICB9KTtcblxuICAgIHRoaXMuX3VzZXJJZEV2ZW50U3ViLnN1YnNjcmlwdGlvbiA9IHRoaXMudXNlciQucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgoYSwgYikgPT4gc2FmZUNvbXBhcmVFcXVhbGl0eShhLCBiLCAoeCwgeSkgPT4geC51c2VyID09PSB5LnVzZXIpKSkuc3Vic2NyaWJlKCh1c2VyKSA9PiB7XG4gICAgICB0aGlzLnNlbmROZXh0RXZlbnQoe30sIERieEFuYWx5dGljc1N0cmVhbUV2ZW50VHlwZS5Vc2VySWRDaGFuZ2UsIHVzZXIgPz8gbnVsbCk7XG4gICAgfSk7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuX3N1YmplY3QuY29tcGxldGUoKTtcbiAgICB0aGlzLl91c2VyU291cmNlLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fdXNlclNvdXJjZVN1Yi5kZXN0cm95KCk7XG4gICAgdGhpcy5fdXNlcklkRXZlbnRTdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2xvZ2dlclN1Yi5kZXN0cm95KCk7XG4gIH1cbn1cbiJdfQ==