@osdk/oauth 1.8.0-beta.1 → 1.8.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/build/browser/common.js +33 -13
  3. package/build/browser/common.js.map +1 -1
  4. package/build/browser/common.test.js +6 -4
  5. package/build/browser/common.test.js.map +1 -1
  6. package/build/browser/createConfidentialOauthClient.js +1 -1
  7. package/build/browser/createConfidentialOauthClient.js.map +1 -1
  8. package/build/browser/createPublicOauthClient.js +19 -9
  9. package/build/browser/createPublicOauthClient.js.map +1 -1
  10. package/build/browser/index.js.map +1 -1
  11. package/build/browser/publicOauth.test.js +91 -1
  12. package/build/browser/publicOauth.test.js.map +1 -1
  13. package/build/browser/utils.js +2 -1
  14. package/build/browser/utils.js.map +1 -1
  15. package/build/cjs/index.cjs +34 -22
  16. package/build/cjs/index.cjs.map +1 -1
  17. package/build/cjs/index.d.cts +25 -1
  18. package/build/esm/common.js +32 -13
  19. package/build/esm/common.js.map +1 -1
  20. package/build/esm/common.test.js +6 -4
  21. package/build/esm/common.test.js.map +1 -1
  22. package/build/esm/createConfidentialOauthClient.js +1 -1
  23. package/build/esm/createConfidentialOauthClient.js.map +1 -1
  24. package/build/esm/createPublicOauthClient.js +19 -9
  25. package/build/esm/createPublicOauthClient.js.map +1 -1
  26. package/build/esm/index.js.map +1 -1
  27. package/build/esm/publicOauth.test.js +91 -1
  28. package/build/esm/publicOauth.test.js.map +1 -1
  29. package/build/esm/utils.js +2 -1
  30. package/build/esm/utils.js.map +1 -1
  31. package/build/types/common.d.ts +19 -4
  32. package/build/types/common.d.ts.map +1 -1
  33. package/build/types/createPublicOauthClient.d.ts +16 -0
  34. package/build/types/createPublicOauthClient.d.ts.map +1 -1
  35. package/build/types/index.d.ts +2 -1
  36. package/build/types/index.d.ts.map +1 -1
  37. package/build/types/utils.d.ts +3 -1
  38. package/build/types/utils.d.ts.map +1 -1
  39. package/package.json +3 -3
@@ -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"],"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 );\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"],"mappings":"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","ignoreList":[]}
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":"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","ignoreList":[]}
@@ -41,7 +41,8 @@ export function processOptionsAndAssignDefaults(url, redirect_uri, useHistory, l
41
41
  joinedScopes: [...(options.scopes ?? ["api:read-data", "api:write-data", "api:use-ontologies-read", "api:use-ontologies-write"])].sort().join(" "),
42
42
  fetchFn: options.fetchFn ?? globalThis.fetch,
43
43
  ctxPath: options.ctxPath ?? "multipass",
44
- refreshTokenMarker: options.refreshTokenMarker
44
+ refreshTokenMarker: options.refreshTokenMarker,
45
+ tokenStorage: options.tokenStorage ?? "localStorage"
45
46
  };
46
47
  }
