@memberjunction/ng-bootstrap 3.4.0 → 4.1.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.
- package/README.md +78 -150
- package/fesm2022/memberjunction-ng-bootstrap.mjs +476 -38
- package/fesm2022/memberjunction-ng-bootstrap.mjs.map +1 -1
- package/package.json +26 -15
- package/types/memberjunction-ng-bootstrap.d.ts +251 -0
- package/esm2022/lib/bootstrap.component.mjs +0 -38
- package/esm2022/lib/bootstrap.module.mjs +0 -98
- package/esm2022/lib/bootstrap.types.mjs +0 -13
- package/esm2022/lib/components/auth-shell.component.mjs +0 -148
- package/esm2022/lib/services/initialization.service.mjs +0 -186
- package/esm2022/memberjunction-ng-bootstrap.mjs +0 -5
- package/esm2022/public-api.mjs +0 -9
- package/index.d.ts +0 -5
- package/lib/bootstrap.component.d.ts +0 -16
- package/lib/bootstrap.module.d.ts +0 -63
- package/lib/bootstrap.types.d.ts +0 -72
- package/lib/components/auth-shell.component.d.ts +0 -36
- package/lib/services/initialization.service.d.ts +0 -52
- package/public-api.d.ts +0 -8
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MemberJunction 3.0 Bootstrap Module
|
|
3
|
-
*
|
|
4
|
-
* Provides the MJBootstrapComponent and all necessary services for MemberJunction Angular applications.
|
|
5
|
-
* This module encapsulates all the authentication and initialization logic that was previously
|
|
6
|
-
* spread across app.component.ts and app.module.ts.
|
|
7
|
-
*
|
|
8
|
-
* Usage:
|
|
9
|
-
* ```typescript
|
|
10
|
-
* import { LoadGeneratedEntities } from 'mj_generatedentities';
|
|
11
|
-
* LoadGeneratedEntities(); // Prevent tree shaking
|
|
12
|
-
*
|
|
13
|
-
* @NgModule({
|
|
14
|
-
* imports: [
|
|
15
|
-
* BrowserModule,
|
|
16
|
-
* BrowserAnimationsModule,
|
|
17
|
-
* MJBootstrapModule.forRoot(environment),
|
|
18
|
-
* // ... other MJ modules
|
|
19
|
-
* ],
|
|
20
|
-
* bootstrap: [AppComponent]
|
|
21
|
-
* })
|
|
22
|
-
* export class AppModule {}
|
|
23
|
-
* ```
|
|
24
|
-
*/
|
|
25
|
-
import { NgModule, APP_INITIALIZER } from '@angular/core';
|
|
26
|
-
import { CommonModule } from '@angular/common';
|
|
27
|
-
import { MJBootstrapComponent } from './bootstrap.component';
|
|
28
|
-
import { MJAuthShellComponent } from './components/auth-shell.component';
|
|
29
|
-
import { MJ_ENVIRONMENT } from './bootstrap.types';
|
|
30
|
-
import { MJAuthBase } from '@memberjunction/ng-auth-services';
|
|
31
|
-
import * as i0 from "@angular/core";
|
|
32
|
-
/**
|
|
33
|
-
* Initialize auth provider before Angular routing starts
|
|
34
|
-
* This ensures auth providers can process OAuth redirect responses before Angular's router
|
|
35
|
-
* consumes the URL hash
|
|
36
|
-
*/
|
|
37
|
-
export function initializeAuth(authService) {
|
|
38
|
-
return () => authService.initialize();
|
|
39
|
-
}
|
|
40
|
-
export class MJBootstrapModule {
|
|
41
|
-
/**
|
|
42
|
-
* Configure the bootstrap module with environment settings
|
|
43
|
-
*
|
|
44
|
-
* @param environment - Environment configuration for the application
|
|
45
|
-
* @returns ModuleWithProviders with environment configuration and all services
|
|
46
|
-
*
|
|
47
|
-
* @example
|
|
48
|
-
* ```typescript
|
|
49
|
-
* import { environment } from '../environments/environment';
|
|
50
|
-
* import { LoadGeneratedEntities } from 'mj_generatedentities';
|
|
51
|
-
* LoadGeneratedEntities();
|
|
52
|
-
*
|
|
53
|
-
* @NgModule({
|
|
54
|
-
* imports: [
|
|
55
|
-
* MJBootstrapModule.forRoot(environment)
|
|
56
|
-
* ]
|
|
57
|
-
* })
|
|
58
|
-
* export class AppModule {}
|
|
59
|
-
* ```
|
|
60
|
-
*/
|
|
61
|
-
static forRoot(environment) {
|
|
62
|
-
return {
|
|
63
|
-
ngModule: MJBootstrapModule,
|
|
64
|
-
providers: [
|
|
65
|
-
{ provide: MJ_ENVIRONMENT, useValue: environment },
|
|
66
|
-
// MJInitializationService uses providedIn: 'root'
|
|
67
|
-
{
|
|
68
|
-
provide: APP_INITIALIZER,
|
|
69
|
-
useFactory: initializeAuth,
|
|
70
|
-
deps: [MJAuthBase],
|
|
71
|
-
multi: true
|
|
72
|
-
}
|
|
73
|
-
]
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MJBootstrapModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
77
|
-
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: MJBootstrapModule, declarations: [MJBootstrapComponent,
|
|
78
|
-
MJAuthShellComponent], imports: [CommonModule], exports: [MJBootstrapComponent,
|
|
79
|
-
MJAuthShellComponent] });
|
|
80
|
-
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MJBootstrapModule, imports: [CommonModule] });
|
|
81
|
-
}
|
|
82
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MJBootstrapModule, decorators: [{
|
|
83
|
-
type: NgModule,
|
|
84
|
-
args: [{
|
|
85
|
-
declarations: [
|
|
86
|
-
MJBootstrapComponent,
|
|
87
|
-
MJAuthShellComponent
|
|
88
|
-
],
|
|
89
|
-
imports: [
|
|
90
|
-
CommonModule
|
|
91
|
-
],
|
|
92
|
-
exports: [
|
|
93
|
-
MJBootstrapComponent,
|
|
94
|
-
MJAuthShellComponent
|
|
95
|
-
]
|
|
96
|
-
}]
|
|
97
|
-
}] });
|
|
98
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYm9vdHN0cmFwLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFFSCxPQUFPLEVBQUUsUUFBUSxFQUF1QixlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRXpFLE9BQU8sRUFBdUIsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDeEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOztBQUU5RDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxXQUF1QjtJQUNwRCxPQUFPLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUN4QyxDQUFDO0FBZUQsTUFBTSxPQUFPLGlCQUFpQjtJQUM1Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQW1CRztJQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBZ0M7UUFDN0MsT0FBTztZQUNMLFFBQVEsRUFBRSxpQkFBaUI7WUFDM0IsU0FBUyxFQUFFO2dCQUNULEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFO2dCQUNsRCxrREFBa0Q7Z0JBQ2xEO29CQUNFLE9BQU8sRUFBRSxlQUFlO29CQUN4QixVQUFVLEVBQUUsY0FBYztvQkFDMUIsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDO29CQUNsQixLQUFLLEVBQUUsSUFBSTtpQkFDWjthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7d0dBbkNVLGlCQUFpQjt5R0FBakIsaUJBQWlCLGlCQVgxQixvQkFBb0I7WUFDcEIsb0JBQW9CLGFBR3BCLFlBQVksYUFHWixvQkFBb0I7WUFDcEIsb0JBQW9CO3lHQUdYLGlCQUFpQixZQVAxQixZQUFZOzs0RkFPSCxpQkFBaUI7a0JBYjdCLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFO3dCQUNaLG9CQUFvQjt3QkFDcEIsb0JBQW9CO3FCQUNyQjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsWUFBWTtxQkFDYjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1Asb0JBQW9CO3dCQUNwQixvQkFBb0I7cUJBQ3JCO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNZW1iZXJKdW5jdGlvbiAzLjAgQm9vdHN0cmFwIE1vZHVsZVxuICpcbiAqIFByb3ZpZGVzIHRoZSBNSkJvb3RzdHJhcENvbXBvbmVudCBhbmQgYWxsIG5lY2Vzc2FyeSBzZXJ2aWNlcyBmb3IgTWVtYmVySnVuY3Rpb24gQW5ndWxhciBhcHBsaWNhdGlvbnMuXG4gKiBUaGlzIG1vZHVsZSBlbmNhcHN1bGF0ZXMgYWxsIHRoZSBhdXRoZW50aWNhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24gbG9naWMgdGhhdCB3YXMgcHJldmlvdXNseVxuICogc3ByZWFkIGFjcm9zcyBhcHAuY29tcG9uZW50LnRzIGFuZCBhcHAubW9kdWxlLnRzLlxuICpcbiAqIFVzYWdlOlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgTG9hZEdlbmVyYXRlZEVudGl0aWVzIH0gZnJvbSAnbWpfZ2VuZXJhdGVkZW50aXRpZXMnO1xuICogTG9hZEdlbmVyYXRlZEVudGl0aWVzKCk7IC8vIFByZXZlbnQgdHJlZSBzaGFraW5nXG4gKlxuICogQE5nTW9kdWxlKHtcbiAqICAgaW1wb3J0czogW1xuICogICAgIEJyb3dzZXJNb2R1bGUsXG4gKiAgICAgQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUsXG4gKiAgICAgTUpCb290c3RyYXBNb2R1bGUuZm9yUm9vdChlbnZpcm9ubWVudCksXG4gKiAgICAgLy8gLi4uIG90aGVyIE1KIG1vZHVsZXNcbiAqICAgXSxcbiAqICAgYm9vdHN0cmFwOiBbQXBwQ29tcG9uZW50XVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge31cbiAqIGBgYFxuICovXG5cbmltcG9ydCB7IE5nTW9kdWxlLCBNb2R1bGVXaXRoUHJvdmlkZXJzLCBBUFBfSU5JVElBTElaRVIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNSkJvb3RzdHJhcENvbXBvbmVudCB9IGZyb20gJy4vYm9vdHN0cmFwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNSkF1dGhTaGVsbENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9hdXRoLXNoZWxsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNSkluaXRpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvaW5pdGlhbGl6YXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBNSkVudmlyb25tZW50Q29uZmlnLCBNSl9FTlZJUk9OTUVOVCB9IGZyb20gJy4vYm9vdHN0cmFwLnR5cGVzJztcbmltcG9ydCB7IE1KQXV0aEJhc2UgfSBmcm9tICdAbWVtYmVyanVuY3Rpb24vbmctYXV0aC1zZXJ2aWNlcyc7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhdXRoIHByb3ZpZGVyIGJlZm9yZSBBbmd1bGFyIHJvdXRpbmcgc3RhcnRzXG4gKiBUaGlzIGVuc3VyZXMgYXV0aCBwcm92aWRlcnMgY2FuIHByb2Nlc3MgT0F1dGggcmVkaXJlY3QgcmVzcG9uc2VzIGJlZm9yZSBBbmd1bGFyJ3Mgcm91dGVyXG4gKiBjb25zdW1lcyB0aGUgVVJMIGhhc2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVBdXRoKGF1dGhTZXJ2aWNlOiBNSkF1dGhCYXNlKTogKCkgPT4gUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiAoKSA9PiBhdXRoU2VydmljZS5pbml0aWFsaXplKCk7XG59XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1xuICAgIE1KQm9vdHN0cmFwQ29tcG9uZW50LFxuICAgIE1KQXV0aFNoZWxsQ29tcG9uZW50XG4gIF0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGVcbiAgXSxcbiAgZXhwb3J0czogW1xuICAgIE1KQm9vdHN0cmFwQ29tcG9uZW50LFxuICAgIE1KQXV0aFNoZWxsQ29tcG9uZW50XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTUpCb290c3RyYXBNb2R1bGUge1xuICAvKipcbiAgICogQ29uZmlndXJlIHRoZSBib290c3RyYXAgbW9kdWxlIHdpdGggZW52aXJvbm1lbnQgc2V0dGluZ3NcbiAgICpcbiAgICogQHBhcmFtIGVudmlyb25tZW50IC0gRW52aXJvbm1lbnQgY29uZmlndXJhdGlvbiBmb3IgdGhlIGFwcGxpY2F0aW9uXG4gICAqIEByZXR1cm5zIE1vZHVsZVdpdGhQcm92aWRlcnMgd2l0aCBlbnZpcm9ubWVudCBjb25maWd1cmF0aW9uIGFuZCBhbGwgc2VydmljZXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBpbXBvcnQgeyBlbnZpcm9ubWVudCB9IGZyb20gJy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudCc7XG4gICAqIGltcG9ydCB7IExvYWRHZW5lcmF0ZWRFbnRpdGllcyB9IGZyb20gJ21qX2dlbmVyYXRlZGVudGl0aWVzJztcbiAgICogTG9hZEdlbmVyYXRlZEVudGl0aWVzKCk7XG4gICAqXG4gICAqIEBOZ01vZHVsZSh7XG4gICAqICAgaW1wb3J0czogW1xuICAgKiAgICAgTUpCb290c3RyYXBNb2R1bGUuZm9yUm9vdChlbnZpcm9ubWVudClcbiAgICogICBdXG4gICAqIH0pXG4gICAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge31cbiAgICogYGBgXG4gICAqL1xuICBzdGF0aWMgZm9yUm9vdChlbnZpcm9ubWVudDogTUpFbnZpcm9ubWVudENvbmZpZyk6IE1vZHVsZVdpdGhQcm92aWRlcnM8TUpCb290c3RyYXBNb2R1bGU+IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdNb2R1bGU6IE1KQm9vdHN0cmFwTW9kdWxlLFxuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHsgcHJvdmlkZTogTUpfRU5WSVJPTk1FTlQsIHVzZVZhbHVlOiBlbnZpcm9ubWVudCB9LFxuICAgICAgICAvLyBNSkluaXRpYWxpemF0aW9uU2VydmljZSB1c2VzIHByb3ZpZGVkSW46ICdyb290J1xuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogQVBQX0lOSVRJQUxJWkVSLFxuICAgICAgICAgIHVzZUZhY3Rvcnk6IGluaXRpYWxpemVBdXRoLFxuICAgICAgICAgIGRlcHM6IFtNSkF1dGhCYXNlXSxcbiAgICAgICAgICBtdWx0aTogdHJ1ZVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfTtcbiAgfVxufVxuIl19
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { InjectionToken } from '@angular/core';
|
|
2
|
-
/**
|
|
3
|
-
* Injection token for MJ Environment Configuration
|
|
4
|
-
*/
|
|
5
|
-
export const MJ_ENVIRONMENT = new InjectionToken('MJ_ENVIRONMENT');
|
|
6
|
-
/**
|
|
7
|
-
* Injection token for optional startup validation service
|
|
8
|
-
*/
|
|
9
|
-
export const MJ_STARTUP_VALIDATION = new InjectionToken('MJ_STARTUP_VALIDATION', {
|
|
10
|
-
providedIn: 'root',
|
|
11
|
-
factory: () => null // Default to null if not provided
|
|
12
|
-
});
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLnR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9ib290c3RyYXAudHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvQzs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FBc0IsZ0JBQWdCLENBQUMsQ0FBQztBQUV4Rjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLElBQUksY0FBYyxDQUFvQyx1QkFBdUIsRUFBRTtJQUNsSCxVQUFVLEVBQUUsTUFBTTtJQUNsQixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGtDQUFrQztDQUN2RCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIEluamVjdGlvbiB0b2tlbiBmb3IgTUogRW52aXJvbm1lbnQgQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgY29uc3QgTUpfRU5WSVJPTk1FTlQgPSBuZXcgSW5qZWN0aW9uVG9rZW48TUpFbnZpcm9ubWVudENvbmZpZz4oJ01KX0VOVklST05NRU5UJyk7XG5cbi8qKlxuICogSW5qZWN0aW9uIHRva2VuIGZvciBvcHRpb25hbCBzdGFydHVwIHZhbGlkYXRpb24gc2VydmljZVxuICovXG5leHBvcnQgY29uc3QgTUpfU1RBUlRVUF9WQUxJREFUSU9OID0gbmV3IEluamVjdGlvblRva2VuPE1KU3RhcnR1cFZhbGlkYXRpb25TZXJ2aWNlIHwgbnVsbD4oJ01KX1NUQVJUVVBfVkFMSURBVElPTicsIHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICBmYWN0b3J5OiAoKSA9PiBudWxsIC8vIERlZmF1bHQgdG8gbnVsbCBpZiBub3QgcHJvdmlkZWRcbn0pO1xuXG4vKipcbiAqIE9wdGlvbmFsIGludGVyZmFjZSBmb3Igc3RhcnR1cCB2YWxpZGF0aW9uIHNlcnZpY2VzXG4gKiBBcHBsaWNhdGlvbnMgY2FuIHByb3ZpZGUgdGhlaXIgb3duIGltcGxlbWVudGF0aW9uIHRvIGhhbmRsZSBzdGFydHVwIHZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNSlN0YXJ0dXBWYWxpZGF0aW9uU2VydmljZSB7XG4gIC8qKlxuICAgKiBSdW5zIHZhbGlkYXRpb24gY2hlY2tzIGR1cmluZyBhcHBsaWNhdGlvbiBzdGFydHVwXG4gICAqL1xuICB2YWxpZGF0ZVN5c3RlbVNldHVwKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSB2YWxpZGF0aW9uIGlzc3VlIGZvciBtaXNzaW5nIHVzZXIgcm9sZXNcbiAgICovXG4gIGFkZE5vUm9sZXNWYWxpZGF0aW9uSXNzdWUoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBFbnZpcm9ubWVudCBjb25maWd1cmF0aW9uIGludGVyZmFjZSBmb3IgTWVtYmVySnVuY3Rpb24gQW5ndWxhciBhcHBsaWNhdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNSkVudmlyb25tZW50Q29uZmlnIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGFwcCBpcyBydW5uaW5nIGluIHByb2R1Y3Rpb24gbW9kZVxuICAgKi9cbiAgcHJvZHVjdGlvbjogYm9vbGVhbjtcblxuICAvKipcbiAgICogR3JhcGhRTCBIVFRQIGVuZHBvaW50IFVSTFxuICAgKiBAZXhhbXBsZSAnaHR0cDovL2xvY2FsaG9zdDo0MDAwL2dyYXBocWwnXG4gICAqL1xuICBHUkFQSFFMX1VSSTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBHcmFwaFFMIFdlYlNvY2tldCBlbmRwb2ludCBVUkwgZm9yIHN1YnNjcmlwdGlvbnNcbiAgICogQGV4YW1wbGUgJ3dzOi8vbG9jYWxob3N0OjQwMDAvZ3JhcGhxbCdcbiAgICovXG4gIEdSQVBIUUxfV1NfVVJJOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyIHR5cGVcbiAgICovXG4gIEFVVEhfVFlQRTogJ21zYWwnIHwgJ2F1dGgwJztcblxuICAvKipcbiAgICogTWVtYmVySnVuY3Rpb24gY29yZSBzY2hlbWEgbmFtZSBpbiB0aGUgZGF0YWJhc2VcbiAgICogQGRlZmF1bHQgJ19fbWonXG4gICAqL1xuICBNSl9DT1JFX1NDSEVNQV9OQU1FOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1pY3Jvc29mdCBBenVyZSBBRC9FbnRyYSBDbGllbnQgSUQgKGZvciBNU0FMIGF1dGgpXG4gICAqL1xuICBDTElFTlRfSUQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1pY3Jvc29mdCBBenVyZSBBRC9FbnRyYSBUZW5hbnQgSUQgKGZvciBNU0FMIGF1dGgpXG4gICAqL1xuICBURU5BTlRfSUQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEF1dGgwIGRvbWFpbiAoZm9yIEF1dGgwIGF1dGgpXG4gICAqIEBleGFtcGxlICdteWFwcC51cy5hdXRoMC5jb20nXG4gICAqL1xuICBBVVRIMF9ET01BSU4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEF1dGgwIGNsaWVudCBJRCAoZm9yIEF1dGgwIGF1dGgpXG4gICAqL1xuICBBVVRIMF9DTElFTlRJRD86IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBjdXN0b20gZW52aXJvbm1lbnQgcHJvcGVydGllc1xuICAgKi9cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuIl19
|
|
@@ -1,148 +0,0 @@
|
|
|
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==
|
|
@@ -1,186 +0,0 @@
|
|
|
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==
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generated bundle index. Do not edit.
|
|
3
|
-
*/
|
|
4
|
-
export * from './public-api';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYmVyanVuY3Rpb24tbmctYm9vdHN0cmFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21lbWJlcmp1bmN0aW9uLW5nLWJvb3RzdHJhcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
|
package/esm2022/public-api.mjs
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
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==
|
package/index.d.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MemberJunction 3.0 Bootstrap Component
|
|
3
|
-
*
|
|
4
|
-
* Minimal placeholder component for future fully encapsulated bootstrap.
|
|
5
|
-
* Currently applications should use MJInitializationService directly in their app.component.
|
|
6
|
-
*/
|
|
7
|
-
import { OnInit } from '@angular/core';
|
|
8
|
-
import { MJEnvironmentConfig } from './bootstrap.types';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
export declare class MJBootstrapComponent implements OnInit {
|
|
11
|
-
private environment;
|
|
12
|
-
constructor(environment: MJEnvironmentConfig);
|
|
13
|
-
ngOnInit(): void;
|
|
14
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<MJBootstrapComponent, never>;
|
|
15
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<MJBootstrapComponent, "mj-bootstrap", never, {}, {}, never, ["*"], false, never>;
|
|
16
|
-
}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MemberJunction 3.0 Bootstrap Module
|
|
3
|
-
*
|
|
4
|
-
* Provides the MJBootstrapComponent and all necessary services for MemberJunction Angular applications.
|
|
5
|
-
* This module encapsulates all the authentication and initialization logic that was previously
|
|
6
|
-
* spread across app.component.ts and app.module.ts.
|
|
7
|
-
*
|
|
8
|
-
* Usage:
|
|
9
|
-
* ```typescript
|
|
10
|
-
* import { LoadGeneratedEntities } from 'mj_generatedentities';
|
|
11
|
-
* LoadGeneratedEntities(); // Prevent tree shaking
|
|
12
|
-
*
|
|
13
|
-
* @NgModule({
|
|
14
|
-
* imports: [
|
|
15
|
-
* BrowserModule,
|
|
16
|
-
* BrowserAnimationsModule,
|
|
17
|
-
* MJBootstrapModule.forRoot(environment),
|
|
18
|
-
* // ... other MJ modules
|
|
19
|
-
* ],
|
|
20
|
-
* bootstrap: [AppComponent]
|
|
21
|
-
* })
|
|
22
|
-
* export class AppModule {}
|
|
23
|
-
* ```
|
|
24
|
-
*/
|
|
25
|
-
import { ModuleWithProviders } from '@angular/core';
|
|
26
|
-
import { MJEnvironmentConfig } from './bootstrap.types';
|
|
27
|
-
import { MJAuthBase } from '@memberjunction/ng-auth-services';
|
|
28
|
-
import * as i0 from "@angular/core";
|
|
29
|
-
import * as i1 from "./bootstrap.component";
|
|
30
|
-
import * as i2 from "./components/auth-shell.component";
|
|
31
|
-
import * as i3 from "@angular/common";
|
|
32
|
-
/**
|
|
33
|
-
* Initialize auth provider before Angular routing starts
|
|
34
|
-
* This ensures auth providers can process OAuth redirect responses before Angular's router
|
|
35
|
-
* consumes the URL hash
|
|
36
|
-
*/
|
|
37
|
-
export declare function initializeAuth(authService: MJAuthBase): () => Promise<void>;
|
|
38
|
-
export declare class MJBootstrapModule {
|
|
39
|
-
/**
|
|
40
|
-
* Configure the bootstrap module with environment settings
|
|
41
|
-
*
|
|
42
|
-
* @param environment - Environment configuration for the application
|
|
43
|
-
* @returns ModuleWithProviders with environment configuration and all services
|
|
44
|
-
*
|
|
45
|
-
* @example
|
|
46
|
-
* ```typescript
|
|
47
|
-
* import { environment } from '../environments/environment';
|
|
48
|
-
* import { LoadGeneratedEntities } from 'mj_generatedentities';
|
|
49
|
-
* LoadGeneratedEntities();
|
|
50
|
-
*
|
|
51
|
-
* @NgModule({
|
|
52
|
-
* imports: [
|
|
53
|
-
* MJBootstrapModule.forRoot(environment)
|
|
54
|
-
* ]
|
|
55
|
-
* })
|
|
56
|
-
* export class AppModule {}
|
|
57
|
-
* ```
|
|
58
|
-
*/
|
|
59
|
-
static forRoot(environment: MJEnvironmentConfig): ModuleWithProviders<MJBootstrapModule>;
|
|
60
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<MJBootstrapModule, never>;
|
|
61
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<MJBootstrapModule, [typeof i1.MJBootstrapComponent, typeof i2.MJAuthShellComponent], [typeof i3.CommonModule], [typeof i1.MJBootstrapComponent, typeof i2.MJAuthShellComponent]>;
|
|
62
|
-
static ɵinj: i0.ɵɵInjectorDeclaration<MJBootstrapModule>;
|
|
63
|
-
}
|