@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,171 @@
1
+ import {
2
+ Component,
3
+ ElementRef,
4
+ EventEmitter,
5
+ Input,
6
+ OnChanges,
7
+ OnInit,
8
+ Output
9
+ } from '@angular/core';
10
+ import DescopeWebComponent from '@descope/web-component';
11
+ import DescopeWc, { ILogger } from '@descope/web-component';
12
+ import { DescopeAuthService } from '../../services/descope-auth.service';
13
+ import { from } from 'rxjs';
14
+ import { baseHeaders } from '../../utils/constants';
15
+ import { DescopeAuthConfig } from '../../types/types';
16
+
17
+ @Component({
18
+ selector: 'descope[flowId]',
19
+ standalone: true,
20
+ template: ''
21
+ })
22
+ export class DescopeComponent implements OnInit, OnChanges {
23
+ projectId: string;
24
+ baseUrl?: string;
25
+ baseStaticUrl?: string;
26
+ storeLastAuthenticatedUser?: boolean;
27
+ @Input() flowId: string;
28
+
29
+ @Input() locale: string;
30
+ @Input() theme: 'light' | 'dark' | 'os';
31
+ @Input() tenant: string;
32
+ @Input() telemetryKey: string;
33
+ @Input() redirectUrl: string;
34
+ @Input() autoFocus: true | false | 'skipFirstScreen';
35
+
36
+ @Input() debug: boolean;
37
+ @Input() errorTransformer: (error: { text: string; type: string }) => string;
38
+ @Input() client: Record<string, any>;
39
+ @Input() form: Record<string, any>;
40
+ @Input() logger: ILogger;
41
+
42
+ @Output() success: EventEmitter<CustomEvent> =
43
+ new EventEmitter<CustomEvent>();
44
+ @Output() error: EventEmitter<CustomEvent> = new EventEmitter<CustomEvent>();
45
+ @Output() ready: EventEmitter<void> = new EventEmitter<void>();
46
+
47
+ private readonly webComponent: DescopeWebComponent =
48
+ new DescopeWebComponent();
49
+
50
+ constructor(
51
+ private elementRef: ElementRef,
52
+ private authService: DescopeAuthService,
53
+ descopeConfig: DescopeAuthConfig
54
+ ) {
55
+ this.projectId = descopeConfig.projectId;
56
+ this.baseUrl = descopeConfig.baseUrl;
57
+ this.baseStaticUrl = descopeConfig.baseStaticUrl;
58
+ this.storeLastAuthenticatedUser = descopeConfig.storeLastAuthenticatedUser;
59
+ }
60
+
61
+ ngOnInit() {
62
+ const sdk = this.authService.descopeSdk; // Capture the class context in a variable
63
+ DescopeWc.sdkConfigOverrides = {
64
+ // Overrides the web-component's base headers to indicate usage via the React SDK
65
+ baseHeaders,
66
+ // Disables token persistence within the web-component to delegate token management
67
+ // to the global SDK hooks. This ensures token handling aligns with the SDK's configuration,
68
+ // and web-component requests leverage the global SDK's beforeRequest hooks for consistency
69
+ persistTokens: false,
70
+ hooks: {
71
+ get beforeRequest() {
72
+ // Retrieves the beforeRequest hook from the global SDK, which is initialized
73
+ // within the AuthProvider using the desired configuration. This approach ensures
74
+ // the web-component utilizes the same beforeRequest hooks as the global SDK
75
+ return sdk.httpClient.hooks?.beforeRequest;
76
+ },
77
+ set beforeRequest(_) {
78
+ // The empty setter prevents runtime errors when attempts are made to assign a value to 'beforeRequest'.
79
+ // JavaScript objects default to having both getters and setters
80
+ }
81
+ }
82
+ };
83
+ this.setupWebComponent();
84
+ this.elementRef.nativeElement.appendChild(this.webComponent);
85
+ }
86
+
87
+ ngOnChanges(): void {
88
+ this.setupWebComponent();
89
+ }
90
+
91
+ private setupWebComponent() {
92
+ this.webComponent.setAttribute('project-id', this.projectId);
93
+ this.webComponent.setAttribute('flow-id', this.flowId);
94
+
95
+ if (this.baseUrl) {
96
+ this.webComponent.setAttribute('base-url', this.baseUrl);
97
+ }
98
+ if (this.baseStaticUrl) {
99
+ this.webComponent.setAttribute('base-static-url', this.baseStaticUrl);
100
+ }
101
+ if (this.storeLastAuthenticatedUser) {
102
+ this.webComponent.setAttribute(
103
+ 'store-last-authenticated-user',
104
+ this.storeLastAuthenticatedUser.toString()
105
+ );
106
+ }
107
+ if (this.locale) {
108
+ this.webComponent.setAttribute('locale', this.locale);
109
+ }
110
+ if (this.theme) {
111
+ this.webComponent.setAttribute('theme', this.theme);
112
+ }
113
+ if (this.tenant) {
114
+ this.webComponent.setAttribute('tenant', this.tenant);
115
+ }
116
+ if (this.telemetryKey) {
117
+ this.webComponent.setAttribute('telemetryKey', this.telemetryKey);
118
+ }
119
+ if (this.redirectUrl) {
120
+ this.webComponent.setAttribute('redirect-url', this.redirectUrl);
121
+ }
122
+ if (this.autoFocus) {
123
+ this.webComponent.setAttribute('auto-focus', this.autoFocus.toString());
124
+ }
125
+ if (this.debug) {
126
+ this.webComponent.setAttribute('debug', this.debug.toString());
127
+ }
128
+
129
+ if (this.errorTransformer) {
130
+ this.webComponent.errorTransformer = this.errorTransformer;
131
+ }
132
+
133
+ if (this.client) {
134
+ this.webComponent.setAttribute('client', JSON.stringify(this.client));
135
+ }
136
+
137
+ if (this.form) {
138
+ this.webComponent.setAttribute('form', JSON.stringify(this.form));
139
+ }
140
+
141
+ if (this.logger) {
142
+ this.webComponent.logger = this.logger;
143
+ }
144
+
145
+ this.webComponent.addEventListener('success', (e: Event) => {
146
+ from(
147
+ this.authService.descopeSdk.httpClient.hooks?.afterRequest!(
148
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
149
+ {} as any,
150
+ new Response(JSON.stringify((e as CustomEvent).detail))
151
+ ) as Promise<unknown>
152
+ ).subscribe(() => {
153
+ if (this.success) {
154
+ this.success?.emit(e as CustomEvent);
155
+ }
156
+ });
157
+ });
158
+
159
+ if (this.error) {
160
+ this.webComponent.addEventListener('error', (e: Event) => {
161
+ this.error?.emit(e as CustomEvent);
162
+ });
163
+ }
164
+
165
+ if (this.ready) {
166
+ this.webComponent.addEventListener('ready', () => {
167
+ this.ready?.emit();
168
+ });
169
+ }
170
+ }
171
+ }
@@ -0,0 +1,84 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+ import { RoleManagementComponent } from './role-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 DescopeRoleManagementWidget
10
+ jest.mock('@descope/role-management-widget', () => {
11
+ return jest.fn(() => {
12
+ // Create a mock DOM element
13
+ return document.createElement('descope-role-management-widget');
14
+ });
15
+ });
16
+
17
+ describe('DescopeRoleManagementComponent', () => {
18
+ let component: RoleManagementComponent;
19
+ let fixture: ComponentFixture<RoleManagementComponent>;
20
+ let mockedCreateSdk: jest.Mock;
21
+ const onSessionTokenChangeSpy = jest.fn();
22
+ const onRoleChangeSpy = 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
+ onRoleChange: onRoleChangeSpy,
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(RoleManagementComponent);
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-role-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-role-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 DescopeRoleManagementWidget from '@descope/role-management-widget';
3
+ import { ILogger } from '@descope/web-component';
4
+ import { DescopeAuthConfig } from '../../types/types';
5
+
6
+ @Component({
7
+ selector: 'role-management[tenant]',
8
+ standalone: true,
9
+ template: ''
10
+ })
11
+ export class RoleManagementComponent 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 DescopeRoleManagementWidget();
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,17 @@
1
+ <descope
2
+ (success)="success.emit($event)"
3
+ (error)="error.emit($event)"
4
+ flowId="sign-in"
5
+ [locale]="locale"
6
+ [theme]="theme"
7
+ [tenant]="tenant"
8
+ [telemetryKey]="telemetryKey"
9
+ [redirectUrl]="redirectUrl"
10
+ [autoFocus]="autoFocus"
11
+ [debug]="debug"
12
+ [errorTransformer]="errorTransformer"
13
+ [client]="client"
14
+ [form]="form"
15
+ [logger]="logger"
16
+ >
17
+ </descope>
@@ -0,0 +1,53 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+ import { SignInFlowComponent } from './sign-in-flow.component';
3
+ import { ngMocks } from 'ng-mocks';
4
+ import { DescopeComponent } from '../descope/descope.component';
5
+ import { DescopeAuthConfig } from '../../types/types';
6
+ import createSdk from '@descope/web-js-sdk';
7
+ import mocked = jest.mocked;
8
+
9
+ jest.mock('@descope/web-js-sdk');
10
+ jest.mock('@descope/web-component', () => {
11
+ return jest.fn(() => {
12
+ // Create a mock DOM element
13
+ return document.createElement('descope-wc');
14
+ });
15
+ });
16
+
17
+ describe('SignInFlowComponent', () => {
18
+ let component: SignInFlowComponent;
19
+ let fixture: ComponentFixture<SignInFlowComponent>;
20
+ let mockedCreateSdk: jest.Mock;
21
+
22
+ beforeEach(() => {
23
+ mockedCreateSdk = mocked(createSdk);
24
+
25
+ mockedCreateSdk.mockReturnValue({
26
+ onSessionTokenChange: jest.fn(),
27
+ onUserChange: jest.fn()
28
+ });
29
+
30
+ TestBed.configureTestingModule({
31
+ providers: [
32
+ DescopeAuthConfig,
33
+ {
34
+ provide: DescopeAuthConfig,
35
+ useValue: {
36
+ projectId: 'someProject'
37
+ }
38
+ }
39
+ ]
40
+ });
41
+
42
+ fixture = TestBed.createComponent(SignInFlowComponent);
43
+ component = fixture.componentInstance;
44
+ fixture.detectChanges();
45
+ });
46
+
47
+ it('should create and be correctly configured', () => {
48
+ expect(component).toBeTruthy();
49
+ const mockComponent =
50
+ ngMocks.find<DescopeComponent>('[flowId=sign-in]').componentInstance;
51
+ expect(mockComponent.flowId).toStrictEqual('sign-in');
52
+ });
53
+ });
@@ -0,0 +1,35 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { ILogger } from '@descope/web-component';
3
+ import { DescopeComponent } from '../descope/descope.component';
4
+ import { DescopeAuthConfig } from '../../types/types';
5
+
6
+ @Component({
7
+ selector: 'descope-sign-in-flow',
8
+ standalone: true,
9
+ imports: [DescopeComponent],
10
+ templateUrl: './sign-in-flow.component.html'
11
+ })
12
+ export class SignInFlowComponent {
13
+ projectId: string;
14
+
15
+ @Input() locale: string;
16
+ @Input() theme: 'light' | 'dark' | 'os';
17
+ @Input() tenant: string;
18
+ @Input() telemetryKey: string;
19
+ @Input() redirectUrl: string;
20
+ @Input() autoFocus: true | false | 'skipFirstScreen';
21
+
22
+ @Input() debug: boolean;
23
+ @Input() errorTransformer: (error: { text: string; type: string }) => string;
24
+ @Input() client: Record<string, any>;
25
+ @Input() form: Record<string, any>;
26
+ @Input() logger: ILogger;
27
+
28
+ @Output() success: EventEmitter<CustomEvent> =
29
+ new EventEmitter<CustomEvent>();
30
+ @Output() error: EventEmitter<CustomEvent> = new EventEmitter<CustomEvent>();
31
+
32
+ constructor(descopeConfig: DescopeAuthConfig) {
33
+ this.projectId = descopeConfig.projectId;
34
+ }
35
+ }
@@ -0,0 +1,17 @@
1
+ <descope
2
+ (success)="success.emit($event)"
3
+ (error)="error.emit($event)"
4
+ flowId="sign-up"
5
+ [locale]="locale"
6
+ [theme]="theme"
7
+ [tenant]="tenant"
8
+ [telemetryKey]="telemetryKey"
9
+ [redirectUrl]="redirectUrl"
10
+ [autoFocus]="autoFocus"
11
+ [debug]="debug"
12
+ [errorTransformer]="errorTransformer"
13
+ [client]="client"
14
+ [form]="form"
15
+ [logger]="logger"
16
+ >
17
+ </descope>
@@ -0,0 +1,51 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+ import { SignUpFlowComponent } from './sign-up-flow.component';
3
+ import { DescopeComponent } from '../descope/descope.component';
4
+ import { ngMocks } from 'ng-mocks';
5
+ import createSdk from '@descope/web-js-sdk';
6
+ import { DescopeAuthConfig } from '../../types/types';
7
+ import mocked = jest.mocked;
8
+
9
+ jest.mock('@descope/web-js-sdk');
10
+ jest.mock('@descope/web-component', () => {
11
+ return jest.fn(() => {
12
+ // Create a mock DOM element
13
+ return document.createElement('descope-wc');
14
+ });
15
+ });
16
+ describe('SignUpFlowComponent', () => {
17
+ let component: SignUpFlowComponent;
18
+ let fixture: ComponentFixture<SignUpFlowComponent>;
19
+ let mockedCreateSdk: jest.Mock;
20
+
21
+ beforeEach(() => {
22
+ mockedCreateSdk = mocked(createSdk);
23
+
24
+ mockedCreateSdk.mockReturnValue({
25
+ onSessionTokenChange: jest.fn(),
26
+ onUserChange: jest.fn()
27
+ });
28
+
29
+ TestBed.configureTestingModule({
30
+ providers: [
31
+ DescopeAuthConfig,
32
+ {
33
+ provide: DescopeAuthConfig,
34
+ useValue: {
35
+ projectId: 'someProject'
36
+ }
37
+ }
38
+ ]
39
+ });
40
+ fixture = TestBed.createComponent(SignUpFlowComponent);
41
+ component = fixture.componentInstance;
42
+ fixture.detectChanges();
43
+ });
44
+
45
+ it('should create and be correctly configured', () => {
46
+ expect(component).toBeTruthy();
47
+ const mockComponent =
48
+ ngMocks.find<DescopeComponent>('[flowId=sign-up]').componentInstance;
49
+ expect(mockComponent.flowId).toStrictEqual('sign-up');
50
+ });
51
+ });
@@ -0,0 +1,35 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { ILogger } from '@descope/web-component';
3
+ import { DescopeComponent } from '../descope/descope.component';
4
+ import { DescopeAuthConfig } from '../../types/types';
5
+
6
+ @Component({
7
+ selector: 'descope-sign-up-flow',
8
+ standalone: true,
9
+ imports: [DescopeComponent],
10
+ templateUrl: './sign-up-flow.component.html'
11
+ })
12
+ export class SignUpFlowComponent {
13
+ projectId: string;
14
+
15
+ @Input() locale: string;
16
+ @Input() theme: 'light' | 'dark' | 'os';
17
+ @Input() tenant: string;
18
+ @Input() telemetryKey: string;
19
+ @Input() redirectUrl: string;
20
+ @Input() autoFocus: true | false | 'skipFirstScreen';
21
+
22
+ @Input() debug: boolean;
23
+ @Input() errorTransformer: (error: { text: string; type: string }) => string;
24
+ @Input() client: Record<string, any>;
25
+ @Input() form: Record<string, any>;
26
+ @Input() logger: ILogger;
27
+
28
+ @Output() success: EventEmitter<CustomEvent> =
29
+ new EventEmitter<CustomEvent>();
30
+ @Output() error: EventEmitter<CustomEvent> = new EventEmitter<CustomEvent>();
31
+
32
+ constructor(descopeConfig: DescopeAuthConfig) {
33
+ this.projectId = descopeConfig.projectId;
34
+ }
35
+ }
@@ -0,0 +1,17 @@
1
+ <descope
2
+ (success)="success.emit($event)"
3
+ (error)="error.emit($event)"
4
+ flowId="sign-up-or-in"
5
+ [locale]="locale"
6
+ [theme]="theme"
7
+ [tenant]="tenant"
8
+ [telemetryKey]="telemetryKey"
9
+ [redirectUrl]="redirectUrl"
10
+ [autoFocus]="autoFocus"
11
+ [debug]="debug"
12
+ [errorTransformer]="errorTransformer"
13
+ [client]="client"
14
+ [form]="form"
15
+ [logger]="logger"
16
+ >
17
+ </descope>
@@ -0,0 +1,53 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+ import { SignUpOrInFlowComponent } from './sign-up-or-in-flow.component';
3
+ import { DescopeComponent } from '../descope/descope.component';
4
+ import { ngMocks } from 'ng-mocks';
5
+ import createSdk from '@descope/web-js-sdk';
6
+ import { DescopeAuthConfig } from '../../types/types';
7
+ import mocked = jest.mocked;
8
+
9
+ jest.mock('@descope/web-js-sdk');
10
+ jest.mock('@descope/web-component', () => {
11
+ return jest.fn(() => {
12
+ // Create a mock DOM element
13
+ return document.createElement('descope-wc');
14
+ });
15
+ });
16
+ describe('SignUpOrInFlowComponent', () => {
17
+ let component: SignUpOrInFlowComponent;
18
+ let fixture: ComponentFixture<SignUpOrInFlowComponent>;
19
+ let mockedCreateSdk: jest.Mock;
20
+
21
+ beforeEach(() => {
22
+ mockedCreateSdk = mocked(createSdk);
23
+
24
+ mockedCreateSdk.mockReturnValue({
25
+ onSessionTokenChange: jest.fn(),
26
+ onUserChange: jest.fn()
27
+ });
28
+
29
+ TestBed.configureTestingModule({
30
+ providers: [
31
+ DescopeAuthConfig,
32
+ {
33
+ provide: DescopeAuthConfig,
34
+ useValue: {
35
+ projectId: 'someProject'
36
+ }
37
+ }
38
+ ]
39
+ });
40
+
41
+ fixture = TestBed.createComponent(SignUpOrInFlowComponent);
42
+ component = fixture.componentInstance;
43
+ fixture.detectChanges();
44
+ });
45
+
46
+ it('should create and be correctly configured', () => {
47
+ expect(component).toBeTruthy();
48
+ const mockComponent = ngMocks.find<DescopeComponent>(
49
+ '[flowId=sign-up-or-in]'
50
+ ).componentInstance;
51
+ expect(mockComponent.flowId).toStrictEqual('sign-up-or-in');
52
+ });
53
+ });
@@ -0,0 +1,35 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { ILogger } from '@descope/web-component';
3
+ import { DescopeComponent } from '../descope/descope.component';
4
+ import { DescopeAuthConfig } from '../../types/types';
5
+
6
+ @Component({
7
+ selector: 'descope-sign-up-or-in-flow',
8
+ standalone: true,
9
+ imports: [DescopeComponent],
10
+ templateUrl: './sign-up-or-in-flow.component.html'
11
+ })
12
+ export class SignUpOrInFlowComponent {
13
+ projectId: string;
14
+
15
+ @Input() locale: string;
16
+ @Input() theme: 'light' | 'dark' | 'os';
17
+ @Input() tenant: string;
18
+ @Input() telemetryKey: string;
19
+ @Input() redirectUrl: string;
20
+ @Input() autoFocus: true | false | 'skipFirstScreen';
21
+
22
+ @Input() debug: boolean;
23
+ @Input() errorTransformer: (error: { text: string; type: string }) => string;
24
+ @Input() client: Record<string, any>;
25
+ @Input() form: Record<string, any>;
26
+ @Input() logger: ILogger;
27
+
28
+ @Output() success: EventEmitter<CustomEvent> =
29
+ new EventEmitter<CustomEvent>();
30
+ @Output() error: EventEmitter<CustomEvent> = new EventEmitter<CustomEvent>();
31
+
32
+ constructor(descopeConfig: DescopeAuthConfig) {
33
+ this.projectId = descopeConfig.projectId;
34
+ }
35
+ }