@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,87 @@
1
+ {
2
+ "name": "@descope/angular-sdk",
3
+ "version": "0.5.11",
4
+ "peerDependencies": {
5
+ "@angular/common": ">=16.0.0",
6
+ "@angular/core": ">=16.0.0"
7
+ },
8
+ "license": "MIT",
9
+ "engines": {
10
+ "node": "^16.14.0 || >=18.10.0",
11
+ "npm": ">= 8.1.0"
12
+ },
13
+ "module": "fesm2022/descope-angular-sdk.mjs",
14
+ "typings": "index.d.ts",
15
+ "exports": {
16
+ "./package.json": {
17
+ "default": "./package.json"
18
+ },
19
+ ".": {
20
+ "types": "./index.d.ts",
21
+ "esm2022": "./esm2022/descope-angular-sdk.mjs",
22
+ "esm": "./esm2022/descope-angular-sdk.mjs",
23
+ "default": "./fesm2022/descope-angular-sdk.mjs"
24
+ }
25
+ },
26
+ "sideEffects": false,
27
+ "scripts": {
28
+ "ng": "ng",
29
+ "start": "ng serve",
30
+ "format-lint": "pretty-quick --staged --ignore-path .gitignore && lint-staged",
31
+ "prebuild": "node scripts/setversion/setversion.js",
32
+ "build": "npm run build:lib && rm -rf ./dist/package.json",
33
+ "build:lib": "cp package.json ./projects/angular-sdk && ng build angular-sdk",
34
+ "build:app": "ng build demo-app",
35
+ "pretest": "cp package.json ./projects/angular-sdk",
36
+ "watch": "ng build --watch --configuration development",
37
+ "test": "jest --config jest.config.js",
38
+ "lint": "ng lint",
39
+ "format": "prettier . -w --ignore-path .gitignore",
40
+ "format-check": "prettier . --check --ignore-path .gitignore"
41
+ },
42
+ "dependencies": {
43
+ "@descope/access-key-management-widget": "workspace:*",
44
+ "@descope/audit-management-widget": "workspace:*",
45
+ "@descope/role-management-widget": "workspace:*",
46
+ "@descope/user-management-widget": "workspace:*",
47
+ "@descope/user-profile-widget": "workspace:*",
48
+ "@descope/web-component": "workspace:*",
49
+ "@descope/web-js-sdk": "workspace:*",
50
+ "@descope/core-js-sdk": "workspace:*",
51
+ "tslib": "^2.3.0"
52
+ },
53
+ "devDependencies": {
54
+ "@angular-devkit/build-angular": "^16.2.6",
55
+ "@angular-eslint/builder": "16.3.1",
56
+ "@angular-eslint/eslint-plugin": "16.3.1",
57
+ "@angular-eslint/eslint-plugin-template": "16.3.1",
58
+ "@angular-eslint/schematics": "16.3.1",
59
+ "@angular-eslint/template-parser": "16.3.1",
60
+ "@angular/animations": "^16.2.9",
61
+ "@angular/cli": "^16.2.6",
62
+ "@angular/common": "^16.2.9",
63
+ "@angular/compiler": "^16.2.9",
64
+ "@angular/compiler-cli": "^16.2.9",
65
+ "@angular/core": "^16.2.9",
66
+ "@angular/forms": "^16.2.9",
67
+ "@angular/platform-browser": "^16.2.9",
68
+ "@angular/platform-browser-dynamic": "^16.2.9",
69
+ "@angular/router": "^16.2.9",
70
+ "@types/jest": "^29.5.5",
71
+ "@typescript-eslint/eslint-plugin": "6.12.0",
72
+ "@typescript-eslint/parser": "6.12.0",
73
+ "eslint": "^8.51.0",
74
+ "eslint-plugin-prettier": "^4.2.1",
75
+ "jest": "^29.7.0",
76
+ "jest-preset-angular": "^13.1.2",
77
+ "lint-staged": "^15.2.0",
78
+ "ng-mocks": "^14.11.0",
79
+ "ng-packagr": "^16.2.3",
80
+ "prettier": "2.8.8",
81
+ "pretty-quick": "^3.1.3",
82
+ "rxjs": "~7.8.1",
83
+ "tslib": "^2.6.2",
84
+ "typescript": "4.9.3",
85
+ "zone.js": "~0.13.0"
86
+ }
87
+ }
@@ -0,0 +1,3 @@
1
+ export const environment = {
2
+ buildVersion: '0.5.10'
3
+ };
@@ -0,0 +1,84 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+ import { AccessKeyManagementComponent } from './access-key-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 DescopeAccessKeyManagementWidget
10
+ jest.mock('@descope/access-key-management-widget', () => {
11
+ return jest.fn(() => {
12
+ // Create a mock DOM element
13
+ return document.createElement('descope-access-key-management-widget');
14
+ });
15
+ });
16
+
17
+ describe('DescopeAccessKeyManagementComponent', () => {
18
+ let component: AccessKeyManagementComponent;
19
+ let fixture: ComponentFixture<AccessKeyManagementComponent>;
20
+ let mockedCreateSdk: jest.Mock;
21
+ const onSessionTokenChangeSpy = jest.fn();
22
+ const onAccessKeyChangeSpy = 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
+ onAccessKeyChange: onAccessKeyChangeSpy,
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(AccessKeyManagementComponent);
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-access-key-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-access-key-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,63 @@
1
+ import { Component, ElementRef, Input, OnChanges, OnInit } from '@angular/core';
2
+ import DescopeAccessKeyManagementWidget from '@descope/access-key-management-widget';
3
+ import { ILogger } from '@descope/web-component';
4
+ import { DescopeAuthConfig } from '../../types/types';
5
+
6
+ @Component({
7
+ selector: 'access-key-management[tenant]',
8
+ standalone: true,
9
+ template: ''
10
+ })
11
+ export class AccessKeyManagementComponent 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 DescopeAccessKeyManagementWidget();
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
+ if (this.baseUrl) {
47
+ this.webComponent.setAttribute('base-url', this.baseUrl);
48
+ }
49
+ if (this.baseStaticUrl) {
50
+ this.webComponent.setAttribute('base-static-url', this.baseStaticUrl);
51
+ }
52
+ if (this.theme) {
53
+ this.webComponent.setAttribute('theme', this.theme);
54
+ }
55
+ if (this.debug) {
56
+ this.webComponent.setAttribute('debug', this.debug.toString());
57
+ }
58
+
59
+ if (this.logger) {
60
+ (this.webComponent as any).logger = this.logger;
61
+ }
62
+ }
63
+ }
@@ -0,0 +1,84 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+ import { AuditManagementComponent } from './audit-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 DescopeAuditManagementWidget
10
+ jest.mock('@descope/audit-management-widget', () => {
11
+ return jest.fn(() => {
12
+ // Create a mock DOM element
13
+ return document.createElement('descope-audit-management-widget');
14
+ });
15
+ });
16
+
17
+ describe('DescopeAuditManagementComponent', () => {
18
+ let component: AuditManagementComponent;
19
+ let fixture: ComponentFixture<AuditManagementComponent>;
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(AuditManagementComponent);
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-audit-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-audit-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,63 @@
1
+ import { Component, ElementRef, Input, OnChanges, OnInit } from '@angular/core';
2
+ import DescopeAuditManagementWidget from '@descope/audit-management-widget';
3
+ import { ILogger } from '@descope/web-component';
4
+ import { DescopeAuthConfig } from '../../types/types';
5
+
6
+ @Component({
7
+ selector: 'audit-management[tenant]',
8
+ standalone: true,
9
+ template: ''
10
+ })
11
+ export class AuditManagementComponent 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 DescopeAuditManagementWidget();
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
+ if (this.baseUrl) {
47
+ this.webComponent.setAttribute('base-url', this.baseUrl);
48
+ }
49
+ if (this.baseStaticUrl) {
50
+ this.webComponent.setAttribute('base-static-url', this.baseStaticUrl);
51
+ }
52
+ if (this.theme) {
53
+ this.webComponent.setAttribute('theme', this.theme);
54
+ }
55
+ if (this.debug) {
56
+ this.webComponent.setAttribute('debug', this.debug.toString());
57
+ }
58
+
59
+ if (this.logger) {
60
+ (this.webComponent as any).logger = this.logger;
61
+ }
62
+ }
63
+ }
@@ -0,0 +1,142 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+ import { default as DescopeWC } from '@descope/web-component';
3
+ import { DescopeComponent } from './descope.component';
4
+ import createSdk from '@descope/web-js-sdk';
5
+ import { DescopeAuthConfig } from '../../types/types';
6
+ import { CUSTOM_ELEMENTS_SCHEMA, EventEmitter } from '@angular/core';
7
+ import mocked = jest.mocked;
8
+
9
+ jest.mock('@descope/web-js-sdk');
10
+ //Mock DescopeWebComponent
11
+ jest.mock('@descope/web-component', () => {
12
+ return jest.fn(() => {
13
+ // Create a mock DOM element
14
+ return document.createElement('descope-wc');
15
+ });
16
+ });
17
+
18
+ describe('DescopeComponent', () => {
19
+ let component: DescopeComponent;
20
+ let fixture: ComponentFixture<DescopeComponent>;
21
+ let mockedCreateSdk: jest.Mock;
22
+ const onSessionTokenChangeSpy = jest.fn();
23
+ const onUserChangeSpy = jest.fn();
24
+ const afterRequestHooksSpy = jest.fn();
25
+ const mockConfig: DescopeAuthConfig = {
26
+ projectId: 'someProject'
27
+ };
28
+
29
+ beforeEach(() => {
30
+ mockedCreateSdk = mocked(createSdk);
31
+
32
+ mockedCreateSdk.mockReturnValue({
33
+ onSessionTokenChange: onSessionTokenChangeSpy,
34
+ onUserChange: onUserChangeSpy,
35
+ httpClient: {
36
+ hooks: {
37
+ afterRequest: afterRequestHooksSpy
38
+ }
39
+ }
40
+ });
41
+
42
+ TestBed.configureTestingModule({
43
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
44
+ providers: [
45
+ DescopeAuthConfig,
46
+ { provide: DescopeAuthConfig, useValue: mockConfig }
47
+ ]
48
+ });
49
+
50
+ fixture = TestBed.createComponent(DescopeComponent);
51
+ component = fixture.componentInstance;
52
+ component.projectId = '123';
53
+ component.flowId = 'sign-in';
54
+ component.locale = 'en-US';
55
+ component.success = new EventEmitter<CustomEvent>();
56
+ component.error = new EventEmitter<CustomEvent>();
57
+ component.logger = {
58
+ info: jest.fn(),
59
+ error: jest.fn(),
60
+ warn: jest.fn(),
61
+ debug: jest.fn()
62
+ };
63
+ component.errorTransformer = jest.fn();
64
+ component.client = {};
65
+ component.form = {};
66
+ component.storeLastAuthenticatedUser = true;
67
+ fixture.detectChanges();
68
+ });
69
+
70
+ it('should create', () => {
71
+ expect(component).toBeTruthy();
72
+ const html: HTMLElement = fixture.nativeElement;
73
+ const webComponentHtml = html.querySelector('descope-wc');
74
+ expect(webComponentHtml).toBeDefined();
75
+
76
+ expect(DescopeWC.sdkConfigOverrides).toEqual({
77
+ baseHeaders: {
78
+ 'x-descope-sdk-name': 'angular',
79
+ 'x-descope-sdk-version': expect.stringMatching(/^\d+\.\d+\.\d+$/)
80
+ },
81
+ persistTokens: false,
82
+ hooks: {
83
+ beforeRequest: undefined
84
+ }
85
+ });
86
+ });
87
+
88
+ it('should correctly setup attributes based on inputs', () => {
89
+ const html: HTMLElement = fixture.nativeElement;
90
+ const webComponentHtml = html.querySelector('descope-wc')!;
91
+ expect(webComponentHtml.getAttribute('project-id')).toStrictEqual('123');
92
+ expect(webComponentHtml.getAttribute('flow-id')).toStrictEqual('sign-in');
93
+ expect(webComponentHtml.getAttribute('locale')).toStrictEqual('en-US');
94
+ expect(webComponentHtml.getAttribute('logger')).toBeDefined();
95
+ expect(webComponentHtml.getAttribute('error-transformer')).toBeDefined();
96
+ expect(webComponentHtml.getAttribute('redirect-url')).toBeNull();
97
+ expect(
98
+ webComponentHtml?.getAttribute('store-last-authenticated-user')
99
+ ).toEqual('true');
100
+ });
101
+
102
+ it('should emit success when web component emits success', () => {
103
+ const html: HTMLElement = fixture.nativeElement;
104
+ const webComponentHtml = html.querySelector('descope-wc')!;
105
+
106
+ const event = {
107
+ detail: { user: { name: 'user1' }, sessionJwt: 'session1' }
108
+ };
109
+ component.success.subscribe((e) => {
110
+ expect(afterRequestHooksSpy).toHaveBeenCalled();
111
+ expect(e.detail).toHaveBeenCalledWith(event.detail);
112
+ });
113
+ webComponentHtml.dispatchEvent(new CustomEvent('success', event));
114
+ });
115
+
116
+ it('should emit error when web component emits error', () => {
117
+ const html: HTMLElement = fixture.nativeElement;
118
+ const webComponentHtml = html.querySelector('descope-wc')!;
119
+
120
+ const event = {
121
+ detail: {
122
+ errorCode: 'someError',
123
+ errorDescription: 'someErrorDescription'
124
+ }
125
+ };
126
+ component.error.subscribe((e) => {
127
+ expect(e.detail).toEqual(event.detail);
128
+ });
129
+ webComponentHtml.dispatchEvent(new CustomEvent('error', event));
130
+ });
131
+
132
+ it('should emit ready when web component emits ready', () => {
133
+ const spy = jest.spyOn(component.ready, 'emit');
134
+
135
+ const html: HTMLElement = fixture.nativeElement;
136
+ const webComponentHtml = html.querySelector('descope-wc')!;
137
+
138
+ webComponentHtml.dispatchEvent(new CustomEvent('ready', {}));
139
+
140
+ expect(spy).toHaveBeenCalled();
141
+ });
142
+ });