@memberjunction/ng-bootstrap 0.0.1 → 3.1.1

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.
@@ -0,0 +1,148 @@
1
+ /**
2
+ * MemberJunction 3.0 Auth Shell Component
3
+ *
4
+ * Handles authentication flow and initialization for MJ applications.
5
+ * This component encapsulates all the auth logic that was previously in app.component.ts
6
+ */
7
+ import { Component, Inject } from '@angular/core';
8
+ import { DOCUMENT } from '@angular/common';
9
+ import { take } from 'rxjs/operators';
10
+ import { SetProductionStatus, LogError } from '@memberjunction/core';
11
+ import { MJ_ENVIRONMENT } from '../bootstrap.types';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "@angular/router";
14
+ import * as i2 from "@memberjunction/ng-auth-services";
15
+ import * as i3 from "../services/initialization.service";
16
+ import * as i4 from "@angular/common";
17
+ export class MJAuthShellComponent {
18
+ router;
19
+ document;
20
+ authBase;
21
+ initService;
22
+ environment;
23
+ HasError = false;
24
+ ErrorMessage = '';
25
+ showValidationOnly = false;
26
+ subHeaderText = "Welcome back! Please log in to your account.";
27
+ initialPath = '/';
28
+ constructor(router, document, authBase, initService, environment) {
29
+ this.router = router;
30
+ this.document = document;
31
+ this.authBase = authBase;
32
+ this.initService = initService;
33
+ this.environment = environment;
34
+ }
35
+ async ngOnInit() {
36
+ console.log('🚀 MemberJunction 3.0 - Auth Shell Initializing');
37
+ SetProductionStatus(this.environment.production);
38
+ this.initialPath = window.location.pathname + (window.location.search ? window.location.search : '');
39
+ await this.setupAuth();
40
+ }
41
+ /**
42
+ * Handle successful login and initialize the application
43
+ */
44
+ async handleLogin(token, userInfo) {
45
+ if (!token)
46
+ return;
47
+ try {
48
+ // Initialize GraphQL client
49
+ await this.initService.initializeGraphQL(token, this.environment);
50
+ // Validate user access and refresh data
51
+ const validationResult = await this.initService.validateUserAccess();
52
+ if (!validationResult.success) {
53
+ this.HasError = true;
54
+ this.ErrorMessage = validationResult.error.message;
55
+ throw new Error(this.ErrorMessage);
56
+ }
57
+ // Run startup validation checks
58
+ this.initService.runValidationChecks();
59
+ // Navigate to initial route
60
+ this.initService.navigateToInitialRoute(this.initialPath, this.document);
61
+ }
62
+ catch (err) {
63
+ // Check for no roles error
64
+ if (this.initService.isNoUserRolesError(err)) {
65
+ this.showValidationOnly = true;
66
+ this.HasError = true;
67
+ const result = this.initService.handleNoRolesError();
68
+ return; // Don't throw, allow UI to show validation banner
69
+ }
70
+ // Try auth retry if applicable
71
+ const retried = await this.initService.handleAuthRetry(err);
72
+ if (retried) {
73
+ return; // Retry initiated
74
+ }
75
+ // Show error
76
+ this.HasError = true;
77
+ this.ErrorMessage = err;
78
+ LogError('Error Logging In: ' + err);
79
+ throw err;
80
+ }
81
+ }
82
+ /**
83
+ * Setup authentication and handle auth state changes
84
+ */
85
+ async setupAuth() {
86
+ // Auth provider already initialized by APP_INITIALIZER
87
+ // Listen for user info changes
88
+ this.authBase.getUserInfo()
89
+ .pipe(take(1))
90
+ .subscribe({
91
+ next: async (userInfo) => {
92
+ if (userInfo) {
93
+ const token = await this.authBase.getIdToken();
94
+ if (token) {
95
+ await this.handleLogin(token, userInfo);
96
+ }
97
+ else {
98
+ console.error('User info available but no token found');
99
+ }
100
+ }
101
+ },
102
+ error: (err) => {
103
+ LogError('Error Logging In: ' + err);
104
+ this.subHeaderText = this.initService.getAuthErrorMessage(err);
105
+ }
106
+ });
107
+ // Check if user is authenticated
108
+ this.authBase.isAuthenticated()
109
+ .pipe(take(1))
110
+ .subscribe((loggedIn) => {
111
+ if (!loggedIn) {
112
+ // Display login screen - auth state is managed by provider
113
+ console.log('User not authenticated, showing login screen');
114
+ }
115
+ });
116
+ }
117
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MJAuthShellComponent, deps: [{ token: i1.Router }, { token: DOCUMENT }, { token: i2.MJAuthBase }, { token: i3.MJInitializationService }, { token: MJ_ENVIRONMENT }], target: i0.ɵɵFactoryTarget.Component });
118
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MJAuthShellComponent, selector: "mj-auth-shell", ngImport: i0, template: `
119
+ <div class="mj-auth-shell">
120
+ <ng-content *ngIf="!HasError || showValidationOnly"></ng-content>
121
+
122
+ <div *ngIf="HasError && !showValidationOnly" class="error-container">
123
+ <h2>Error</h2>
124
+ <p>{{ ErrorMessage }}</p>
125
+ </div>
126
+ </div>
127
+ `, isInline: true, styles: [".mj-auth-shell{width:100%;height:100%;display:block}.error-container{padding:20px;text-align:center}.error-container h2{color:#d32f2f;margin-bottom:10px}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
128
+ }
129
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MJAuthShellComponent, decorators: [{
130
+ type: Component,
131
+ args: [{ selector: 'mj-auth-shell', template: `
132
+ <div class="mj-auth-shell">
133
+ <ng-content *ngIf="!HasError || showValidationOnly"></ng-content>
134
+
135
+ <div *ngIf="HasError && !showValidationOnly" class="error-container">
136
+ <h2>Error</h2>
137
+ <p>{{ ErrorMessage }}</p>
138
+ </div>
139
+ </div>
140
+ `, styles: [".mj-auth-shell{width:100%;height:100%;display:block}.error-container{padding:20px;text-align:center}.error-container h2{color:#d32f2f;margin-bottom:10px}\n"] }]
141
+ }], ctorParameters: () => [{ type: i1.Router }, { type: Document, decorators: [{
142
+ type: Inject,
143
+ args: [DOCUMENT]
144
+ }] }, { type: i2.MJAuthBase }, { type: i3.MJInitializationService }, { type: undefined, decorators: [{
145
+ type: Inject,
146
+ args: [MJ_ENVIRONMENT]
147
+ }] }] });
148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1zaGVsbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvYXV0aC1zaGVsbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFM0MsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQWEsTUFBTSxzQkFBc0IsQ0FBQztBQUdoRixPQUFPLEVBQXVCLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7Ozs7QUFnQ3pFLE1BQU0sT0FBTyxvQkFBb0I7SUFTckI7SUFDaUI7SUFDbEI7SUFDQztJQUN3QjtJQVozQixRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ2pCLFlBQVksR0FBUSxFQUFFLENBQUM7SUFDdkIsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0lBQzNCLGFBQWEsR0FBVyw4Q0FBOEMsQ0FBQztJQUV0RSxXQUFXLEdBQUcsR0FBRyxDQUFDO0lBRTFCLFlBQ1UsTUFBYyxFQUNHLFFBQWtCLEVBQ3BDLFFBQW9CLEVBQ25CLFdBQW9DLEVBQ1osV0FBZ0M7UUFKeEQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNHLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDcEMsYUFBUSxHQUFSLFFBQVEsQ0FBWTtRQUNuQixnQkFBVyxHQUFYLFdBQVcsQ0FBeUI7UUFDWixnQkFBVyxHQUFYLFdBQVcsQ0FBcUI7SUFDL0QsQ0FBQztJQUVKLEtBQUssQ0FBQyxRQUFRO1FBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO1FBRS9ELG1CQUFtQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMs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QkFBTSxDQUFDO3dCQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztvQkFDMUQsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEdBQVksRUFBRSxFQUFFO2dCQUN0QixRQUFRLENBQUMsb0JBQW9CLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqRSxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBRUwsaUNBQWlDO1FBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFO2FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDYixTQUFTLENBQUMsQ0FBQyxRQUFpQixFQUFFLEVBQUU7WUFDL0IsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNkLDJEQUEyRDtnQkFDM0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1lBQzlELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7d0dBN0dVLG9CQUFvQix3Q0FVckIsUUFBUSw4RUFHUixjQUFjOzRGQWJiLG9CQUFvQixxREE1QnJCOzs7Ozs7Ozs7R0FTVDs7NEZBbUJVLG9CQUFvQjtrQkE5QmhDLFNBQVM7K0JBQ0UsZUFBZSxZQUNmOzs7Ozs7Ozs7R0FTVDs7MEJBNkJFLE1BQU07MkJBQUMsUUFBUTs7MEJBR2YsTUFBTTsyQkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNZW1iZXJKdW5jdGlvbiAzLjAgQXV0aCBTaGVsbCBDb21wb25lbnRcbiAqXG4gKiBIYW5kbGVzIGF1dGhlbnRpY2F0aW9uIGZsb3cgYW5kIGluaXRpYWxpemF0aW9uIGZvciBNSiBhcHBsaWNhdGlvbnMuXG4gKiBUaGlzIGNvbXBvbmVudCBlbmNhcHN1bGF0ZXMgYWxsIHRoZSBhdXRoIGxvZ2ljIHRoYXQgd2FzIHByZXZpb3VzbHkgaW4gYXBwLmNvbXBvbmVudC50c1xuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU2V0UHJvZHVjdGlvblN0YXR1cywgTG9nRXJyb3IsIExvZ1N0YXR1cyB9IGZyb20gJ0BtZW1iZXJqdW5jdGlvbi9jb3JlJztcbmltcG9ydCB7IE1KQXV0aEJhc2UsIFN0YW5kYXJkVXNlckluZm8sIEF1dGhFcnJvclR5cGUgfSBmcm9tICdAbWVtYmVyanVuY3Rpb24vbmctYXV0aC1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBNSkluaXRpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2luaXRpYWxpemF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTUpFbnZpcm9ubWVudENvbmZpZywgTUpfRU5WSVJPTk1FTlQgfSBmcm9tICcuLi9ib290c3RyYXAudHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtai1hdXRoLXNoZWxsJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwibWotYXV0aC1zaGVsbFwiPlxuICAgICAgPG5nLWNvbnRlbnQgKm5nSWY9XCIhSGFzRXJyb3IgfHwgc2hvd1ZhbGlkYXRpb25Pbmx5XCI+PC9uZy1jb250ZW50PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwiSGFzRXJyb3IgJiYgIXNob3dWYWxpZGF0aW9uT25seVwiIGNsYXNzPVwiZXJyb3ItY29udGFpbmVyXCI+XG4gICAgICAgIDxoMj5FcnJvcjwvaDI+XG4gICAgICAgIDxwPnt7IEVycm9yTWVzc2FnZSB9fTwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgLm1qLWF1dGgtc2hlbGwge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG5cbiAgICAuZXJyb3ItY29udGFpbmVyIHtcbiAgICAgIHBhZGRpbmc6IDIwcHg7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgfVxuXG4gICAgLmVycm9yLWNvbnRhaW5lciBoMiB7XG4gICAgICBjb2xvcjogI2QzMmYyZjtcbiAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XG4gICAgfVxuICBgXVxufSlcbmV4cG9ydCBjbGFzcyBNSkF1dGhTaGVsbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHB1YmxpYyBIYXNFcnJvciA9IGZhbHNlO1xuICBwdWJsaWMgRXJyb3JNZXNzYWdlOiBhbnkgPSAnJztcbiAgcHVibGljIHNob3dWYWxpZGF0aW9uT25seSA9IGZhbHNlO1xuICBwdWJsaWMgc3ViSGVhZGVyVGV4dDogc3RyaW5nID0gXCJXZWxjb21lIGJhY2shIFBsZWFzZSBsb2cgaW4gdG8geW91ciBhY2NvdW50LlwiO1xuXG4gIHByaXZhdGUgaW5pdGlhbFBhdGggPSAnLyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwdWJsaWMgZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgIHB1YmxpYyBhdXRoQmFzZTogTUpBdXRoQmFzZSxcbiAgICBwcml2YXRlIGluaXRTZXJ2aWNlOiBNSkluaXRpYWxpemF0aW9uU2VydmljZSxcbiAgICBASW5qZWN0KE1KX0VOVklST05NRU5UKSBwcml2YXRlIGVudmlyb25tZW50OiBNSkVudmlyb25tZW50Q29uZmlnXG4gICkge31cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICBjb25zb2xlLmxvZygn8J+agCBNZW1iZXJKdW5jdGlvbiAzLjAgLSBBdXRoIFNoZWxsIEluaXRpYWxpemluZycpO1xuXG4gICAgU2V0UHJvZHVjdGlvblN0YXR1cyh0aGlzLmVudmlyb25tZW50LnByb2R1Y3Rpb24pO1xuICAgIHRoaXMuaW5pdGlhbFBhdGggPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyAod2luZG93LmxvY2F0aW9uLnNlYXJjaCA/IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggOiAnJyk7XG5cbiAgICBhd2FpdCB0aGlzLnNldHVwQXV0aCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBzdWNjZXNzZnVsIGxvZ2luIGFuZCBpbml0aWFsaXplIHRoZSBhcHBsaWNhdGlvblxuICAgKi9cbiAgYXN5bmMgaGFuZGxlTG9naW4odG9rZW46IHN0cmluZywgdXNlckluZm86IFN0YW5kYXJkVXNlckluZm8pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRva2VuKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgLy8gSW5pdGlhbGl6ZSBHcmFwaFFMIGNsaWVudFxuICAgICAgYXdhaXQgdGhpcy5pbml0U2VydmljZS5pbml0aWFsaXplR3JhcGhRTCh0b2tlbiwgdGhpcy5lbnZpcm9ubWVudCk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHVzZXIgYWNjZXNzIGFuZCByZWZyZXNoIGRhdGFcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLmluaXRTZXJ2aWNlLnZhbGlkYXRlVXNlckFjY2VzcygpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICB0aGlzLkhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5FcnJvck1lc3NhZ2UgPSB2YWxpZGF0aW9uUmVzdWx0LmVycm9yIS5tZXNzYWdlO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5FcnJvck1lc3NhZ2UpO1xuICAgICAgfVxuXG4gICAgICAvLyBSdW4gc3RhcnR1cCB2YWxpZGF0aW9uIGNoZWNrc1xuICAgICAgdGhpcy5pbml0U2VydmljZS5ydW5WYWxpZGF0aW9uQ2hlY2tzKCk7XG5cbiAgICAgIC8vIE5hdmlnYXRlIHRvIGluaXRpYWwgcm91dGVcbiAgICAgIHRoaXMuaW5pdFNlcnZpY2UubmF2aWdhdGVUb0luaXRpYWxSb3V0ZSh0aGlzLmluaXRpYWxQYXRoLCB0aGlzLmRvY3VtZW50KTtcblxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAvLyBDaGVjayBmb3Igbm8gcm9sZXMgZXJyb3JcbiAgICAgIGlmICh0aGlzLmluaXRTZXJ2aWNlLmlzTm9Vc2VyUm9sZXNFcnJvcihlcnIpKSB7XG4gICAgICAgIHRoaXMuc2hvd1ZhbGlkYXRpb25Pbmx5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5IYXNFcnJvciA9IHRydWU7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuaW5pdFNlcnZpY2UuaGFuZGxlTm9Sb2xlc0Vycm9yKCk7XG4gICAgICAgIHJldHVybjsgLy8gRG9uJ3QgdGhyb3csIGFsbG93IFVJIHRvIHNob3cgdmFsaWRhdGlvbiBiYW5uZXJcbiAgICAgIH1cblxuICAgICAgLy8gVHJ5IGF1dGggcmV0cnkgaWYgYXBwbGljYWJsZVxuICAgICAgY29uc3QgcmV0cmllZCA9IGF3YWl0IHRoaXMuaW5pdFNlcnZpY2UuaGFuZGxlQXV0aFJldHJ5KGVycik7XG4gICAgICBpZiAocmV0cmllZCkge1xuICAgICAgICByZXR1cm47IC8vIFJldHJ5IGluaXRpYXRlZFxuICAgICAgfVxuXG4gICAgICAvLyBTaG93IGVycm9yXG4gICAgICB0aGlzLkhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgIHRoaXMuRXJyb3JNZXNzYWdlID0gZXJyO1xuICAgICAgTG9nRXJyb3IoJ0Vycm9yIExvZ2dpbmcgSW46ICcgKyBlcnIpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR1cCBhdXRoZW50aWNhdGlvbiBhbmQgaGFuZGxlIGF1dGggc3RhdGUgY2hhbmdlc1xuICAgKi9cbiAgYXN5bmMgc2V0dXBBdXRoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEF1dGggcHJvdmlkZXIgYWxyZWFkeSBpbml0aWFsaXplZCBieSBBUFBfSU5JVElBTElaRVJcblxuICAgIC8vIExpc3RlbiBmb3IgdXNlciBpbmZvIGNoYW5nZXNcbiAgICB0aGlzLmF1dGhCYXNlLmdldFVzZXJJbmZvKClcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogYXN5bmMgKHVzZXJJbmZvKSA9PiB7XG4gICAgICAgICAgaWYgKHVzZXJJbmZvKSB7XG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuYXV0aEJhc2UuZ2V0SWRUb2tlbigpO1xuXG4gICAgICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVMb2dpbih0b2tlbiwgdXNlckluZm8pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVXNlciBpbmZvIGF2YWlsYWJsZSBidXQgbm8gdG9rZW4gZm91bmQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgTG9nRXJyb3IoJ0Vycm9yIExvZ2dpbmcgSW46ICcgKyBlcnIpO1xuICAgICAgICAgIHRoaXMuc3ViSGVhZGVyVGV4dCA9IHRoaXMuaW5pdFNlcnZpY2UuZ2V0QXV0aEVycm9yTWVzc2FnZShlcnIpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIC8vIENoZWNrIGlmIHVzZXIgaXMgYXV0aGVudGljYXRlZFxuICAgIHRoaXMuYXV0aEJhc2UuaXNBdXRoZW50aWNhdGVkKClcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKChsb2dnZWRJbjogYm9vbGVhbikgPT4ge1xuICAgICAgICBpZiAoIWxvZ2dlZEluKSB7XG4gICAgICAgICAgLy8gRGlzcGxheSBsb2dpbiBzY3JlZW4gLSBhdXRoIHN0YXRlIGlzIG1hbmFnZWQgYnkgcHJvdmlkZXJcbiAgICAgICAgICBjb25zb2xlLmxvZygnVXNlciBub3QgYXV0aGVudGljYXRlZCwgc2hvd2luZyBsb2dpbiBzY3JlZW4nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,186 @@
1
+ /**
2
+ * MemberJunction 3.0 Initialization Service
3
+ *
4
+ * Handles all core initialization tasks:
5
+ * - Generated entities loading
6
+ * - GraphQL client setup
7
+ * - Token refresh configuration
8
+ * - System validation
9
+ */
10
+ import { Injectable, Inject } from '@angular/core';
11
+ import { Metadata } from '@memberjunction/core';
12
+ import { setupGraphQLClient, GraphQLProviderConfigData } from '@memberjunction/graphql-dataprovider';
13
+ import { AuthErrorType } from '@memberjunction/ng-auth-services';
14
+ import { SharedService } from '@memberjunction/ng-shared';
15
+ import { MJ_STARTUP_VALIDATION } from '../bootstrap.types';
16
+ import * as i0 from "@angular/core";
17
+ import * as i1 from "@angular/router";
18
+ import * as i2 from "@memberjunction/ng-auth-services";
19
+ export class MJInitializationService {
20
+ router;
21
+ authBase;
22
+ startupValidationService;
23
+ constructor(router, authBase, startupValidationService) {
24
+ this.router = router;
25
+ this.authBase = authBase;
26
+ this.startupValidationService = startupValidationService;
27
+ }
28
+ /**
29
+ * Initialize GraphQL client with authentication token and refresh callback
30
+ */
31
+ async initializeGraphQL(token, environment) {
32
+ const url = environment.GRAPHQL_URI;
33
+ const wsurl = environment.GRAPHQL_WS_URI;
34
+ const start = Date.now();
35
+ const config = new GraphQLProviderConfigData(token, url, wsurl, async () => {
36
+ // Token refresh callback - refreshToken() returns StandardAuthToken directly or throws
37
+ const token = await this.authBase.refreshToken();
38
+ return token.idToken;
39
+ }, environment.MJ_CORE_SCHEMA_NAME);
40
+ await setupGraphQLClient(config);
41
+ const end = Date.now();
42
+ console.log(`✓ GraphQL Client Setup Complete: ${end - start}ms`);
43
+ }
44
+ /**
45
+ * Refresh shared data and validate user access
46
+ */
47
+ async validateUserAccess() {
48
+ await SharedService.RefreshData(true);
49
+ const md = new Metadata();
50
+ if (!md.CurrentUser) {
51
+ return {
52
+ success: false,
53
+ error: {
54
+ message: "You don't have access to the application, contact your system administrator.",
55
+ type: 'no_access'
56
+ }
57
+ };
58
+ }
59
+ return { success: true };
60
+ }
61
+ /**
62
+ * Run startup validation checks (if validation service is provided)
63
+ */
64
+ runValidationChecks() {
65
+ if (!this.startupValidationService) {
66
+ return; // No validation service provided
67
+ }
68
+ // Small delay to ensure everything is initialized
69
+ setTimeout(() => {
70
+ this.startupValidationService?.validateSystemSetup();
71
+ }, 500);
72
+ }
73
+ /**
74
+ * Navigate to initial route after successful login
75
+ */
76
+ navigateToInitialRoute(initialPath, document) {
77
+ localStorage.removeItem('jwt-retry-ts');
78
+ if (initialPath === '/') {
79
+ // Use first nav item instead
80
+ setTimeout(() => {
81
+ // Find the KendoDrawer element and simulate a click for the first item
82
+ const drawerElement = document.querySelector('li.k-drawer-item.k-level-0');
83
+ if (drawerElement)
84
+ drawerElement.click();
85
+ }, 10); // Wait for the drawer to finish render
86
+ }
87
+ else {
88
+ this.router.navigateByUrl(initialPath, { replaceUrl: true });
89
+ }
90
+ }
91
+ /**
92
+ * Check if error is related to missing user roles
93
+ */
94
+ isNoUserRolesError(err) {
95
+ try {
96
+ if (!err || typeof err !== 'object')
97
+ return false;
98
+ // Check for GraphQL-style errors
99
+ if (err.response && Array.isArray(err.response.errors)) {
100
+ return err.response.errors.some((e) => e && e.message && typeof e.message === 'string' &&
101
+ e.message.includes('does not have read permissions on User Roles'));
102
+ }
103
+ // Check for specific "ResourceTypes" error
104
+ if (err.toString && typeof err.toString === 'function') {
105
+ const errorString = err.toString();
106
+ if (errorString.includes("Cannot read properties of undefined (reading 'ResourceTypes')")) {
107
+ return true;
108
+ }
109
+ }
110
+ // Check for error message directly on the error object
111
+ if (err.message && typeof err.message === 'string') {
112
+ const message = err.message;
113
+ return message.includes('does not have read permissions on User Roles') ||
114
+ message.includes("Cannot read properties of undefined (reading 'ResourceTypes')");
115
+ }
116
+ // Check for nested error object
117
+ if (err.error && typeof err.error === 'object') {
118
+ return this.isNoUserRolesError(err.error);
119
+ }
120
+ return false;
121
+ }
122
+ catch (e) {
123
+ console.error('Error while checking for user roles error:', e);
124
+ return false;
125
+ }
126
+ }
127
+ /**
128
+ * Handle no roles error by showing validation banner (if validation service is provided)
129
+ */
130
+ handleNoRolesError() {
131
+ this.startupValidationService?.addNoRolesValidationIssue();
132
+ return {
133
+ success: false,
134
+ error: {
135
+ message: 'User has no roles assigned',
136
+ type: 'no_roles',
137
+ showValidationOnly: true
138
+ }
139
+ };
140
+ }
141
+ /**
142
+ * Handle authentication retry logic
143
+ */
144
+ async handleAuthRetry(err) {
145
+ const retryKey = 'auth-retry-dt';
146
+ const lastRetryDateTime = localStorage.getItem(retryKey);
147
+ const yesterday = +new Date(Date.now() - 1 * 24 * 60 * 60 * 1000);
148
+ const retriedRecently = lastRetryDateTime && +new Date(lastRetryDateTime) > yesterday;
149
+ const authError = this.authBase.classifyError(err);
150
+ const isTokenExpired = authError.type === AuthErrorType.TOKEN_EXPIRED;
151
+ if (!retriedRecently && isTokenExpired) {
152
+ console.log('JWT Expired, retrying once: ' + err);
153
+ localStorage.setItem(retryKey, new Date().toISOString());
154
+ await this.authBase.login({ appState: { target: window.location.pathname } }).toPromise();
155
+ return true;
156
+ }
157
+ return false;
158
+ }
159
+ /**
160
+ * Get auth error message for display
161
+ */
162
+ getAuthErrorMessage(err) {
163
+ const authError = this.authBase.classifyError(err);
164
+ switch (authError.type) {
165
+ case AuthErrorType.NO_ACTIVE_SESSION:
166
+ return "Welcome back! Please log in to your account.";
167
+ case AuthErrorType.INTERACTION_REQUIRED:
168
+ case AuthErrorType.TOKEN_EXPIRED:
169
+ return "Your session has expired. Please log in to your account.";
170
+ default:
171
+ return authError.userMessage || "Welcome back! Please log in to your account.";
172
+ }
173
+ }
174
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MJInitializationService, deps: [{ token: i1.Router }, { token: i2.MJAuthBase }, { token: MJ_STARTUP_VALIDATION }], target: i0.ɵɵFactoryTarget.Injectable });
175
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MJInitializationService, providedIn: 'root' });
176
+ }
177
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MJInitializationService, decorators: [{
178
+ type: Injectable,
179
+ args: [{
180
+ providedIn: 'root'
181
+ }]
182
+ }], ctorParameters: () => [{ type: i1.Router }, { type: i2.MJAuthBase }, { type: undefined, decorators: [{
183
+ type: Inject,
184
+ args: [MJ_STARTUP_VALIDATION]
185
+ }] }] });
186
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdGlhbGl6YXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvaW5pdGlhbGl6YXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNyRyxPQUFPLEVBQWdDLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQy9GLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQW1FLHFCQUFxQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7QUFjNUgsTUFBTSxPQUFPLHVCQUF1QjtJQUV4QjtJQUNBO0lBQytCO0lBSHpDLFlBQ1UsTUFBYyxFQUNkLFFBQW9CLEVBQ1csd0JBQTJEO1FBRjFGLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxhQUFRLEdBQVIsUUFBUSxDQUFZO1FBQ1csNkJBQXdCLEdBQXhCLHdCQUF3QixDQUFtQztJQUNqRyxDQUFDO0lBRUo7O09BRUc7SUFDSCxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBYSxFQUFFLFdBQWdDO1FBQ3JFLE1BQU0sR0FBRyxHQUFXLFdBQVcsQ0FBQyxXQUFXLENBQUM7UUFDNUMsTUFBTSxLQUFLLEdBQVcsV0FBVyxDQUFDLGNBQWMsQ0FBQztRQUVqRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDekIsTUFBTSxNQUFNLEdBQUcsSUFBSSx5QkFBeUIsQ0FDMUMsS0FBSyxFQUNMLEdBQUcsRUFDSCxLQUFLLEVBQ0wsS0FBSyxJQUFJLEVBQUU7WUFD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Q0FBQyxDQUFDO1FBRW5ELFFBQVEsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZCLEtBQUssYUFBYSxDQUFDLGlCQUFpQjtnQkFDbEMsT0FBTyw4Q0FBOEMsQ0FBQztZQUN4RCxLQUFLLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQztZQUN4QyxLQUFLLGFBQWEsQ0FBQyxhQUFhO2dCQUM5QixPQUFPLDBEQUEwRCxDQUFDO1lBQ3BFO2dCQUNFLE9BQU8sU0FBUyxDQUFDLFdBQVcsSUFBSSw4Q0FBOEMsQ0FBQztRQUNuRixDQUFDO0lBQ0gsQ0FBQzt3R0FwTFUsdUJBQXVCLGtFQUl4QixxQkFBcUI7NEdBSnBCLHVCQUF1QixjQUZ0QixNQUFNOzs0RkFFUCx1QkFBdUI7a0JBSG5DLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFLSSxNQUFNOzJCQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWVtYmVySnVuY3Rpb24gMy4wIEluaXRpYWxpemF0aW9uIFNlcnZpY2VcbiAqXG4gKiBIYW5kbGVzIGFsbCBjb3JlIGluaXRpYWxpemF0aW9uIHRhc2tzOlxuICogLSBHZW5lcmF0ZWQgZW50aXRpZXMgbG9hZGluZ1xuICogLSBHcmFwaFFMIGNsaWVudCBzZXR1cFxuICogLSBUb2tlbiByZWZyZXNoIGNvbmZpZ3VyYXRpb25cbiAqIC0gU3lzdGVtIHZhbGlkYXRpb25cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gJ0BtZW1iZXJqdW5jdGlvbi9jb3JlJztcbmltcG9ydCB7IHNldHVwR3JhcGhRTENsaWVudCwgR3JhcGhRTFByb3ZpZGVyQ29uZmlnRGF0YSB9IGZyb20gJ0BtZW1iZXJqdW5jdGlvbi9ncmFwaHFsLWRhdGFwcm92aWRlcic7XG5pbXBvcnQgeyBNSkF1dGhCYXNlLCBTdGFuZGFyZFVzZXJJbmZvLCBBdXRoRXJyb3JUeXBlIH0gZnJvbSAnQG1lbWJlcmp1bmN0aW9uL25nLWF1dGgtc2VydmljZXMnO1xuaW1wb3J0IHsgU2hhcmVkU2VydmljZSB9IGZyb20gJ0BtZW1iZXJqdW5jdGlvbi9uZy1zaGFyZWQnO1xuaW1wb3J0IHsgTUpFbnZpcm9ubWVudENvbmZpZywgTUpfRU5WSVJPTk1FTlQsIE1KU3RhcnR1cFZhbGlkYXRpb25TZXJ2aWNlLCBNSl9TVEFSVFVQX1ZBTElEQVRJT04gfSBmcm9tICcuLi9ib290c3RyYXAudHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEluaXRpYWxpemF0aW9uUmVzdWx0IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgZXJyb3I/OiB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIHR5cGU6ICdub19hY2Nlc3MnIHwgJ25vX3JvbGVzJyB8ICdhdXRoX2Vycm9yJyB8ICd1bmtub3duJztcbiAgICBzaG93VmFsaWRhdGlvbk9ubHk/OiBib29sZWFuO1xuICB9O1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBNSkluaXRpYWxpemF0aW9uU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBhdXRoQmFzZTogTUpBdXRoQmFzZSxcbiAgICBASW5qZWN0KE1KX1NUQVJUVVBfVkFMSURBVElPTikgcHJpdmF0ZSBzdGFydHVwVmFsaWRhdGlvblNlcnZpY2U6IE1KU3RhcnR1cFZhbGlkYXRpb25TZXJ2aWNlIHwgbnVsbFxuICApIHt9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgR3JhcGhRTCBjbGllbnQgd2l0aCBhdXRoZW50aWNhdGlvbiB0b2tlbiBhbmQgcmVmcmVzaCBjYWxsYmFja1xuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZUdyYXBoUUwodG9rZW46IHN0cmluZywgZW52aXJvbm1lbnQ6IE1KRW52aXJvbm1lbnRDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1cmw6IHN0cmluZyA9IGVudmlyb25tZW50LkdSQVBIUUxfVVJJO1xuICAgIGNvbnN0IHdzdXJsOiBzdHJpbmcgPSBlbnZpcm9ubWVudC5HUkFQSFFMX1dTX1VSSTtcblxuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBjb25maWcgPSBuZXcgR3JhcGhRTFByb3ZpZGVyQ29uZmlnRGF0YShcbiAgICAgIHRva2VuLFxuICAgICAgdXJsLFxuICAgICAgd3N1cmwsXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIFRva2VuIHJlZnJlc2ggY2FsbGJhY2sgLSByZWZyZXNoVG9rZW4oKSByZXR1cm5zIFN0YW5kYXJkQXV0aFRva2VuIGRpcmVjdGx5IG9yIHRocm93c1xuICAgICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuYXV0aEJhc2UucmVmcmVzaFRva2VuKCk7XG4gICAgICAgIHJldHVybiB0b2tlbi5pZFRva2VuO1xuICAgICAgfSxcbiAgICAgIGVudmlyb25tZW50Lk1KX0NPUkVfU0NIRU1BX05BTUVcbiAgICApO1xuXG4gICAgYXdhaXQgc2V0dXBHcmFwaFFMQ2xpZW50KGNvbmZpZyk7XG4gICAgY29uc3QgZW5kID0gRGF0ZS5ub3coKTtcbiAgICBjb25zb2xlLmxvZyhg4pyTIEdyYXBoUUwgQ2xpZW50IFNldHVwIENvbXBsZXRlOiAke2VuZCAtIHN0YXJ0fW1zYCk7XG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzaCBzaGFyZWQgZGF0YSBhbmQgdmFsaWRhdGUgdXNlciBhY2Nlc3NcbiAgICovXG4gIGFzeW5jIHZhbGlkYXRlVXNlckFjY2VzcygpOiBQcm9taXNlPEluaXRpYWxpemF0aW9uUmVzdWx0PiB7XG4gICAgYXdhaXQgU2hhcmVkU2VydmljZS5SZWZyZXNoRGF0YSh0cnVlKTtcblxuICAgIGNvbnN0IG1kID0gbmV3IE1ldGFkYXRhKCk7XG5cbiAgICBpZiAoIW1kLkN1cnJlbnRVc2VyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBtZXNzYWdlOiBcIllvdSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUgYXBwbGljYXRpb24sIGNvbnRhY3QgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvci5cIixcbiAgICAgICAgICB0eXBlOiAnbm9fYWNjZXNzJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gc3RhcnR1cCB2YWxpZGF0aW9uIGNoZWNrcyAoaWYgdmFsaWRhdGlvbiBzZXJ2aWNlIGlzIHByb3ZpZGVkKVxuICAgKi9cbiAgcnVuVmFsaWRhdGlvbkNoZWNrcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3RhcnR1cFZhbGlkYXRpb25TZXJ2aWNlKSB7XG4gICAgICByZXR1cm47IC8vIE5vIHZhbGlkYXRpb24gc2VydmljZSBwcm92aWRlZFxuICAgIH1cblxuICAgIC8vIFNtYWxsIGRlbGF5IHRvIGVuc3VyZSBldmVyeXRoaW5nIGlzIGluaXRpYWxpemVkXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnN0YXJ0dXBWYWxpZGF0aW9uU2VydmljZT8udmFsaWRhdGVTeXN0ZW1TZXR1cCgpO1xuICAgIH0sIDUwMCk7XG4gIH1cblxuICAvKipcbiAgICogTmF2aWdhdGUgdG8gaW5pdGlhbCByb3V0ZSBhZnRlciBzdWNjZXNzZnVsIGxvZ2luXG4gICAqL1xuICBuYXZpZ2F0ZVRvSW5pdGlhbFJvdXRlKGluaXRpYWxQYXRoOiBzdHJpbmcsIGRvY3VtZW50OiBEb2N1bWVudCk6IHZvaWQge1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdqd3QtcmV0cnktdHMnKTtcblxuICAgIGlmIChpbml0aWFsUGF0aCA9PT0gJy8nKSB7XG4gICAgICAvLyBVc2UgZmlyc3QgbmF2IGl0ZW0gaW5zdGVhZFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIC8vIEZpbmQgdGhlIEtlbmRvRHJhd2VyIGVsZW1lbnQgYW5kIHNpbXVsYXRlIGEgY2xpY2sgZm9yIHRoZSBmaXJzdCBpdGVtXG4gICAgICAgIGNvbnN0IGRyYXdlckVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdsaS5rLWRyYXdlci1pdGVtLmstbGV2ZWwtMCcpIGFzIGFueTtcbiAgICAgICAgaWYgKGRyYXdlckVsZW1lbnQpIGRyYXdlckVsZW1lbnQuY2xpY2soKTtcbiAgICAgIH0sIDEwKTsgLy8gV2FpdCBmb3IgdGhlIGRyYXdlciB0byBmaW5pc2ggcmVuZGVyXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoaW5pdGlhbFBhdGgsIHsgcmVwbGFjZVVybDogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZXJyb3IgaXMgcmVsYXRlZCB0byBtaXNzaW5nIHVzZXIgcm9sZXNcbiAgICovXG4gIGlzTm9Vc2VyUm9sZXNFcnJvcihlcnI6IGFueSk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIWVyciB8fCB0eXBlb2YgZXJyICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBDaGVjayBmb3IgR3JhcGhRTC1zdHlsZSBlcnJvcnNcbiAgICAgIGlmIChlcnIucmVzcG9uc2UgJiYgQXJyYXkuaXNBcnJheShlcnIucmVzcG9uc2UuZXJyb3JzKSkge1xuICAgICAgICByZXR1cm4gZXJyLnJlc3BvbnNlLmVycm9ycy5zb21lKChlOiBhbnkpID0+XG4gICAgICAgICAgZSAmJiBlLm1lc3NhZ2UgJiYgdHlwZW9mIGUubWVzc2FnZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICBlLm1lc3NhZ2UuaW5jbHVkZXMoJ2RvZXMgbm90IGhhdmUgcmVhZCBwZXJtaXNzaW9ucyBvbiBVc2VyIFJvbGVzJylcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgZm9yIHNwZWNpZmljIFwiUmVzb3VyY2VUeXBlc1wiIGVycm9yXG4gICAgICBpZiAoZXJyLnRvU3RyaW5nICYmIHR5cGVvZiBlcnIudG9TdHJpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc3QgZXJyb3JTdHJpbmcgPSBlcnIudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKGVycm9yU3RyaW5nLmluY2x1ZGVzKFwiQ2Fubm90IHJlYWQgcHJvcGVydGllcyBvZiB1bmRlZmluZWQgKHJlYWRpbmcgJ1Jlc291cmNlVHlwZXMnKVwiKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGZvciBlcnJvciBtZXNzYWdlIGRpcmVjdGx5IG9uIHRoZSBlcnJvciBvYmplY3RcbiAgICAgIGlmIChlcnIubWVzc2FnZSAmJiB0eXBlb2YgZXJyLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnIubWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2UuaW5jbHVkZXMoJ2RvZXMgbm90IGhhdmUgcmVhZCBwZXJtaXNzaW9ucyBvbiBVc2VyIFJvbGVzJykgfHxcbiAgICAgICAgICAgICAgIG1lc3NhZ2UuaW5jbHVkZXMoXCJDYW5ub3QgcmVhZCBwcm9wZXJ0aWVzIG9mIHVuZGVmaW5lZCAocmVhZGluZyAnUmVzb3VyY2VUeXBlcycpXCIpO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBmb3IgbmVzdGVkIGVycm9yIG9iamVjdFxuICAgICAgaWYgKGVyci5lcnJvciAmJiB0eXBlb2YgZXJyLmVycm9yID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gdGhpcy5pc05vVXNlclJvbGVzRXJyb3IoZXJyLmVycm9yKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdoaWxlIGNoZWNraW5nIGZvciB1c2VyIHJvbGVzIGVycm9yOicsIGUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgbm8gcm9sZXMgZXJyb3IgYnkgc2hvd2luZyB2YWxpZGF0aW9uIGJhbm5lciAoaWYgdmFsaWRhdGlvbiBzZXJ2aWNlIGlzIHByb3ZpZGVkKVxuICAgKi9cbiAgaGFuZGxlTm9Sb2xlc0Vycm9yKCk6IEluaXRpYWxpemF0aW9uUmVzdWx0IHtcbiAgICB0aGlzLnN0YXJ0dXBWYWxpZGF0aW9uU2VydmljZT8uYWRkTm9Sb2xlc1ZhbGlkYXRpb25Jc3N1ZSgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgZXJyb3I6IHtcbiAgICAgICAgbWVzc2FnZTogJ1VzZXIgaGFzIG5vIHJvbGVzIGFzc2lnbmVkJyxcbiAgICAgICAgdHlwZTogJ25vX3JvbGVzJyxcbiAgICAgICAgc2hvd1ZhbGlkYXRpb25Pbmx5OiB0cnVlXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgYXV0aGVudGljYXRpb24gcmV0cnkgbG9naWNcbiAgICovXG4gIGFzeW5jIGhhbmRsZUF1dGhSZXRyeShlcnI6IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHJldHJ5S2V5ID0gJ2F1dGgtcmV0cnktZHQnO1xuICAgIGNvbnN0IGxhc3RSZXRyeURhdGVUaW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0ocmV0cnlLZXkpO1xuICAgIGNvbnN0IHllc3RlcmRheSA9ICtuZXcgRGF0ZShEYXRlLm5vdygpIC0gMSAqIDI0ICogNjAgKiA2MCAqIDEwMDApO1xuICAgIGNvbnN0IHJldHJpZWRSZWNlbnRseSA9IGxhc3RSZXRyeURhdGVUaW1lICYmICtuZXcgRGF0ZShsYXN0UmV0cnlEYXRlVGltZSkgPiB5ZXN0ZXJkYXk7XG5cbiAgICBjb25zdCBhdXRoRXJyb3IgPSB0aGlzLmF1dGhCYXNlLmNsYXNzaWZ5RXJyb3IoZXJyKTtcbiAgICBjb25zdCBpc1Rva2VuRXhwaXJlZCA9IGF1dGhFcnJvci50eXBlID09PSBBdXRoRXJyb3JUeXBlLlRPS0VOX0VYUElSRUQ7XG5cbiAgICBpZiAoIXJldHJpZWRSZWNlbnRseSAmJiBpc1Rva2VuRXhwaXJlZCkge1xuICAgICAgY29uc29sZS5sb2coJ0pXVCBFeHBpcmVkLCByZXRyeWluZyBvbmNlOiAnICsgZXJyKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHJldHJ5S2V5LCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkpO1xuICAgICAgYXdhaXQgdGhpcy5hdXRoQmFzZS5sb2dpbih7IGFwcFN0YXRlOiB7IHRhcmdldDogd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lIH0gfSkudG9Qcm9taXNlKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGF1dGggZXJyb3IgbWVzc2FnZSBmb3IgZGlzcGxheVxuICAgKi9cbiAgZ2V0QXV0aEVycm9yTWVzc2FnZShlcnI6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGNvbnN0IGF1dGhFcnJvciA9IHRoaXMuYXV0aEJhc2UuY2xhc3NpZnlFcnJvcihlcnIpO1xuXG4gICAgc3dpdGNoIChhdXRoRXJyb3IudHlwZSkge1xuICAgICAgY2FzZSBBdXRoRXJyb3JUeXBlLk5PX0FDVElWRV9TRVNTSU9OOlxuICAgICAgICByZXR1cm4gXCJXZWxjb21lIGJhY2shIFBsZWFzZSBsb2cgaW4gdG8geW91ciBhY2NvdW50LlwiO1xuICAgICAgY2FzZSBBdXRoRXJyb3JUeXBlLklOVEVSQUNUSU9OX1JFUVVJUkVEOlxuICAgICAgY2FzZSBBdXRoRXJyb3JUeXBlLlRPS0VOX0VYUElSRUQ6XG4gICAgICAgIHJldHVybiBcIllvdXIgc2Vzc2lvbiBoYXMgZXhwaXJlZC4gUGxlYXNlIGxvZyBpbiB0byB5b3VyIGFjY291bnQuXCI7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYXV0aEVycm9yLnVzZXJNZXNzYWdlIHx8IFwiV2VsY29tZSBiYWNrISBQbGVhc2UgbG9nIGluIHRvIHlvdXIgYWNjb3VudC5cIjtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYmVyanVuY3Rpb24tbmctYm9vdHN0cmFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21lbWJlcmp1bmN0aW9uLW5nLWJvb3RzdHJhcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Public API Surface of @memberjunction/ng-bootstrap
3
+ */
4
+ export * from './lib/bootstrap.module';
5
+ export * from './lib/bootstrap.component';
6
+ export * from './lib/bootstrap.types';
7
+ export * from './lib/services/initialization.service';
8
+ export * from './lib/components/auth-shell.component';
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyx1Q0FBdUMsQ0FBQztBQUN0RCxjQUFjLHVDQUF1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2YgQG1lbWJlcmp1bmN0aW9uL25nLWJvb3RzdHJhcFxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL2Jvb3RzdHJhcC5tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvYm9vdHN0cmFwLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9ib290c3RyYXAudHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2VydmljZXMvaW5pdGlhbGl6YXRpb24uc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2F1dGgtc2hlbGwuY29tcG9uZW50JztcbiJdfQ==