@descope/angular-sdk 0.5.10 → 0.5.11

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 (146) hide show
  1. package/.eslintrc.json +41 -0
  2. package/.prettierrc +7 -0
  3. package/CHANGELOG.md +5 -0
  4. package/LICENSE +21 -0
  5. package/README.md +647 -11
  6. package/angular.json +154 -0
  7. package/{esm2022 → dist/esm2022}/lib/components/access-key-management/access-key-management.component.mjs +4 -4
  8. package/{esm2022 → dist/esm2022}/lib/components/audit-management/audit-management.component.mjs +4 -4
  9. package/dist/esm2022/lib/components/descope/descope.component.mjs +156 -0
  10. package/{esm2022 → dist/esm2022}/lib/components/role-management/role-management.component.mjs +4 -4
  11. package/dist/esm2022/lib/components/sign-in-flow/sign-in-flow.component.mjs +44 -0
  12. package/dist/esm2022/lib/components/sign-up-flow/sign-up-flow.component.mjs +44 -0
  13. package/dist/esm2022/lib/components/sign-up-or-in-flow/sign-up-or-in-flow.component.mjs +44 -0
  14. package/{esm2022 → dist/esm2022}/lib/components/user-management/user-management.component.mjs +4 -4
  15. package/dist/esm2022/lib/components/user-profile/user-profile.component.mjs +66 -0
  16. package/{esm2022 → dist/esm2022}/lib/descope-auth.module.mjs +5 -5
  17. package/{esm2022 → dist/esm2022}/lib/services/descope-auth.guard.mjs +1 -1
  18. package/dist/esm2022/lib/services/descope-auth.service.mjs +154 -0
  19. package/dist/esm2022/lib/services/descope.interceptor.mjs +51 -0
  20. package/dist/esm2022/lib/types/types.mjs +6 -0
  21. package/{esm2022 → dist/esm2022}/lib/utils/constants.mjs +1 -1
  22. package/dist/esm2022/lib/utils/helpers.mjs +27 -0
  23. package/{fesm2022 → dist/fesm2022}/descope-angular-sdk.mjs +37 -37
  24. package/dist/fesm2022/descope-angular-sdk.mjs.map +1 -0
  25. package/{lib → dist/lib}/services/descope-auth.service.d.ts +3 -2
  26. package/jest.config.js +17 -0
  27. package/package.json +62 -19
  28. package/project.json +17 -0
  29. package/projects/angular-sdk/.eslintrc.json +32 -0
  30. package/projects/angular-sdk/ng-package.json +17 -0
  31. package/projects/angular-sdk/package.json +87 -0
  32. package/projects/angular-sdk/src/environment.ts +3 -0
  33. package/projects/angular-sdk/src/lib/components/access-key-management/access-key-management.component.spec.ts +84 -0
  34. package/projects/angular-sdk/src/lib/components/access-key-management/access-key-management.component.ts +63 -0
  35. package/projects/angular-sdk/src/lib/components/audit-management/audit-management.component.spec.ts +84 -0
  36. package/projects/angular-sdk/src/lib/components/audit-management/audit-management.component.ts +63 -0
  37. package/projects/angular-sdk/src/lib/components/descope/descope.component.spec.ts +142 -0
  38. package/projects/angular-sdk/src/lib/components/descope/descope.component.ts +171 -0
  39. package/projects/angular-sdk/src/lib/components/role-management/role-management.component.spec.ts +84 -0
  40. package/projects/angular-sdk/src/lib/components/role-management/role-management.component.ts +63 -0
  41. package/projects/angular-sdk/src/lib/components/sign-in-flow/sign-in-flow.component.html +17 -0
  42. package/projects/angular-sdk/src/lib/components/sign-in-flow/sign-in-flow.component.spec.ts +53 -0
  43. package/projects/angular-sdk/src/lib/components/sign-in-flow/sign-in-flow.component.ts +35 -0
  44. package/projects/angular-sdk/src/lib/components/sign-up-flow/sign-up-flow.component.html +17 -0
  45. package/projects/angular-sdk/src/lib/components/sign-up-flow/sign-up-flow.component.spec.ts +51 -0
  46. package/projects/angular-sdk/src/lib/components/sign-up-flow/sign-up-flow.component.ts +35 -0
  47. package/projects/angular-sdk/src/lib/components/sign-up-or-in-flow/sign-up-or-in-flow.component.html +17 -0
  48. package/projects/angular-sdk/src/lib/components/sign-up-or-in-flow/sign-up-or-in-flow.component.spec.ts +53 -0
  49. package/projects/angular-sdk/src/lib/components/sign-up-or-in-flow/sign-up-or-in-flow.component.ts +35 -0
  50. package/projects/angular-sdk/src/lib/components/user-management/user-management.component.spec.ts +84 -0
  51. package/projects/angular-sdk/src/lib/components/user-management/user-management.component.ts +64 -0
  52. package/projects/angular-sdk/src/lib/components/user-profile/user-profile.component.spec.ts +93 -0
  53. package/projects/angular-sdk/src/lib/components/user-profile/user-profile.component.ts +77 -0
  54. package/projects/angular-sdk/src/lib/descope-auth.module.ts +61 -0
  55. package/projects/angular-sdk/src/lib/services/descope-auth.guard.spec.ts +76 -0
  56. package/projects/angular-sdk/src/lib/services/descope-auth.guard.ts +16 -0
  57. package/projects/angular-sdk/src/lib/services/descope-auth.service.spec.ts +309 -0
  58. package/projects/angular-sdk/src/lib/services/descope-auth.service.ts +200 -0
  59. package/projects/angular-sdk/src/lib/services/descope.interceptor.spec.ts +102 -0
  60. package/projects/angular-sdk/src/lib/services/descope.interceptor.ts +76 -0
  61. package/projects/angular-sdk/src/lib/types/types.ts +15 -0
  62. package/projects/angular-sdk/src/lib/utils/constants.ts +8 -0
  63. package/projects/angular-sdk/src/lib/utils/helpers.spec.ts +103 -0
  64. package/projects/angular-sdk/src/lib/utils/helpers.ts +36 -0
  65. package/projects/angular-sdk/src/public-api.ts +18 -0
  66. package/projects/angular-sdk/tsconfig.lib.json +12 -0
  67. package/projects/angular-sdk/tsconfig.lib.prod.json +10 -0
  68. package/projects/angular-sdk/tsconfig.spec.json +11 -0
  69. package/projects/demo-app/.eslintrc.json +31 -0
  70. package/projects/demo-app/src/app/app-routing.module.ts +33 -0
  71. package/projects/demo-app/src/app/app.component.html +3 -0
  72. package/projects/demo-app/src/app/app.component.scss +18 -0
  73. package/projects/demo-app/src/app/app.component.spec.ts +37 -0
  74. package/projects/demo-app/src/app/app.component.ts +8 -0
  75. package/projects/demo-app/src/app/app.module.ts +63 -0
  76. package/projects/demo-app/src/app/home/home.component.html +32 -0
  77. package/projects/demo-app/src/app/home/home.component.scss +15 -0
  78. package/projects/demo-app/src/app/home/home.component.spec.ts +44 -0
  79. package/projects/demo-app/src/app/home/home.component.ts +85 -0
  80. package/projects/demo-app/src/app/interceptor/auth.interceptor.ts +20 -0
  81. package/projects/demo-app/src/app/login/login.component.html +20 -0
  82. package/projects/demo-app/src/app/login/login.component.spec.ts +42 -0
  83. package/projects/demo-app/src/app/login/login.component.ts +41 -0
  84. package/projects/demo-app/src/app/manage-access-keys/manage-access-keys.component.html +12 -0
  85. package/projects/demo-app/src/app/manage-access-keys/manage-access-keys.component.spec.ts +36 -0
  86. package/projects/demo-app/src/app/manage-access-keys/manage-access-keys.component.ts +15 -0
  87. package/projects/demo-app/src/app/manage-audit/manage-audit.component.html +6 -0
  88. package/projects/demo-app/src/app/manage-audit/manage-audit.component.spec.ts +36 -0
  89. package/projects/demo-app/src/app/manage-audit/manage-audit.component.ts +15 -0
  90. package/projects/demo-app/src/app/manage-roles/manage-roles.component.html +6 -0
  91. package/projects/demo-app/src/app/manage-roles/manage-roles.component.spec.ts +36 -0
  92. package/projects/demo-app/src/app/manage-roles/manage-roles.component.ts +15 -0
  93. package/projects/demo-app/src/app/manage-users/manage-users.component.html +6 -0
  94. package/projects/demo-app/src/app/manage-users/manage-users.component.spec.ts +36 -0
  95. package/projects/demo-app/src/app/manage-users/manage-users.component.ts +15 -0
  96. package/projects/demo-app/src/app/my-user-profile/my-user-profile.component.html +6 -0
  97. package/projects/demo-app/src/app/my-user-profile/my-user-profile.component.spec.ts +36 -0
  98. package/projects/demo-app/src/app/my-user-profile/my-user-profile.component.ts +20 -0
  99. package/projects/demo-app/src/app/my-user-profile/my-user-profile.scss +18 -0
  100. package/projects/demo-app/src/app/protected/protected.component.html +18 -0
  101. package/projects/demo-app/src/app/protected/protected.component.scss +8 -0
  102. package/projects/demo-app/src/app/protected/protected.component.spec.ts +42 -0
  103. package/projects/demo-app/src/app/protected/protected.component.ts +41 -0
  104. package/projects/demo-app/src/assets/.gitkeep +0 -0
  105. package/projects/demo-app/src/environments/conifg.ts +14 -0
  106. package/projects/demo-app/src/environments/environment.ts +20 -0
  107. package/projects/demo-app/src/favicon.ico +0 -0
  108. package/projects/demo-app/src/index.html +17 -0
  109. package/projects/demo-app/src/main.ts +7 -0
  110. package/projects/demo-app/src/styles.scss +21 -0
  111. package/projects/demo-app/tsconfig.app.json +11 -0
  112. package/projects/demo-app/tsconfig.spec.json +10 -0
  113. package/scripts/setversion/setversion.js +20 -0
  114. package/setup-jest.ts +1 -0
  115. package/tsconfig.json +36 -0
  116. package/esm2022/lib/components/descope/descope.component.mjs +0 -156
  117. package/esm2022/lib/components/sign-in-flow/sign-in-flow.component.mjs +0 -44
  118. package/esm2022/lib/components/sign-up-flow/sign-up-flow.component.mjs +0 -44
  119. package/esm2022/lib/components/sign-up-or-in-flow/sign-up-or-in-flow.component.mjs +0 -44
  120. package/esm2022/lib/components/user-profile/user-profile.component.mjs +0 -66
  121. package/esm2022/lib/services/descope-auth.service.mjs +0 -154
  122. package/esm2022/lib/services/descope.interceptor.mjs +0 -51
  123. package/esm2022/lib/types/types.mjs +0 -6
  124. package/esm2022/lib/utils/helpers.mjs +0 -27
  125. package/fesm2022/descope-angular-sdk.mjs.map +0 -1
  126. /package/{environment.d.ts → dist/environment.d.ts} +0 -0
  127. /package/{esm2022 → dist/esm2022}/descope-angular-sdk.mjs +0 -0
  128. /package/{esm2022 → dist/esm2022}/environment.mjs +0 -0
  129. /package/{esm2022 → dist/esm2022}/public-api.mjs +0 -0
  130. /package/{index.d.ts → dist/index.d.ts} +0 -0
  131. /package/{lib → dist/lib}/components/access-key-management/access-key-management.component.d.ts +0 -0
  132. /package/{lib → dist/lib}/components/audit-management/audit-management.component.d.ts +0 -0
  133. /package/{lib → dist/lib}/components/descope/descope.component.d.ts +0 -0
  134. /package/{lib → dist/lib}/components/role-management/role-management.component.d.ts +0 -0
  135. /package/{lib → dist/lib}/components/sign-in-flow/sign-in-flow.component.d.ts +0 -0
  136. /package/{lib → dist/lib}/components/sign-up-flow/sign-up-flow.component.d.ts +0 -0
  137. /package/{lib → dist/lib}/components/sign-up-or-in-flow/sign-up-or-in-flow.component.d.ts +0 -0
  138. /package/{lib → dist/lib}/components/user-management/user-management.component.d.ts +0 -0
  139. /package/{lib → dist/lib}/components/user-profile/user-profile.component.d.ts +0 -0
  140. /package/{lib → dist/lib}/descope-auth.module.d.ts +0 -0
  141. /package/{lib → dist/lib}/services/descope-auth.guard.d.ts +0 -0
  142. /package/{lib → dist/lib}/services/descope.interceptor.d.ts +0 -0
  143. /package/{lib → dist/lib}/types/types.d.ts +0 -0
  144. /package/{lib → dist/lib}/utils/constants.d.ts +0 -0
  145. /package/{lib → dist/lib}/utils/helpers.d.ts +0 -0
  146. /package/{public-api.d.ts → dist/public-api.d.ts} +0 -0