47
48
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["invariant","processOptionsAndAssignDefaults","url","redirect_uri","useHistory","loginPage","postLoginPage","scopes","fetchFn","ctxPath","options","process","env","NODE_ENV","window","location","toString","joinedScopes","sort","join","globalThis","fetch","refreshTokenMarker"],"sources":["utils.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 invariant from \"tiny-invariant\";\nimport type { PublicOauthClientOptions } from \"./createPublicOauthClient.js\";\n\ninterface ProcessedPublicOauthClientOptions extends\n Omit<\n Required<PublicOauthClientOptions>,\n \"loginPage\" | \"refreshTokenMarker\" | \"scopes\"\n >\n{\n loginPage?: string;\n refreshTokenMarker?: string;\n joinedScopes: string;\n}\n\nexport function processOptionsAndAssignDefaults(\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): ProcessedPublicOauthClientOptions {\n let options: PublicOauthClientOptions = {};\n\n if (typeof useHistory === \"object\") {\n invariant(\n !loginPage && !postLoginPage && !scopes && !fetchFn && !ctxPath,\n \"If useHistory is an object, other options should not be provided\",\n );\n options = useHistory;\n } else {\n options = {\n useHistory,\n loginPage,\n postLoginPage,\n scopes,\n fetchFn,\n ctxPath,\n };\n }\n\n invariant(url, \"url is required\");\n invariant(redirect_uri, \"redirectUrl is required\");\n\n // Assign defaults\n return {\n useHistory: options.useHistory ?? true,\n loginPage: options.loginPage,\n postLoginPage: options.postLoginPage || window.location.toString(),\n joinedScopes: [\n ...options.scopes\n ?? [\n \"api:read-data\",\n \"api:write-data\",\n \"api:use-ontologies-read\",\n \"api:use-ontologies-write\",\n ],\n ]\n .sort().join(\" \"),\n fetchFn: options.fetchFn ?? globalThis.fetch,\n ctxPath: options.ctxPath ?? \"multipass\",\n refreshTokenMarker: options.refreshTokenMarker,\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,SAAS,MAAM,gBAAgB;AActC,OAAO,SAASC,+BAA+BA,CAC7CC,GAAW,EACXC,YAAoB,EACpBC,UAA+C,EAC/CC,SAAkB,EAClBC,aAAsB,EACtBC,MAAiB,EACjBC,OAAiC,EACjCC,OAAgB,EACmB;EACnC,IAAIC,OAAiC,GAAG,CAAC,CAAC;EAE1C,IAAI,OAAON,UAAU,KAAK,QAAQ,EAAE;IAClC,EACE,CAACC,SAAS,IAAI,CAACC,aAAa,IAAI,CAACC,MAAM,IAAI,CAACC,OAAO,IAAI,CAACC,OAAO,IAAAE,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBADjEb,SAAS,QAEP,kEAAkE,IAFpEA,SAAS;IAITU,OAAO,GAAGN,UAAU;EACtB,CAAC,MAAM;IACLM,OAAO,GAAG;MACRN,UAAU;MACVC,SAAS;MACTC,aAAa;MACbC,MAAM;MACNC,OAAO;MACPC;IACF,CAAC;EACH;EAEA,CAAUP,GAAG,GAAAS,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBAAbb,SAAS,QAAM,iBAAiB,IAAhCA,SAAS;EACT,CAAUG,YAAY,GAAAQ,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBAAtBb,SAAS,QAAe,yBAAyB,IAAjDA,SAAS;;EAET;EACA,OAAO;IACLI,UAAU,EAAEM,OAAO,CAACN,UAAU,IAAI,IAAI;IACtCC,SAAS,EAAEK,OAAO,CAACL,SAAS;IAC5BC,aAAa,EAAEI,OAAO,CAACJ,aAAa,IAAIQ,MAAM,CAACC,QAAQ,CAACC,QAAQ,CAAC,CAAC;IAClEC,YAAY,EAAE,CACZ,IAAGP,OAAO,CAACH,MAAM,IACZ,CACD,eAAe,EACf,gBAAgB,EAChB,yBAAyB,EACzB,0BAA0B,CAC3B,EACJ,CACEW,IAAI,CAAC,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC;IACnBX,OAAO,EAAEE,OAAO,CAACF,OAAO,IAAIY,UAAU,CAACC,KAAK;IAC5CZ,OAAO,EAAEC,OAAO,CAACD,OAAO,IAAI,WAAW;IACvCa,kBAAkB,EAAEZ,OAAO,CAACY;EAC9B,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"file":"utils.js","names":["invariant","processOptionsAndAssignDefaults","url","redirect_uri","useHistory","loginPage","postLoginPage","scopes","fetchFn","ctxPath","options","process","env","NODE_ENV","window","location","toString","joinedScopes","sort","join","globalThis","fetch","refreshTokenMarker","tokenStorage"],"sources":["utils.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 invariant from \"tiny-invariant\";\nimport type { TokenStorageType } from \"./common.js\";\nimport type { PublicOauthClientOptions } from \"./createPublicOauthClient.js\";\n\ninterface ProcessedPublicOauthClientOptions extends\n Omit<\n Required<PublicOauthClientOptions>,\n \"loginPage\" | \"refreshTokenMarker\" | \"scopes\" | \"tokenStorage\"\n >\n{\n loginPage?: string;\n refreshTokenMarker?: string;\n joinedScopes: string;\n tokenStorage: TokenStorageType;\n}\n\nexport function processOptionsAndAssignDefaults(\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): ProcessedPublicOauthClientOptions {\n let options: PublicOauthClientOptions = {};\n\n if (typeof useHistory === \"object\") {\n invariant(\n !loginPage && !postLoginPage && !scopes && !fetchFn && !ctxPath,\n \"If useHistory is an object, other options should not be provided\",\n );\n options = useHistory;\n } else {\n options = {\n useHistory,\n loginPage,\n postLoginPage,\n scopes,\n fetchFn,\n ctxPath,\n };\n }\n\n invariant(url, \"url is required\");\n invariant(redirect_uri, \"redirectUrl is required\");\n\n // Assign defaults\n return {\n useHistory: options.useHistory ?? true,\n loginPage: options.loginPage,\n postLoginPage: options.postLoginPage || window.location.toString(),\n joinedScopes: [\n ...options.scopes\n ?? [\n \"api:read-data\",\n \"api:write-data\",\n \"api:use-ontologies-read\",\n \"api:use-ontologies-write\",\n ],\n ]\n .sort().join(\" \"),\n fetchFn: options.fetchFn ?? globalThis.fetch,\n ctxPath: options.ctxPath ?? \"multipass\",\n refreshTokenMarker: options.refreshTokenMarker,\n tokenStorage: options.tokenStorage ?? \"localStorage\",\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,SAAS,MAAM,gBAAgB;AAgBtC,OAAO,SAASC,+BAA+BA,CAC7CC,GAAW,EACXC,YAAoB,EACpBC,UAA+C,EAC/CC,SAAkB,EAClBC,aAAsB,EACtBC,MAAiB,EACjBC,OAAiC,EACjCC,OAAgB,EACmB;EACnC,IAAIC,OAAiC,GAAG,CAAC,CAAC;EAE1C,IAAI,OAAON,UAAU,KAAK,QAAQ,EAAE;IAClC,EACE,CAACC,SAAS,IAAI,CAACC,aAAa,IAAI,CAACC,MAAM,IAAI,CAACC,OAAO,IAAI,CAACC,OAAO,IAAAE,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBADjEb,SAAS,QAEP,kEAAkE,IAFpEA,SAAS;IAITU,OAAO,GAAGN,UAAU;EACtB,CAAC,MAAM;IACLM,OAAO,GAAG;MACRN,UAAU;MACVC,SAAS;MACTC,aAAa;MACbC,MAAM;MACNC,OAAO;MACPC;IACF,CAAC;EACH;EAEA,CAAUP,GAAG,GAAAS,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBAAbb,SAAS,QAAM,iBAAiB,IAAhCA,SAAS;EACT,CAAUG,YAAY,GAAAQ,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBAAtBb,SAAS,QAAe,yBAAyB,IAAjDA,SAAS;;EAET;EACA,OAAO;IACLI,UAAU,EAAEM,OAAO,CAACN,UAAU,IAAI,IAAI;IACtCC,SAAS,EAAEK,OAAO,CAACL,SAAS;IAC5BC,aAAa,EAAEI,OAAO,CAACJ,aAAa,IAAIQ,MAAM,CAACC,QAAQ,CAACC,QAAQ,CAAC,CAAC;IAClEC,YAAY,EAAE,CACZ,IAAGP,OAAO,CAACH,MAAM,IACZ,CACD,eAAe,EACf,gBAAgB,EAChB,yBAAyB,EACzB,0BAA0B,CAC3B,EACJ,CACEW,IAAI,CAAC,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC;IACnBX,OAAO,EAAEE,OAAO,CAACF,OAAO,IAAIY,UAAU,CAACC,KAAK;IAC5CZ,OAAO,EAAEC,OAAO,CAACD,OAAO,IAAI,WAAW;IACvCa,kBAAkB,EAAEZ,OAAO,CAACY,kBAAkB;IAC9CC,YAAY,EAAEb,OAAO,CAACa,YAAY,IAAI;EACxC,CAAC;AACH","ignoreList":[]}
@@ -6,6 +6,14 @@ export interface LocalStorageState {
6
6
  refreshTokenMarker?: string;
7
7
  requestedScopes?: string;
8
8
  }
