@osdk/oauth 1.8.0-beta.2 → 1.8.0-beta.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/CHANGELOG.md +12 -0
- package/build/browser/createPublicOauthClient.js +1 -1
- package/build/browser/createPublicOauthClient.js.map +1 -1
- package/build/browser/delay.js +20 -0
- package/build/browser/delay.js.map +1 -0
- package/build/browser/publicOauth.test.js +3 -9
- package/build/browser/publicOauth.test.js.map +1 -1
- package/build/cjs/index.cjs +5 -55
- package/build/cjs/index.cjs.map +1 -1
- package/build/esm/createPublicOauthClient.js +1 -1
- package/build/esm/createPublicOauthClient.js.map +1 -1
- package/build/esm/delay.js +20 -0
- package/build/esm/delay.js.map +1 -0
- package/build/esm/publicOauth.test.js +3 -9
- package/build/esm/publicOauth.test.js.map +1 -1
- package/build/types/createPublicOauthClient.d.ts.map +1 -1
- package/build/types/delay.d.ts +1 -0
- package/build/types/delay.d.ts.map +1 -0
- package/package.json +3 -4
package/CHANGELOG.md
CHANGED
|
@@ -14,9 +14,9 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import delay from "delay";
|
|
18
17
|
import { authorizationCodeGrantRequest, calculatePKCECodeChallenge, customFetch, generateRandomCodeVerifier, generateRandomState, processAuthorizationCodeOAuth2Response, refreshTokenGrantRequest, validateAuthResponse } from "oauth4webapi";
|
|
19
18
|
import { common, createAuthorizationServer, getStorage, readLocal, readSession, removeLocal, removeSession, saveLocal, saveSession } from "./common.js";
|
|
19
|
+
import { delay } from "./delay.js";
|
|
20
20
|
import { throwIfError } from "./throwIfError.js";
|
|
21
21
|
import { processOptionsAndAssignDefaults } from "./utils.js";
|
|
22
22
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createPublicOauthClient.js","names":["delay","authorizationCodeGrantRequest","calculatePKCECodeChallenge","customFetch","generateRandomCodeVerifier","generateRandomState","processAuthorizationCodeOAuth2Response","refreshTokenGrantRequest","validateAuthResponse","common","createAuthorizationServer","getStorage","readLocal","readSession","removeLocal","removeSession","saveLocal","saveSession","throwIfError","processOptionsAndAssignDefaults","createPublicOauthClient","client_id","url","redirect_uri","useHistory","loginPage","postLoginPage","scopes","fetchFn","ctxPath","refreshTokenMarker","joinedScopes","tokenStorage","client","token_endpoint_auth_method","authServer","oauthHttpOptions","storage","makeTokenAndSaveRefresh","getToken","_signIn","maybeRefresh","maybeHandleAuthReturn","initiateLoginRedirect","bind","globalThis","go","x","window","history","replaceState","location","assign","Error","expectRefreshToken","refresh_token","lastRefreshTokenMarker","requestedScopes","initialRequestedScopes","areScopesEqual","result","pathname","URL","oldUrl","e","process","env","NODE_ENV","console","warn","state","codeVerifier","ret","href","toString","scopeString","authorization_endpoint","URLSearchParams","response_type","code_challenge","code_challenge_method","scope"],"sources":["createPublicOauthClient.ts"],"sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport delay from \"delay\";\nimport type { Client, HttpRequestOptions } from \"oauth4webapi\";\nimport {\n authorizationCodeGrantRequest,\n calculatePKCECodeChallenge,\n customFetch,\n generateRandomCodeVerifier,\n generateRandomState,\n processAuthorizationCodeOAuth2Response,\n refreshTokenGrantRequest,\n validateAuthResponse,\n} from \"oauth4webapi\";\nimport {\n common,\n createAuthorizationServer,\n getStorage,\n readLocal,\n readSession,\n removeLocal,\n removeSession,\n saveLocal,\n saveSession,\n} from \"./common.js\";\nimport type { TokenStorageType } from \"./common.js\";\nimport type { PublicOauthClient } from \"./PublicOauthClient.js\";\nimport { throwIfError } from \"./throwIfError.js\";\nimport type { Token } from \"./Token.js\";\nimport { processOptionsAndAssignDefaults } from \"./utils.js\";\n\ndeclare const process: {\n env: {\n NODE_ENV: \"production\" | \"development\";\n TARGET: \"browser\" | \"node\";\n };\n};\n\nexport interface PublicOauthClientOptions {\n /**\n * If true, uses `history.replaceState()`, otherwise uses `window.location.assign()` (defaults to true)\n */\n useHistory?: boolean;\n\n /**\n * Custom landing page URL prior to logging in\n */\n loginPage?: string;\n\n /**\n * URL to return to after completed authentication cycle (defaults to `window.location.toString()`)\n */\n postLoginPage?: string;\n\n /**\n * * @param {string[]} [scopes=[]] - OAuth scopes to request. If not provided, defaults to `[\"api:read-data\", \"api:write-data\", \"api:use-ontologies-read\", \"api:use-ontologies-write\"]`\n */\n scopes?: string[];\n\n /**\n * Custom fetch function to use for requests (defaults to `globalThis.fetch`)\n */\n fetchFn?: typeof globalThis.fetch;\n\n /**\n * Context path for the authorization server (defaults to \"multipass\")\n */\n ctxPath?: string;\n\n /**\n * Allows for an additional value to be appended to the local storage key for the refresh token.\n */\n refreshTokenMarker?: string;\n\n /**\n * Controls how refresh tokens are stored. Affects security vs. convenience tradeoff.\n *\n * - `'localStorage'` (default): Tokens persist across browser sessions.\n * Best UX but vulnerable on shared devices.\n *\n * - `'sessionStorage'`: Tokens cleared when browser/tab closes.\n * Recommended for shared devices. Users re-authenticate each browser session.\n *\n * - `'none'`: Tokens never stored. Users re-authenticate on every page load.\n * Most secure but worst UX. Does not request `offline_access` scope.\n *\n * @default 'localStorage'\n */\n tokenStorage?: TokenStorageType;\n}\n\n/**\n * Creates a PublicOauthClient for authentication.\n *\n * @param {string} clientId - The client_id from the OAuth configuration on the server\n * @param {string} url - The base URL of your Foundry server\n * @param {string} redirectUrl - The URL configured for redirect in the OAuth configuration on the server\n * @param {PublicOauthClientOptions} options - Additional options for the client\n * @returns {PublicOauthClient} A client that can be used as a token provider\n */\nexport function createPublicOauthClient(\n clientId: string,\n url: string,\n redirectUrl: string,\n options?: PublicOauthClientOptions,\n): PublicOauthClient;\n\n/**\n * Creates a PublicOauthClient for authentication.\n *\n * @param {string} clientId - The client_id from the OAuth configuration on the server\n * @param {string} url - The base URL of your Foundry server\n * @param {string} redirectUrl - The URL configured for redirect in the OAuth configuration on the server\n * @param {boolean} useHistory - If true, uses `history.replaceState()`, otherwise uses `window.location.assign()` (defaults to true)\n * @param {string} loginPage - Custom landing page URL prior to logging in\n * @param {string} postLoginPage - URL to return to after completed authentication cycle (defaults to `window.location.toString()`)\n * @param {string[]} scopes - OAuth scopes to request. If not provided, defaults to `[\"api:read-data\", \"api:write-data\", \"api:use-ontologies-read\", \"api:use-ontologies-write\"]`\n * @param {typeof globalThis.fetch} fetchFn - Custom fetch function to use for requests (defaults to `globalThis.fetch`)\n * @param {string} ctxPath - Context path for the authorization server (defaults to \"multipass\")\n * @returns {PublicOauthClient} A client that can be used as a token provider\n */\nexport function createPublicOauthClient(\n client_id: string,\n url: string,\n redirectUrl: string,\n useHistory?: boolean,\n loginPage?: string,\n postLoginPage?: string,\n scopes?: string[],\n fetchFn?: typeof globalThis.fetch,\n ctxPath?: string,\n): PublicOauthClient;\nexport function createPublicOauthClient(\n client_id: string,\n url: string,\n redirect_uri: string,\n useHistory?: boolean | PublicOauthClientOptions,\n loginPage?: string,\n postLoginPage?: string,\n scopes?: string[],\n fetchFn?: typeof globalThis.fetch,\n ctxPath?: string,\n): PublicOauthClient {\n let refreshTokenMarker: string | undefined;\n let joinedScopes: string;\n let tokenStorage: TokenStorageType;\n ({\n useHistory,\n loginPage,\n postLoginPage,\n joinedScopes,\n fetchFn,\n ctxPath,\n refreshTokenMarker,\n tokenStorage,\n } = processOptionsAndAssignDefaults(\n url,\n redirect_uri,\n useHistory,\n loginPage,\n postLoginPage,\n scopes,\n fetchFn,\n ctxPath,\n ));\n\n const client: Client = {\n client_id,\n token_endpoint_auth_method: \"none\",\n };\n const authServer = createAuthorizationServer(ctxPath, url);\n const oauthHttpOptions: HttpRequestOptions = { [customFetch]: fetchFn };\n\n const storage = getStorage(tokenStorage);\n\n const { makeTokenAndSaveRefresh, getToken } = common(\n client,\n authServer,\n _signIn,\n oauthHttpOptions,\n maybeRefresh.bind(globalThis, true),\n refreshTokenMarker,\n joinedScopes,\n storage,\n );\n\n // as an arrow function, `useHistory` is known to be a boolean\n const go = async (x: string) => {\n if (useHistory) {\n window.history.replaceState({}, \"\", x);\n return;\n } else window.location.assign(x);\n\n await delay(1000);\n throw new Error(\"Unable to redirect\");\n };\n\n async function maybeRefresh(\n expectRefreshToken?: boolean,\n ): Promise<Token | undefined> {\n if (tokenStorage === \"none\") {\n if (expectRefreshToken) throw new Error(\"No refresh token found\");\n return;\n }\n\n const {\n refresh_token,\n refreshTokenMarker: lastRefreshTokenMarker,\n requestedScopes: initialRequestedScopes,\n } = readLocal(client, storage);\n\n const areScopesEqual = initialRequestedScopes != null\n && joinedScopes === initialRequestedScopes;\n\n if (\n !refresh_token || lastRefreshTokenMarker !== refreshTokenMarker\n || !areScopesEqual\n ) {\n if (expectRefreshToken) throw new Error(\"No refresh token found\");\n return;\n }\n\n try {\n // note, we don't use processRefreshTokenResponse because the mp oauth implementation\n // doesn't do refresh tokens quite right and this lets us skip the id check\n const result = makeTokenAndSaveRefresh(\n throwIfError(\n await processAuthorizationCodeOAuth2Response(\n authServer,\n client,\n await refreshTokenGrantRequest(\n authServer,\n client,\n refresh_token,\n oauthHttpOptions,\n ),\n ),\n ),\n \"refresh\",\n );\n\n if (\n result && window.location.pathname === new URL(redirect_uri).pathname\n ) {\n const { oldUrl } = readSession(client);\n // don't block on the redirect\n void go(oldUrl ?? \"/\");\n }\n return result;\n } catch (e) {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n \"Failed to get OAuth2 refresh token. Removing refresh token\",\n e,\n );\n }\n removeLocal(client, storage);\n if (expectRefreshToken) {\n throw new Error(\"Could not refresh token\");\n }\n }\n }\n\n async function maybeHandleAuthReturn() {\n const { state, oldUrl, codeVerifier } = readSession(client);\n if (!codeVerifier) return;\n\n try {\n const ret = makeTokenAndSaveRefresh(\n throwIfError(\n await processAuthorizationCodeOAuth2Response(\n authServer,\n client,\n await authorizationCodeGrantRequest(\n authServer,\n client,\n throwIfError(\n validateAuthResponse(\n authServer,\n client,\n new URL(window.location.href),\n state,\n ),\n ),\n redirect_uri,\n codeVerifier,\n oauthHttpOptions,\n ),\n ),\n ),\n \"signIn\",\n );\n\n void go(oldUrl);\n return ret;\n } catch (e) {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n \"Failed to get OAuth2 token using PKCE, removing PKCE and starting a new auth flow\",\n e,\n );\n }\n removeLocal(client, storage);\n removeSession(client);\n throw e;\n }\n }\n\n // As an arrow function, `scopes` and `postLoginPage` are known at compile time\n const initiateLoginRedirect = async (): Promise<void> => {\n if (\n loginPage\n && window.location.href !== loginPage\n && window.location.pathname !== loginPage\n ) {\n saveLocal(client, {}, storage);\n saveSession(client, { oldUrl: postLoginPage });\n await go(loginPage);\n return;\n }\n\n const state = generateRandomState()!;\n const codeVerifier = generateRandomCodeVerifier();\n const oldUrl = readSession(client).oldUrl ?? window.location.toString();\n saveLocal(client, {}, storage);\n saveSession(client, { codeVerifier, state, oldUrl });\n\n // Only request offline_access (refresh tokens) if we're going to store them\n const scopeString = tokenStorage === \"none\"\n ? joinedScopes\n : `offline_access ${joinedScopes}`;\n\n window.location.assign(`${authServer\n .authorization_endpoint!}?${new URLSearchParams({\n client_id,\n response_type: \"code\",\n state,\n redirect_uri,\n code_challenge: await calculatePKCECodeChallenge(codeVerifier),\n code_challenge_method: \"S256\",\n scope: scopeString,\n })}`);\n\n // Give time for redirect to happen\n await delay(1000);\n throw new Error(\"Unable to redirect\");\n };\n\n /** Will throw if there is no token! */\n async function _signIn() {\n // 1. Check if we have a refresh token in local storage\n return await maybeRefresh()\n // 2. If there is no refresh token we are likely trying to perform the callback\n ?? await maybeHandleAuthReturn()\n // 3. If we haven't been able to load the token from one of the two above ways, we need to make the initial auth request\n ?? await initiateLoginRedirect() as unknown as Token;\n }\n\n return getToken;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,KAAK,MAAM,OAAO;AAEzB,SACEC,6BAA6B,EAC7BC,0BAA0B,EAC1BC,WAAW,EACXC,0BAA0B,EAC1BC,mBAAmB,EACnBC,sCAAsC,EACtCC,wBAAwB,EACxBC,oBAAoB,QACf,cAAc;AACrB,SACEC,MAAM,EACNC,yBAAyB,EACzBC,UAAU,EACVC,SAAS,EACTC,WAAW,EACXC,WAAW,EACXC,aAAa,EACbC,SAAS,EACTC,WAAW,QACN,aAAa;AAGpB,SAASC,YAAY,QAAQ,mBAAmB;AAEhD,SAASC,+BAA+B,QAAQ,YAAY;;AA8D5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAYA,OAAO,SAASC,uBAAuBA,CACrCC,SAAiB,EACjBC,GAAW,EACXC,YAAoB,EACpBC,UAA+C,EAC/CC,SAAkB,EAClBC,aAAsB,EACtBC,MAAiB,EACjBC,OAAiC,EACjCC,OAAgB,EACG;EACnB,IAAIC,kBAAsC;EAC1C,IAAIC,YAAoB;EACxB,IAAIC,YAA8B;EAClC,CAAC;IACCR,UAAU;IACVC,SAAS;IACTC,aAAa;IACbK,YAAY;IACZH,OAAO;IACPC,OAAO;IACPC,kBAAkB;IAClBE;EACF,CAAC,GAAGb,+BAA+B,CACjCG,GAAG,EACHC,YAAY,EACZC,UAAU,EACVC,SAAS,EACTC,aAAa,EACbC,MAAM,EACNC,OAAO,EACPC,OACF,CAAC;EAED,MAAMI,MAAc,GAAG;IACrBZ,SAAS;IACTa,0BAA0B,EAAE;EAC9B,CAAC;EACD,MAAMC,UAAU,GAAGzB,yBAAyB,CAACmB,OAAO,EAAEP,GAAG,CAAC;EAC1D,MAAMc,gBAAoC,GAAG;IAAE,CAACjC,WAAW,GAAGyB;EAAQ,CAAC;EAEvE,MAAMS,OAAO,GAAG1B,UAAU,CAACqB,YAAY,CAAC;EAExC,MAAM;IAAEM,uBAAuB;IAAEC;EAAS,CAAC,GAAG9B,MAAM,CAClDwB,MAAM,EACNE,UAAU,EA6KZ;EACA,eAAeK,OAAOA,CAAA,EAAG;IACvB;IACA,OAAO,OAAMC,YAAY,CAAC;IACxB;IAAA,MACG,MAAMC,qBAAqB,CAAC,CAAC;IAChC;IAAA,IACG,MAAMC,qBAAqB,CAAC,CAAC,CAAoB;EACxD,CAAC,EAnLCP,gBAAgB,EAChBK,YAAY,CAACG,IAAI,CAACC,UAAU,EAAE,IAAI,CAAC,EACnCf,kBAAkB,EAClBC,YAAY,EACZM,OACF,CAAC;;EAED;EACA,MAAMS,EAAE,GAAG,MAAOC,CAAS,IAAK;IAC9B,IAAIvB,UAAU,EAAE;MACdwB,MAAM,CAACC,OAAO,CAACC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,EAAEH,CAAC,CAAC;MACtC;IACF,CAAC,MAAMC,MAAM,CAACG,QAAQ,CAACC,MAAM,CAACL,CAAC,CAAC;IAEhC,MAAM/C,KAAK,CAAC,IAAI,CAAC;IACjB,MAAM,IAAIqD,KAAK,CAAC,oBAAoB,CAAC;EACvC,CAAC;EAED,eAAeZ,YAAYA,CACzBa,kBAA4B,EACA;IAC5B,IAAItB,YAAY,KAAK,MAAM,EAAE;MAC3B,IAAIsB,kBAAkB,EAAE,MAAM,IAAID,KAAK,CAAC,wBAAwB,CAAC;MACjE;IACF;IAEA,MAAM;MACJE,aAAa;MACbzB,kBAAkB,EAAE0B,sBAAsB;MAC1CC,eAAe,EAAEC;IACnB,CAAC,GAAG9C,SAAS,CAACqB,MAAM,EAAEI,OAAO,CAAC;IAE9B,MAAMsB,cAAc,GAAGD,sBAAsB,IAAI,IAAI,IAChD3B,YAAY,KAAK2B,sBAAsB;IAE5C,IACE,CAACH,aAAa,IAAIC,sBAAsB,KAAK1B,kBAAkB,IAC5D,CAAC6B,cAAc,EAClB;MACA,IAAIL,kBAAkB,EAAE,MAAM,IAAID,KAAK,CAAC,wBAAwB,CAAC;MACjE;IACF;IAEA,IAAI;MACF;MACA;MACA,MAAMO,MAAM,GAAGtB,uBAAuB,CACpCpB,YAAY,CACV,MAAMZ,sCAAsC,CAC1C6B,UAAU,EACVF,MAAM,EACN,MAAM1B,wBAAwB,CAC5B4B,UAAU,EACVF,MAAM,EACNsB,aAAa,EACbnB,gBACF,CACF,CACF,CAAC,EACD,SACF,CAAC;MAED,IACEwB,MAAM,IAAIZ,MAAM,CAACG,QAAQ,CAACU,QAAQ,KAAK,IAAIC,GAAG,CAACvC,YAAY,CAAC,CAACsC,QAAQ,EACrE;QACA,MAAM;UAAEE;QAAO,CAAC,GAAGlD,WAAW,CAACoB,MAAM,CAAC;QACtC;QACA,KAAKa,EAAE,CAACiB,MAAM,IAAI,GAAG,CAAC;MACxB;MACA,OAAOH,MAAM;IACf,CAAC,CAAC,OAAOI,CAAC,EAAE;MACV,IAAIC,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;QACzC;QACAC,OAAO,CAACC,IAAI,CACV,4DAA4D,EAC5DL,CACF,CAAC;MACH;MACAlD,WAAW,CAACmB,MAAM,EAAEI,OAAO,CAAC;MAC5B,IAAIiB,kBAAkB,EAAE;QACtB,MAAM,IAAID,KAAK,CAAC,yBAAyB,CAAC;MAC5C;IACF;EACF;EAEA,eAAeX,qBAAqBA,CAAA,EAAG;IACrC,MAAM;MAAE4B,KAAK;MAAEP,MAAM;MAAEQ;IAAa,CAAC,GAAG1D,WAAW,CAACoB,MAAM,CAAC;IAC3D,IAAI,CAACsC,YAAY,EAAE;IAEnB,IAAI;MACF,MAAMC,GAAG,GAAGlC,uBAAuB,CACjCpB,YAAY,CACV,MAAMZ,sCAAsC,CAC1C6B,UAAU,EACVF,MAAM,EACN,MAAMhC,6BAA6B,CACjCkC,UAAU,EACVF,MAAM,EACNf,YAAY,CACVV,oBAAoB,CAClB2B,UAAU,EACVF,MAAM,EACN,IAAI6B,GAAG,CAACd,MAAM,CAACG,QAAQ,CAACsB,IAAI,CAAC,EAC7BH,KACF,CACF,CAAC,EACD/C,YAAY,EACZgD,YAAY,EACZnC,gBACF,CACF,CACF,CAAC,EACD,QACF,CAAC;MAED,KAAKU,EAAE,CAACiB,MAAM,CAAC;MACf,OAAOS,GAAG;IACZ,CAAC,CAAC,OAAOR,CAAC,EAAE;MACV,IAAIC,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;QACzC;QACAC,OAAO,CAACC,IAAI,CACV,mFAAmF,EACnFL,CACF,CAAC;MACH;MACAlD,WAAW,CAACmB,MAAM,EAAEI,OAAO,CAAC;MAC5BtB,aAAa,CAACkB,MAAM,CAAC;MACrB,MAAM+B,CAAC;IACT;EACF;;EAEA;EACA,MAAMrB,qBAAqB,GAAG,MAAAA,CAAA,KAA2B;IACvD,IACElB,SAAS,IACNuB,MAAM,CAACG,QAAQ,CAACsB,IAAI,KAAKhD,SAAS,IAClCuB,MAAM,CAACG,QAAQ,CAACU,QAAQ,KAAKpC,SAAS,EACzC;MACAT,SAAS,CAACiB,MAAM,EAAE,CAAC,CAAC,EAAEI,OAAO,CAAC;MAC9BpB,WAAW,CAACgB,MAAM,EAAE;QAAE8B,MAAM,EAAErC;MAAc,CAAC,CAAC;MAC9C,MAAMoB,EAAE,CAACrB,SAAS,CAAC;MACnB;IACF;IAEA,MAAM6C,KAAK,GAAGjE,mBAAmB,CAAC,CAAE;IACpC,MAAMkE,YAAY,GAAGnE,0BAA0B,CAAC,CAAC;IACjD,MAAM2D,MAAM,GAAGlD,WAAW,CAACoB,MAAM,CAAC,CAAC8B,MAAM,IAAIf,MAAM,CAACG,QAAQ,CAACuB,QAAQ,CAAC,CAAC;IACvE1D,SAAS,CAACiB,MAAM,EAAE,CAAC,CAAC,EAAEI,OAAO,CAAC;IAC9BpB,WAAW,CAACgB,MAAM,EAAE;MAAEsC,YAAY;MAAED,KAAK;MAAEP;IAAO,CAAC,CAAC;;IAEpD;IACA,MAAMY,WAAW,GAAG3C,YAAY,KAAK,MAAM,GACvCD,YAAY,GACZ,kBAAkBA,YAAY,EAAE;IAEpCiB,MAAM,CAACG,QAAQ,CAACC,MAAM,CAAC,GAAGjB,UAAU,CACjCyC,sBAAsB,IAAK,IAAIC,eAAe,CAAC;MAChDxD,SAAS;MACTyD,aAAa,EAAE,MAAM;MACrBR,KAAK;MACL/C,YAAY;MACZwD,cAAc,EAAE,MAAM7E,0BAA0B,CAACqE,YAAY,CAAC;MAC9DS,qBAAqB,EAAE,MAAM;MAC7BC,KAAK,EAAEN;IACT,CAAC,CAAC,EAAE,CAAC;;IAEL;IACA,MAAM3E,KAAK,CAAC,IAAI,CAAC;IACjB,MAAM,IAAIqD,KAAK,CAAC,oBAAoB,CAAC;EACvC,CAAC;EAYD,OAAOd,QAAQ;AACjB","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"createPublicOauthClient.js","names":["authorizationCodeGrantRequest","calculatePKCECodeChallenge","customFetch","generateRandomCodeVerifier","generateRandomState","processAuthorizationCodeOAuth2Response","refreshTokenGrantRequest","validateAuthResponse","common","createAuthorizationServer","getStorage","readLocal","readSession","removeLocal","removeSession","saveLocal","saveSession","delay","throwIfError","processOptionsAndAssignDefaults","createPublicOauthClient","client_id","url","redirect_uri","useHistory","loginPage","postLoginPage","scopes","fetchFn","ctxPath","refreshTokenMarker","joinedScopes","tokenStorage","client","token_endpoint_auth_method","authServer","oauthHttpOptions","storage","makeTokenAndSaveRefresh","getToken","_signIn","maybeRefresh","maybeHandleAuthReturn","initiateLoginRedirect","bind","globalThis","go","x","window","history","replaceState","location","assign","Error","expectRefreshToken","refresh_token","lastRefreshTokenMarker","requestedScopes","initialRequestedScopes","areScopesEqual","result","pathname","URL","oldUrl","e","process","env","NODE_ENV","console","warn","state","codeVerifier","ret","href","toString","scopeString","authorization_endpoint","URLSearchParams","response_type","code_challenge","code_challenge_method","scope"],"sources":["createPublicOauthClient.ts"],"sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Client, HttpRequestOptions } from \"oauth4webapi\";\nimport {\n authorizationCodeGrantRequest,\n calculatePKCECodeChallenge,\n customFetch,\n generateRandomCodeVerifier,\n generateRandomState,\n processAuthorizationCodeOAuth2Response,\n refreshTokenGrantRequest,\n validateAuthResponse,\n} from \"oauth4webapi\";\nimport {\n common,\n createAuthorizationServer,\n getStorage,\n readLocal,\n readSession,\n removeLocal,\n removeSession,\n saveLocal,\n saveSession,\n} from \"./common.js\";\nimport type { TokenStorageType } from \"./common.js\";\nimport { delay } from \"./delay.js\";\nimport type { PublicOauthClient } from \"./PublicOauthClient.js\";\nimport { throwIfError } from \"./throwIfError.js\";\nimport type { Token } from \"./Token.js\";\nimport { processOptionsAndAssignDefaults } from \"./utils.js\";\n\ndeclare const process: {\n env: {\n NODE_ENV: \"production\" | \"development\";\n TARGET: \"browser\" | \"node\";\n };\n};\n\nexport interface PublicOauthClientOptions {\n /**\n * If true, uses `history.replaceState()`, otherwise uses `window.location.assign()` (defaults to true)\n */\n useHistory?: boolean;\n\n /**\n * Custom landing page URL prior to logging in\n */\n loginPage?: string;\n\n /**\n * URL to return to after completed authentication cycle (defaults to `window.location.toString()`)\n */\n postLoginPage?: string;\n\n /**\n * * @param {string[]} [scopes=[]] - OAuth scopes to request. If not provided, defaults to `[\"api:read-data\", \"api:write-data\", \"api:use-ontologies-read\", \"api:use-ontologies-write\"]`\n */\n scopes?: string[];\n\n /**\n * Custom fetch function to use for requests (defaults to `globalThis.fetch`)\n */\n fetchFn?: typeof globalThis.fetch;\n\n /**\n * Context path for the authorization server (defaults to \"multipass\")\n */\n ctxPath?: string;\n\n /**\n * Allows for an additional value to be appended to the local storage key for the refresh token.\n */\n refreshTokenMarker?: string;\n\n /**\n * Controls how refresh tokens are stored. Affects security vs. convenience tradeoff.\n *\n * - `'localStorage'` (default): Tokens persist across browser sessions.\n * Best UX but vulnerable on shared devices.\n *\n * - `'sessionStorage'`: Tokens cleared when browser/tab closes.\n * Recommended for shared devices. Users re-authenticate each browser session.\n *\n * - `'none'`: Tokens never stored. Users re-authenticate on every page load.\n * Most secure but worst UX. Does not request `offline_access` scope.\n *\n * @default 'localStorage'\n */\n tokenStorage?: TokenStorageType;\n}\n\n/**\n * Creates a PublicOauthClient for authentication.\n *\n * @param {string} clientId - The client_id from the OAuth configuration on the server\n * @param {string} url - The base URL of your Foundry server\n * @param {string} redirectUrl - The URL configured for redirect in the OAuth configuration on the server\n * @param {PublicOauthClientOptions} options - Additional options for the client\n * @returns {PublicOauthClient} A client that can be used as a token provider\n */\nexport function createPublicOauthClient(\n clientId: string,\n url: string,\n redirectUrl: string,\n options?: PublicOauthClientOptions,\n): PublicOauthClient;\n\n/**\n * Creates a PublicOauthClient for authentication.\n *\n * @param {string} clientId - The client_id from the OAuth configuration on the server\n * @param {string} url - The base URL of your Foundry server\n * @param {string} redirectUrl - The URL configured for redirect in the OAuth configuration on the server\n * @param {boolean} useHistory - If true, uses `history.replaceState()`, otherwise uses `window.location.assign()` (defaults to true)\n * @param {string} loginPage - Custom landing page URL prior to logging in\n * @param {string} postLoginPage - URL to return to after completed authentication cycle (defaults to `window.location.toString()`)\n * @param {string[]} scopes - OAuth scopes to request. If not provided, defaults to `[\"api:read-data\", \"api:write-data\", \"api:use-ontologies-read\", \"api:use-ontologies-write\"]`\n * @param {typeof globalThis.fetch} fetchFn - Custom fetch function to use for requests (defaults to `globalThis.fetch`)\n * @param {string} ctxPath - Context path for the authorization server (defaults to \"multipass\")\n * @returns {PublicOauthClient} A client that can be used as a token provider\n */\nexport function createPublicOauthClient(\n client_id: string,\n url: string,\n redirectUrl: string,\n useHistory?: boolean,\n loginPage?: string,\n postLoginPage?: string,\n scopes?: string[],\n fetchFn?: typeof globalThis.fetch,\n ctxPath?: string,\n): PublicOauthClient;\nexport function createPublicOauthClient(\n client_id: string,\n url: string,\n redirect_uri: string,\n useHistory?: boolean | PublicOauthClientOptions,\n loginPage?: string,\n postLoginPage?: string,\n scopes?: string[],\n fetchFn?: typeof globalThis.fetch,\n ctxPath?: string,\n): PublicOauthClient {\n let refreshTokenMarker: string | undefined;\n let joinedScopes: string;\n let tokenStorage: TokenStorageType;\n ({\n useHistory,\n loginPage,\n postLoginPage,\n joinedScopes,\n fetchFn,\n ctxPath,\n refreshTokenMarker,\n tokenStorage,\n } = processOptionsAndAssignDefaults(\n url,\n redirect_uri,\n useHistory,\n loginPage,\n postLoginPage,\n scopes,\n fetchFn,\n ctxPath,\n ));\n\n const client: Client = {\n client_id,\n token_endpoint_auth_method: \"none\",\n };\n const authServer = createAuthorizationServer(ctxPath, url);\n const oauthHttpOptions: HttpRequestOptions = { [customFetch]: fetchFn };\n\n const storage = getStorage(tokenStorage);\n\n const { makeTokenAndSaveRefresh, getToken } = common(\n client,\n authServer,\n _signIn,\n oauthHttpOptions,\n maybeRefresh.bind(globalThis, true),\n refreshTokenMarker,\n joinedScopes,\n storage,\n );\n\n // as an arrow function, `useHistory` is known to be a boolean\n const go = async (x: string) => {\n if (useHistory) {\n window.history.replaceState({}, \"\", x);\n return;\n } else window.location.assign(x);\n\n await delay(1000);\n throw new Error(\"Unable to redirect\");\n };\n\n async function maybeRefresh(\n expectRefreshToken?: boolean,\n ): Promise<Token | undefined> {\n if (tokenStorage === \"none\") {\n if (expectRefreshToken) throw new Error(\"No refresh token found\");\n return;\n }\n\n const {\n refresh_token,\n refreshTokenMarker: lastRefreshTokenMarker,\n requestedScopes: initialRequestedScopes,\n } = readLocal(client, storage);\n\n const areScopesEqual = initialRequestedScopes != null\n && joinedScopes === initialRequestedScopes;\n\n if (\n !refresh_token || lastRefreshTokenMarker !== refreshTokenMarker\n || !areScopesEqual\n ) {\n if (expectRefreshToken) throw new Error(\"No refresh token found\");\n return;\n }\n\n try {\n // note, we don't use processRefreshTokenResponse because the mp oauth implementation\n // doesn't do refresh tokens quite right and this lets us skip the id check\n const result = makeTokenAndSaveRefresh(\n throwIfError(\n await processAuthorizationCodeOAuth2Response(\n authServer,\n client,\n await refreshTokenGrantRequest(\n authServer,\n client,\n refresh_token,\n oauthHttpOptions,\n ),\n ),\n ),\n \"refresh\",\n );\n\n if (\n result && window.location.pathname === new URL(redirect_uri).pathname\n ) {\n const { oldUrl } = readSession(client);\n // don't block on the redirect\n void go(oldUrl ?? \"/\");\n }\n return result;\n } catch (e) {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n \"Failed to get OAuth2 refresh token. Removing refresh token\",\n e,\n );\n }\n removeLocal(client, storage);\n if (expectRefreshToken) {\n throw new Error(\"Could not refresh token\");\n }\n }\n }\n\n async function maybeHandleAuthReturn() {\n const { state, oldUrl, codeVerifier } = readSession(client);\n if (!codeVerifier) return;\n\n try {\n const ret = makeTokenAndSaveRefresh(\n throwIfError(\n await processAuthorizationCodeOAuth2Response(\n authServer,\n client,\n await authorizationCodeGrantRequest(\n authServer,\n client,\n throwIfError(\n validateAuthResponse(\n authServer,\n client,\n new URL(window.location.href),\n state,\n ),\n ),\n redirect_uri,\n codeVerifier,\n oauthHttpOptions,\n ),\n ),\n ),\n \"signIn\",\n );\n\n void go(oldUrl);\n return ret;\n } catch (e) {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n \"Failed to get OAuth2 token using PKCE, removing PKCE and starting a new auth flow\",\n e,\n );\n }\n removeLocal(client, storage);\n removeSession(client);\n throw e;\n }\n }\n\n // As an arrow function, `scopes` and `postLoginPage` are known at compile time\n const initiateLoginRedirect = async (): Promise<void> => {\n if (\n loginPage\n && window.location.href !== loginPage\n && window.location.pathname !== loginPage\n ) {\n saveLocal(client, {}, storage);\n saveSession(client, { oldUrl: postLoginPage });\n await go(loginPage);\n return;\n }\n\n const state = generateRandomState()!;\n const codeVerifier = generateRandomCodeVerifier();\n const oldUrl = readSession(client).oldUrl ?? window.location.toString();\n saveLocal(client, {}, storage);\n saveSession(client, { codeVerifier, state, oldUrl });\n\n // Only request offline_access (refresh tokens) if we're going to store them\n const scopeString = tokenStorage === \"none\"\n ? joinedScopes\n : `offline_access ${joinedScopes}`;\n\n window.location.assign(`${authServer\n .authorization_endpoint!}?${new URLSearchParams({\n client_id,\n response_type: \"code\",\n state,\n redirect_uri,\n code_challenge: await calculatePKCECodeChallenge(codeVerifier),\n code_challenge_method: \"S256\",\n scope: scopeString,\n })}`);\n\n // Give time for redirect to happen\n await delay(1000);\n throw new Error(\"Unable to redirect\");\n };\n\n /** Will throw if there is no token! */\n async function _signIn() {\n // 1. Check if we have a refresh token in local storage\n return await maybeRefresh()\n // 2. If there is no refresh token we are likely trying to perform the callback\n ?? await maybeHandleAuthReturn()\n // 3. If we haven't been able to load the token from one of the two above ways, we need to make the initial auth request\n ?? await initiateLoginRedirect() as unknown as Token;\n }\n\n return getToken;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SACEA,6BAA6B,EAC7BC,0BAA0B,EAC1BC,WAAW,EACXC,0BAA0B,EAC1BC,mBAAmB,EACnBC,sCAAsC,EACtCC,wBAAwB,EACxBC,oBAAoB,QACf,cAAc;AACrB,SACEC,MAAM,EACNC,yBAAyB,EACzBC,UAAU,EACVC,SAAS,EACTC,WAAW,EACXC,WAAW,EACXC,aAAa,EACbC,SAAS,EACTC,WAAW,QACN,aAAa;AAEpB,SAASC,KAAK,QAAQ,YAAY;AAElC,SAASC,YAAY,QAAQ,mBAAmB;AAEhD,SAASC,+BAA+B,QAAQ,YAAY;;AA8D5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAYA,OAAO,SAASC,uBAAuBA,CACrCC,SAAiB,EACjBC,GAAW,EACXC,YAAoB,EACpBC,UAA+C,EAC/CC,SAAkB,EAClBC,aAAsB,EACtBC,MAAiB,EACjBC,OAAiC,EACjCC,OAAgB,EACG;EACnB,IAAIC,kBAAsC;EAC1C,IAAIC,YAAoB;EACxB,IAAIC,YAA8B;EAClC,CAAC;IACCR,UAAU;IACVC,SAAS;IACTC,aAAa;IACbK,YAAY;IACZH,OAAO;IACPC,OAAO;IACPC,kBAAkB;IAClBE;EACF,CAAC,GAAGb,+BAA+B,CACjCG,GAAG,EACHC,YAAY,EACZC,UAAU,EACVC,SAAS,EACTC,aAAa,EACbC,MAAM,EACNC,OAAO,EACPC,OACF,CAAC;EAED,MAAMI,MAAc,GAAG;IACrBZ,SAAS;IACTa,0BAA0B,EAAE;EAC9B,CAAC;EACD,MAAMC,UAAU,GAAG1B,yBAAyB,CAACoB,OAAO,EAAEP,GAAG,CAAC;EAC1D,MAAMc,gBAAoC,GAAG;IAAE,CAAClC,WAAW,GAAG0B;EAAQ,CAAC;EAEvE,MAAMS,OAAO,GAAG3B,UAAU,CAACsB,YAAY,CAAC;EAExC,MAAM;IAAEM,uBAAuB;IAAEC;EAAS,CAAC,GAAG/B,MAAM,CAClDyB,MAAM,EACNE,UAAU,EA6KZ;EACA,eAAeK,OAAOA,CAAA,EAAG;IACvB;IACA,OAAO,OAAMC,YAAY,CAAC;IACxB;IAAA,MACG,MAAMC,qBAAqB,CAAC,CAAC;IAChC;IAAA,IACG,MAAMC,qBAAqB,CAAC,CAAC,CAAoB;EACxD,CAAC,EAnLCP,gBAAgB,EAChBK,YAAY,CAACG,IAAI,CAACC,UAAU,EAAE,IAAI,CAAC,EACnCf,kBAAkB,EAClBC,YAAY,EACZM,OACF,CAAC;;EAED;EACA,MAAMS,EAAE,GAAG,MAAOC,CAAS,IAAK;IAC9B,IAAIvB,UAAU,EAAE;MACdwB,MAAM,CAACC,OAAO,CAACC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,EAAEH,CAAC,CAAC;MACtC;IACF,CAAC,MAAMC,MAAM,CAACG,QAAQ,CAACC,MAAM,CAACL,CAAC,CAAC;IAEhC,MAAM9B,KAAK,CAAC,IAAI,CAAC;IACjB,MAAM,IAAIoC,KAAK,CAAC,oBAAoB,CAAC;EACvC,CAAC;EAED,eAAeZ,YAAYA,CACzBa,kBAA4B,EACA;IAC5B,IAAItB,YAAY,KAAK,MAAM,EAAE;MAC3B,IAAIsB,kBAAkB,EAAE,MAAM,IAAID,KAAK,CAAC,wBAAwB,CAAC;MACjE;IACF;IAEA,MAAM;MACJE,aAAa;MACbzB,kBAAkB,EAAE0B,sBAAsB;MAC1CC,eAAe,EAAEC;IACnB,CAAC,GAAG/C,SAAS,CAACsB,MAAM,EAAEI,OAAO,CAAC;IAE9B,MAAMsB,cAAc,GAAGD,sBAAsB,IAAI,IAAI,IAChD3B,YAAY,KAAK2B,sBAAsB;IAE5C,IACE,CAACH,aAAa,IAAIC,sBAAsB,KAAK1B,kBAAkB,IAC5D,CAAC6B,cAAc,EAClB;MACA,IAAIL,kBAAkB,EAAE,MAAM,IAAID,KAAK,CAAC,wBAAwB,CAAC;MACjE;IACF;IAEA,IAAI;MACF;MACA;MACA,MAAMO,MAAM,GAAGtB,uBAAuB,CACpCpB,YAAY,CACV,MAAMb,sCAAsC,CAC1C8B,UAAU,EACVF,MAAM,EACN,MAAM3B,wBAAwB,CAC5B6B,UAAU,EACVF,MAAM,EACNsB,aAAa,EACbnB,gBACF,CACF,CACF,CAAC,EACD,SACF,CAAC;MAED,IACEwB,MAAM,IAAIZ,MAAM,CAACG,QAAQ,CAACU,QAAQ,KAAK,IAAIC,GAAG,CAACvC,YAAY,CAAC,CAACsC,QAAQ,EACrE;QACA,MAAM;UAAEE;QAAO,CAAC,GAAGnD,WAAW,CAACqB,MAAM,CAAC;QACtC;QACA,KAAKa,EAAE,CAACiB,MAAM,IAAI,GAAG,CAAC;MACxB;MACA,OAAOH,MAAM;IACf,CAAC,CAAC,OAAOI,CAAC,EAAE;MACV,IAAIC,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;QACzC;QACAC,OAAO,CAACC,IAAI,CACV,4DAA4D,EAC5DL,CACF,CAAC;MACH;MACAnD,WAAW,CAACoB,MAAM,EAAEI,OAAO,CAAC;MAC5B,IAAIiB,kBAAkB,EAAE;QACtB,MAAM,IAAID,KAAK,CAAC,yBAAyB,CAAC;MAC5C;IACF;EACF;EAEA,eAAeX,qBAAqBA,CAAA,EAAG;IACrC,MAAM;MAAE4B,KAAK;MAAEP,MAAM;MAAEQ;IAAa,CAAC,GAAG3D,WAAW,CAACqB,MAAM,CAAC;IAC3D,IAAI,CAACsC,YAAY,EAAE;IAEnB,IAAI;MACF,MAAMC,GAAG,GAAGlC,uBAAuB,CACjCpB,YAAY,CACV,MAAMb,sCAAsC,CAC1C8B,UAAU,EACVF,MAAM,EACN,MAAMjC,6BAA6B,CACjCmC,UAAU,EACVF,MAAM,EACNf,YAAY,CACVX,oBAAoB,CAClB4B,UAAU,EACVF,MAAM,EACN,IAAI6B,GAAG,CAACd,MAAM,CAACG,QAAQ,CAACsB,IAAI,CAAC,EAC7BH,KACF,CACF,CAAC,EACD/C,YAAY,EACZgD,YAAY,EACZnC,gBACF,CACF,CACF,CAAC,EACD,QACF,CAAC;MAED,KAAKU,EAAE,CAACiB,MAAM,CAAC;MACf,OAAOS,GAAG;IACZ,CAAC,CAAC,OAAOR,CAAC,EAAE;MACV,IAAIC,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;QACzC;QACAC,OAAO,CAACC,IAAI,CACV,mFAAmF,EACnFL,CACF,CAAC;MACH;MACAnD,WAAW,CAACoB,MAAM,EAAEI,OAAO,CAAC;MAC5BvB,aAAa,CAACmB,MAAM,CAAC;MACrB,MAAM+B,CAAC;IACT;EACF;;EAEA;EACA,MAAMrB,qBAAqB,GAAG,MAAAA,CAAA,KAA2B;IACvD,IACElB,SAAS,IACNuB,MAAM,CAACG,QAAQ,CAACsB,IAAI,KAAKhD,SAAS,IAClCuB,MAAM,CAACG,QAAQ,CAACU,QAAQ,KAAKpC,SAAS,EACzC;MACAV,SAAS,CAACkB,MAAM,EAAE,CAAC,CAAC,EAAEI,OAAO,CAAC;MAC9BrB,WAAW,CAACiB,MAAM,EAAE;QAAE8B,MAAM,EAAErC;MAAc,CAAC,CAAC;MAC9C,MAAMoB,EAAE,CAACrB,SAAS,CAAC;MACnB;IACF;IAEA,MAAM6C,KAAK,GAAGlE,mBAAmB,CAAC,CAAE;IACpC,MAAMmE,YAAY,GAAGpE,0BAA0B,CAAC,CAAC;IACjD,MAAM4D,MAAM,GAAGnD,WAAW,CAACqB,MAAM,CAAC,CAAC8B,MAAM,IAAIf,MAAM,CAACG,QAAQ,CAACuB,QAAQ,CAAC,CAAC;IACvE3D,SAAS,CAACkB,MAAM,EAAE,CAAC,CAAC,EAAEI,OAAO,CAAC;IAC9BrB,WAAW,CAACiB,MAAM,EAAE;MAAEsC,YAAY;MAAED,KAAK;MAAEP;IAAO,CAAC,CAAC;;IAEpD;IACA,MAAMY,WAAW,GAAG3C,YAAY,KAAK,MAAM,GACvCD,YAAY,GACZ,kBAAkBA,YAAY,EAAE;IAEpCiB,MAAM,CAACG,QAAQ,CAACC,MAAM,CAAC,GAAGjB,UAAU,CACjCyC,sBAAsB,IAAK,IAAIC,eAAe,CAAC;MAChDxD,SAAS;MACTyD,aAAa,EAAE,MAAM;MACrBR,KAAK;MACL/C,YAAY;MACZwD,cAAc,EAAE,MAAM9E,0BAA0B,CAACsE,YAAY,CAAC;MAC9DS,qBAAqB,EAAE,MAAM;MAC7BC,KAAK,EAAEN;IACT,CAAC,CAAC,EAAE,CAAC;;IAEL;IACA,MAAM1D,KAAK,CAAC,IAAI,CAAC;IACjB,MAAM,IAAIoC,KAAK,CAAC,oBAAoB,CAAC;EACvC,CAAC;EAYD,OAAOd,QAAQ;AACjB","ignoreList":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2024 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export function delay(ms) {
|
|
18
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=delay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delay.js","names":["delay","ms","Promise","resolve","setTimeout"],"sources":["delay.ts"],"sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport function delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO,SAASA,KAAKA,CAACC,EAAU,EAAiB;EAC/C,OAAO,IAAIC,OAAO,CAACC,OAAO,IAAIC,UAAU,CAACD,OAAO,EAAEF,EAAE,CAAC,CAAC;AACxD","ignoreList":[]}
|
|
@@ -23,15 +23,9 @@ const hoistedMocks = vi.hoisted(() => {
|
|
|
23
23
|
makeTokenAndSaveRefresh: vi.fn()
|
|
24
24
|
};
|
|
25
25
|
});
|
|
26
|
-
vi.mock("delay",
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
default: vi.fn((ms, opts) => {
|
|
30
|
-
// speed up the tests
|
|
31
|
-
return original.default(ms / 100, opts);
|
|
32
|
-
})
|
|
33
|
-
};
|
|
34
|
-
});
|
|
26
|
+
vi.mock("./delay.js", () => ({
|
|
27
|
+
delay: vi.fn(ms => new Promise(resolve => setTimeout(resolve, ms / 100)))
|
|
28
|
+
}));
|
|
35
29
|
vi.mock("./common.js", async importOriginal => {
|
|
36
30
|
const original = await importOriginal();
|
|
37
31
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publicOauth.test.js","names":["afterAll","afterEach","beforeAll","beforeEach","describe","expect","it","vi","commonJs","createPublicOauthClient","hoistedMocks","hoisted","makeTokenAndSaveRefresh","fn","mock","importOriginal","original","default","ms","opts","common","args","result","readLocal","spyOn","readSession","DEFAULT_CUR_URL","URL","fetchFn","mockWindow","location","toString","assign","href","pathname","history","replaceState","mockLocalStorage","setItem","getItem","removeItem","mockSessionStorage","restoreAllMocks","mockRestore","clearAllMocks","mockReset","stubGlobal","unstubAllGlobals","BASE_CLIENT_ARGS","clientId","foundryUrl","redirectUrl","fullLoginUrl","setupWindowLocation","currentUrl","setupLocalState","initialLocalState","mocked","mockImplementation","client","clientArgs","setupClient","clientArgs_","refreshTokenMarker","useHistory","loginPage","postLoginPage","scopes","ctxPath","undefined","expectRedirectToMultipass","tokenPromise","rejects","toThrowError","Error","toHaveBeenCalledOnce","url","calls","origin","toEqual","Object","fromEntries","searchParams","entries","objectContaining","client_id","code_challenge","any","String","redirect_uri","response_type","code_challenge_method","scope","sort","join","state","refresh_token","requestedScopes","mockImplementationOnce","access_token","expires_at","Date","now","expires_in","resolves","toBeCalledTimes","each","name","should","redirectToLoginPage","toHaveBeenCalledWith","token_endpoint_auth_method","createAuthorizationServer","Function","anything","localStorage","sessionStorage","codeVerifier","oldUrl","initialState","ACCESS_TOKEN","Math","random","substring","keys","length","toBeUndefined","toBeCalledWith","JSON","stringify","window","toHaveBeenCalledTimes","env","TARGET","tokenStorage","lastArg","toBe","get","not","toContain","mockClear","toHaveBeenCalled"],"sources":["publicOauth.test.ts"],"sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* eslint-disable @typescript-eslint/consistent-type-imports */\nimport {\n afterAll,\n afterEach,\n beforeAll,\n beforeEach,\n describe,\n expect,\n it,\n vi,\n} from \"vitest\";\n\nimport * as commonJs from \"./common.js\";\nimport { LocalStorageState, SessionStorageState } from \"./common.js\";\nimport { createPublicOauthClient } from \"./createPublicOauthClient.js\";\nimport { PublicOauthClient } from \"./PublicOauthClient.js\";\n\nconst hoistedMocks = vi.hoisted(() => {\n return {\n makeTokenAndSaveRefresh: vi.fn(),\n };\n});\n\nvi.mock(\"delay\", async (importOriginal) => {\n const original = await importOriginal<typeof import(\"delay\")>();\n return {\n default: vi.fn<typeof original.default>((ms, opts) => {\n // speed up the tests\n return original.default(ms / 100, opts);\n }),\n };\n});\n\nvi.mock(\"./common.js\", async (importOriginal) => {\n const original = await importOriginal<typeof import(\"./common.js\")>();\n return {\n ...original,\n common: vi.fn<typeof commonJs.common>((...args) => {\n const result = original.common(...args);\n return {\n ...result,\n makeTokenAndSaveRefresh: hoistedMocks.makeTokenAndSaveRefresh,\n };\n }),\n readLocal: vi.spyOn(original, \"readLocal\"),\n readSession: vi.spyOn(original, \"readSession\"),\n // vi.fn(original.readLocal),\n };\n});\n\nvi.mock(\"oauth4webapi\");\n\ninterface BaseClientArgs {\n clientId: string;\n foundryUrl: string;\n redirectUrl: string;\n fetchFn?: typeof globalThis.fetch;\n}\n\ninterface ClientArgs extends BaseClientArgs {\n useHistory?: boolean;\n loginPage?: string;\n postLoginPage?: string;\n scopes?: string[];\n ctxPath?: string;\n refreshTokenMarker?: string;\n}\n\ndescribe(createPublicOauthClient, () => {\n const DEFAULT_CUR_URL = new URL(\"https://fauxurl\");\n const fetchFn = vi.fn<typeof fetch>();\n\n const mockWindow = {\n location: {\n toString: vi.fn(() => DEFAULT_CUR_URL),\n assign: vi.fn(),\n href: DEFAULT_CUR_URL.href,\n pathname: DEFAULT_CUR_URL.pathname,\n },\n history: {\n replaceState: vi.fn<typeof window.history.replaceState>(),\n },\n };\n\n const mockLocalStorage = {\n setItem: vi.fn(),\n getItem: vi.fn(),\n removeItem: vi.fn(),\n };\n\n const mockSessionStorage = {\n setItem: vi.fn(),\n getItem: vi.fn(),\n removeItem: vi.fn(),\n };\n\n beforeEach((context) => {\n vi.restoreAllMocks();\n fetchFn.mockRestore();\n });\n\n afterEach((context) => {\n vi.clearAllMocks();\n fetchFn.mockReset();\n });\n\n beforeAll(() => {\n vi.stubGlobal(\"window\", mockWindow);\n vi.stubGlobal(\"localStorage\", mockLocalStorage);\n vi.stubGlobal(\"sessionStorage\", mockSessionStorage);\n });\n\n afterAll(() => {\n vi.unstubAllGlobals();\n });\n\n const BASE_CLIENT_ARGS: BaseClientArgs = {\n clientId: \"this-would-be-client-id\",\n foundryUrl: \"https://a.foundry.url.local\",\n redirectUrl: \"https://my.redirect.url.local\",\n fetchFn,\n };\n\n const fullLoginUrl = new URL(\"/loginPage\", DEFAULT_CUR_URL);\n\n function setupWindowLocation(currentUrl: string) {\n mockWindow.location.href = new URL(currentUrl).href;\n mockWindow.location.pathname = new URL(currentUrl).pathname;\n }\n\n function setupLocalState(initialLocalState: LocalStorageState) {\n vi.mocked(commonJs.readLocal).mockImplementation(() => initialLocalState);\n }\n\n let client: PublicOauthClient;\n let clientArgs: ClientArgs;\n function setupClient(clientArgs_: ClientArgs) {\n clientArgs = clientArgs_;\n if (clientArgs.refreshTokenMarker) {\n client = createPublicOauthClient(\n clientArgs.clientId,\n clientArgs.foundryUrl,\n clientArgs.redirectUrl,\n clientArgs,\n );\n } else {\n client = createPublicOauthClient(\n clientArgs.clientId,\n clientArgs.foundryUrl,\n clientArgs.redirectUrl,\n clientArgs.useHistory,\n clientArgs.loginPage,\n clientArgs.postLoginPage,\n clientArgs.scopes,\n clientArgs.fetchFn,\n clientArgs.ctxPath,\n );\n }\n }\n beforeEach((context) => {\n // prevents mistakes like forgetting to initialize the client with an\n // old value around\n client = undefined!;\n clientArgs = undefined!;\n });\n\n async function expectRedirectToMultipass(\n tokenPromise: Promise<string>,\n ) {\n // we assume window.location.assign will take you away therefore we\n // also have to expect in this scenario that the thrown error happens\n await expect(tokenPromise)\n .rejects.toThrowError(new Error(\"Unable to redirect\"));\n\n expect(mockWindow.location.assign).toHaveBeenCalledOnce();\n\n const url = new URL(\n mockWindow.location.assign.mock.calls[0][0],\n );\n expect(url.origin).toEqual(clientArgs.foundryUrl);\n expect(url.pathname).toEqual(\"/multipass/api/oauth2/authorize\");\n expect(Object.fromEntries(url.searchParams.entries())).toEqual(\n expect.objectContaining({\n client_id: clientArgs.clientId,\n code_challenge: expect.any(String),\n redirect_uri: clientArgs.redirectUrl,\n response_type: \"code\",\n code_challenge_method: \"S256\",\n scope: [\n \"offline_access\",\n ...(clientArgs.scopes\n ?? [\n \"api:read-data\",\n \"api:write-data\",\n \"api:use-ontologies-read\",\n \"api:use-ontologies-write\",\n ].sort()),\n ].join(\" \"),\n state: expect.any(String),\n }),\n );\n }\n\n describe(\"refresh token marker and scopes\", () => {\n beforeEach(() => {\n setupWindowLocation(\"https://foundry.local\");\n });\n\n // Backwards compatibility from when we didn't store scopes\n it(\"should not allow refresh if scopes in local storage is undefined\", async () => {\n setupLocalState({\n refresh_token: \"refreshToken\",\n });\n\n setupClient({\n ...BASE_CLIENT_ARGS,\n // Testing with default scopes\n });\n\n await expectRedirectToMultipass(\n client(),\n );\n });\n\n it(\"should not allow refresh if requested scopes are different\", async () => {\n setupLocalState({\n refresh_token: \"refreshToken\",\n requestedScopes: \"api:read-data\",\n });\n\n setupClient({\n ...BASE_CLIENT_ARGS,\n scopes: [\"api:write-data\"],\n });\n\n await expectRedirectToMultipass(\n client(),\n );\n });\n\n it(\"should not allow refresh if the refresh markers do not match\", async () => {\n setupLocalState({\n refresh_token: \"refreshToken\",\n refreshTokenMarker: \"not-the-right-marker\",\n requestedScopes: \"api:read-data\",\n });\n\n setupClient({\n ...BASE_CLIENT_ARGS,\n refreshTokenMarker: \"marker\",\n scopes: [\"api:read-data\"],\n });\n\n await expectRedirectToMultipass(\n client(),\n );\n });\n\n it(\"should try to refresh if refresh markers match and requested scopes are equal\", async () => {\n setupLocalState({\n refresh_token: \"refreshToken\",\n refreshTokenMarker: \"marker\",\n requestedScopes: \"api:admin-read api:datasets-read\",\n });\n\n setupClient({\n ...BASE_CLIENT_ARGS,\n refreshTokenMarker: \"marker\",\n scopes: [\"api:datasets-read\", \"api:admin-read\"],\n });\n\n hoistedMocks.makeTokenAndSaveRefresh.mockImplementationOnce(\n () => ({\n access_token: \"some token\",\n expires_at: Date.now(),\n expires_in: 10000,\n }),\n );\n\n const tokenPromise = client();\n\n await expect(tokenPromise).resolves.toEqual(\"some token\");\n\n expect(hoistedMocks.makeTokenAndSaveRefresh).toBeCalledTimes(1);\n });\n });\n\n describe.each<{\n name: string;\n currentUrl: URL;\n clientArgs: BaseClientArgs & {\n useHistory?: boolean;\n loginPage?: string;\n postLoginPage?: string;\n scopes?: string[];\n ctxPath?: string;\n };\n should: {\n redirectToLoginPage: boolean;\n };\n }>([\n {\n name: \"Basic Usage\",\n currentUrl: DEFAULT_CUR_URL,\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n },\n should: {\n redirectToLoginPage: false,\n },\n },\n {\n name: \"Base w/ full loginPage and curUrl is root\",\n currentUrl: DEFAULT_CUR_URL,\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n loginPage: fullLoginUrl.toString(),\n },\n should: {\n redirectToLoginPage: true,\n },\n },\n {\n name: \"Base w/ full loginPage and curUrl is login page\",\n currentUrl: fullLoginUrl,\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n loginPage: fullLoginUrl.toString(),\n },\n should: {\n redirectToLoginPage: false,\n },\n },\n {\n name: \"Base w/ short loginPage and curUrl is root\",\n currentUrl: DEFAULT_CUR_URL,\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n loginPage: \"/loginPage\",\n },\n should: {\n redirectToLoginPage: true,\n },\n },\n {\n name: \"Base w/ short loginPage and curUrl is loginPage\",\n currentUrl: new URL(\"/loginPage\", DEFAULT_CUR_URL),\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n loginPage: \"/loginPage\",\n },\n should: {\n redirectToLoginPage: false,\n },\n },\n ])(\"$name\", ({ clientArgs, currentUrl, should }) => {\n beforeEach(() => {\n setupClient(clientArgs);\n setupWindowLocation(currentUrl.toString());\n });\n\n it(\"calls common with expected values\", () => {\n expect(vi.mocked(commonJs.common)).toHaveBeenCalledWith(\n expect.objectContaining({\n client_id: clientArgs.clientId,\n token_endpoint_auth_method: \"none\",\n }),\n commonJs.createAuthorizationServer(\n clientArgs.ctxPath ?? \"/multipass\",\n clientArgs.foundryUrl,\n ),\n expect.any(Function),\n expect.anything(),\n expect.any(Function),\n undefined,\n (clientArgs.scopes\n ?? [\n \"api:read-data\",\n \"api:write-data\",\n \"api:use-ontologies-read\",\n \"api:use-ontologies-write\",\n ]).sort().join(\" \"),\n undefined,\n );\n });\n\n describe.each<\n { localStorage: LocalStorageState; sessionStorage: SessionStorageState }\n >([\n {\n localStorage: {\n refresh_token: \"a-refresh-token\",\n requestedScopes: (clientArgs.scopes\n ?? [\n \"api:read-data\",\n \"api:write-data\",\n \"api:use-ontologies-read\",\n \"api:use-ontologies-write\",\n ]).sort().join(\" \"),\n },\n sessionStorage: {},\n },\n {\n localStorage: {},\n sessionStorage: {\n codeVerifier: \"hi\",\n state: \"mom\",\n oldUrl: \"https://someoldurl.local\",\n },\n },\n { localStorage: {}, sessionStorage: {} },\n ])(\"Initial Local State: %s\", (initialState) => {\n const ACCESS_TOKEN = (Math.random() + 1).toString(36).substring(7);\n\n beforeEach(() => {\n vi.mocked(commonJs.readLocal).mockImplementation(() =>\n initialState.localStorage\n );\n\n vi.mocked(commonJs.readSession).mockImplementation(() =>\n initialState.sessionStorage\n );\n\n hoistedMocks.makeTokenAndSaveRefresh.mockImplementation(\n () => ({\n access_token: ACCESS_TOKEN,\n expires_at: Date.now(),\n expires_in: 10000,\n }),\n );\n });\n\n if (\n Object.keys(initialState.localStorage).length === 0\n && Object.keys(initialState.sessionStorage).length === 0\n ) {\n if (should.redirectToLoginPage) {\n it(\"redirects to login page\", async () => {\n const tokenPromise = client!();\n expect(vi.mocked(commonJs.common)).toBeCalledTimes(1);\n\n if (should.redirectToLoginPage) {\n // expect save local\n await expect(tokenPromise).resolves.toBeUndefined();\n expect(mockSessionStorage.setItem).toBeCalledWith(\n `@osdk/oauth : refresh : ${clientArgs.clientId}`,\n JSON.stringify({ oldUrl: window.location.toString() }),\n );\n expect(mockWindow.history.replaceState).toHaveBeenCalledWith(\n {},\n \"\",\n clientArgs.loginPage,\n );\n return;\n }\n });\n } else {\n it(\"redirects to multipass\", async () => {\n const tokenPromise = client!();\n expect(vi.mocked(commonJs.common)).toBeCalledTimes(1);\n\n if (should.redirectToLoginPage) {\n // expect save local\n await expect(tokenPromise).resolves.toBeUndefined();\n expect(mockSessionStorage.setItem).toBeCalledWith(\n `@osdk/oauth : refresh : ${clientArgs.clientId}`,\n JSON.stringify({ oldUrl: window.location.toString() }),\n );\n\n expect(mockWindow.history.replaceState).toHaveBeenCalledWith(\n {},\n \"\",\n clientArgs.loginPage,\n );\n return;\n }\n\n await expectRedirectToMultipass(\n tokenPromise,\n );\n });\n }\n }\n\n if (initialState.sessionStorage.codeVerifier) {\n it(\"tries to auth with return results\", async () => {\n await expect(client()).resolves.toEqual(ACCESS_TOKEN);\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledTimes(\n 1,\n );\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledWith(\n undefined, // this is only because we didn't mock out the internals\n \"signIn\",\n );\n\n expect(mockWindow.history.replaceState).toHaveBeenCalledTimes(1);\n expect(mockWindow.history.replaceState).toBeCalledWith(\n expect.anything(),\n expect.anything(),\n initialState.sessionStorage.oldUrl,\n );\n });\n }\n\n if (initialState.localStorage.refresh_token) {\n it(\"refreshes\", async () => {\n await expect(client()).resolves.toEqual(ACCESS_TOKEN);\n\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledTimes(\n 1,\n );\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledWith(\n undefined, // this is only because we didn't mock out the internals\n \"refresh\",\n );\n });\n }\n });\n });\n\n describe(\"tokenStorage option\", () => {\n beforeEach(() => {\n setupWindowLocation(\"https://foundry.local\");\n setupLocalState({});\n vi.mocked(commonJs.readSession).mockImplementation(() => ({}));\n // getStorage() checks process.env.TARGET to determine if we're in a browser\n vi.stubGlobal(\"process\", { env: { TARGET: \"browser\" } });\n });\n\n afterEach(() => {\n vi.unstubAllGlobals();\n // Re-stub the globals that the outer describe needs\n vi.stubGlobal(\"window\", mockWindow);\n vi.stubGlobal(\"localStorage\", mockLocalStorage);\n vi.stubGlobal(\"sessionStorage\", mockSessionStorage);\n });\n\n it(\"should pass localStorage to common when tokenStorage is 'localStorage'\", () => {\n createPublicOauthClient(\n BASE_CLIENT_ARGS.clientId,\n BASE_CLIENT_ARGS.foundryUrl,\n BASE_CLIENT_ARGS.redirectUrl,\n { tokenStorage: \"localStorage\" },\n );\n\n // common() is called with 8 args, the last one being the storage\n const lastArg = vi.mocked(commonJs.common).mock.calls[0][7];\n expect(lastArg).toBe(mockLocalStorage);\n });\n\n it(\"should pass sessionStorage to common when tokenStorage is 'sessionStorage'\", () => {\n createPublicOauthClient(\n BASE_CLIENT_ARGS.clientId,\n BASE_CLIENT_ARGS.foundryUrl,\n BASE_CLIENT_ARGS.redirectUrl,\n { tokenStorage: \"sessionStorage\" },\n );\n\n const lastArg = vi.mocked(commonJs.common).mock.calls[0][7];\n expect(lastArg).toBe(mockSessionStorage);\n });\n\n it(\"should pass undefined to common when tokenStorage is 'none'\", () => {\n createPublicOauthClient(\n BASE_CLIENT_ARGS.clientId,\n BASE_CLIENT_ARGS.foundryUrl,\n BASE_CLIENT_ARGS.redirectUrl,\n { tokenStorage: \"none\" },\n );\n\n const lastArg = vi.mocked(commonJs.common).mock.calls[0][7];\n expect(lastArg).toBeUndefined();\n });\n\n it(\"should not include offline_access scope when tokenStorage is 'none'\", async () => {\n const client = createPublicOauthClient(\n BASE_CLIENT_ARGS.clientId,\n BASE_CLIENT_ARGS.foundryUrl,\n BASE_CLIENT_ARGS.redirectUrl,\n { tokenStorage: \"none\" },\n );\n\n // Trigger the auth flow - this should redirect to multipass\n await expect(client()).rejects.toThrowError(\"Unable to redirect\");\n\n expect(mockWindow.location.assign).toHaveBeenCalledOnce();\n\n const url = new URL(mockWindow.location.assign.mock.calls[0][0]);\n const scope = url.searchParams.get(\"scope\");\n\n // Should NOT include offline_access\n expect(scope).not.toContain(\"offline_access\");\n // Should still include the regular scopes\n expect(scope).toContain(\"api:read-data\");\n });\n\n it(\"should pass localStorage to common when tokenStorage is not provided\", () => {\n createPublicOauthClient(\n BASE_CLIENT_ARGS.clientId,\n BASE_CLIENT_ARGS.foundryUrl,\n BASE_CLIENT_ARGS.redirectUrl,\n );\n const lastArg = vi.mocked(commonJs.common).mock.calls[0][7];\n expect(lastArg).toBe(mockLocalStorage);\n });\n\n it(\"should include offline_access scope when tokenStorage is 'localStorage'\", async () => {\n const client = createPublicOauthClient(\n BASE_CLIENT_ARGS.clientId,\n BASE_CLIENT_ARGS.foundryUrl,\n BASE_CLIENT_ARGS.redirectUrl,\n { tokenStorage: \"localStorage\" },\n );\n\n await expect(client()).rejects.toThrowError(\"Unable to redirect\");\n\n const url = new URL(mockWindow.location.assign.mock.calls[0][0]);\n const scope = url.searchParams.get(\"scope\");\n\n expect(scope).toContain(\"offline_access\");\n });\n\n it(\"should include offline_access scope when tokenStorage is 'sessionStorage'\", async () => {\n const client = createPublicOauthClient(\n BASE_CLIENT_ARGS.clientId,\n BASE_CLIENT_ARGS.foundryUrl,\n BASE_CLIENT_ARGS.redirectUrl,\n { tokenStorage: \"sessionStorage\" },\n );\n\n await expect(client()).rejects.toThrowError(\"Unable to redirect\");\n\n const url = new URL(mockWindow.location.assign.mock.calls[0][0]);\n const scope = url.searchParams.get(\"scope\");\n\n expect(scope).toContain(\"offline_access\");\n });\n\n it(\"should not attempt to read from storage when tokenStorage is 'none'\", async () => {\n vi.mocked(commonJs.readLocal).mockClear();\n\n const client = createPublicOauthClient(\n BASE_CLIENT_ARGS.clientId,\n BASE_CLIENT_ARGS.foundryUrl,\n BASE_CLIENT_ARGS.redirectUrl,\n { tokenStorage: \"none\" },\n );\n\n await expect(client()).rejects.toThrowError(\"Unable to redirect\");\n\n expect(vi.mocked(commonJs.readLocal)).not.toHaveBeenCalled();\n });\n });\n});\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SACEA,QAAQ,EACRC,SAAS,EACTC,SAAS,EACTC,UAAU,EACVC,QAAQ,EACRC,MAAM,EACNC,EAAE,EACFC,EAAE,QACG,QAAQ;AAEf,OAAO,KAAKC,QAAQ,MAAM,aAAa;AAEvC,SAASC,uBAAuB,QAAQ,8BAA8B;AAGtE,MAAMC,YAAY,GAAGH,EAAE,CAACI,OAAO,CAAC,MAAM;EACpC,OAAO;IACLC,uBAAuB,EAAEL,EAAE,CAACM,EAAE,CAAC;EACjC,CAAC;AACH,CAAC,CAAC;AAEFN,EAAE,CAACO,IAAI,CAAC,OAAO,EAAE,MAAOC,cAAc,IAAK;EACzC,MAAMC,QAAQ,GAAG,MAAMD,cAAc,CAAyB,CAAC;EAC/D,OAAO;IACLE,OAAO,EAAEV,EAAE,CAACM,EAAE,CAA0B,CAACK,EAAE,EAAEC,IAAI,KAAK;MACpD;MACA,OAAOH,QAAQ,CAACC,OAAO,CAACC,EAAE,GAAG,GAAG,EAAEC,IAAI,CAAC;IACzC,CAAC;EACH,CAAC;AACH,CAAC,CAAC;AAEFZ,EAAE,CAACO,IAAI,CAAC,aAAa,EAAE,MAAOC,cAAc,IAAK;EAC/C,MAAMC,QAAQ,GAAG,MAAMD,cAAc,CAA+B,CAAC;EACrE,OAAO;IACL,GAAGC,QAAQ;IACXI,MAAM,EAAEb,EAAE,CAACM,EAAE,CAAyB,CAAC,GAAGQ,IAAI,KAAK;MACjD,MAAMC,MAAM,GAAGN,QAAQ,CAACI,MAAM,CAAC,GAAGC,IAAI,CAAC;MACvC,OAAO;QACL,GAAGC,MAAM;QACTV,uBAAuB,EAAEF,YAAY,CAACE;MACxC,CAAC;IACH,CAAC,CAAC;IACFW,SAAS,EAAEhB,EAAE,CAACiB,KAAK,CAACR,QAAQ,EAAE,WAAW,CAAC;IAC1CS,WAAW,EAAElB,EAAE,CAACiB,KAAK,CAACR,QAAQ,EAAE,aAAa;IAC7C;EACF,CAAC;AACH,CAAC,CAAC;AAEFT,EAAE,CAACO,IAAI,CAAC,cAAc,CAAC;AAkBvBV,QAAQ,CAACK,uBAAuB,EAAE,MAAM;EACtC,MAAMiB,eAAe,GAAG,IAAIC,GAAG,CAAC,iBAAiB,CAAC;EAClD,MAAMC,OAAO,GAAGrB,EAAE,CAACM,EAAE,CAAe,CAAC;EAErC,MAAMgB,UAAU,GAAG;IACjBC,QAAQ,EAAE;MACRC,QAAQ,EAAExB,EAAE,CAACM,EAAE,CAAC,MAAMa,eAAe,CAAC;MACtCM,MAAM,EAAEzB,EAAE,CAACM,EAAE,CAAC,CAAC;MACfoB,IAAI,EAAEP,eAAe,CAACO,IAAI;MAC1BC,QAAQ,EAAER,eAAe,CAACQ;IAC5B,CAAC;IACDC,OAAO,EAAE;MACPC,YAAY,EAAE7B,EAAE,CAACM,EAAE,CAAqC;IAC1D;EACF,CAAC;EAED,MAAMwB,gBAAgB,GAAG;IACvBC,OAAO,EAAE/B,EAAE,CAACM,EAAE,CAAC,CAAC;IAChB0B,OAAO,EAAEhC,EAAE,CAACM,EAAE,CAAC,CAAC;IAChB2B,UAAU,EAAEjC,EAAE,CAACM,EAAE,CAAC;EACpB,CAAC;EAED,MAAM4B,kBAAkB,GAAG;IACzBH,OAAO,EAAE/B,EAAE,CAACM,EAAE,CAAC,CAAC;IAChB0B,OAAO,EAAEhC,EAAE,CAACM,EAAE,CAAC,CAAC;IAChB2B,UAAU,EAAEjC,EAAE,CAACM,EAAE,CAAC;EACpB,CAAC;EAEDV,UAAU,CAAC,MAAa;IACtBI,EAAE,CAACmC,eAAe,CAAC,CAAC;IACpBd,OAAO,CAACe,WAAW,CAAC,CAAC;EACvB,CAAC,CAAC;EAEF1C,SAAS,CAAC,MAAa;IACrBM,EAAE,CAACqC,aAAa,CAAC,CAAC;IAClBhB,OAAO,CAACiB,SAAS,CAAC,CAAC;EACrB,CAAC,CAAC;EAEF3C,SAAS,CAAC,MAAM;IACdK,EAAE,CAACuC,UAAU,CAAC,QAAQ,EAAEjB,UAAU,CAAC;IACnCtB,EAAE,CAACuC,UAAU,CAAC,cAAc,EAAET,gBAAgB,CAAC;IAC/C9B,EAAE,CAACuC,UAAU,CAAC,gBAAgB,EAAEL,kBAAkB,CAAC;EACrD,CAAC,CAAC;EAEFzC,QAAQ,CAAC,MAAM;IACbO,EAAE,CAACwC,gBAAgB,CAAC,CAAC;EACvB,CAAC,CAAC;EAEF,MAAMC,gBAAgC,GAAG;IACvCC,QAAQ,EAAE,yBAAyB;IACnCC,UAAU,EAAE,6BAA6B;IACzCC,WAAW,EAAE,+BAA+B;IAC5CvB;EACF,CAAC;EAED,MAAMwB,YAAY,GAAG,IAAIzB,GAAG,CAAC,YAAY,EAAED,eAAe,CAAC;EAE3D,SAAS2B,mBAAmBA,CAACC,UAAkB,EAAE;IAC/CzB,UAAU,CAACC,QAAQ,CAACG,IAAI,GAAG,IAAIN,GAAG,CAAC2B,UAAU,CAAC,CAACrB,IAAI;IACnDJ,UAAU,CAACC,QAAQ,CAACI,QAAQ,GAAG,IAAIP,GAAG,CAAC2B,UAAU,CAAC,CAACpB,QAAQ;EAC7D;EAEA,SAASqB,eAAeA,CAACC,iBAAoC,EAAE;IAC7DjD,EAAE,CAACkD,MAAM,CAACjD,QAAQ,CAACe,SAAS,CAAC,CAACmC,kBAAkB,CAAC,MAAMF,iBAAiB,CAAC;EAC3E;EAEA,IAAIG,MAAyB;EAC7B,IAAIC,UAAsB;EAC1B,SAASC,WAAWA,CAACC,WAAuB,EAAE;IAC5CF,UAAU,GAAGE,WAAW;IACxB,IAAIF,UAAU,CAACG,kBAAkB,EAAE;MACjCJ,MAAM,GAAGlD,uBAAuB,CAC9BmD,UAAU,CAACX,QAAQ,EACnBW,UAAU,CAACV,UAAU,EACrBU,UAAU,CAACT,WAAW,EACtBS,UACF,CAAC;IACH,CAAC,MAAM;MACLD,MAAM,GAAGlD,uBAAuB,CAC9BmD,UAAU,CAACX,QAAQ,EACnBW,UAAU,CAACV,UAAU,EACrBU,UAAU,CAACT,WAAW,EACtBS,UAAU,CAACI,UAAU,EACrBJ,UAAU,CAACK,SAAS,EACpBL,UAAU,CAACM,aAAa,EACxBN,UAAU,CAACO,MAAM,EACjBP,UAAU,CAAChC,OAAO,EAClBgC,UAAU,CAACQ,OACb,CAAC;IACH;EACF;EACAjE,UAAU,CAAC,MAAa;IACtB;IACA;IACAwD,MAAM,GAAGU,SAAU;IACnBT,UAAU,GAAGS,SAAU;EACzB,CAAC,CAAC;EAEF,eAAeC,yBAAyBA,CACtCC,YAA6B,EAC7B;IACA;IACA;IACA,MAAMlE,MAAM,CAACkE,YAAY,CAAC,CACvBC,OAAO,CAACC,YAAY,CAAC,IAAIC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAExDrE,MAAM,CAACwB,UAAU,CAACC,QAAQ,CAACE,MAAM,CAAC,CAAC2C,oBAAoB,CAAC,CAAC;IAEzD,MAAMC,GAAG,GAAG,IAAIjD,GAAG,CACjBE,UAAU,CAACC,QAAQ,CAACE,MAAM,CAAClB,IAAI,CAAC+D,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAC5C,CAAC;IACDxE,MAAM,CAACuE,GAAG,CAACE,MAAM,CAAC,CAACC,OAAO,CAACnB,UAAU,CAACV,UAAU,CAAC;IACjD7C,MAAM,CAACuE,GAAG,CAAC1C,QAAQ,CAAC,CAAC6C,OAAO,CAAC,iCAAiC,CAAC;IAC/D1E,MAAM,CAAC2E,MAAM,CAACC,WAAW,CAACL,GAAG,CAACM,YAAY,CAACC,OAAO,CAAC,CAAC,CAAC,CAAC,CAACJ,OAAO,CAC5D1E,MAAM,CAAC+E,gBAAgB,CAAC;MACtBC,SAAS,EAAEzB,UAAU,CAACX,QAAQ;MAC9BqC,cAAc,EAAEjF,MAAM,CAACkF,GAAG,CAACC,MAAM,CAAC;MAClCC,YAAY,EAAE7B,UAAU,CAACT,WAAW;MACpCuC,aAAa,EAAE,MAAM;MACrBC,qBAAqB,EAAE,MAAM;MAC7BC,KAAK,EAAE,CACL,gBAAgB,EAChB,IAAIhC,UAAU,CAACO,MAAM,IAChB,CACD,eAAe,EACf,gBAAgB,EAChB,yBAAyB,EACzB,0BAA0B,CAC3B,CAAC0B,IAAI,CAAC,CAAC,CAAC,CACZ,CAACC,IAAI,CAAC,GAAG,CAAC;MACXC,KAAK,EAAE1F,MAAM,CAACkF,GAAG,CAACC,MAAM;IAC1B,CAAC,CACH,CAAC;EACH;EAEApF,QAAQ,CAAC,iCAAiC,EAAE,MAAM;IAChDD,UAAU,CAAC,MAAM;MACfkD,mBAAmB,CAAC,uBAAuB,CAAC;IAC9C,CAAC,CAAC;;IAEF;IACA/C,EAAE,CAAC,kEAAkE,EAAE,YAAY;MACjFiD,eAAe,CAAC;QACdyC,aAAa,EAAE;MACjB,CAAC,CAAC;MAEFnC,WAAW,CAAC;QACV,GAAGb;QACH;MACF,CAAC,CAAC;MAEF,MAAMsB,yBAAyB,CAC7BX,MAAM,CAAC,CACT,CAAC;IACH,CAAC,CAAC;IAEFrD,EAAE,CAAC,4DAA4D,EAAE,YAAY;MAC3EiD,eAAe,CAAC;QACdyC,aAAa,EAAE,cAAc;QAC7BC,eAAe,EAAE;MACnB,CAAC,CAAC;MAEFpC,WAAW,CAAC;QACV,GAAGb,gBAAgB;QACnBmB,MAAM,EAAE,CAAC,gBAAgB;MAC3B,CAAC,CAAC;MAEF,MAAMG,yBAAyB,CAC7BX,MAAM,CAAC,CACT,CAAC;IACH,CAAC,CAAC;IAEFrD,EAAE,CAAC,8DAA8D,EAAE,YAAY;MAC7EiD,eAAe,CAAC;QACdyC,aAAa,EAAE,cAAc;QAC7BjC,kBAAkB,EAAE,sBAAsB;QAC1CkC,eAAe,EAAE;MACnB,CAAC,CAAC;MAEFpC,WAAW,CAAC;QACV,GAAGb,gBAAgB;QACnBe,kBAAkB,EAAE,QAAQ;QAC5BI,MAAM,EAAE,CAAC,eAAe;MAC1B,CAAC,CAAC;MAEF,MAAMG,yBAAyB,CAC7BX,MAAM,CAAC,CACT,CAAC;IACH,CAAC,CAAC;IAEFrD,EAAE,CAAC,+EAA+E,EAAE,YAAY;MAC9FiD,eAAe,CAAC;QACdyC,aAAa,EAAE,cAAc;QAC7BjC,kBAAkB,EAAE,QAAQ;QAC5BkC,eAAe,EAAE;MACnB,CAAC,CAAC;MAEFpC,WAAW,CAAC;QACV,GAAGb,gBAAgB;QACnBe,kBAAkB,EAAE,QAAQ;QAC5BI,MAAM,EAAE,CAAC,mBAAmB,EAAE,gBAAgB;MAChD,CAAC,CAAC;MAEFzD,YAAY,CAACE,uBAAuB,CAACsF,sBAAsB,CACzD,OAAO;QACLC,YAAY,EAAE,YAAY;QAC1BC,UAAU,EAAEC,IAAI,CAACC,GAAG,CAAC,CAAC;QACtBC,UAAU,EAAE;MACd,CAAC,CACH,CAAC;MAED,MAAMhC,YAAY,GAAGZ,MAAM,CAAC,CAAC;MAE7B,MAAMtD,MAAM,CAACkE,YAAY,CAAC,CAACiC,QAAQ,CAACzB,OAAO,CAAC,YAAY,CAAC;MAEzD1E,MAAM,CAACK,YAAY,CAACE,uBAAuB,CAAC,CAAC6F,eAAe,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFrG,QAAQ,CAACsG,IAAI,CAaV,CACD;IACEC,IAAI,EAAE,aAAa;IACnBrD,UAAU,EAAE5B,eAAe;IAC3BkC,UAAU,EAAE;MACV,GAAGZ;IACL,CAAC;IACD4D,MAAM,EAAE;MACNC,mBAAmB,EAAE;IACvB;EACF,CAAC,EACD;IACEF,IAAI,EAAE,2CAA2C;IACjDrD,UAAU,EAAE5B,eAAe;IAC3BkC,UAAU,EAAE;MACV,GAAGZ,gBAAgB;MACnBiB,SAAS,EAAEb,YAAY,CAACrB,QAAQ,CAAC;IACnC,CAAC;IACD6E,MAAM,EAAE;MACNC,mBAAmB,EAAE;IACvB;EACF,CAAC,EACD;IACEF,IAAI,EAAE,iDAAiD;IACvDrD,UAAU,EAAEF,YAAY;IACxBQ,UAAU,EAAE;MACV,GAAGZ,gBAAgB;MACnBiB,SAAS,EAAEb,YAAY,CAACrB,QAAQ,CAAC;IACnC,CAAC;IACD6E,MAAM,EAAE;MACNC,mBAAmB,EAAE;IACvB;EACF,CAAC,EACD;IACEF,IAAI,EAAE,4CAA4C;IAClDrD,UAAU,EAAE5B,eAAe;IAC3BkC,UAAU,EAAE;MACV,GAAGZ,gBAAgB;MACnBiB,SAAS,EAAE;IACb,CAAC;IACD2C,MAAM,EAAE;MACNC,mBAAmB,EAAE;IACvB;EACF,CAAC,EACD;IACEF,IAAI,EAAE,iDAAiD;IACvDrD,UAAU,EAAE,IAAI3B,GAAG,CAAC,YAAY,EAAED,eAAe,CAAC;IAClDkC,UAAU,EAAE;MACV,GAAGZ,gBAAgB;MACnBiB,SAAS,EAAE;IACb,CAAC;IACD2C,MAAM,EAAE;MACNC,mBAAmB,EAAE;IACvB;EACF,CAAC,CACF,CAAC,CAAC,OAAO,EAAE,CAAC;IAAEjD,UAAU;IAAEN,UAAU;IAAEsD;EAAO,CAAC,KAAK;IAClDzG,UAAU,CAAC,MAAM;MACf0D,WAAW,CAACD,UAAU,CAAC;MACvBP,mBAAmB,CAACC,UAAU,CAACvB,QAAQ,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC;IAEFzB,EAAE,CAAC,mCAAmC,EAAE,MAAM;MAC5CD,MAAM,CAACE,EAAE,CAACkD,MAAM,CAACjD,QAAQ,CAACY,MAAM,CAAC,CAAC,CAAC0F,oBAAoB,CACrDzG,MAAM,CAAC+E,gBAAgB,CAAC;QACtBC,SAAS,EAAEzB,UAAU,CAACX,QAAQ;QAC9B8D,0BAA0B,EAAE;MAC9B,CAAC,CAAC,EACFvG,QAAQ,CAACwG,yBAAyB,CAChCpD,UAAU,CAACQ,OAAO,IAAI,YAAY,EAClCR,UAAU,CAACV,UACb,CAAC,EACD7C,MAAM,CAACkF,GAAG,CAAC0B,QAAQ,CAAC,EACpB5G,MAAM,CAAC6G,QAAQ,CAAC,CAAC,EACjB7G,MAAM,CAACkF,GAAG,CAAC0B,QAAQ,CAAC,EACpB5C,SAAS,EACT,CAACT,UAAU,CAACO,MAAM,IACb,CACD,eAAe,EACf,gBAAgB,EAChB,yBAAyB,EACzB,0BAA0B,CAC3B,EAAE0B,IAAI,CAAC,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC,EACrBzB,SACF,CAAC;IACH,CAAC,CAAC;IAEFjE,QAAQ,CAACsG,IAAI,CAEX,CACA;MACES,YAAY,EAAE;QACZnB,aAAa,EAAE,iBAAiB;QAChCC,eAAe,EAAE,CAACrC,UAAU,CAACO,MAAM,IAC9B,CACD,eAAe,EACf,gBAAgB,EAChB,yBAAyB,EACzB,0BAA0B,CAC3B,EAAE0B,IAAI,CAAC,CAAC,CAACC,IAAI,CAAC,GAAG;MACtB,CAAC;MACDsB,cAAc,EAAE,CAAC;IACnB,CAAC,EACD;MACED,YAAY,EAAE,CAAC,CAAC;MAChBC,cAAc,EAAE;QACdC,YAAY,EAAE,IAAI;QAClBtB,KAAK,EAAE,KAAK;QACZuB,MAAM,EAAE;MACV;IACF,CAAC,EACD;MAAEH,YAAY,EAAE,CAAC,CAAC;MAAEC,cAAc,EAAE,CAAC;IAAE,CAAC,CACzC,CAAC,CAAC,yBAAyB,EAAGG,YAAY,IAAK;MAC9C,MAAMC,YAAY,GAAG,CAACC,IAAI,CAACC,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE3F,QAAQ,CAAC,EAAE,CAAC,CAAC4F,SAAS,CAAC,CAAC,CAAC;MAElExH,UAAU,CAAC,MAAM;QACfI,EAAE,CAACkD,MAAM,CAACjD,QAAQ,CAACe,SAAS,CAAC,CAACmC,kBAAkB,CAAC,MAC/C6D,YAAY,CAACJ,YACf,CAAC;QAED5G,EAAE,CAACkD,MAAM,CAACjD,QAAQ,CAACiB,WAAW,CAAC,CAACiC,kBAAkB,CAAC,MACjD6D,YAAY,CAACH,cACf,CAAC;QAED1G,YAAY,CAACE,uBAAuB,CAAC8C,kBAAkB,CACrD,OAAO;UACLyC,YAAY,EAAEqB,YAAY;UAC1BpB,UAAU,EAAEC,IAAI,CAACC,GAAG,CAAC,CAAC;UACtBC,UAAU,EAAE;QACd,CAAC,CACH,CAAC;MACH,CAAC,CAAC;MAEF,IACEvB,MAAM,CAAC4C,IAAI,CAACL,YAAY,CAACJ,YAAY,CAAC,CAACU,MAAM,KAAK,CAAC,IAChD7C,MAAM,CAAC4C,IAAI,CAACL,YAAY,CAACH,cAAc,CAAC,CAACS,MAAM,KAAK,CAAC,EACxD;QACA,IAAIjB,MAAM,CAACC,mBAAmB,EAAE;UAC9BvG,EAAE,CAAC,yBAAyB,EAAE,YAAY;YACxC,MAAMiE,YAAY,GAAGZ,MAAM,CAAE,CAAC;YAC9BtD,MAAM,CAACE,EAAE,CAACkD,MAAM,CAACjD,QAAQ,CAACY,MAAM,CAAC,CAAC,CAACqF,eAAe,CAAC,CAAC,CAAC;YAErD,IAAIG,MAAM,CAACC,mBAAmB,EAAE;cAC9B;cACA,MAAMxG,MAAM,CAACkE,YAAY,CAAC,CAACiC,QAAQ,CAACsB,aAAa,CAAC,CAAC;cACnDzH,MAAM,CAACoC,kBAAkB,CAACH,OAAO,CAAC,CAACyF,cAAc,CAC/C,2BAA2BnE,UAAU,CAACX,QAAQ,EAAE,EAChD+E,IAAI,CAACC,SAAS,CAAC;gBAAEX,MAAM,EAAEY,MAAM,CAACpG,QAAQ,CAACC,QAAQ,CAAC;cAAE,CAAC,CACvD,CAAC;cACD1B,MAAM,CAACwB,UAAU,CAACM,OAAO,CAACC,YAAY,CAAC,CAAC0E,oBAAoB,CAC1D,CAAC,CAAC,EACF,EAAE,EACFlD,UAAU,CAACK,SACb,CAAC;YAEH;UACF,CAAC,CAAC;QACJ,CAAC,MAAM;UACL3D,EAAE,CAAC,wBAAwB,EAAE,YAAY;YACvC,MAAMiE,YAAY,GAAGZ,MAAM,CAAE,CAAC;YAC9BtD,MAAM,CAACE,EAAE,CAACkD,MAAM,CAACjD,QAAQ,CAACY,MAAM,CAAC,CAAC,CAACqF,eAAe,CAAC,CAAC,CAAC;YAErD,IAAIG,MAAM,CAACC,mBAAmB,EAAE;cAC9B;cACA,MAAMxG,MAAM,CAACkE,YAAY,CAAC,CAACiC,QAAQ,CAACsB,aAAa,CAAC,CAAC;cACnDzH,MAAM,CAACoC,kBAAkB,CAACH,OAAO,CAAC,CAACyF,cAAc,CAC/C,2BAA2BnE,UAAU,CAACX,QAAQ,EAAE,EAChD+E,IAAI,CAACC,SAAS,CAAC;gBAAEX,MAAM,EAAEY,MAAM,CAACpG,QAAQ,CAACC,QAAQ,CAAC;cAAE,CAAC,CACvD,CAAC;cAED1B,MAAM,CAACwB,UAAU,CAACM,OAAO,CAACC,YAAY,CAAC,CAAC0E,oBAAoB,CAC1D,CAAC,CAAC,EACF,EAAE,EACFlD,UAAU,CAACK,SACb,CAAC;cACD;YACF;YAEA,MAAMK,yBAAyB,CAC7BC,YACF,CAAC;UACH,CAAC,CAAC;QACJ;MACF;MAEA,IAAIgD,YAAY,CAACH,cAAc,CAACC,YAAY,EAAE;QAC5C/G,EAAE,CAAC,mCAAmC,EAAE,YAAY;UAClD,MAAMD,MAAM,CAACsD,MAAM,CAAC,CAAC,CAAC,CAAC6C,QAAQ,CAACzB,OAAO,CAACyC,YAAY,CAAC;UACrDnH,MAAM,CAACK,YAAY,CAACE,uBAAuB,CAAC,CAACuH,qBAAqB,CAChE,CACF,CAAC;UACD9H,MAAM,CAACK,YAAY,CAACE,uBAAuB,CAAC,CAACkG,oBAAoB,CAC/DzC,SAAS;UAAE;UACX,QACF,CAAC;UAEDhE,MAAM,CAACwB,UAAU,CAACM,OAAO,CAACC,YAAY,CAAC,CAAC+F,qBAAqB,CAAC,CAAC,CAAC;UAChE9H,MAAM,CAACwB,UAAU,CAACM,OAAO,CAACC,YAAY,CAAC,CAAC2F,cAAc,CACpD1H,MAAM,CAAC6G,QAAQ,CAAC,CAAC,EACjB7G,MAAM,CAAC6G,QAAQ,CAAC,CAAC,EACjBK,YAAY,CAACH,cAAc,CAACE,MAC9B,CAAC;QACH,CAAC,CAAC;MACJ;MAEA,IAAIC,YAAY,CAACJ,YAAY,CAACnB,aAAa,EAAE;QAC3C1F,EAAE,CAAC,WAAW,EAAE,YAAY;UAC1B,MAAMD,MAAM,CAACsD,MAAM,CAAC,CAAC,CAAC,CAAC6C,QAAQ,CAACzB,OAAO,CAACyC,YAAY,CAAC;UAErDnH,MAAM,CAACK,YAAY,CAACE,uBAAuB,CAAC,CAACuH,qBAAqB,CAChE,CACF,CAAC;UACD9H,MAAM,CAACK,YAAY,CAACE,uBAAuB,CAAC,CAACkG,oBAAoB,CAC/DzC,SAAS;UAAE;UACX,SACF,CAAC;QACH,CAAC,CAAC;MACJ;IACF,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFjE,QAAQ,CAAC,qBAAqB,EAAE,MAAM;IACpCD,UAAU,CAAC,MAAM;MACfkD,mBAAmB,CAAC,uBAAuB,CAAC;MAC5CE,eAAe,CAAC,CAAC,CAAC,CAAC;MACnBhD,EAAE,CAACkD,MAAM,CAACjD,QAAQ,CAACiB,WAAW,CAAC,CAACiC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;MAC9D;MACAnD,EAAE,CAACuC,UAAU,CAAC,SAAS,EAAE;QAAEsF,GAAG,EAAE;UAAEC,MAAM,EAAE;QAAU;MAAE,CAAC,CAAC;IAC1D,CAAC,CAAC;IAEFpI,SAAS,CAAC,MAAM;MACdM,EAAE,CAACwC,gBAAgB,CAAC,CAAC;MACrB;MACAxC,EAAE,CAACuC,UAAU,CAAC,QAAQ,EAAEjB,UAAU,CAAC;MACnCtB,EAAE,CAACuC,UAAU,CAAC,cAAc,EAAET,gBAAgB,CAAC;MAC/C9B,EAAE,CAACuC,UAAU,CAAC,gBAAgB,EAAEL,kBAAkB,CAAC;IACrD,CAAC,CAAC;IAEFnC,EAAE,CAAC,wEAAwE,EAAE,MAAM;MACjFG,uBAAuB,CACrBuC,gBAAgB,CAACC,QAAQ,EACzBD,gBAAgB,CAACE,UAAU,EAC3BF,gBAAgB,CAACG,WAAW,EAC5B;QAAEmF,YAAY,EAAE;MAAe,CACjC,CAAC;;MAED;MACA,MAAMC,OAAO,GAAGhI,EAAE,CAACkD,MAAM,CAACjD,QAAQ,CAACY,MAAM,CAAC,CAACN,IAAI,CAAC+D,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;MAC3DxE,MAAM,CAACkI,OAAO,CAAC,CAACC,IAAI,CAACnG,gBAAgB,CAAC;IACxC,CAAC,CAAC;IAEF/B,EAAE,CAAC,4EAA4E,EAAE,MAAM;MACrFG,uBAAuB,CACrBuC,gBAAgB,CAACC,QAAQ,EACzBD,gBAAgB,CAACE,UAAU,EAC3BF,gBAAgB,CAACG,WAAW,EAC5B;QAAEmF,YAAY,EAAE;MAAiB,CACnC,CAAC;MAED,MAAMC,OAAO,GAAGhI,EAAE,CAACkD,MAAM,CAACjD,QAAQ,CAACY,MAAM,CAAC,CAACN,IAAI,CAAC+D,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;MAC3DxE,MAAM,CAACkI,OAAO,CAAC,CAACC,IAAI,CAAC/F,kBAAkB,CAAC;IAC1C,CAAC,CAAC;IAEFnC,EAAE,CAAC,6DAA6D,EAAE,MAAM;MACtEG,uBAAuB,CACrBuC,gBAAgB,CAACC,QAAQ,EACzBD,gBAAgB,CAACE,UAAU,EAC3BF,gBAAgB,CAACG,WAAW,EAC5B;QAAEmF,YAAY,EAAE;MAAO,CACzB,CAAC;MAED,MAAMC,OAAO,GAAGhI,EAAE,CAACkD,MAAM,CAACjD,QAAQ,CAACY,MAAM,CAAC,CAACN,IAAI,CAAC+D,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;MAC3DxE,MAAM,CAACkI,OAAO,CAAC,CAACT,aAAa,CAAC,CAAC;IACjC,CAAC,CAAC;IAEFxH,EAAE,CAAC,qEAAqE,EAAE,YAAY;MACpF,MAAMqD,MAAM,GAAGlD,uBAAuB,CACpCuC,gBAAgB,CAACC,QAAQ,EACzBD,gBAAgB,CAACE,UAAU,EAC3BF,gBAAgB,CAACG,WAAW,EAC5B;QAAEmF,YAAY,EAAE;MAAO,CACzB,CAAC;;MAED;MACA,MAAMjI,MAAM,CAACsD,MAAM,CAAC,CAAC,CAAC,CAACa,OAAO,CAACC,YAAY,CAAC,oBAAoB,CAAC;MAEjEpE,MAAM,CAACwB,UAAU,CAACC,QAAQ,CAACE,MAAM,CAAC,CAAC2C,oBAAoB,CAAC,CAAC;MAEzD,MAAMC,GAAG,GAAG,IAAIjD,GAAG,CAACE,UAAU,CAACC,QAAQ,CAACE,MAAM,CAAClB,IAAI,CAAC+D,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;MAChE,MAAMe,KAAK,GAAGhB,GAAG,CAACM,YAAY,CAACuD,GAAG,CAAC,OAAO,CAAC;;MAE3C;MACApI,MAAM,CAACuF,KAAK,CAAC,CAAC8C,GAAG,CAACC,SAAS,CAAC,gBAAgB,CAAC;MAC7C;MACAtI,MAAM,CAACuF,KAAK,CAAC,CAAC+C,SAAS,CAAC,eAAe,CAAC;IAC1C,CAAC,CAAC;IAEFrI,EAAE,CAAC,sEAAsE,EAAE,MAAM;MAC/EG,uBAAuB,CACrBuC,gBAAgB,CAACC,QAAQ,EACzBD,gBAAgB,CAACE,UAAU,EAC3BF,gBAAgB,CAACG,WACnB,CAAC;MACD,MAAMoF,OAAO,GAAGhI,EAAE,CAACkD,MAAM,CAACjD,QAAQ,CAACY,MAAM,CAAC,CAACN,IAAI,CAAC+D,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;MAC3DxE,MAAM,CAACkI,OAAO,CAAC,CAACC,IAAI,CAACnG,gBAAgB,CAAC;IACxC,CAAC,CAAC;IAEF/B,EAAE,CAAC,yEAAyE,EAAE,YAAY;MACxF,MAAMqD,MAAM,GAAGlD,uBAAuB,CACpCuC,gBAAgB,CAACC,QAAQ,EACzBD,gBAAgB,CAACE,UAAU,EAC3BF,gBAAgB,CAACG,WAAW,EAC5B;QAAEmF,YAAY,EAAE;MAAe,CACjC,CAAC;MAED,MAAMjI,MAAM,CAACsD,MAAM,CAAC,CAAC,CAAC,CAACa,OAAO,CAACC,YAAY,CAAC,oBAAoB,CAAC;MAEjE,MAAMG,GAAG,GAAG,IAAIjD,GAAG,CAACE,UAAU,CAACC,QAAQ,CAACE,MAAM,CAAClB,IAAI,CAAC+D,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;MAChE,MAAMe,KAAK,GAAGhB,GAAG,CAACM,YAAY,CAACuD,GAAG,CAAC,OAAO,CAAC;MAE3CpI,MAAM,CAACuF,KAAK,CAAC,CAAC+C,SAAS,CAAC,gBAAgB,CAAC;IAC3C,CAAC,CAAC;IAEFrI,EAAE,CAAC,2EAA2E,EAAE,YAAY;MAC1F,MAAMqD,MAAM,GAAGlD,uBAAuB,CACpCuC,gBAAgB,CAACC,QAAQ,EACzBD,gBAAgB,CAACE,UAAU,EAC3BF,gBAAgB,CAACG,WAAW,EAC5B;QAAEmF,YAAY,EAAE;MAAiB,CACnC,CAAC;MAED,MAAMjI,MAAM,CAACsD,MAAM,CAAC,CAAC,CAAC,CAACa,OAAO,CAACC,YAAY,CAAC,oBAAoB,CAAC;MAEjE,MAAMG,GAAG,GAAG,IAAIjD,GAAG,CAACE,UAAU,CAACC,QAAQ,CAACE,MAAM,CAAClB,IAAI,CAAC+D,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;MAChE,MAAMe,KAAK,GAAGhB,GAAG,CAACM,YAAY,CAACuD,GAAG,CAAC,OAAO,CAAC;MAE3CpI,MAAM,CAACuF,KAAK,CAAC,CAAC+C,SAAS,CAAC,gBAAgB,CAAC;IAC3C,CAAC,CAAC;IAEFrI,EAAE,CAAC,qEAAqE,EAAE,YAAY;MACpFC,EAAE,CAACkD,MAAM,CAACjD,QAAQ,CAACe,SAAS,CAAC,CAACqH,SAAS,CAAC,CAAC;MAEzC,MAAMjF,MAAM,GAAGlD,uBAAuB,CACpCuC,gBAAgB,CAACC,QAAQ,EACzBD,gBAAgB,CAACE,UAAU,EAC3BF,gBAAgB,CAACG,WAAW,EAC5B;QAAEmF,YAAY,EAAE;MAAO,CACzB,CAAC;MAED,MAAMjI,MAAM,CAACsD,MAAM,CAAC,CAAC,CAAC,CAACa,OAAO,CAACC,YAAY,CAAC,oBAAoB,CAAC;MAEjEpE,MAAM,CAACE,EAAE,CAACkD,MAAM,CAACjD,QAAQ,CAACe,SAAS,CAAC,CAAC,CAACmH,GAAG,CAACG,gBAAgB,CAAC,CAAC;IAC9D,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"publicOauth.test.js","names":["afterAll","afterEach","beforeAll","beforeEach","describe","expect","it","vi","commonJs","createPublicOauthClient","hoistedMocks","hoisted","makeTokenAndSaveRefresh","fn","mock","delay","ms","Promise","resolve","setTimeout","importOriginal","original","common","args","result","readLocal","spyOn","readSession","DEFAULT_CUR_URL","URL","fetchFn","mockWindow","location","toString","assign","href","pathname","history","replaceState","mockLocalStorage","setItem","getItem","removeItem","mockSessionStorage","restoreAllMocks","mockRestore","clearAllMocks","mockReset","stubGlobal","unstubAllGlobals","BASE_CLIENT_ARGS","clientId","foundryUrl","redirectUrl","fullLoginUrl","setupWindowLocation","currentUrl","setupLocalState","initialLocalState","mocked","mockImplementation","client","clientArgs","setupClient","clientArgs_","refreshTokenMarker","useHistory","loginPage","postLoginPage","scopes","ctxPath","undefined","expectRedirectToMultipass","tokenPromise","rejects","toThrowError","Error","toHaveBeenCalledOnce","url","calls","origin","toEqual","Object","fromEntries","searchParams","entries","objectContaining","client_id","code_challenge","any","String","redirect_uri","response_type","code_challenge_method","scope","sort","join","state","refresh_token","requestedScopes","mockImplementationOnce","access_token","expires_at","Date","now","expires_in","resolves","toBeCalledTimes","each","name","should","redirectToLoginPage","toHaveBeenCalledWith","token_endpoint_auth_method","createAuthorizationServer","Function","anything","localStorage","sessionStorage","codeVerifier","oldUrl","initialState","ACCESS_TOKEN","Math","random","substring","keys","length","toBeUndefined","toBeCalledWith","JSON","stringify","window","toHaveBeenCalledTimes","env","TARGET","tokenStorage","lastArg","toBe","get","not","toContain","mockClear","toHaveBeenCalled"],"sources":["publicOauth.test.ts"],"sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* eslint-disable @typescript-eslint/consistent-type-imports */\nimport {\n afterAll,\n afterEach,\n beforeAll,\n beforeEach,\n describe,\n expect,\n it,\n vi,\n} from \"vitest\";\n\nimport * as commonJs from \"./common.js\";\nimport { LocalStorageState, SessionStorageState } from \"./common.js\";\nimport { createPublicOauthClient } from \"./createPublicOauthClient.js\";\nimport { PublicOauthClient } from \"./PublicOauthClient.js\";\n\nconst hoistedMocks = vi.hoisted(() => {\n return {\n makeTokenAndSaveRefresh: vi.fn(),\n };\n});\n\nvi.mock(\"./delay.js\", () => ({\n delay: vi.fn((ms: number) =>\n new Promise<void>(resolve => setTimeout(resolve, ms / 100))\n ),\n}));\n\nvi.mock(\"./common.js\", async (importOriginal) => {\n const original = await importOriginal<typeof import(\"./common.js\")>();\n return {\n ...original,\n common: vi.fn<typeof commonJs.common>((...args) => {\n const result = original.common(...args);\n return {\n ...result,\n makeTokenAndSaveRefresh: hoistedMocks.makeTokenAndSaveRefresh,\n };\n }),\n readLocal: vi.spyOn(original, \"readLocal\"),\n readSession: vi.spyOn(original, \"readSession\"),\n // vi.fn(original.readLocal),\n };\n});\n\nvi.mock(\"oauth4webapi\");\n\ninterface BaseClientArgs {\n clientId: string;\n foundryUrl: string;\n redirectUrl: string;\n fetchFn?: typeof globalThis.fetch;\n}\n\ninterface ClientArgs extends BaseClientArgs {\n useHistory?: boolean;\n loginPage?: string;\n postLoginPage?: string;\n scopes?: string[];\n ctxPath?: string;\n refreshTokenMarker?: string;\n}\n\ndescribe(createPublicOauthClient, () => {\n const DEFAULT_CUR_URL = new URL(\"https://fauxurl\");\n const fetchFn = vi.fn<typeof fetch>();\n\n const mockWindow = {\n location: {\n toString: vi.fn(() => DEFAULT_CUR_URL),\n assign: vi.fn(),\n href: DEFAULT_CUR_URL.href,\n pathname: DEFAULT_CUR_URL.pathname,\n },\n history: {\n replaceState: vi.fn<typeof window.history.replaceState>(),\n },\n };\n\n const mockLocalStorage = {\n setItem: vi.fn(),\n getItem: vi.fn(),\n removeItem: vi.fn(),\n };\n\n const mockSessionStorage = {\n setItem: vi.fn(),\n getItem: vi.fn(),\n removeItem: vi.fn(),\n };\n\n beforeEach((context) => {\n vi.restoreAllMocks();\n fetchFn.mockRestore();\n });\n\n afterEach((context) => {\n vi.clearAllMocks();\n fetchFn.mockReset();\n });\n\n beforeAll(() => {\n vi.stubGlobal(\"window\", mockWindow);\n vi.stubGlobal(\"localStorage\", mockLocalStorage);\n vi.stubGlobal(\"sessionStorage\", mockSessionStorage);\n });\n\n afterAll(() => {\n vi.unstubAllGlobals();\n });\n\n const BASE_CLIENT_ARGS: BaseClientArgs = {\n clientId: \"this-would-be-client-id\",\n foundryUrl: \"https://a.foundry.url.local\",\n redirectUrl: \"https://my.redirect.url.local\",\n fetchFn,\n };\n\n const fullLoginUrl = new URL(\"/loginPage\", DEFAULT_CUR_URL);\n\n function setupWindowLocation(currentUrl: string) {\n mockWindow.location.href = new URL(currentUrl).href;\n mockWindow.location.pathname = new URL(currentUrl).pathname;\n }\n\n function setupLocalState(initialLocalState: LocalStorageState) {\n vi.mocked(commonJs.readLocal).mockImplementation(() => initialLocalState);\n }\n\n let client: PublicOauthClient;\n let clientArgs: ClientArgs;\n function setupClient(clientArgs_: ClientArgs) {\n clientArgs = clientArgs_;\n if (clientArgs.refreshTokenMarker) {\n client = createPublicOauthClient(\n clientArgs.clientId,\n clientArgs.foundryUrl,\n clientArgs.redirectUrl,\n clientArgs,\n );\n } else {\n client = createPublicOauthClient(\n clientArgs.clientId,\n clientArgs.foundryUrl,\n clientArgs.redirectUrl,\n clientArgs.useHistory,\n clientArgs.loginPage,\n clientArgs.postLoginPage,\n clientArgs.scopes,\n clientArgs.fetchFn,\n clientArgs.ctxPath,\n );\n }\n }\n beforeEach((context) => {\n // prevents mistakes like forgetting to initialize the client with an\n // old value around\n client = undefined!;\n clientArgs = undefined!;\n });\n\n async function expectRedirectToMultipass(\n tokenPromise: Promise<string>,\n ) {\n // we assume window.location.assign will take you away therefore we\n // also have to expect in this scenario that the thrown error happens\n await expect(tokenPromise)\n .rejects.toThrowError(new Error(\"Unable to redirect\"));\n\n expect(mockWindow.location.assign).toHaveBeenCalledOnce();\n\n const url = new URL(\n mockWindow.location.assign.mock.calls[0][0],\n );\n expect(url.origin).toEqual(clientArgs.foundryUrl);\n expect(url.pathname).toEqual(\"/multipass/api/oauth2/authorize\");\n expect(Object.fromEntries(url.searchParams.entries())).toEqual(\n expect.objectContaining({\n client_id: clientArgs.clientId,\n code_challenge: expect.any(String),\n redirect_uri: clientArgs.redirectUrl,\n response_type: \"code\",\n code_challenge_method: \"S256\",\n scope: [\n \"offline_access\",\n ...(clientArgs.scopes\n ?? [\n \"api:read-data\",\n \"api:write-data\",\n \"api:use-ontologies-read\",\n \"api:use-ontologies-write\",\n ].sort()),\n ].join(\" \"),\n state: expect.any(String),\n }),\n );\n }\n\n describe(\"refresh token marker and scopes\", () => {\n beforeEach(() => {\n setupWindowLocation(\"https://foundry.local\");\n });\n\n // Backwards compatibility from when we didn't store scopes\n it(\"should not allow refresh if scopes in local storage is undefined\", async () => {\n setupLocalState({\n refresh_token: \"refreshToken\",\n });\n\n setupClient({\n ...BASE_CLIENT_ARGS,\n // Testing with default scopes\n });\n\n await expectRedirectToMultipass(\n client(),\n );\n });\n\n it(\"should not allow refresh if requested scopes are different\", async () => {\n setupLocalState({\n refresh_token: \"refreshToken\",\n requestedScopes: \"api:read-data\",\n });\n\n setupClient({\n ...BASE_CLIENT_ARGS,\n scopes: [\"api:write-data\"],\n });\n\n await expectRedirectToMultipass(\n client(),\n );\n });\n\n it(\"should not allow refresh if the refresh markers do not match\", async () => {\n setupLocalState({\n refresh_token: \"refreshToken\",\n refreshTokenMarker: \"not-the-right-marker\",\n requestedScopes: \"api:read-data\",\n });\n\n setupClient({\n ...BASE_CLIENT_ARGS,\n refreshTokenMarker: \"marker\",\n scopes: [\"api:read-data\"],\n });\n\n await expectRedirectToMultipass(\n client(),\n );\n });\n\n it(\"should try to refresh if refresh markers match and requested scopes are equal\", async () => {\n setupLocalState({\n refresh_token: \"refreshToken\",\n refreshTokenMarker: \"marker\",\n requestedScopes: \"api:admin-read api:datasets-read\",\n });\n\n setupClient({\n ...BASE_CLIENT_ARGS,\n refreshTokenMarker: \"marker\",\n scopes: [\"api:datasets-read\", \"api:admin-read\"],\n });\n\n hoistedMocks.makeTokenAndSaveRefresh.mockImplementationOnce(\n () => ({\n access_token: \"some token\",\n expires_at: Date.now(),\n expires_in: 10000,\n }),\n );\n\n const tokenPromise = client();\n\n await expect(tokenPromise).resolves.toEqual(\"some token\");\n\n expect(hoistedMocks.makeTokenAndSaveRefresh).toBeCalledTimes(1);\n });\n });\n\n describe.each<{\n name: string;\n currentUrl: URL;\n clientArgs: BaseClientArgs & {\n useHistory?: boolean;\n loginPage?: string;\n postLoginPage?: string;\n scopes?: string[];\n ctxPath?: string;\n };\n should: {\n redirectToLoginPage: boolean;\n };\n }>([\n {\n name: \"Basic Usage\",\n currentUrl: DEFAULT_CUR_URL,\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n },\n should: {\n redirectToLoginPage: false,\n },\n },\n {\n name: \"Base w/ full loginPage and curUrl is root\",\n currentUrl: DEFAULT_CUR_URL,\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n loginPage: fullLoginUrl.toString(),\n },\n should: {\n redirectToLoginPage: true,\n },\n },\n {\n name: \"Base w/ full loginPage and curUrl is login page\",\n currentUrl: fullLoginUrl,\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n loginPage: fullLoginUrl.toString(),\n },\n should: {\n redirectToLoginPage: false,\n },\n },\n {\n name: \"Base w/ short loginPage and curUrl is root\",\n currentUrl: DEFAULT_CUR_URL,\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n loginPage: \"/loginPage\",\n },\n should: {\n redirectToLoginPage: true,\n },\n },\n {\n name: \"Base w/ short loginPage and curUrl is loginPage\",\n currentUrl: new URL(\"/loginPage\", DEFAULT_CUR_URL),\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n loginPage: \"/loginPage\",\n },\n should: {\n redirectToLoginPage: false,\n },\n },\n ])(\"$name\", ({ clientArgs, currentUrl, should }) => {\n beforeEach(() => {\n setupClient(clientArgs);\n setupWindowLocation(currentUrl.toString());\n });\n\n it(\"calls common with expected values\", () => {\n expect(vi.mocked(commonJs.common)).toHaveBeenCalledWith(\n expect.objectContaining({\n client_id: clientArgs.clientId,\n token_endpoint_auth_method: \"none\",\n }),\n commonJs.createAuthorizationServer(\n clientArgs.ctxPath ?? \"/multipass\",\n clientArgs.foundryUrl,\n ),\n expect.any(Function),\n expect.anything(),\n expect.any(Function),\n undefined,\n (clientArgs.scopes\n ?? [\n \"api:read-data\",\n \"api:write-data\",\n \"api:use-ontologies-read\",\n \"api:use-ontologies-write\",\n ]).sort().join(\" \"),\n undefined,\n );\n });\n\n describe.each<\n { localStorage: LocalStorageState; sessionStorage: SessionStorageState }\n >([\n {\n localStorage: {\n refresh_token: \"a-refresh-token\",\n requestedScopes: (clientArgs.scopes\n ?? [\n \"api:read-data\",\n \"api:write-data\",\n \"api:use-ontologies-read\",\n \"api:use-ontologies-write\",\n ]).sort().join(\" \"),\n },\n sessionStorage: {},\n },\n {\n localStorage: {},\n sessionStorage: {\n codeVerifier: \"hi\",\n state: \"mom\",\n oldUrl: \"https://someoldurl.local\",\n },\n },\n { localStorage: {}, sessionStorage: {} },\n ])(\"Initial Local State: %s\", (initialState) => {\n const ACCESS_TOKEN = (Math.random() + 1).toString(36).substring(7);\n\n beforeEach(() => {\n vi.mocked(commonJs.readLocal).mockImplementation(() =>\n initialState.localStorage\n );\n\n vi.mocked(commonJs.readSession).mockImplementation(() =>\n initialState.sessionStorage\n );\n\n hoistedMocks.makeTokenAndSaveRefresh.mockImplementation(\n () => ({\n access_token: ACCESS_TOKEN,\n expires_at: Date.now(),\n expires_in: 10000,\n }),\n );\n });\n\n if (\n Object.keys(initialState.localStorage).length === 0\n && Object.keys(initialState.sessionStorage).length === 0\n ) {\n if (should.redirectToLoginPage) {\n it(\"redirects to login page\", async () => {\n const tokenPromise = client!();\n expect(vi.mocked(commonJs.common)).toBeCalledTimes(1);\n\n if (should.redirectToLoginPage) {\n // expect save local\n await expect(tokenPromise).resolves.toBeUndefined();\n expect(mockSessionStorage.setItem).toBeCalledWith(\n `@osdk/oauth : refresh : ${clientArgs.clientId}`,\n JSON.stringify({ oldUrl: window.location.toString() }),\n );\n expect(mockWindow.history.replaceState).toHaveBeenCalledWith(\n {},\n \"\",\n clientArgs.loginPage,\n );\n return;\n }\n });\n } else {\n it(\"redirects to multipass\", async () => {\n const tokenPromise = client!();\n expect(vi.mocked(commonJs.common)).toBeCalledTimes(1);\n\n if (should.redirectToLoginPage) {\n // expect save local\n await expect(tokenPromise).resolves.toBeUndefined();\n expect(mockSessionStorage.setItem).toBeCalledWith(\n `@osdk/oauth : refresh : ${clientArgs.clientId}`,\n JSON.stringify({ oldUrl: window.location.toString() }),\n );\n\n expect(mockWindow.history.replaceState).toHaveBeenCalledWith(\n {},\n \"\",\n clientArgs.loginPage,\n );\n return;\n }\n\n await expectRedirectToMultipass(\n tokenPromise,\n );\n });\n }\n }\n\n if (initialState.sessionStorage.codeVerifier) {\n it(\"tries to auth with return results\", async () => {\n await expect(client()).resolves.toEqual(ACCESS_TOKEN);\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledTimes(\n 1,\n );\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledWith(\n undefined, // this is only because we didn't mock out the internals\n \"signIn\",\n );\n\n expect(mockWindow.history.replaceState).toHaveBeenCalledTimes(1);\n expect(mockWindow.history.replaceState).toBeCalledWith(\n expect.anything(),\n expect.anything(),\n initialState.sessionStorage.oldUrl,\n );\n });\n }\n\n if (initialState.localStorage.refresh_token) {\n it(\"refreshes\", async () => {\n await expect(client()).resolves.toEqual(ACCESS_TOKEN);\n\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledTimes(\n 1,\n );\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledWith(\n undefined, // this is only because we didn't mock out the internals\n \"refresh\",\n );\n });\n }\n });\n });\n\n describe(\"tokenStorage option\", () => {\n beforeEach(() => {\n setupWindowLocation(\"https://foundry.local\");\n setupLocalState({});\n vi.mocked(commonJs.readSession).mockImplementation(() => ({}));\n // getStorage() checks process.env.TARGET to determine if we're in a browser\n vi.stubGlobal(\"process\", { env: { TARGET: \"browser\" } });\n });\n\n afterEach(() => {\n vi.unstubAllGlobals();\n // Re-stub the globals that the outer describe needs\n vi.stubGlobal(\"window\", mockWindow);\n vi.stubGlobal(\"localStorage\", mockLocalStorage);\n vi.stubGlobal(\"sessionStorage\", mockSessionStorage);\n });\n\n it(\"should pass localStorage to common when tokenStorage is 'localStorage'\", () => {\n createPublicOauthClient(\n BASE_CLIENT_ARGS.clientId,\n BASE_CLIENT_ARGS.foundryUrl,\n BASE_CLIENT_ARGS.redirectUrl,\n { tokenStorage: \"localStorage\" },\n );\n\n // common() is called with 8 args, the last one being the storage\n const lastArg = vi.mocked(commonJs.common).mock.calls[0][7];\n expect(lastArg).toBe(mockLocalStorage);\n });\n\n it(\"should pass sessionStorage to common when tokenStorage is 'sessionStorage'\", () => {\n createPublicOauthClient(\n BASE_CLIENT_ARGS.clientId,\n BASE_CLIENT_ARGS.foundryUrl,\n BASE_CLIENT_ARGS.redirectUrl,\n { tokenStorage: \"sessionStorage\" },\n );\n\n const lastArg = vi.mocked(commonJs.common).mock.calls[0][7];\n expect(lastArg).toBe(mockSessionStorage);\n });\n\n it(\"should pass undefined to common when tokenStorage is 'none'\", () => {\n createPublicOauthClient(\n BASE_CLIENT_ARGS.clientId,\n BASE_CLIENT_ARGS.foundryUrl,\n BASE_CLIENT_ARGS.redirectUrl,\n { tokenStorage: \"none\" },\n );\n\n const lastArg = vi.mocked(commonJs.common).mock.calls[0][7];\n expect(lastArg).toBeUndefined();\n });\n\n it(\"should not include offline_access scope when tokenStorage is 'none'\", async () => {\n const client = createPublicOauthClient(\n BASE_CLIENT_ARGS.clientId,\n BASE_CLIENT_ARGS.foundryUrl,\n BASE_CLIENT_ARGS.redirectUrl,\n { tokenStorage: \"none\" },\n );\n\n // Trigger the auth flow - this should redirect to multipass\n await expect(client()).rejects.toThrowError(\"Unable to redirect\");\n\n expect(mockWindow.location.assign).toHaveBeenCalledOnce();\n\n const url = new URL(mockWindow.location.assign.mock.calls[0][0]);\n const scope = url.searchParams.get(\"scope\");\n\n // Should NOT include offline_access\n expect(scope).not.toContain(\"offline_access\");\n // Should still include the regular scopes\n expect(scope).toContain(\"api:read-data\");\n });\n\n it(\"should pass localStorage to common when tokenStorage is not provided\", () => {\n createPublicOauthClient(\n BASE_CLIENT_ARGS.clientId,\n BASE_CLIENT_ARGS.foundryUrl,\n BASE_CLIENT_ARGS.redirectUrl,\n );\n const lastArg = vi.mocked(commonJs.common).mock.calls[0][7];\n expect(lastArg).toBe(mockLocalStorage);\n });\n\n it(\"should include offline_access scope when tokenStorage is 'localStorage'\", async () => {\n const client = createPublicOauthClient(\n BASE_CLIENT_ARGS.clientId,\n BASE_CLIENT_ARGS.foundryUrl,\n BASE_CLIENT_ARGS.redirectUrl,\n { tokenStorage: \"localStorage\" },\n );\n\n await expect(client()).rejects.toThrowError(\"Unable to redirect\");\n\n const url = new URL(mockWindow.location.assign.mock.calls[0][0]);\n const scope = url.searchParams.get(\"scope\");\n\n expect(scope).toContain(\"offline_access\");\n });\n\n it(\"should include offline_access scope when tokenStorage is 'sessionStorage'\", async () => {\n const client = createPublicOauthClient(\n BASE_CLIENT_ARGS.clientId,\n BASE_CLIENT_ARGS.foundryUrl,\n BASE_CLIENT_ARGS.redirectUrl,\n { tokenStorage: \"sessionStorage\" },\n );\n\n await expect(client()).rejects.toThrowError(\"Unable to redirect\");\n\n const url = new URL(mockWindow.location.assign.mock.calls[0][0]);\n const scope = url.searchParams.get(\"scope\");\n\n expect(scope).toContain(\"offline_access\");\n });\n\n it(\"should not attempt to read from storage when tokenStorage is 'none'\", async () => {\n vi.mocked(commonJs.readLocal).mockClear();\n\n const client = createPublicOauthClient(\n BASE_CLIENT_ARGS.clientId,\n BASE_CLIENT_ARGS.foundryUrl,\n BASE_CLIENT_ARGS.redirectUrl,\n { tokenStorage: \"none\" },\n );\n\n await expect(client()).rejects.toThrowError(\"Unable to redirect\");\n\n expect(vi.mocked(commonJs.readLocal)).not.toHaveBeenCalled();\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
package/build/cjs/index.cjs
CHANGED
|
@@ -1135,60 +1135,10 @@ function createConfidentialOauthClient(client_id, client_secret, url, scopes = [
|
|
|
1135
1135
|
return getToken;
|
|
1136
1136
|
}
|
|
1137
1137
|
|
|
1138
|
-
//
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
error.name = "AbortError";
|
|
1142
|
-
return error;
|
|
1143
|
-
};
|
|
1144
|
-
var clearMethods = /* @__PURE__ */ new WeakMap();
|
|
1145
|
-
function createDelay({
|
|
1146
|
-
clearTimeout: defaultClear,
|
|
1147
|
-
setTimeout: defaultSet
|
|
1148
|
-
} = {}) {
|
|
1149
|
-
return (milliseconds, {
|
|
1150
|
-
value,
|
|
1151
|
-
signal: signal2
|
|
1152
|
-
} = {}) => {
|
|
1153
|
-
if (signal2?.aborted) {
|
|
1154
|
-
return Promise.reject(createAbortError());
|
|
1155
|
-
}
|
|
1156
|
-
let timeoutId;
|
|
1157
|
-
let settle;
|
|
1158
|
-
let rejectFunction;
|
|
1159
|
-
const clear = defaultClear ?? clearTimeout;
|
|
1160
|
-
const signalListener = () => {
|
|
1161
|
-
clear(timeoutId);
|
|
1162
|
-
rejectFunction(createAbortError());
|
|
1163
|
-
};
|
|
1164
|
-
const cleanup = () => {
|
|
1165
|
-
if (signal2) {
|
|
1166
|
-
signal2.removeEventListener("abort", signalListener);
|
|
1167
|
-
}
|
|
1168
|
-
};
|
|
1169
|
-
const delayPromise = new Promise((resolve, reject) => {
|
|
1170
|
-
settle = () => {
|
|
1171
|
-
cleanup();
|
|
1172
|
-
resolve(value);
|
|
1173
|
-
};
|
|
1174
|
-
rejectFunction = reject;
|
|
1175
|
-
timeoutId = (defaultSet ?? setTimeout)(settle, milliseconds);
|
|
1176
|
-
});
|
|
1177
|
-
if (signal2) {
|
|
1178
|
-
signal2.addEventListener("abort", signalListener, {
|
|
1179
|
-
once: true
|
|
1180
|
-
});
|
|
1181
|
-
}
|
|
1182
|
-
clearMethods.set(delayPromise, () => {
|
|
1183
|
-
clear(timeoutId);
|
|
1184
|
-
timeoutId = null;
|
|
1185
|
-
settle();
|
|
1186
|
-
});
|
|
1187
|
-
return delayPromise;
|
|
1188
|
-
};
|
|
1138
|
+
// src/delay.ts
|
|
1139
|
+
function delay(ms) {
|
|
1140
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
1189
1141
|
}
|
|
1190
|
-
var delay = createDelay();
|
|
1191
|
-
var delay_default = delay;
|
|
1192
1142
|
function processOptionsAndAssignDefaults(url, redirect_uri, useHistory, loginPage, postLoginPage, scopes, fetchFn, ctxPath) {
|
|
1193
1143
|
let options = {};
|
|
1194
1144
|
if (typeof useHistory === "object") {
|
|
@@ -1251,7 +1201,7 @@ function createPublicOauthClient(client_id, url, redirect_uri, useHistory, login
|
|
|
1251
1201
|
window.history.replaceState({}, "", x);
|
|
1252
1202
|
return;
|
|
1253
1203
|
} else window.location.assign(x);
|
|
1254
|
-
await
|
|
1204
|
+
await delay(1e3);
|
|
1255
1205
|
throw new Error("Unable to redirect");
|
|
1256
1206
|
};
|
|
1257
1207
|
async function maybeRefresh(expectRefreshToken) {
|
|
@@ -1336,7 +1286,7 @@ function createPublicOauthClient(client_id, url, redirect_uri, useHistory, login
|
|
|
1336
1286
|
code_challenge_method: "S256",
|
|
1337
1287
|
scope: scopeString
|
|
1338
1288
|
})}`);
|
|
1339
|
-
await
|
|
1289
|
+
await delay(1e3);
|
|
1340
1290
|
throw new Error("Unable to redirect");
|
|
1341
1291
|
};
|
|
1342
1292
|
async function _signIn() {
|