@@ -0,0 +1,84 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+ import { UserManagementComponent } from './user-management.component';
3
+ import createSdk from '@descope/web-js-sdk';
4
+ import { DescopeAuthConfig } from '../../types/types';
5
+ import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
6
+ import mocked = jest.mocked;
7
+
8
+ jest.mock('@descope/web-js-sdk');
9
+ //Mock DescopeUserManagementWidget
10
+ jest.mock('@descope/user-management-widget', () => {
11
+ return jest.fn(() => {
12
+ // Create a mock DOM element
13
+ return document.createElement('descope-user-management-widget');
14
+ });
15
+ });
16
+
17
+ describe('DescopeUserManagementComponent', () => {
18
+ let component: UserManagementComponent;
19
+ let fixture: ComponentFixture<UserManagementComponent>;
20
+ let mockedCreateSdk: jest.Mock;
21
+ const onSessionTokenChangeSpy = jest.fn();
22
+ const onUserChangeSpy = jest.fn();
23
+ const afterRequestHooksSpy = jest.fn();
24
+ const mockConfig: DescopeAuthConfig = {
25
+ projectId: 'someProject'
26
+ };
27
+
28
+ beforeEach(() => {
29
+ mockedCreateSdk = mocked(createSdk);
30
+
31
+ mockedCreateSdk.mockReturnValue({
32
+ onSessionTokenChange: onSessionTokenChangeSpy,
33
+ onUserChange: onUserChangeSpy,
34
+ httpClient: {
35
+ hooks: {
36
+ afterRequest: afterRequestHooksSpy
37
+ }
38
+ }
39
+ });
40
+
41
+ TestBed.configureTestingModule({
42
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
43
+ providers: [
44
+ DescopeAuthConfig,
45
+ { provide: DescopeAuthConfig, useValue: mockConfig }
46
+ ]
47
+ });
48
+
49
+ fixture = TestBed.createComponent(UserManagementComponent);
50
+ component = fixture.componentInstance;
51
+ component.projectId = '123';
52
+ component.tenant = 'tenant-1';
53
+ component.widgetId = 'widget-1';
54
+ component.logger = {
55
+ info: jest.fn(),
56
+ error: jest.fn(),
57
+ warn: jest.fn(),
58
+ debug: jest.fn()
59
+ };
60
+ fixture.detectChanges();
61
+ });
62
+
63
+ it('should create', () => {
64
+ expect(component).toBeTruthy();
65
+ const html: HTMLElement = fixture.nativeElement;
66
+ const webComponentHtml = html.querySelector(
67
+ 'descope-user-management-widget'
68
+ );
69
+ expect(webComponentHtml).toBeDefined();
70
+ });
71
+
72
+ it('should correctly setup attributes based on inputs', () => {
73
+ const html: HTMLElement = fixture.nativeElement;
74
+ const webComponentHtml = html.querySelector(
75
+ 'descope-user-management-widget'
76
+ )!;
77
+ expect(webComponentHtml.getAttribute('project-id')).toStrictEqual('123');
78
+ expect(webComponentHtml.getAttribute('tenant')).toStrictEqual('tenant-1');
79
+ expect(webComponentHtml.getAttribute('widget-id')).toStrictEqual(
80
+ 'widget-1'
81
+ );
82
+ expect(webComponentHtml.getAttribute('logger')).toBeDefined();
83
+ });
84
+ });
@@ -0,0 +1,64 @@
1
+ import { Component, ElementRef, Input, OnChanges, OnInit } from '@angular/core';
2
+ import DescopeUserManagementWidget from '@descope/user-management-widget';
3
+ import { ILogger } from '@descope/web-component';
4
+ import { DescopeAuthConfig } from '../../types/types';
5
+
6
+ @Component({
7
+ selector: 'user-management[tenant]',
8
+ standalone: true,
9
+ template: ''
10
+ })
11
+ export class UserManagementComponent implements OnInit, OnChanges {
12
+ projectId: string;
13
+ baseUrl?: string;
14
+ baseStaticUrl?: string;
15
+ @Input() tenant: string;
16
+ @Input() widgetId: string;
17
+
18
+ @Input() theme: 'light' | 'dark' | 'os';
19
+ @Input() debug: boolean;
20
+ @Input() logger: ILogger;
21
+
22
+ private readonly webComponent = new DescopeUserManagementWidget();
23
+
24
+ constructor(
25
+ private elementRef: ElementRef,
26
+ descopeConfig: DescopeAuthConfig
27
+ ) {
28
+ this.projectId = descopeConfig.projectId;
29
+ this.baseUrl = descopeConfig.baseUrl;
30
+ this.baseStaticUrl = descopeConfig.baseStaticUrl;
31
+ }
32
+
33
+ ngOnInit() {
34
+ this.setupWebComponent();
35
+ this.elementRef.nativeElement.appendChild(this.webComponent);
36
+ }
37
+
38
+ ngOnChanges(): void {
39
+ this.setupWebComponent();
40
+ }
41
+
42
+ private setupWebComponent() {
43
+ this.webComponent.setAttribute('project-id', this.projectId);
44
+ this.webComponent.setAttribute('tenant', this.tenant);
45
+ this.webComponent.setAttribute('widget-id', this.widgetId);
46
+
47
+ if (this.baseUrl) {
48
+ this.webComponent.setAttribute('base-url', this.baseUrl);
49
+ }
50
+ if (this.baseStaticUrl) {
51
+ this.webComponent.setAttribute('base-static-url', this.baseStaticUrl);
52
+ }
53
+ if (this.theme) {
54
+ this.webComponent.setAttribute('theme', this.theme);
55
+ }
56
+ if (this.debug) {
57
+ this.webComponent.setAttribute('debug', this.debug.toString());
58
+ }
59
+
60
+ if (this.logger) {
61
+ (this.webComponent as any).logger = this.logger;
62
+ }
63
+ }
64
+ }
@@ -0,0 +1,93 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+ import { UserProfileComponent } from './user-profile.component';
3
+ import createSdk from '@descope/web-js-sdk';
4
+ import { DescopeAuthConfig } from '../../types/types';
5
+ import { CUSTOM_ELEMENTS_SCHEMA, EventEmitter } from '@angular/core';
6
+ import mocked = jest.mocked;
7
+
8
+ jest.mock('@descope/web-js-sdk');
9
+ //Mock DescopeUserProfileWidget
10
+ jest.mock('@descope/user-profile-widget', () => {
11
+ return jest.fn(() => {
12
+ // Create a mock DOM element
13
+ return document.createElement('descope-user-profile-widget');
14
+ });
15
+ });
16
+
17
+ describe('DescopeUserProfileComponent', () => {
18
+ let component: UserProfileComponent;
19
+ let fixture: ComponentFixture<UserProfileComponent>;
20
+ let mockedCreateSdk: jest.Mock;
21
+ const onSessionTokenChangeSpy = jest.fn();
22
+ const onAuditChangeSpy = jest.fn();
23
+ const afterRequestHooksSpy = jest.fn();
24
+ const mockConfig: DescopeAuthConfig = {
25
+ projectId: 'someProject'
26
+ };
27
+
28
+ beforeEach(() => {
29
+ mockedCreateSdk = mocked(createSdk);
30
+
31
+ mockedCreateSdk.mockReturnValue({
32
+ onSessionTokenChange: onSessionTokenChangeSpy,
33
+ onAuditChange: onAuditChangeSpy,
34
+ httpClient: {
35
+ hooks: {
36
+ afterRequest: afterRequestHooksSpy
37
+ }
38
+ }
39
+ });
40
+
41
+ TestBed.configureTestingModule({
42
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
43
+ providers: [
44
+ DescopeAuthConfig,
45
+ { provide: DescopeAuthConfig, useValue: mockConfig }
46
+ ]
47
+ });
48
+
49
+ fixture = TestBed.createComponent(UserProfileComponent);
50
+ component = fixture.componentInstance;
51
+ component.projectId = '123';
52
+ component.widgetId = 'widget-1';
53
+ component.logout = new EventEmitter<CustomEvent>();
54
+ component.logger = {
55
+ info: jest.fn(),
56
+ error: jest.fn(),
57
+ warn: jest.fn(),
58
+ debug: jest.fn()
59
+ };
60
+ fixture.detectChanges();
61
+ });
62
+
63
+ it('should create', () => {
64
+ expect(component).toBeTruthy();
65
+ const html: HTMLElement = fixture.nativeElement;
66
+ const webComponentHtml = html.querySelector('descope-user-profile-widget');
67
+ expect(webComponentHtml).toBeDefined();
68
+ });
69
+
70
+ it('should correctly setup attributes based on inputs', () => {
71
+ const html: HTMLElement = fixture.nativeElement;
72
+ const webComponentHtml = html.querySelector('descope-user-profile-widget')!;
73
+ expect(webComponentHtml.getAttribute('project-id')).toStrictEqual('123');
74
+ expect(webComponentHtml.getAttribute('widget-id')).toStrictEqual(
75
+ 'widget-1'
76
+ );
77
+ expect(webComponentHtml.getAttribute('logger')).toBeDefined();
78
+ });
79
+
80
+ it('should emit logout when web component emits logout', () => {
81
+ const html: HTMLElement = fixture.nativeElement;
82
+ const webComponentHtml = html.querySelector('descope-user-profile-widget')!;
83
+
84
+ const event = {
85
+ detail: 'logout'
86
+ };
87
+ component.logout.subscribe((e) => {
88
+ expect(afterRequestHooksSpy).toHaveBeenCalled();
89
+ expect(e.detail).toHaveBeenCalledWith(event.detail);
90
+ });
91
+ webComponentHtml.dispatchEvent(new CustomEvent('logout', event));
92
+ });
93
+ });
@@ -0,0 +1,77 @@
1
+ import {
2
+ Component,
3
+ ElementRef,
4
+ EventEmitter,
5
+ Input,
6
+ OnChanges,
7
+ OnInit,
8
+ Output
9
+ } from '@angular/core';
10
+ import DescopeUserProfileWidget from '@descope/user-profile-widget';
11
+ import { ILogger } from '@descope/web-component';
12
+ import { DescopeAuthConfig } from '../../types/types';
13
+
14
+ @Component({
15
+ selector: 'user-profile',
16
+ standalone: true,
17
+ template: ''
18
+ })
19
+ export class UserProfileComponent implements OnInit, OnChanges {
20
+ projectId: string;
21
+ baseUrl?: string;
22
+ baseStaticUrl?: string;
23
+ @Input() widgetId: string;
24
+
25
+ @Input() theme: 'light' | 'dark' | 'os';
26
+ @Input() debug: boolean;
27
+ @Input() logger: ILogger;
28
+
29
+ @Output() logout: EventEmitter<CustomEvent> = new EventEmitter<CustomEvent>();
30
+
31
+ private readonly webComponent = new DescopeUserProfileWidget();
32
+
33
+ constructor(
34
+ private elementRef: ElementRef,
35
+ descopeConfig: DescopeAuthConfig
36
+ ) {
37
+ this.projectId = descopeConfig.projectId;
38
+ this.baseUrl = descopeConfig.baseUrl;
39
+ this.baseStaticUrl = descopeConfig.baseStaticUrl;
40
+ }
41
+
42
+ ngOnInit() {
43
+ this.setupWebComponent();
44
+ this.elementRef.nativeElement.appendChild(this.webComponent);
45
+ }
46
+
47
+ ngOnChanges(): void {
48
+ this.setupWebComponent();
49
+ }
50
+
51
+ private setupWebComponent() {
52
+ this.webComponent.setAttribute('project-id', this.projectId);
53
+ this.webComponent.setAttribute('widget-id', this.widgetId);
54
+ if (this.baseUrl) {
55
+ this.webComponent.setAttribute('base-url', this.baseUrl);
56
+ }
57
+ if (this.baseStaticUrl) {
58
+ this.webComponent.setAttribute('base-static-url', this.baseStaticUrl);
59
+ }
60
+ if (this.theme) {
61
+ this.webComponent.setAttribute('theme', this.theme);
62
+ }
63
+ if (this.debug) {
64
+ this.webComponent.setAttribute('debug', this.debug.toString());
65
+ }
66
+
67
+ if (this.logger) {
68
+ (this.webComponent as any).logger = this.logger;
69
+ }
70
+
71
+ if (this.logout) {
72
+ this.webComponent.addEventListener('logout', (e: Event) => {
73
+ this.logout?.emit(e as CustomEvent);
74
+ });
75
+ }
76
+ }
77
+ }
@@ -0,0 +1,61 @@
1
+ import {
2
+ CUSTOM_ELEMENTS_SCHEMA,
3
+ ModuleWithProviders,
4
+ NgModule,
5
+ Optional,
6
+ SkipSelf
7
+ } from '@angular/core';
8
+ import { DescopeComponent } from './components/descope/descope.component';
9
+ import { SignInFlowComponent } from './components/sign-in-flow/sign-in-flow.component';
10
+ import { SignUpFlowComponent } from './components/sign-up-flow/sign-up-flow.component';
11
+ import { SignUpOrInFlowComponent } from './components/sign-up-or-in-flow/sign-up-or-in-flow.component';
12
+ import { UserManagementComponent } from './components/user-management/user-management.component';
13
+ import { RoleManagementComponent } from './components/role-management/role-management.component';
14
+ import { AccessKeyManagementComponent } from './components/access-key-management/access-key-management.component';
15
+ import { AuditManagementComponent } from './components/audit-management/audit-management.component';
16
+ import { UserProfileComponent } from './components/user-profile/user-profile.component';
17
+ import { DescopeAuthConfig } from './types/types';
18
+
19
+ @NgModule({
20
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
21
+ imports: [
22
+ DescopeComponent,
23
+ SignInFlowComponent,
24
+ SignUpFlowComponent,
25
+ SignUpOrInFlowComponent,
26
+ UserManagementComponent,
27
+ RoleManagementComponent,
28
+ AccessKeyManagementComponent,
29
+ AuditManagementComponent,
30
+ UserProfileComponent
31
+ ],
32
+ exports: [
33
+ DescopeComponent,
34
+ SignInFlowComponent,
35
+ SignUpFlowComponent,
36
+ SignUpOrInFlowComponent,
37
+ UserManagementComponent,
38
+ RoleManagementComponent,
39
+ AccessKeyManagementComponent,
40
+ AuditManagementComponent,
41
+ UserProfileComponent
42
+ ]
43
+ })
44
+ export class DescopeAuthModule {
45
+ constructor(@Optional() @SkipSelf() parentModule?: DescopeAuthModule) {
46
+ if (parentModule) {
47
+ throw new Error(
48
+ 'DescopeAuthModule is already loaded. Import it only once'
49
+ );
50
+ }
51
+ }
52
+
53
+ static forRoot(
54
+ config?: DescopeAuthConfig
55
+ ): ModuleWithProviders<DescopeAuthModule> {
56
+ return {
57
+ ngModule: DescopeAuthModule,
58
+ providers: [{ provide: DescopeAuthConfig, useValue: config }]
59
+ };
60
+ }
61
+ }
@@ -0,0 +1,76 @@
1
+ import { delay, Observable } from 'rxjs';
2
+ import { ActivatedRoute, Router } from '@angular/router';
3
+ import { descopeAuthGuard } from './descope-auth.guard';
4
+ import { fakeAsync, TestBed, tick } from '@angular/core/testing';
5
+ import { RouterTestingModule } from '@angular/router/testing';
6
+ import { DescopeAuthService } from './descope-auth.service';
7
+
8
+ describe('descopeAuthGuard', () => {
9
+ const authServiceMock = {
10
+ isAuthenticated: jest.fn()
11
+ };
12
+
13
+ const routerMock = {
14
+ navigate: jest.fn()
15
+ };
16
+
17
+ beforeEach(async () => {
18
+ await TestBed.configureTestingModule({
19
+ imports: [RouterTestingModule],
20
+ providers: [
21
+ {
22
+ provide: Router,
23
+ useValue: routerMock
24
+ },
25
+ {
26
+ provide: DescopeAuthService,
27
+ useValue: authServiceMock
28
+ },
29
+ {
30
+ provide: ActivatedRoute,
31
+ useValue: {
32
+ snapshot: {
33
+ data: {
34
+ descopeFallbackUrl: '/fallback'
35
+ }
36
+ }
37
+ }
38
+ }
39
+ ]
40
+ });
41
+ });
42
+
43
+ it('return true if authenticated', fakeAsync(() => {
44
+ const activatedRoute = TestBed.inject(ActivatedRoute);
45
+ authServiceMock.isAuthenticated.mockReturnValue(true);
46
+ const guardResponse = TestBed.runInInjectionContext(() => {
47
+ return descopeAuthGuard(activatedRoute.snapshot) as Observable<boolean>;
48
+ });
49
+
50
+ let guardOutput = null;
51
+ guardResponse
52
+ .pipe(delay(100))
53
+ .subscribe((response) => (guardOutput = response));
54
+ tick(100);
55
+
56
+ expect(guardOutput).toBeTruthy();
57
+ }));
58
+
59
+ it('navigate to fallbackUrl when not auth', fakeAsync(() => {
60
+ const activatedRoute = TestBed.inject(ActivatedRoute);
61
+ authServiceMock.isAuthenticated.mockReturnValue(false);
62
+ routerMock.navigate.mockReturnValue([]);
63
+ const guardResponse = TestBed.runInInjectionContext(() => {
64
+ return descopeAuthGuard(activatedRoute.snapshot) as Observable<boolean>;
65
+ });
66
+
67
+ let guardOutput = null;
68
+ guardResponse
69
+ .pipe(delay(100))
70
+ .subscribe((response) => (guardOutput = response));
71
+ tick(100);
72
+
73
+ expect(guardOutput).toBeFalsy();
74
+ expect(routerMock.navigate).toHaveBeenCalledWith(['/fallback']);
75
+ }));
76
+ });
@@ -0,0 +1,16 @@
1
+ import { inject } from '@angular/core';
2
+
3
+ import { DescopeAuthService } from './descope-auth.service';
4
+ import { ActivatedRouteSnapshot, Router } from '@angular/router';
5
+ import { from, of } from 'rxjs';
6
+
7
+ export const descopeAuthGuard = (route: ActivatedRouteSnapshot) => {
8
+ const authService = inject(DescopeAuthService);
9
+ const router = inject(Router);
10
+ const fallbackUrl = route.data['descopeFallbackUrl'];
11
+ const isAuthenticated = authService.isAuthenticated();
12
+ if (!isAuthenticated && !!fallbackUrl) {
13
+ return from(router.navigate([fallbackUrl]));
14
+ }
15
+ return of(isAuthenticated);
16
+ };