9
+ /**
10
+ * Specifies where to store refresh tokens.
11
+ *
12
+ * - `'localStorage'`: Tokens persist across browser sessions. Best UX but vulnerable on shared devices without browser separation.
13
+ * - `'sessionStorage'`: Tokens cleared when browser/tab closes. Recommended for shared devices.
14
+ * - `'none'`: Tokens never stored. Users re-authenticate on every page load.
15
+ */
16
+ export type TokenStorageType = "localStorage" | "sessionStorage" | "none";
9
17
  export type SessionStorageState = {
10
18
  codeVerifier?: never
11
19
  state?: never
@@ -19,13 +27,20 @@ export type SessionStorageState = {
19
27
  state?: never
20
28
  oldUrl?: never
21
29
  };
22
- export declare function saveLocal(client: Client, x: LocalStorageState): void;
23
- export declare function removeLocal(client: Client): void;
24
- export declare function readLocal(client: Client): LocalStorageState;
30
+ /**
31
+ * Returns the appropriate Storage object based on the storage type.
32
+ * Returns undefined if storage type is 'none' or if running in Node.js (where storage APIs don't exist).
33
+ *
34
+ * Call this once at client initialization and pass the result to storage functions.
35
+ */
36
+ export declare function getStorage(storageType: TokenStorageType): Storage | undefined;
37
+ export declare function saveLocal(client: Client, x: LocalStorageState, storage: Storage | undefined): void;
38
+ export declare function removeLocal(client: Client, storage: Storage | undefined): void;
39
+ export declare function readLocal(client: Client, storage: Storage | undefined): LocalStorageState;
25
40
  export declare function saveSession(client: Client, x: SessionStorageState): void;
26
41
  export declare function removeSession(client: Client): void;
27
42
  export declare function readSession(client: Client): SessionStorageState;
28
- export declare function common<R extends undefined | (() => Promise<Token | undefined>)>(client: Client, as: AuthorizationServer, _signIn: () => Promise<Token>, oauthHttpOptions: HttpRequestOptions, refresh: R, refreshTokenMarker: string | undefined, scopes: string): {
43
+ export declare function common<R extends undefined | (() => Promise<Token | undefined>)>(client: Client, as: AuthorizationServer, _signIn: () => Promise<Token>, oauthHttpOptions: HttpRequestOptions, refresh: R, refreshTokenMarker: string | undefined, scopes: string, storage: Storage | undefined): {
29
44
  getToken: BaseOauthClient<keyof Events & string> & {
30
45
  refresh: R
31
46
  }
@@ -1 +1 @@
1
- {"mappings":"AAgBA,cACE,qBACA,QACA,oBACA,mCACK,cAAe;AAItB,cAAc,iBAAiB,cAAc,sBAAuB;AAEpE,cAAc,aAAa,YAAa;AAwBxC,iBAAiB,kBAAkB;CACjC;CACA;CAGA;AACD;AAED,YAAY,sBAER;CACA;CACA;CACA;AACD,IAEC;CACA;CACA;CACA;AACD,IAEC;CACA;CACA;CACA;AACD;AAMH,OAAO,iBAAS,UAAUA,QAAQ,QAAQC,GAAG;AAQ7C,OAAO,iBAAS,YAAYD,QAAQ;AAOpC,OAAO,iBAAS,UAAUA,QAAQ,SAAS;AAU3C,OAAO,iBAAS,YAAYA,QAAQ,QAAQE,GAAG;AAQ/C,OAAO,iBAAS,cAAcF,QAAQ;AAOtC,OAAO,iBAAS,YAAYA,QAAQ,SAAS;AAU7C,OAAO,iBAAS,OACd,6BAA6B,QAAQ,qBAErCA,QAAQ,QACRG,IAAI,qBACJC,eAAe,QAAQ,QACvBC,kBAAkB,oBAClBC,SAAS,GACTC,wCACAC,iBACC;CACD,UAAU,sBAAsB,mBAAmB;EAAE,SAAS;CAAG;CACjE,0BACEC,MAAM,6BACNC,MAAM,WAAW,cACd;AACN;AAgHD,OAAO,iBAAS,0BACdC,iBACAC,cACC,SACD,KACE,qBACE,WACA,mBACA,2BACA","names":["client: Client","x: LocalStorageState","x: SessionStorageState","as: AuthorizationServer","_signIn: () => Promise<Token>","oauthHttpOptions: HttpRequestOptions","refresh: R","refreshTokenMarker: string | undefined","scopes: string","resp: OAuth2TokenEndpointResponse","type: \"signIn\" | \"refresh\"","ctxPath: string","url: string"],"sources":["../../src/common.ts"],"version":3,"file":"common.d.ts"}
1
+ {"mappings":"AAgBA,cACE,qBACA,QACA,oBACA,mCACK,cAAe;AAItB,cAAc,iBAAiB,cAAc,sBAAuB;AAEpE,cAAc,aAAa,YAAa;AAwBxC,iBAAiB,kBAAkB;CACjC;CACA;CAGA;AACD;;;;;;;;AASD,YAAY,mBAAmB,iBAAiB,mBAAmB;AAEnE,YAAY,sBAER;CACA;CACA;CACA;AACD,IAEC;CACA;CACA;CACA;AACD,IAEC;CACA;CACA;CACA;AACD;;;;;;;AAYH,OAAO,iBAAS,WACdA,aAAa,mBACZ;AAYH,OAAO,iBAAS,UACdC,QAAQ,QACRC,GAAG,mBACHC,SAAS;AAQX,OAAO,iBAAS,YACdF,QAAQ,QACRE,SAAS;AAOX,OAAO,iBAAS,UACdF,QAAQ,QACRE,SAAS,sBACR;AASH,OAAO,iBAAS,YAAYF,QAAQ,QAAQG,GAAG;AAQ/C,OAAO,iBAAS,cAAcH,QAAQ;AAOtC,OAAO,iBAAS,YAAYA,QAAQ,SAAS;AAU7C,OAAO,iBAAS,OACd,6BAA6B,QAAQ,qBAErCA,QAAQ,QACRI,IAAI,qBACJC,eAAe,QAAQ,QACvBC,kBAAkB,oBAClBC,SAAS,GACTC,wCACAC,gBACAP,SAAS,sBACR;CACD,UAAU,sBAAsB,mBAAmB;EAAE,SAAS;CAAG;CACjE,0BACEQ,MAAM,6BACNC,MAAM,WAAW,cACd;AACN;AAgHD,OAAO,iBAAS,0BACdC,iBACAC,cACC,SACD,KACE,qBACE,WACA,mBACA,2BACA","names":["storageType: TokenStorageType","client: Client","x: LocalStorageState","storage: Storage | undefined","x: SessionStorageState","as: AuthorizationServer","_signIn: () => Promise<Token>","oauthHttpOptions: HttpRequestOptions","refresh: R","refreshTokenMarker: string | undefined","scopes: string","resp: OAuth2TokenEndpointResponse","type: \"signIn\" | \"refresh\"","ctxPath: string","url: string"],"sources":["../../src/common.ts"],"version":3,"file":"common.d.ts"}
@@ -1,3 +1,4 @@
1
+ import type { TokenStorageType } from "./common.js";
1
2
  import type { PublicOauthClient } from "./PublicOauthClient.js";
2
3
  export interface PublicOauthClientOptions {
3
4
  /**
@@ -28,6 +29,21 @@ export interface PublicOauthClientOptions {
28
29
  * Allows for an additional value to be appended to the local storage key for the refresh token.
29
30
  */
30
31
  refreshTokenMarker?: string;
32
+ /**
33
+ * Controls how refresh tokens are stored. Affects security vs. convenience tradeoff.
34
+ *
35
+ * - `'localStorage'` (default): Tokens persist across browser sessions.
36
+ * Best UX but vulnerable on shared devices.
37
+ *
38
+ * - `'sessionStorage'`: Tokens cleared when browser/tab closes.
39
+ * Recommended for shared devices. Users re-authenticate each browser session.
40
+ *
41
+ * - `'none'`: Tokens never stored. Users re-authenticate on every page load.
42
+ * Most secure but worst UX. Does not request `offline_access` scope.
43
+ *
44
+ * @default 'localStorage'
45
+ */
46
+ tokenStorage?: TokenStorageType;
31
47
  }
32
48
  /**
33
49
  * Creates a PublicOauthClient for authentication.
@@ -1 +1 @@
1
- {"mappings":"AAsCA,cAAc,yBAAyB,wBAAyB;AAYhE,iBAAiB,yBAAyB;;;;CAIxC;;;;CAKA;;;;CAKA;;;;CAKA;;;;CAKA,iBAAiB,WAAW;;;;CAK5B;;;;CAKA;AACD;;;;;;;;;;AAWD,OAAO,iBAAS,wBACdA,kBACAC,aACAC,qBACAC,UAAU,2BACT;;;;;;;;;;;;;;;AAgBH,OAAO,iBAAS,wBACdC,mBACAH,aACAC,qBACAG,sBACAC,oBACAC,wBACAC,mBACAC,iBAAiB,WAAW,OAC5BC,mBACC","names":["clientId: string","url: string","redirectUrl: string","options?: PublicOauthClientOptions","client_id: string","useHistory?: boolean","loginPage?: string","postLoginPage?: string","scopes?: string[]","fetchFn?: typeof globalThis.fetch","ctxPath?: string"],"sources":["../../src/createPublicOauthClient.ts"],"version":3,"file":"createPublicOauthClient.d.ts"}
1
+ {"mappings":"AAuCA,cAAc,wBAAwB,aAAc;AACpD,cAAc,yBAAyB,wBAAyB;AAYhE,iBAAiB,yBAAyB;;;;CAIxC;;;;CAKA;;;;CAKA;;;;CAKA;;;;CAKA,iBAAiB,WAAW;;;;CAK5B;;;;CAKA;;;;;;;;;;;;;;;CAgBA,eAAe;AAChB;;;;;;;;;;AAWD,OAAO,iBAAS,wBACdA,kBACAC,aACAC,qBACAC,UAAU,2BACT;;;;;;;;;;;;;;;AAgBH,OAAO,iBAAS,wBACdC,mBACAH,aACAC,qBACAG,sBACAC,oBACAC,wBACAC,mBACAC,iBAAiB,WAAW,OAC5BC,mBACC","names":["clientId: string","url: string","redirectUrl: string","options?: PublicOauthClientOptions","client_id: string","useHistory?: boolean","loginPage?: string","postLoginPage?: string","scopes?: string[]","fetchFn?: typeof globalThis.fetch","ctxPath?: string"],"sources":["../../src/createPublicOauthClient.ts"],"version":3,"file":"createPublicOauthClient.d.ts"}
@@ -1,4 +1,5 @@
1
+ export type { TokenStorageType } from "./common.js";
1
2
  export type { ConfidentialOauthClient } from "./ConfidentialOauthClient.js";
2
3
  export { createConfidentialOauthClient } from "./createConfidentialOauthClient.js";
3
- export { createPublicOauthClient } from "./createPublicOauthClient.js";
4
+ export { createPublicOauthClient, type PublicOauthClientOptions } from "./createPublicOauthClient.js";
4
5
  export type { PublicOauthClient } from "./PublicOauthClient.js";
@@ -1 +1 @@
1
- {"mappings":"AAgBA,cAAc,+BAA+B;AAC7C,SAAS,qCAAqC;AAC9C,SAAS,+BAA+B;AACxC,cAAc,yBAAyB","names":[],"sources":["../../src/index.ts"],"version":3,"file":"index.d.ts"}
1
+ {"mappings":"AAgBA,cAAc,wBAAwB;AACtC,cAAc,+BAA+B;AAC7C,SAAS,qCAAqC;AAC9C,SACE,8BACK,gCACA;AACP,cAAc,yBAAyB","names":[],"sources":["../../src/index.ts"],"version":3,"file":"index.d.ts"}
@@ -1,8 +1,10 @@
1
+ import type { TokenStorageType } from "./common.js";
1
2
  import type { PublicOauthClientOptions } from "./createPublicOauthClient.js";
2
- interface ProcessedPublicOauthClientOptions extends Omit<Required<PublicOauthClientOptions>, "loginPage" | "refreshTokenMarker" | "scopes"> {
3
+ interface ProcessedPublicOauthClientOptions extends Omit<Required<PublicOauthClientOptions>, "loginPage" | "refreshTokenMarker" | "scopes" | "tokenStorage"> {
3
4
  loginPage?: string;
4
5
  refreshTokenMarker?: string;
5
6
  joinedScopes: string;
7
+ tokenStorage: TokenStorageType;
6
8
  }
7
9
  export declare function processOptionsAndAssignDefaults(url: string, redirect_uri: string, useHistory?: boolean | PublicOauthClientOptions, loginPage?: string, postLoginPage?: string, scopes?: string[], fetchFn?: typeof globalThis.fetch, ctxPath?: string): ProcessedPublicOauthClientOptions;
8
10
  export {};
@@ -1 +1 @@
1
- {"mappings":"AAiBA,cAAc,gCAAgC,8BAA+B;UAEnE,0CACR,KACE,SAAS,2BACT,cAAc,uBAAuB,UAEzC;CACE;CACA;CACA;AACD;AAED,OAAO,iBAAS,gCACdA,aACAC,sBACAC,uBAAuB,0BACvBC,oBACAC,wBACAC,mBACAC,iBAAiB,WAAW,OAC5BC,mBACC","names":["url: string","redirect_uri: string","useHistory?: boolean | PublicOauthClientOptions","loginPage?: string","postLoginPage?: string","scopes?: string[]","fetchFn?: typeof globalThis.fetch","ctxPath?: string"],"sources":["../../src/utils.ts"],"version":3,"file":"utils.d.ts"}
1
+ {"mappings":"AAiBA,cAAc,wBAAwB,aAAc;AACpD,cAAc,gCAAgC,8BAA+B;UAEnE,0CACR,KACE,SAAS,2BACT,cAAc,uBAAuB,WAAW,gBAEpD;CACE;CACA;CACA;CACA,cAAc;AACf;AAED,OAAO,iBAAS,gCACdA,aACAC,sBACAC,uBAAuB,0BACvBC,oBACAC,wBACAC,mBACAC,iBAAiB,WAAW,OAC5BC,mBACC","names":["url: string","redirect_uri: string","useHistory?: boolean | PublicOauthClientOptions","loginPage?: string","postLoginPage?: string","scopes?: string[]","fetchFn?: typeof globalThis.fetch","ctxPath?: string"],"sources":["../../src/utils.ts"],"version":3,"file":"utils.d.ts"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@osdk/oauth",
3
- "version": "1.8.0-beta.1",
3
+ "version": "1.8.0-beta.2",
4
4
  "license": "Apache-2.0",
5
5
  "repository": {
6
6
  "type": "git",
@@ -34,8 +34,8 @@
34
34
  },
35
35
  "devDependencies": {
36
36
  "typescript": "~5.5.4",
37
- "@osdk/monorepo.tsconfig": "~0.7.0-beta.1",
38
- "@osdk/monorepo.api-extractor": "~0.7.0-beta.1"
37
+ "@osdk/monorepo.api-extractor": "~0.7.0-beta.1",
38
+ "@osdk/monorepo.tsconfig": "~0.7.0-beta.1"
39
39
  },
40
40
  "publishConfig": {
41
41
  "access": "public"