zudoku 0.1.1-dev.50 → 0.1.1-dev.51
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/dist/config/config.d.ts +19 -2
- package/dist/config/validators/auth.d.ts +2 -0
- package/dist/config/validators/auth.js +2 -0
- package/dist/config/validators/auth.js.map +1 -0
- package/dist/config/validators/validate.d.ts +2 -0
- package/dist/config/validators/validate.js +4 -0
- package/dist/config/validators/validate.js.map +1 -0
- package/dist/lib/authentication/Callback.d.ts +4 -0
- package/dist/lib/authentication/Callback.js +20 -0
- package/dist/lib/authentication/Callback.js.map +1 -0
- package/dist/lib/authentication/auth0.d.ts +5 -0
- package/dist/lib/authentication/auth0.js +9 -0
- package/dist/lib/authentication/auth0.js.map +1 -0
- package/dist/lib/authentication/authentication.d.ts +7 -10
- package/dist/lib/authentication/clerk.d.ts +3 -4
- package/dist/lib/authentication/clerk.js +13 -6
- package/dist/lib/authentication/clerk.js.map +1 -1
- package/dist/lib/authentication/openid.d.ts +5 -11
- package/dist/lib/authentication/openid.js +90 -73
- package/dist/lib/authentication/openid.js.map +1 -1
- package/dist/lib/components/DevPortal.d.ts +2 -2
- package/dist/lib/components/DevPortal.js +5 -1
- package/dist/lib/components/DevPortal.js.map +1 -1
- package/dist/lib/components/Layout.js +1 -4
- package/dist/lib/components/Layout.js.map +1 -1
- package/dist/lib/core/DevPortalContext.d.ts +4 -7
- package/dist/lib/core/DevPortalContext.js +6 -6
- package/dist/lib/core/DevPortalContext.js.map +1 -1
- package/dist/lib/core/plugins.d.ts +1 -6
- package/dist/lib/plugins/api-key/index.js +6 -3
- package/dist/lib/plugins/api-key/index.js.map +1 -1
- package/dist/vite/config.js +2 -0
- package/dist/vite/config.js.map +1 -1
- package/dist/vite/plugin-auth.js +1 -1
- package/dist/vite/plugin-auth.js.map +1 -1
- package/lib/DevPortalProvider-yBHPOS9_.js +4559 -0
- package/lib/Spinner-Daa7xsri.js +7329 -0
- package/lib/loglevel-D-4S8up4.js +152 -0
- package/lib/zudoku.auth-auth0.js +829 -0
- package/lib/zudoku.auth-clerk.js +21 -12
- package/lib/zudoku.components.js +180 -174
- package/lib/zudoku.plugins.js +5702 -5846
- package/package.json +4 -1
- package/src/lib/authentication/Callback.tsx +31 -0
- package/src/lib/authentication/auth0.tsx +18 -0
- package/src/lib/authentication/authentication.ts +7 -14
- package/src/lib/authentication/{clerk.ts → clerk.tsx} +17 -9
- package/src/lib/authentication/openid.tsx +206 -0
- package/src/lib/components/DevPortal.tsx +10 -3
- package/src/lib/components/Layout.tsx +1 -5
- package/src/lib/core/DevPortalContext.ts +10 -13
- package/src/lib/core/plugins.ts +4 -4
- package/src/lib/plugins/api-key/index.tsx +9 -3
- package/dist/lib/core/types/combine.d.ts +0 -4
- package/dist/lib/core/types/combine.js +0 -2
- package/dist/lib/core/types/combine.js.map +0 -1
- package/lib/Spinner-9_-7nYgL.js +0 -11855
- package/src/lib/authentication/openid.ts +0 -194
- package/src/lib/core/types/combine.ts +0 -16
package/dist/config/config.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import type { ApiKeyPluginOptions } from "../lib/plugins/api-key/index.js";
|
|
|
4
4
|
import { OasPluginConfig } from "../lib/plugins/openapi/index.js";
|
|
5
5
|
import type { Redirect } from "../lib/plugins/redirect/index.js";
|
|
6
6
|
import { type MdxComponentsType } from "../lib/util/MdxComponents.js";
|
|
7
|
+
export type URLString = `https://${string}` | `http://${string}`;
|
|
7
8
|
export interface ZudokuConfig {
|
|
8
9
|
ui?: UIConfig;
|
|
9
10
|
mdx?: {
|
|
@@ -45,6 +46,22 @@ export interface DocsConfig {
|
|
|
45
46
|
export type ApiConfig = OasPluginConfig;
|
|
46
47
|
export interface ClerkAuthenticationConfig {
|
|
47
48
|
type: "clerk";
|
|
48
|
-
clerkPubKey: string
|
|
49
|
+
clerkPubKey: `pk_test_${string}` | `pk_live_${string}`;
|
|
49
50
|
}
|
|
50
|
-
export
|
|
51
|
+
export interface OpenIDAuthenticationConfig {
|
|
52
|
+
type: "openid";
|
|
53
|
+
clientId: string;
|
|
54
|
+
issuer: string;
|
|
55
|
+
scopes?: string[];
|
|
56
|
+
audience?: string;
|
|
57
|
+
jwksEndpoint?: URL | URLString;
|
|
58
|
+
authorizationEndpoint?: string;
|
|
59
|
+
tokenEndpoint?: string;
|
|
60
|
+
}
|
|
61
|
+
export interface Auth0AuthenticationConfig {
|
|
62
|
+
type: "auth0";
|
|
63
|
+
clientId: string;
|
|
64
|
+
domain: string;
|
|
65
|
+
audience?: string;
|
|
66
|
+
}
|
|
67
|
+
export type AuthenticationConfig = ClerkAuthenticationConfig | Auth0AuthenticationConfig;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/config/validators/auth.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,cAAc,CAAC,MAAiC,IAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/config/validators/validate.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,OAAO;AACT,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { DevPortalContext, SessionProfileState } from "../core/DevPortalContext.js";
|
|
2
|
+
export declare function Callback({ handleCallback, }: {
|
|
3
|
+
handleCallback: (url: URL, context: DevPortalContext) => Promise<SessionProfileState>;
|
|
4
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useQuery } from "@tanstack/react-query";
|
|
3
|
+
import { Navigate } from "react-router-dom";
|
|
4
|
+
import { useDevPortal } from "../components/context/DevPortalProvider.js";
|
|
5
|
+
export function Callback({ handleCallback, }) {
|
|
6
|
+
const context = useDevPortal();
|
|
7
|
+
const callback = useQuery({
|
|
8
|
+
queryFn: () => handleCallback(new URL(window.location.href), context),
|
|
9
|
+
retry: 0,
|
|
10
|
+
queryKey: ["auth-callback"],
|
|
11
|
+
});
|
|
12
|
+
if (callback.isPending) {
|
|
13
|
+
return _jsx("div", { children: "Loading..." });
|
|
14
|
+
}
|
|
15
|
+
else if (callback.error) {
|
|
16
|
+
return _jsxs("div", { children: ["Error: ", JSON.stringify(callback.error)] });
|
|
17
|
+
}
|
|
18
|
+
return _jsx(Navigate, { to: "/", replace: true });
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=Callback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Callback.js","sourceRoot":"","sources":["../../../src/lib/authentication/Callback.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAM1E,MAAM,UAAU,QAAQ,CAAC,EACvB,cAAc,GAMf;IACC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,QAAQ,CAAC;QACxB,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;QACrE,KAAK,EAAE,CAAC;QACR,QAAQ,EAAE,CAAC,eAAe,CAAC;KAC5B,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QACvB,OAAO,uCAAqB,CAAC;IAC/B,CAAC;SAAM,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC1B,OAAO,qCAAa,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAO,CAAC;IAC5D,CAAC;IAED,OAAO,KAAC,QAAQ,IAAC,EAAE,EAAC,GAAG,EAAC,OAAO,EAAE,IAAI,GAAI,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Auth0AuthenticationConfig } from "../../config/config.js";
|
|
2
|
+
import { NavigationPlugin } from "../core/plugins.js";
|
|
3
|
+
import { AuthenticationProvider } from "./authentication.js";
|
|
4
|
+
declare const auth0Provider: ({ domain, clientId, audience, }: Auth0AuthenticationConfig) => AuthenticationProvider & NavigationPlugin;
|
|
5
|
+
export default auth0Provider;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import openIdAuth from "./openid.js";
|
|
2
|
+
const auth0Provider = ({ domain, clientId, audience, }) => openIdAuth({
|
|
3
|
+
type: "openid",
|
|
4
|
+
issuer: `https://${domain}`,
|
|
5
|
+
clientId: clientId,
|
|
6
|
+
audience: audience,
|
|
7
|
+
});
|
|
8
|
+
export default auth0Provider;
|
|
9
|
+
//# sourceMappingURL=auth0.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth0.js","sourceRoot":"","sources":["../../../src/lib/authentication/auth0.tsx"],"names":[],"mappings":"AAGA,OAAO,UAAU,MAAM,aAAa,CAAC;AAErC,MAAM,aAAa,GAAG,CAAC,EACrB,MAAM,EACN,QAAQ,EACR,QAAQ,GACkB,EAA6C,EAAE,CACzE,UAAU,CAAC;IACT,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,WAAW,MAAM,EAAE;IAC3B,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE,QAAQ;CACnB,CAAC,CAAC;AAEL,eAAe,aAAa,CAAC"}
|
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
import { DevPortalContext } from "
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { DevPortalContext } from "../../lib/core/DevPortalContext.js";
|
|
2
|
+
import { NavigationPlugin } from "../../lib/core/plugins.js";
|
|
3
|
+
export interface AuthenticationProvider extends NavigationPlugin {
|
|
4
|
+
initialize?(context: DevPortalContext): Promise<unknown>;
|
|
4
5
|
login(context: DevPortalContext): Promise<unknown>;
|
|
6
|
+
signRequest(request: Request, context: DevPortalContext): Promise<Request>;
|
|
7
|
+
/** @deprecated **/
|
|
5
8
|
getToken?: (context: DevPortalContext) => Promise<string | undefined>;
|
|
6
|
-
|
|
7
|
-
signOut(context: DevPortalContext): void;
|
|
9
|
+
logout(context: DevPortalContext): void;
|
|
8
10
|
}
|
|
9
|
-
export type Path = {
|
|
10
|
-
pathname: string;
|
|
11
|
-
search: string;
|
|
12
|
-
hash: string;
|
|
13
|
-
};
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
}) => AuthProvider;
|
|
1
|
+
import { ClerkAuthenticationConfig } from "../../config/config.js";
|
|
2
|
+
import { AuthenticationProvider } from "./authentication.js";
|
|
3
|
+
declare const clerkAuth: ({ clerkPubKey, }: ClerkAuthenticationConfig) => AuthenticationProvider;
|
|
5
4
|
export default clerkAuth;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
const clerkAuth = ({ clerkPubKey }) => {
|
|
1
|
+
const clerkAuth = ({ clerkPubKey, }) => {
|
|
2
2
|
let clerkApi;
|
|
3
|
-
const
|
|
3
|
+
const ensureLoaded = (async () => {
|
|
4
4
|
const { Clerk } = await import("@clerk/clerk-js");
|
|
5
5
|
clerkApi = new Clerk(clerkPubKey);
|
|
6
6
|
await clerkApi.load({});
|
|
7
7
|
})();
|
|
8
8
|
return {
|
|
9
9
|
initialize: async (context) => {
|
|
10
|
-
await
|
|
10
|
+
await ensureLoaded;
|
|
11
11
|
if (clerkApi.session) {
|
|
12
12
|
await context.setUserProfile({
|
|
13
13
|
isLoggedIn: true,
|
|
@@ -22,17 +22,24 @@ const clerkAuth = ({ clerkPubKey }) => {
|
|
|
22
22
|
});
|
|
23
23
|
}
|
|
24
24
|
},
|
|
25
|
+
async signRequest(request) {
|
|
26
|
+
await ensureLoaded;
|
|
27
|
+
const token = await clerkApi.session?.getToken();
|
|
28
|
+
request.headers.set("Authorization", `Bearer ${token}`);
|
|
29
|
+
return request;
|
|
30
|
+
},
|
|
25
31
|
getToken: async () => {
|
|
26
|
-
await
|
|
32
|
+
await ensureLoaded;
|
|
27
33
|
const token = await clerkApi.session?.getToken();
|
|
28
34
|
return token ?? undefined;
|
|
29
35
|
},
|
|
30
|
-
|
|
31
|
-
clerkApi.signOut();
|
|
36
|
+
logout: async () => {
|
|
37
|
+
await clerkApi.signOut();
|
|
32
38
|
},
|
|
33
39
|
login: async () => {
|
|
34
40
|
await clerkApi.redirectToSignIn();
|
|
35
41
|
},
|
|
42
|
+
getRoutes: () => [],
|
|
36
43
|
};
|
|
37
44
|
};
|
|
38
45
|
export default clerkAuth;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clerk.js","sourceRoot":"","sources":["../../../src/lib/authentication/clerk.
|
|
1
|
+
{"version":3,"file":"clerk.js","sourceRoot":"","sources":["../../../src/lib/authentication/clerk.tsx"],"names":[],"mappings":"AAIA,MAAM,SAAS,GAAG,CAAC,EACjB,WAAW,GACe,EAA0B,EAAE;IACtD,IAAI,QAAe,CAAC;IAEpB,MAAM,YAAY,GAAG,CAAC,KAAK,IAAI,EAAE;QAC/B,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAClD,QAAQ,GAAG,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;QAElC,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,EAAE,CAAC;IAEL,OAAO;QACL,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YAC5B,MAAM,YAAY,CAAC;YAEnB,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACrB,MAAM,OAAO,CAAC,cAAc,CAAC;oBAC3B,UAAU,EAAE,IAAI;oBAChB,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,SAAS;oBACjD,KAAK,EACH,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY;wBACxD,SAAS;iBACZ,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,CAAC,cAAc,CAAC;oBAC3B,UAAU,EAAE,KAAK;iBAClB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,OAAgB;YAChC,MAAM,YAAY,CAAC;YACnB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;YACjD,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,KAAK,EAAE,CAAC,CAAC;YACxD,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,QAAQ,EAAE,KAAK,IAAI,EAAE;YACnB,MAAM,YAAY,CAAC;YACnB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;YACjD,OAAO,KAAK,IAAI,SAAS,CAAC;QAC5B,CAAC;QACD,MAAM,EAAE,KAAK,IAAI,EAAE;YACjB,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QACD,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QACpC,CAAC;QACD,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE;KACpB,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,SAAS,CAAC"}
|
|
@@ -1,11 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
};
|
|
7
|
-
export declare const openIdAuth: ({ clientId, clientSecret, issuer, authorizationEndpoint, tokenEndpoint, }: {
|
|
8
|
-
clientId: string;
|
|
9
|
-
clientSecret?: string;
|
|
10
|
-
audience?: string;
|
|
11
|
-
} & AuthServerOption) => AuthProvider;
|
|
1
|
+
import { OpenIDAuthenticationConfig } from "../../config/config.js";
|
|
2
|
+
import { NavigationPlugin } from "../core/plugins.js";
|
|
3
|
+
import { AuthenticationProvider } from "./authentication.js";
|
|
4
|
+
declare const openIdAuth: ({ issuer, authorizationEndpoint, tokenEndpoint, clientId, }: OpenIDAuthenticationConfig) => AuthenticationProvider & NavigationPlugin;
|
|
5
|
+
export default openIdAuth;
|
|
@@ -1,38 +1,87 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
1
2
|
import logger from "loglevel";
|
|
2
3
|
import * as oauth from "oauth4webapi";
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
|
|
4
|
+
import { Callback } from "./Callback.js";
|
|
5
|
+
const CALLBACK_URL_PATH = "/oauth/callback";
|
|
6
|
+
async function getAuthServerByIssuer(issuer) {
|
|
7
|
+
const issuerUrl = typeof issuer === "string" ? new URL(issuer) : issuer;
|
|
8
|
+
const response = await oauth.discoveryRequest(issuerUrl);
|
|
9
|
+
const server = await oauth.processDiscoveryResponse(issuerUrl, response);
|
|
10
|
+
return server;
|
|
11
|
+
}
|
|
12
|
+
async function getAuthServer({ issuer, authorizationEndpoint, tokenEndpoint, }) {
|
|
13
|
+
return await getAuthServerByIssuer(issuer);
|
|
14
|
+
// : ({
|
|
15
|
+
// issuer: new URL(authorizationEndpoint!).origin,
|
|
16
|
+
// authorization_endpoint: authorizationEndpoint,
|
|
17
|
+
// token_endpoint: tokenEndpoint,
|
|
18
|
+
// code_challenge_methods_supported: [],
|
|
19
|
+
// } satisfies oauth.AuthorizationServer);
|
|
20
|
+
}
|
|
21
|
+
const openIdAuth = ({ issuer, authorizationEndpoint, tokenEndpoint, clientId, }) => {
|
|
21
22
|
const client = {
|
|
22
23
|
client_id: clientId,
|
|
23
|
-
client_secret: clientSecret,
|
|
24
24
|
token_endpoint_auth_method: "none",
|
|
25
25
|
};
|
|
26
|
-
|
|
26
|
+
async function handleCallback(url, context) {
|
|
27
|
+
const searchParams = url.searchParams;
|
|
28
|
+
const state = searchParams.get("state");
|
|
29
|
+
// one eternity later, the user lands back on the redirect_uri
|
|
30
|
+
// Authorization Code Grant Request & Response
|
|
31
|
+
const codeVerifier = await context.sessionStorage.get("codeVerifier");
|
|
32
|
+
if (!codeVerifier) {
|
|
33
|
+
return {
|
|
34
|
+
isLoggedIn: false,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const authServer = await getAuthServer({
|
|
38
|
+
issuer: issuer,
|
|
39
|
+
authorizationEndpoint: authorizationEndpoint,
|
|
40
|
+
tokenEndpoint: tokenEndpoint,
|
|
41
|
+
});
|
|
42
|
+
const params = oauth.validateAuthResponse(authServer, client, searchParams, state ?? undefined);
|
|
43
|
+
if (oauth.isOAuth2Error(params)) {
|
|
44
|
+
logger.error("Error Response", params);
|
|
45
|
+
throw new Error(); // Handle OAuth 2.0 redirect error
|
|
46
|
+
}
|
|
47
|
+
const redirectUrl = new URL(url);
|
|
48
|
+
redirectUrl.pathname = CALLBACK_URL_PATH;
|
|
49
|
+
redirectUrl.search = "";
|
|
50
|
+
const response = await oauth.authorizationCodeGrantRequest(authServer, client, params, redirectUrl.toString(), codeVerifier);
|
|
51
|
+
// @todo do we need to do these
|
|
52
|
+
// const challenges = oauth.parseWwwAuthenticateChallenges(response);
|
|
53
|
+
// if (challenges) {
|
|
54
|
+
// for (const challenge of challenges) {
|
|
55
|
+
// console.error("WWW-Authenticate Challenge", challenge);
|
|
56
|
+
// }
|
|
57
|
+
// throw new Error(); // Handle WWW-Authenticate Challenges as needed
|
|
58
|
+
// }
|
|
59
|
+
const oauthResult = await oauth.processAuthorizationCodeOAuth2Response(authServer, client, response);
|
|
60
|
+
if (oauth.isOAuth2Error(oauthResult)) {
|
|
61
|
+
logger.error("Error Response", oauthResult);
|
|
62
|
+
throw new Error(oauthResult.error);
|
|
63
|
+
}
|
|
64
|
+
const userInfoResponse = await oauth.userInfoRequest(authServer, client, oauthResult.access_token);
|
|
65
|
+
const userInfo = await userInfoResponse.json();
|
|
66
|
+
const profile = {
|
|
67
|
+
sub: userInfo.sub,
|
|
68
|
+
email: userInfo.email,
|
|
69
|
+
name: userInfo.name,
|
|
70
|
+
email_verified: userInfo.email_verified ?? false,
|
|
71
|
+
picture: userInfo.picture,
|
|
72
|
+
isLoggedIn: true,
|
|
73
|
+
};
|
|
74
|
+
void context.setUserProfile(profile);
|
|
75
|
+
return profile;
|
|
76
|
+
}
|
|
27
77
|
return {
|
|
28
|
-
|
|
29
|
-
|
|
78
|
+
logout: async (context) => {
|
|
79
|
+
await context.setUserProfile({ isLoggedIn: false });
|
|
30
80
|
},
|
|
31
|
-
signOut() { },
|
|
32
81
|
login: async (context) => {
|
|
33
82
|
const code_challenge_method = "S256";
|
|
34
83
|
const authorizationServer = await getAuthServer({
|
|
35
|
-
issuer,
|
|
84
|
+
issuer: issuer,
|
|
36
85
|
authorizationEndpoint,
|
|
37
86
|
tokenEndpoint,
|
|
38
87
|
});
|
|
@@ -49,10 +98,13 @@ export const openIdAuth = ({ clientId, clientSecret, issuer, authorizationEndpoi
|
|
|
49
98
|
await context.sessionStorage.set("codeVerifier", codeVerifier);
|
|
50
99
|
// redirect user to as.authorization_endpoint
|
|
51
100
|
const authorizationUrl = new URL(authorizationServer.authorization_endpoint);
|
|
101
|
+
const redirectUrl = new URL(context.url);
|
|
102
|
+
redirectUrl.pathname = CALLBACK_URL_PATH;
|
|
103
|
+
redirectUrl.search = "";
|
|
52
104
|
authorizationUrl.searchParams.set("client_id", client.client_id);
|
|
53
|
-
authorizationUrl.searchParams.set("redirect_uri",
|
|
105
|
+
authorizationUrl.searchParams.set("redirect_uri", redirectUrl.toString());
|
|
54
106
|
authorizationUrl.searchParams.set("response_type", "code");
|
|
55
|
-
|
|
107
|
+
authorizationUrl.searchParams.set("scope", "openid+profile+email");
|
|
56
108
|
authorizationUrl.searchParams.set("code_challenge", codeChallenge);
|
|
57
109
|
authorizationUrl.searchParams.set("code_challenge_method", code_challenge_method);
|
|
58
110
|
/**
|
|
@@ -66,54 +118,19 @@ export const openIdAuth = ({ clientId, clientSecret, issuer, authorizationEndpoi
|
|
|
66
118
|
// now redirect the user to authorizationUrl.href
|
|
67
119
|
location.href = authorizationUrl.href;
|
|
68
120
|
},
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
81
|
-
const as = await getAuthServer({
|
|
82
|
-
issuer,
|
|
83
|
-
authorizationEndpoint,
|
|
84
|
-
tokenEndpoint,
|
|
85
|
-
});
|
|
86
|
-
const params = oauth.validateAuthResponse(as, client, searchParams, state);
|
|
87
|
-
if (oauth.isOAuth2Error(params)) {
|
|
88
|
-
logger.error("Error Response", params);
|
|
89
|
-
throw new Error(); // Handle OAuth 2.0 redirect error
|
|
90
|
-
}
|
|
91
|
-
const response = await oauth.authorizationCodeGrantRequest(as, client, params, redirect_uri, codeVerifier);
|
|
92
|
-
// @todo do we need to do these
|
|
93
|
-
// const challenges = oauth.parseWwwAuthenticateChallenges(response);
|
|
94
|
-
// if (challenges) {
|
|
95
|
-
// for (const challenge of challenges) {
|
|
96
|
-
// console.error("WWW-Authenticate Challenge", challenge);
|
|
97
|
-
// }
|
|
98
|
-
// throw new Error(); // Handle WWW-Authenticate Challenges as needed
|
|
99
|
-
// }
|
|
100
|
-
const oauthResult = await oauth.processAuthorizationCodeOpenIDResponse(as, client, response);
|
|
101
|
-
if (oauth.isOAuth2Error(oauthResult)) {
|
|
102
|
-
logger.error("Error Response", oauthResult);
|
|
103
|
-
throw new Error(oauthResult.error);
|
|
104
|
-
}
|
|
105
|
-
const userInfoResponse = await oauth.userInfoRequest(as, client, oauthResult.access_token);
|
|
106
|
-
const userInfo = await userInfoResponse.json();
|
|
107
|
-
// void storage.setProfile({
|
|
108
|
-
// sub: userInfo.sub,
|
|
109
|
-
// email: userInfo.email,
|
|
110
|
-
// name: userInfo.name,
|
|
111
|
-
// email_verified: userInfo.email_verified ?? false,
|
|
112
|
-
// picture: userInfo.picture,
|
|
113
|
-
// id_token: oauthResult.id_token,
|
|
114
|
-
// access_token: oauthResult.access_token,
|
|
115
|
-
// });
|
|
121
|
+
signRequest(request, context) {
|
|
122
|
+
// check if token is expired
|
|
123
|
+
return Promise.resolve(request);
|
|
124
|
+
},
|
|
125
|
+
getRoutes: () => {
|
|
126
|
+
return [
|
|
127
|
+
{
|
|
128
|
+
path: CALLBACK_URL_PATH,
|
|
129
|
+
element: _jsx(Callback, { handleCallback: handleCallback }),
|
|
130
|
+
},
|
|
131
|
+
];
|
|
116
132
|
},
|
|
117
133
|
};
|
|
118
134
|
};
|
|
135
|
+
export default openIdAuth;
|
|
119
136
|
//# sourceMappingURL=openid.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openid.js","sourceRoot":"","sources":["../../../src/lib/authentication/openid.
|
|
1
|
+
{"version":3,"file":"openid.js","sourceRoot":"","sources":["../../../src/lib/authentication/openid.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { type AuthProvider } from "../authentication/authentication.js";
|
|
2
1
|
import { type NavigationItem } from "../core/DevPortalContext.js";
|
|
3
2
|
import { type DevPortalPlugin } from "../core/plugins.js";
|
|
3
|
+
import { AuthenticationProvider } from "../authentication/authentication.js";
|
|
4
4
|
import { type MdxComponentsType } from "../util/MdxComponents.js";
|
|
5
5
|
import { type ComponentsContextType } from "./context/ComponentsContext.js";
|
|
6
6
|
export declare const DevPortalSystemPaths: {
|
|
@@ -15,7 +15,7 @@ export type DevPortalProps = {
|
|
|
15
15
|
logo: string;
|
|
16
16
|
favicon: string;
|
|
17
17
|
}>;
|
|
18
|
-
authentication?:
|
|
18
|
+
authentication?: AuthenticationProvider;
|
|
19
19
|
navigation: NavigationItem[];
|
|
20
20
|
plugins?: DevPortalPlugin[];
|
|
21
21
|
mdxComponents?: MdxComponentsType;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/* eslint-disable react/destructuring-assignment */
|
|
2
3
|
import { MDXProvider } from "@mdx-js/react";
|
|
3
4
|
import { QueryClientProvider } from "@tanstack/react-query";
|
|
4
5
|
import { memo, Suspense, useEffect, useMemo } from "react";
|
|
@@ -20,7 +21,10 @@ const DevPortalInner = (props) => {
|
|
|
20
21
|
useEffect(() => {
|
|
21
22
|
void devPortalContext.initialize();
|
|
22
23
|
}, [devPortalContext]);
|
|
23
|
-
return (_jsx(QueryClientProvider, { client: queryClient, children: _jsx(HelmetProvider, { children: _jsx(DevPortalProvider, { value: devPortalContext, children: _jsx(MDXProvider, { components: mdxComponents, children: _jsx(ThemeProvider, { children: _jsx(ComponentsProvider, { value: components, children: _jsx(ViewportAnchorProvider, { children: _jsx(Suspense, { fallback: _jsx("div", { className: "grid place-items-center h-full", children: "Loading..." }), children: _jsx(Router, { plugins:
|
|
24
|
+
return (_jsx(QueryClientProvider, { client: queryClient, children: _jsx(HelmetProvider, { children: _jsx(DevPortalProvider, { value: devPortalContext, children: _jsx(MDXProvider, { components: mdxComponents, children: _jsx(ThemeProvider, { children: _jsx(ComponentsProvider, { value: components, children: _jsx(ViewportAnchorProvider, { children: _jsx(Suspense, { fallback: _jsx("div", { className: "grid place-items-center h-full", children: "Loading..." }), children: _jsx(Router, { plugins: [
|
|
25
|
+
...(props.plugins ?? []),
|
|
26
|
+
...(props.authentication ? [props.authentication] : []),
|
|
27
|
+
] }) }) }) }) }) }) }) }) }));
|
|
24
28
|
};
|
|
25
29
|
const DevPortal = memo(DevPortalInner);
|
|
26
30
|
DevPortal.displayName = "DevPortal";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DevPortal.js","sourceRoot":"","sources":["../../../src/lib/components/DevPortal.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"DevPortal.js","sourceRoot":"","sources":["../../../src/lib/components/DevPortal.tsx"],"names":[],"mappings":";AAAA,mDAAmD;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,EACL,gBAAgB,EAChB,WAAW,GAEZ,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAInD,OAAO,EACL,aAAa,GAEd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GAEnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,QAAQ,EAAE,WAAW;CACb,CAAC;AAqBX,MAAM,cAAc,GAAG,CAAC,KAAqB,EAAE,EAAE;IAC/C,MAAM,UAAU,GAAG,OAAO,CACxB,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,kBAAkB,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,EACrD,CAAC,KAAK,CAAC,SAAS,CAAC,CAClB,CAAC;IAEF,MAAM,aAAa,GAAG,OAAO,CAC3B,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,aAAa,EAAE,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC,EACpD,CAAC,KAAK,CAAC,aAAa,CAAC,CACtB,CAAC;IAEF,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAE7E,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,gBAAgB,CAAC,UAAU,EAAE,CAAC;IACrC,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEvB,OAAO,CACL,KAAC,mBAAmB,IAAC,MAAM,EAAE,WAAW,YACtC,KAAC,cAAc,cACb,KAAC,iBAAiB,IAAC,KAAK,EAAE,gBAAgB,YACxC,KAAC,WAAW,IAAC,UAAU,EAAE,aAAa,YACpC,KAAC,aAAa,cACZ,KAAC,kBAAkB,IAAC,KAAK,EAAE,UAAU,YACnC,KAAC,sBAAsB,cACrB,KAAC,QAAQ,IACP,QAAQ,EACN,cAAK,SAAS,EAAC,gCAAgC,2BAEzC,YAGR,KAAC,MAAM,IACL,OAAO,EAAE;4CACP,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;4CACxB,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;yCACxD,GACD,GACO,GACY,GACN,GACP,GACJ,GACI,GACL,GACG,CACvB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;AACvC,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -12,10 +12,7 @@ import { Spinner } from "./Spinner.js";
|
|
|
12
12
|
export const Layout = ({ children }) => {
|
|
13
13
|
const location = useLocation();
|
|
14
14
|
const { setActiveAnchor } = useViewportAnchor();
|
|
15
|
-
const { meta
|
|
16
|
-
useEffect(() => {
|
|
17
|
-
void handleAuthenticationResponse(location);
|
|
18
|
-
}, [handleAuthenticationResponse, location]);
|
|
15
|
+
const { meta } = useDevPortal();
|
|
19
16
|
useScrollToAnchor();
|
|
20
17
|
useScrollToTop();
|
|
21
18
|
const previousLocationPath = useRef(location.pathname);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Layout.js","sourceRoot":"","sources":["../../../src/lib/components/Layout.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAkB,MAAM,OAAO,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,EAAE,QAAQ,EAA4B,EAAE,EAAE;IAC/D,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,EAAE,eAAe,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAChD,MAAM,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"Layout.js","sourceRoot":"","sources":["../../../src/lib/components/Layout.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAkB,MAAM,OAAO,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,EAAE,QAAQ,EAA4B,EAAE,EAAE;IAC/D,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,EAAE,eAAe,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAChD,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,EAAE,CAAC;IAEhC,iBAAiB,EAAE,CAAC;IACpB,cAAc,EAAE,CAAC;IAEjB,MAAM,oBAAoB,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEvD,SAAS,CAAC,GAAG,EAAE;QACb,kCAAkC;QAClC,IAAI,QAAQ,CAAC,QAAQ,KAAK,oBAAoB,CAAC,OAAO,EAAE,CAAC;YACvD,eAAe,CAAC,EAAE,CAAC,CAAC;QACtB,CAAC;QACD,oBAAoB,CAAC,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACnD,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC;IAEzC,OAAO,CACL,8BACE,MAAC,MAAM,IAAC,aAAa,EAAE,IAAI,EAAE,SAAS,aACpC,mCAAmB,EAClB,IAAI,EAAE,WAAW,IAAI,CACpB,eAAM,IAAI,EAAC,aAAa,EAAC,OAAO,EAAE,IAAI,CAAC,WAAW,GAAI,CACvD,EACA,IAAI,EAAE,OAAO,IAAI,eAAM,GAAG,EAAC,MAAM,EAAC,IAAI,EAAE,IAAI,CAAC,OAAO,GAAI,IAClD,EACT,KAAC,MAAM,KAAG,EAEV,cAAK,SAAS,EAAC,qEAAqE,YAClF,MAAC,QAAQ,IACP,QAAQ,EACN,cAAK,SAAS,EAAC,gCAAgC,YAC7C,KAAC,OAAO,KAAG,GACP,aAGR,KAAC,cAAc,KAAG,EAClB,eACE,SAAS,EAAC,6PAGoF,YAE7F,QAAQ,IAAI,KAAC,MAAM,KAAG,GAClB,IACE,GACP,IACL,CACJ,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { QueryClient } from "@tanstack/react-query";
|
|
2
2
|
import { type ReactNode } from "react";
|
|
3
|
-
import { type
|
|
3
|
+
import { type AuthenticationProvider } from "../authentication/authentication.js";
|
|
4
4
|
import { type DevPortalPath, type DevPortalProps } from "../components/DevPortal.js";
|
|
5
5
|
export interface ApiIdentity {
|
|
6
6
|
authorizeRequest: (request: Request) => Request;
|
|
@@ -41,6 +41,7 @@ export type SessionProfileState = {
|
|
|
41
41
|
name?: string;
|
|
42
42
|
email_verified?: string;
|
|
43
43
|
picture?: string;
|
|
44
|
+
[key: string]: string | boolean | undefined;
|
|
44
45
|
};
|
|
45
46
|
export type RoutingState = {
|
|
46
47
|
path?: string;
|
|
@@ -55,8 +56,9 @@ export declare class DevPortalContext {
|
|
|
55
56
|
private navigationPlugins;
|
|
56
57
|
navigation: NavigationItem[];
|
|
57
58
|
meta: DevPortalProps["meta"];
|
|
58
|
-
authentication?:
|
|
59
|
+
authentication?: AuthenticationProvider;
|
|
59
60
|
state: typeof useDevPortalState;
|
|
61
|
+
get url(): URL;
|
|
60
62
|
constructor(config: DevPortalProps);
|
|
61
63
|
initialize: () => Promise<void>;
|
|
62
64
|
setUserProfile: (profile: Partial<SessionProfileState>) => Promise<void>;
|
|
@@ -64,11 +66,6 @@ export declare class DevPortalContext {
|
|
|
64
66
|
getApiIdentities: () => Promise<ApiIdentity[]>;
|
|
65
67
|
login: () => Promise<unknown>;
|
|
66
68
|
logout: () => Promise<void>;
|
|
67
|
-
handleAuthenticationResponse: (path: {
|
|
68
|
-
pathname: string;
|
|
69
|
-
search: string;
|
|
70
|
-
hash: string;
|
|
71
|
-
}) => Promise<void>;
|
|
72
69
|
getNavigation: (path: string) => Promise<import("./plugins.js").PluginNavigationCategory[]>;
|
|
73
70
|
sessionStorage: {
|
|
74
71
|
get: (key: string) => Promise<string>;
|
|
@@ -13,6 +13,9 @@ export class DevPortalContext {
|
|
|
13
13
|
meta;
|
|
14
14
|
authentication;
|
|
15
15
|
state;
|
|
16
|
+
get url() {
|
|
17
|
+
return new URL(window.location.href);
|
|
18
|
+
}
|
|
16
19
|
constructor(config) {
|
|
17
20
|
this.config = config;
|
|
18
21
|
this.plugins = config.plugins ?? [];
|
|
@@ -26,13 +29,13 @@ export class DevPortalContext {
|
|
|
26
29
|
this.plugins
|
|
27
30
|
.filter(needsInitialization)
|
|
28
31
|
.forEach((plugin) => plugin.initialize(this));
|
|
29
|
-
this.authentication?.initialize(this);
|
|
32
|
+
await this.authentication?.initialize?.(this);
|
|
30
33
|
};
|
|
31
34
|
setUserProfile = async (profile) => {
|
|
32
35
|
return useDevPortalState.setState(profile);
|
|
33
36
|
};
|
|
34
37
|
invalidateCache = async (key) => {
|
|
35
|
-
queryClient.invalidateQueries({ queryKey: key });
|
|
38
|
+
await queryClient.invalidateQueries({ queryKey: key });
|
|
36
39
|
};
|
|
37
40
|
getApiIdentities = async () => {
|
|
38
41
|
const keys = await Promise.all(this.plugins
|
|
@@ -50,10 +53,7 @@ export class DevPortalContext {
|
|
|
50
53
|
if (!this.authentication) {
|
|
51
54
|
throw new Error("No authentication configured");
|
|
52
55
|
}
|
|
53
|
-
return this.authentication.
|
|
54
|
-
};
|
|
55
|
-
handleAuthenticationResponse = async (path) => {
|
|
56
|
-
this.config.authentication?.handleAuthenticationResponse?.(path, this);
|
|
56
|
+
return this.authentication.logout(this);
|
|
57
57
|
};
|
|
58
58
|
getNavigation = async (path) => {
|
|
59
59
|
const navigations = await Promise.all(this.navigationPlugins.map(async (plugin) => plugin.getNavigation?.(path)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DevPortalContext.js","sourceRoot":"","sources":["../../../src/lib/core/DevPortalContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAMjC,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,GAGpB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"DevPortalContext.js","sourceRoot":"","sources":["../../../src/lib/core/DevPortalContext.ts"],"names":[],"mappings":"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"}
|