oidc-spa 8.0.2 → 8.0.4
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/angular/angular.d.ts +72 -0
- package/angular/angular.js +253 -0
- package/angular/angular.js.map +1 -0
- package/angular/index.d.ts +1 -0
- package/angular/index.js +6 -0
- package/angular/index.js.map +1 -0
- package/core/createOidc.d.ts +1 -1
- package/core/createOidc.js +1 -1
- package/esm/angular/angular.d.ts +72 -0
- package/esm/angular/angular.js +249 -0
- package/esm/angular/angular.js.map +1 -0
- package/esm/angular/index.d.ts +1 -0
- package/esm/angular/index.js +2 -0
- package/esm/angular/index.js.map +1 -0
- package/esm/core/createOidc.d.ts +1 -1
- package/esm/core/createOidc.js +1 -1
- package/esm/mock/angular.d.ts +41 -0
- package/esm/mock/angular.js +7 -0
- package/esm/mock/angular.js.map +1 -0
- package/esm/mock/react.js +2 -2
- package/esm/mock/react.js.map +1 -1
- package/esm/react/react.d.ts +1 -1
- package/esm/react/react.js +5 -5
- package/esm/react/react.js.map +1 -1
- package/mock/angular.d.ts +41 -0
- package/mock/angular.js +10 -0
- package/mock/angular.js.map +1 -0
- package/mock/react.js +1 -1
- package/mock/react.js.map +1 -1
- package/package.json +24 -3
- package/react/react.d.ts +1 -1
- package/react/react.js +6 -6
- package/react/react.js.map +1 -1
- package/src/angular/angular.ts +428 -0
- package/src/angular/index.ts +1 -0
- package/src/core/createOidc.ts +1 -1
- package/src/mock/angular.ts +11 -0
- package/src/mock/react.tsx +2 -2
- package/src/react/react.tsx +6 -6
package/react/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react/react.tsx"],"names":[],"mappings":";;AAoHA,
|
|
1
|
+
{"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react/react.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
import { type Oidc, createOidc, type ParamsOfCreateOidc, OidcInitializationError } from "../core";
|
|
2
|
+
import { assert, type Equals } from "../vendor/frontend/tsafe";
|
|
3
|
+
import { id } from "../vendor/frontend/tsafe";
|
|
4
|
+
import type { ValueOrAsyncGetter } from "../tools/ValueOrAsyncGetter";
|
|
5
|
+
import { Deferred } from "../tools/Deferred";
|
|
6
|
+
import { type Signal, type EnvironmentProviders, provideAppInitializer, inject } from "@angular/core";
|
|
7
|
+
import { type CanActivateFn, Router } from "@angular/router";
|
|
8
|
+
import { toSignal } from "@angular/core/rxjs-interop";
|
|
9
|
+
import { BehaviorSubject } from "rxjs";
|
|
10
|
+
import { createObjectThatThrowsIfAccessed } from "../tools/createObjectThatThrowsIfAccessed";
|
|
11
|
+
|
|
12
|
+
export type OidcAngular = OidcAngular.NotLoggedIn | OidcAngular.LoggedIn;
|
|
13
|
+
|
|
14
|
+
export namespace OidcAngular {
|
|
15
|
+
export type Common = Oidc.Common;
|
|
16
|
+
|
|
17
|
+
export type NotLoggedIn = Common & {
|
|
18
|
+
isUserLoggedIn: false;
|
|
19
|
+
login: (params?: {
|
|
20
|
+
extraQueryParams?: Record<string, string | undefined>;
|
|
21
|
+
transformUrlBeforeRedirect?: (url: string) => string;
|
|
22
|
+
}) => Promise<never>;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export type LoggedIn = Common & {
|
|
26
|
+
isUserLoggedIn: true;
|
|
27
|
+
logout: Oidc.LoggedIn["logout"];
|
|
28
|
+
renewTokens: Oidc.LoggedIn["renewTokens"];
|
|
29
|
+
goToAuthServer: Oidc.LoggedIn["goToAuthServer"];
|
|
30
|
+
backFromAuthServer:
|
|
31
|
+
| {
|
|
32
|
+
extraQueryParams: Record<string, string>;
|
|
33
|
+
result: Record<string, string>;
|
|
34
|
+
}
|
|
35
|
+
| undefined;
|
|
36
|
+
isNewBrowserSession: boolean;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
type OidcAngularApi<DecodedIdToken extends Record<string, unknown>, AutoLogin extends boolean> = {
|
|
41
|
+
getOidc: AutoLogin extends true
|
|
42
|
+
? {
|
|
43
|
+
(params?: { assert: "user logged in" }): OidcAngular.LoggedIn;
|
|
44
|
+
}
|
|
45
|
+
: {
|
|
46
|
+
(params?: { assert?: undefined }): OidcAngular;
|
|
47
|
+
(params: { assert: "user logged in" }): OidcAngular.LoggedIn;
|
|
48
|
+
(params: { assert: "user not logged in" }): OidcAngular.NotLoggedIn;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
getOidcInitializationError: () => OidcInitializationError | undefined;
|
|
52
|
+
|
|
53
|
+
get$decodedIdToken: () => Signal<DecodedIdToken>;
|
|
54
|
+
|
|
55
|
+
get$secondsLeftBeforeAutoLogout: (params: {
|
|
56
|
+
warningDurationSeconds: number;
|
|
57
|
+
}) => Signal<number | undefined>;
|
|
58
|
+
|
|
59
|
+
getTokens: () => Promise<
|
|
60
|
+
| { isUserLoggedIn: false; prTokens?: never }
|
|
61
|
+
| { isUserLoggedIn: true; prTokens: Promise<Oidc.Tokens<DecodedIdToken>> }
|
|
62
|
+
>;
|
|
63
|
+
|
|
64
|
+
provideOidcInitAwaiter: EnvironmentProviders;
|
|
65
|
+
} & (AutoLogin extends true
|
|
66
|
+
? {}
|
|
67
|
+
: {
|
|
68
|
+
enforceLoginGuard: CanActivateFn;
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
export function createAngularOidc_dependencyInjection<
|
|
72
|
+
DecodedIdToken extends Record<string, unknown>,
|
|
73
|
+
ParamsOfCreateOidc extends {
|
|
74
|
+
autoLogin?: boolean;
|
|
75
|
+
} & (
|
|
76
|
+
| {
|
|
77
|
+
decodedIdTokenSchema: { parse: (data: unknown) => DecodedIdToken } | undefined;
|
|
78
|
+
}
|
|
79
|
+
| {}
|
|
80
|
+
)
|
|
81
|
+
>(
|
|
82
|
+
paramsOrGetParams: ValueOrAsyncGetter<ParamsOfCreateOidc>,
|
|
83
|
+
createOidc: (params: ParamsOfCreateOidc) => Promise<Oidc<DecodedIdToken>>
|
|
84
|
+
): OidcAngularApi<
|
|
85
|
+
DecodedIdToken,
|
|
86
|
+
ParamsOfCreateOidc extends { autoLogin?: true | undefined } ? true : false
|
|
87
|
+
> {
|
|
88
|
+
const dReadyToCreate = new Deferred<void>();
|
|
89
|
+
|
|
90
|
+
// NOTE: It can be InitializationError only if autoLogin is true
|
|
91
|
+
const prOidcOrAutoLoginInitializationError = (async () => {
|
|
92
|
+
const params = await (async () => {
|
|
93
|
+
await dReadyToCreate.pr;
|
|
94
|
+
|
|
95
|
+
if (typeof paramsOrGetParams === "function") {
|
|
96
|
+
const getParams = paramsOrGetParams;
|
|
97
|
+
|
|
98
|
+
const params = await getParams();
|
|
99
|
+
|
|
100
|
+
return params;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const params = paramsOrGetParams;
|
|
104
|
+
|
|
105
|
+
return params;
|
|
106
|
+
})();
|
|
107
|
+
|
|
108
|
+
let oidc: Oidc<DecodedIdToken>;
|
|
109
|
+
|
|
110
|
+
try {
|
|
111
|
+
oidc = await createOidc(params);
|
|
112
|
+
} catch (error) {
|
|
113
|
+
if (!(error instanceof OidcInitializationError)) {
|
|
114
|
+
throw error;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return error;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return oidc;
|
|
121
|
+
})();
|
|
122
|
+
|
|
123
|
+
let oidcOrAutoLoginInitializationError: Oidc<DecodedIdToken> | OidcInitializationError | undefined =
|
|
124
|
+
undefined;
|
|
125
|
+
|
|
126
|
+
prOidcOrAutoLoginInitializationError.then(value => {
|
|
127
|
+
oidcOrAutoLoginInitializationError = value;
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
function getOidc(params?: { assert?: "user logged in" | "user not logged in" }): OidcAngular {
|
|
131
|
+
const { assert: assert_params } = params ?? {};
|
|
132
|
+
|
|
133
|
+
if (oidcOrAutoLoginInitializationError === undefined) {
|
|
134
|
+
throw new Error("oidc-spa: calling getOidc() before provideOidcInitAwaiter has resolved");
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (oidcOrAutoLoginInitializationError instanceof OidcInitializationError) {
|
|
138
|
+
throw new Error(
|
|
139
|
+
"oidc-spa: calling getOidc() while getOidcInitializationError() is not `undefined` in autoLogin: true mode"
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const oidc = oidcOrAutoLoginInitializationError;
|
|
144
|
+
|
|
145
|
+
check_assertion: {
|
|
146
|
+
if (assert_params === undefined) {
|
|
147
|
+
break check_assertion;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const getMessage = (v: string) =>
|
|
151
|
+
[
|
|
152
|
+
"There is a logic error in the application.",
|
|
153
|
+
`If this component is mounted the user is supposed ${v}.`,
|
|
154
|
+
"An explicit assertion was made in this sense."
|
|
155
|
+
].join(" ");
|
|
156
|
+
|
|
157
|
+
switch (assert_params) {
|
|
158
|
+
case "user logged in":
|
|
159
|
+
if (!oidc.isUserLoggedIn) {
|
|
160
|
+
throw new Error(getMessage("to be logged in but currently they arn't"));
|
|
161
|
+
}
|
|
162
|
+
break;
|
|
163
|
+
case "user not logged in":
|
|
164
|
+
if (oidc.isUserLoggedIn) {
|
|
165
|
+
throw new Error(getMessage("not to be logged in but currently they are"));
|
|
166
|
+
}
|
|
167
|
+
break;
|
|
168
|
+
default:
|
|
169
|
+
assert<Equals<typeof assert_params, never>>(false);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const common: OidcAngular.Common = {
|
|
174
|
+
params: oidc.params
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
return oidc.isUserLoggedIn
|
|
178
|
+
? id<OidcAngular.LoggedIn>({
|
|
179
|
+
...common,
|
|
180
|
+
isUserLoggedIn: true,
|
|
181
|
+
logout: oidc.logout,
|
|
182
|
+
renewTokens: oidc.renewTokens,
|
|
183
|
+
goToAuthServer: oidc.goToAuthServer,
|
|
184
|
+
backFromAuthServer: oidc.backFromAuthServer,
|
|
185
|
+
isNewBrowserSession: oidc.isNewBrowserSession
|
|
186
|
+
})
|
|
187
|
+
: id<OidcAngular.NotLoggedIn>({
|
|
188
|
+
...common,
|
|
189
|
+
isUserLoggedIn: false,
|
|
190
|
+
login: params =>
|
|
191
|
+
oidc.login({
|
|
192
|
+
...params,
|
|
193
|
+
doesCurrentHrefRequiresAuth: false
|
|
194
|
+
})
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function getOidcInitializationError(): OidcInitializationError | undefined {
|
|
199
|
+
if (oidcOrAutoLoginInitializationError === undefined) {
|
|
200
|
+
throw new Error(
|
|
201
|
+
"oidc-spa: calling getOidcInitializationError() before provideOidcInitAwaiter has resolved"
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
if (oidcOrAutoLoginInitializationError instanceof OidcInitializationError) {
|
|
206
|
+
return oidcOrAutoLoginInitializationError;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
const oidc = oidcOrAutoLoginInitializationError;
|
|
210
|
+
|
|
211
|
+
if (!oidc.isUserLoggedIn && oidc.initializationError !== undefined) {
|
|
212
|
+
return oidc.initializationError;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
return undefined;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
const { get$decodedIdToken } = (() => {
|
|
219
|
+
function createDecodedIdToken$() {
|
|
220
|
+
if (oidcOrAutoLoginInitializationError === undefined) {
|
|
221
|
+
throw new Error(
|
|
222
|
+
"oidc-spa: calling get$decodedIdToken() before provideOidcInitAwaiter has resolved"
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
if (oidcOrAutoLoginInitializationError instanceof OidcInitializationError) {
|
|
227
|
+
throw new Error(
|
|
228
|
+
"oidc-spa: calling getOidc() while getOidcInitializationError() is not `undefined` in autoLogin: true mode"
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
const oidc = oidcOrAutoLoginInitializationError;
|
|
233
|
+
|
|
234
|
+
let initialValue: DecodedIdToken;
|
|
235
|
+
|
|
236
|
+
if (!oidc.isUserLoggedIn) {
|
|
237
|
+
initialValue = createObjectThatThrowsIfAccessed({
|
|
238
|
+
debugMessage: [
|
|
239
|
+
"You are trying to read the decodedIdToken but the user",
|
|
240
|
+
"isn't logged in"
|
|
241
|
+
].join(" ")
|
|
242
|
+
});
|
|
243
|
+
} else {
|
|
244
|
+
initialValue = oidc.getDecodedIdToken();
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
const decodedIdToken$ = new BehaviorSubject<DecodedIdToken>(initialValue);
|
|
248
|
+
|
|
249
|
+
if (oidc.isUserLoggedIn) {
|
|
250
|
+
oidc.subscribeToTokensChange(() => {
|
|
251
|
+
const decodedIdToken = oidc.getDecodedIdToken();
|
|
252
|
+
|
|
253
|
+
if (decodedIdToken$.getValue() === decodedIdToken) {
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
decodedIdToken$.next(decodedIdToken);
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
return decodedIdToken$;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
let decodedIdToken$: BehaviorSubject<DecodedIdToken> | undefined = undefined;
|
|
265
|
+
|
|
266
|
+
function get$decodedIdToken(): Signal<DecodedIdToken> {
|
|
267
|
+
return toSignal((decodedIdToken$ ??= createDecodedIdToken$()), {
|
|
268
|
+
requireSync: true
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
return { get$decodedIdToken };
|
|
273
|
+
})();
|
|
274
|
+
|
|
275
|
+
const { get$secondsLeftBeforeAutoLogout } = (() => {
|
|
276
|
+
function createSecondsLeftBeforeAutoLogout$() {
|
|
277
|
+
if (oidcOrAutoLoginInitializationError === undefined) {
|
|
278
|
+
throw new Error(
|
|
279
|
+
"oidc-spa: calling get$decodedIdToken() before provideOidcInitAwaiter has resolved"
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
if (oidcOrAutoLoginInitializationError instanceof OidcInitializationError) {
|
|
284
|
+
throw new Error(
|
|
285
|
+
"oidc-spa: calling getOidc() while getOidcInitializationError() is not `undefined` in autoLogin: true mode"
|
|
286
|
+
);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
const oidc = oidcOrAutoLoginInitializationError;
|
|
290
|
+
|
|
291
|
+
const secondsLeftBeforeAutoLogout$ = new BehaviorSubject<number | undefined>(undefined);
|
|
292
|
+
|
|
293
|
+
if (oidc.isUserLoggedIn) {
|
|
294
|
+
oidc.subscribeToAutoLogoutCountdown(({ secondsLeft }) =>
|
|
295
|
+
secondsLeftBeforeAutoLogout$.next(secondsLeft)
|
|
296
|
+
);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
return secondsLeftBeforeAutoLogout$;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
let secondsLeftBeforeAutoLogout$: BehaviorSubject<number | undefined> | undefined = undefined;
|
|
303
|
+
|
|
304
|
+
function get$secondsLeftBeforeAutoLogout(params: {
|
|
305
|
+
warningDurationSeconds: number;
|
|
306
|
+
}): Signal<number | undefined> {
|
|
307
|
+
const { warningDurationSeconds } = params;
|
|
308
|
+
|
|
309
|
+
secondsLeftBeforeAutoLogout$ ??= createSecondsLeftBeforeAutoLogout$();
|
|
310
|
+
|
|
311
|
+
const secondsLeftBeforeAutoLogout$_cropped = new BehaviorSubject<number | undefined>(
|
|
312
|
+
secondsLeftBeforeAutoLogout$.getValue()
|
|
313
|
+
);
|
|
314
|
+
|
|
315
|
+
secondsLeftBeforeAutoLogout$.subscribe(secondsLeftBeforeAutoLogout => {
|
|
316
|
+
if (
|
|
317
|
+
secondsLeftBeforeAutoLogout === undefined ||
|
|
318
|
+
secondsLeftBeforeAutoLogout > warningDurationSeconds
|
|
319
|
+
) {
|
|
320
|
+
if (secondsLeftBeforeAutoLogout$_cropped.getValue() !== undefined) {
|
|
321
|
+
secondsLeftBeforeAutoLogout$_cropped.next(undefined);
|
|
322
|
+
}
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
secondsLeftBeforeAutoLogout$_cropped.next(secondsLeftBeforeAutoLogout);
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
const signal = toSignal(secondsLeftBeforeAutoLogout$_cropped, {
|
|
330
|
+
requireSync: true
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
return signal;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
return { get$secondsLeftBeforeAutoLogout };
|
|
337
|
+
})();
|
|
338
|
+
|
|
339
|
+
async function getTokens(): Promise<
|
|
340
|
+
| { isUserLoggedIn: false; prTokens?: never }
|
|
341
|
+
| { isUserLoggedIn: true; prTokens: Promise<Oidc.Tokens<DecodedIdToken>> }
|
|
342
|
+
> {
|
|
343
|
+
const oidcOrAutoLoginInitializationError = await prOidcOrAutoLoginInitializationError;
|
|
344
|
+
|
|
345
|
+
if (oidcOrAutoLoginInitializationError instanceof OidcInitializationError) {
|
|
346
|
+
return new Promise<never>(() => {});
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
const oidc = oidcOrAutoLoginInitializationError;
|
|
350
|
+
|
|
351
|
+
return oidc.isUserLoggedIn
|
|
352
|
+
? { isUserLoggedIn: true, prTokens: oidc.getTokens() }
|
|
353
|
+
: {
|
|
354
|
+
isUserLoggedIn: false
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
const provideOidcInitAwaiter: EnvironmentProviders = provideAppInitializer(async () => {
|
|
359
|
+
dReadyToCreate.resolve();
|
|
360
|
+
await prOidcOrAutoLoginInitializationError;
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
const enforceLoginGuard: CanActivateFn = async route => {
|
|
364
|
+
const router = inject(Router);
|
|
365
|
+
|
|
366
|
+
const oidcOrAutoLoginInitializationError = await prOidcOrAutoLoginInitializationError;
|
|
367
|
+
|
|
368
|
+
if (oidcOrAutoLoginInitializationError instanceof OidcInitializationError) {
|
|
369
|
+
return new Promise<never>(() => {});
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
const oidc = oidcOrAutoLoginInitializationError;
|
|
373
|
+
|
|
374
|
+
if (!oidc.isUserLoggedIn) {
|
|
375
|
+
const redirectUrl = (() => {
|
|
376
|
+
const tree = router.createUrlTree(
|
|
377
|
+
route.url.map(u => u.path),
|
|
378
|
+
{
|
|
379
|
+
queryParams: route.queryParams
|
|
380
|
+
}
|
|
381
|
+
);
|
|
382
|
+
return router.serializeUrl(tree);
|
|
383
|
+
})();
|
|
384
|
+
|
|
385
|
+
const doesCurrentHrefRequiresAuth =
|
|
386
|
+
location.href.replace(/\/$/, "") === redirectUrl.replace(/\/$/, "");
|
|
387
|
+
|
|
388
|
+
await oidc.login({
|
|
389
|
+
doesCurrentHrefRequiresAuth,
|
|
390
|
+
redirectUrl
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
return true;
|
|
395
|
+
};
|
|
396
|
+
|
|
397
|
+
const oidcAngularApi = id<OidcAngularApi<DecodedIdToken, false>>({
|
|
398
|
+
getOidc: getOidc as any,
|
|
399
|
+
getOidcInitializationError,
|
|
400
|
+
get$decodedIdToken,
|
|
401
|
+
get$secondsLeftBeforeAutoLogout,
|
|
402
|
+
getTokens,
|
|
403
|
+
provideOidcInitAwaiter,
|
|
404
|
+
enforceLoginGuard
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
// @ts-expect-error: We know what we are doing
|
|
408
|
+
return oidcAngularApi;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
/** @see: https://docs.oidc-spa.dev/v/v8/usage#angular-api */
|
|
412
|
+
export function createAngularOidc<
|
|
413
|
+
DecodedIdToken extends Record<string, unknown> = Oidc.Tokens.DecodedIdToken_base,
|
|
414
|
+
AutoLogin extends boolean = false
|
|
415
|
+
>(params: ValueOrAsyncGetter<Omit<ParamsOfCreateOidc<DecodedIdToken, AutoLogin>, "homeUrl">>) {
|
|
416
|
+
return createAngularOidc_dependencyInjection(params, params =>
|
|
417
|
+
createOidc({
|
|
418
|
+
...params,
|
|
419
|
+
homeUrl: (() => {
|
|
420
|
+
const baseEl = document.querySelector<HTMLBaseElement>("base[href]");
|
|
421
|
+
if (!baseEl) {
|
|
422
|
+
throw new Error('No <base href="..."> element found in the DOM');
|
|
423
|
+
}
|
|
424
|
+
return baseEl.getAttribute("href") ?? "/";
|
|
425
|
+
})()
|
|
426
|
+
})
|
|
427
|
+
);
|
|
428
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { type OidcAngular, createAngularOidc } from "./angular";
|
package/src/core/createOidc.ts
CHANGED
|
@@ -52,7 +52,7 @@ import { isKeycloak } from "../keycloak/isKeycloak";
|
|
|
52
52
|
const VERSION = "{{OIDC_SPA_VERSION}}";
|
|
53
53
|
|
|
54
54
|
export type ParamsOfCreateOidc<
|
|
55
|
-
DecodedIdToken extends Record<string, unknown> =
|
|
55
|
+
DecodedIdToken extends Record<string, unknown> = Oidc.Tokens.DecodedIdToken_base,
|
|
56
56
|
AutoLogin extends boolean = false
|
|
57
57
|
> = {
|
|
58
58
|
issuerUri: string;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createAngularOidc_dependencyInjection } from "../angular/angular";
|
|
2
|
+
import { createMockOidc, type ParamsOfCreateMockOidc } from "./oidc";
|
|
3
|
+
import type { ValueOrAsyncGetter } from "../tools/ValueOrAsyncGetter";
|
|
4
|
+
|
|
5
|
+
/** @see: https://docs.oidc-spa.dev/v/v8/mock */
|
|
6
|
+
export function createMockAngularOidc<
|
|
7
|
+
DecodedIdToken extends Record<string, unknown> = Record<string, unknown>,
|
|
8
|
+
AutoLogin extends boolean = false
|
|
9
|
+
>(params: ValueOrAsyncGetter<ParamsOfCreateMockOidc<DecodedIdToken, AutoLogin>>) {
|
|
10
|
+
return createAngularOidc_dependencyInjection(params, createMockOidc);
|
|
11
|
+
}
|
package/src/mock/react.tsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createReactOidc_dependencyInjection } from "../react/react";
|
|
2
2
|
import { createMockOidc, type ParamsOfCreateMockOidc } from "./oidc";
|
|
3
3
|
import type { ValueOrAsyncGetter } from "../tools/ValueOrAsyncGetter";
|
|
4
4
|
|
|
@@ -7,5 +7,5 @@ export function createMockReactOidc<
|
|
|
7
7
|
DecodedIdToken extends Record<string, unknown> = Record<string, unknown>,
|
|
8
8
|
AutoLogin extends boolean = false
|
|
9
9
|
>(params: ValueOrAsyncGetter<ParamsOfCreateMockOidc<DecodedIdToken, AutoLogin>>) {
|
|
10
|
-
return
|
|
10
|
+
return createReactOidc_dependencyInjection(params, createMockOidc);
|
|
11
11
|
}
|
package/src/react/react.tsx
CHANGED
|
@@ -114,7 +114,7 @@ type OidcReactApi<DecodedIdToken extends Record<string, unknown>, AutoLogin exte
|
|
|
114
114
|
}) => Promise<void | never>;
|
|
115
115
|
});
|
|
116
116
|
|
|
117
|
-
export function
|
|
117
|
+
export function createReactOidc_dependencyInjection<
|
|
118
118
|
DecodedIdToken extends Record<string, unknown>,
|
|
119
119
|
ParamsOfCreateOidc extends {
|
|
120
120
|
autoLogin?: boolean;
|
|
@@ -140,11 +140,11 @@ export function createOidcReactApi_dependencyInjection<
|
|
|
140
140
|
// NOTE: It can be InitializationError only if autoLogin is true
|
|
141
141
|
const prOidcOrInitializationError = (async () => {
|
|
142
142
|
const params = await (async () => {
|
|
143
|
+
await dReadyToCreate.pr;
|
|
144
|
+
|
|
143
145
|
if (typeof paramsOrGetParams === "function") {
|
|
144
146
|
const getParams = paramsOrGetParams;
|
|
145
147
|
|
|
146
|
-
await dReadyToCreate.pr;
|
|
147
|
-
|
|
148
148
|
const params = await getParams();
|
|
149
149
|
|
|
150
150
|
return params;
|
|
@@ -439,7 +439,7 @@ export function createOidcReactApi_dependencyInjection<
|
|
|
439
439
|
return oidc;
|
|
440
440
|
}
|
|
441
441
|
|
|
442
|
-
const
|
|
442
|
+
const oidcReactApi: OidcReactApi<DecodedIdToken, false> = {
|
|
443
443
|
OidcProvider,
|
|
444
444
|
useOidc: useOidc as any,
|
|
445
445
|
getOidc,
|
|
@@ -448,7 +448,7 @@ export function createOidcReactApi_dependencyInjection<
|
|
|
448
448
|
};
|
|
449
449
|
|
|
450
450
|
// @ts-expect-error: We know what we are doing
|
|
451
|
-
return
|
|
451
|
+
return oidcReactApi;
|
|
452
452
|
}
|
|
453
453
|
|
|
454
454
|
/** @see: https://docs.oidc-spa.dev/v/v8/usage#react-api */
|
|
@@ -456,5 +456,5 @@ export function createReactOidc<
|
|
|
456
456
|
DecodedIdToken extends Record<string, unknown> = Oidc.Tokens.DecodedIdToken_base,
|
|
457
457
|
AutoLogin extends boolean = false
|
|
458
458
|
>(params: ValueOrAsyncGetter<ParamsOfCreateOidc<DecodedIdToken, AutoLogin>>) {
|
|
459
|
-
return
|
|
459
|
+
return createReactOidc_dependencyInjection(params, createOidc);
|
|
460
460
|
}
|