antarctic 0.5.0 → 0.6.0

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 (131) hide show
  1. package/dist/auth.d.ts +19 -0
  2. package/dist/auth.js +20 -0
  3. package/dist/index.d.ts +1 -1
  4. package/dist/providers/42.d.ts +3 -3
  5. package/dist/providers/42.js +8 -6
  6. package/dist/providers/amazon-cognito.d.ts +3 -3
  7. package/dist/providers/amazon-cognito.js +8 -6
  8. package/dist/providers/anilist.d.ts +3 -3
  9. package/dist/providers/anilist.js +8 -6
  10. package/dist/providers/apple.d.ts +3 -3
  11. package/dist/providers/apple.js +8 -6
  12. package/dist/providers/atlassian.d.ts +3 -3
  13. package/dist/providers/atlassian.js +8 -6
  14. package/dist/providers/auth0.d.ts +3 -3
  15. package/dist/providers/auth0.js +8 -6
  16. package/dist/providers/authentik.d.ts +3 -3
  17. package/dist/providers/authentik.js +8 -6
  18. package/dist/providers/autodesk.d.ts +3 -3
  19. package/dist/providers/autodesk.js +8 -6
  20. package/dist/providers/battlenet.d.ts +3 -3
  21. package/dist/providers/battlenet.js +8 -6
  22. package/dist/providers/bitbucket.d.ts +3 -3
  23. package/dist/providers/bitbucket.js +8 -6
  24. package/dist/providers/box.d.ts +3 -3
  25. package/dist/providers/box.js +8 -6
  26. package/dist/providers/bungie.d.ts +3 -3
  27. package/dist/providers/bungie.js +8 -6
  28. package/dist/providers/coinbase.d.ts +3 -3
  29. package/dist/providers/coinbase.js +8 -6
  30. package/dist/providers/discord.d.ts +3 -3
  31. package/dist/providers/discord.js +8 -6
  32. package/dist/providers/donation-alerts.d.ts +3 -3
  33. package/dist/providers/donation-alerts.js +8 -6
  34. package/dist/providers/dribbble.d.ts +3 -3
  35. package/dist/providers/dribbble.js +8 -6
  36. package/dist/providers/dropbox.d.ts +3 -3
  37. package/dist/providers/dropbox.js +8 -6
  38. package/dist/providers/epicgames.d.ts +3 -3
  39. package/dist/providers/epicgames.js +8 -6
  40. package/dist/providers/etsy.d.ts +3 -3
  41. package/dist/providers/etsy.js +8 -6
  42. package/dist/providers/facebook.d.ts +3 -3
  43. package/dist/providers/facebook.js +8 -6
  44. package/dist/providers/figma.d.ts +3 -3
  45. package/dist/providers/figma.js +8 -6
  46. package/dist/providers/gitea.d.ts +3 -3
  47. package/dist/providers/gitea.js +8 -6
  48. package/dist/providers/github.d.ts +3 -3
  49. package/dist/providers/github.js +8 -6
  50. package/dist/providers/gitlab.d.ts +3 -3
  51. package/dist/providers/gitlab.js +8 -6
  52. package/dist/providers/google.d.ts +3 -3
  53. package/dist/providers/google.js +8 -6
  54. package/dist/providers/intuit.d.ts +3 -3
  55. package/dist/providers/intuit.js +8 -6
  56. package/dist/providers/kakao.d.ts +3 -3
  57. package/dist/providers/kakao.js +8 -6
  58. package/dist/providers/keycloak.d.ts +3 -3
  59. package/dist/providers/keycloak.js +8 -6
  60. package/dist/providers/kick.d.ts +3 -3
  61. package/dist/providers/kick.js +8 -6
  62. package/dist/providers/lichess.d.ts +3 -3
  63. package/dist/providers/lichess.js +8 -6
  64. package/dist/providers/line.d.ts +3 -3
  65. package/dist/providers/line.js +8 -6
  66. package/dist/providers/linear.d.ts +3 -3
  67. package/dist/providers/linear.js +8 -6
  68. package/dist/providers/linkedin.d.ts +3 -3
  69. package/dist/providers/linkedin.js +8 -6
  70. package/dist/providers/mastodon.d.ts +3 -3
  71. package/dist/providers/mastodon.js +8 -6
  72. package/dist/providers/mercadolibre.d.ts +3 -3
  73. package/dist/providers/mercadolibre.js +8 -6
  74. package/dist/providers/mercadopago.d.ts +3 -3
  75. package/dist/providers/mercadopago.js +8 -6
  76. package/dist/providers/microsoft-entra-id.d.ts +3 -3
  77. package/dist/providers/microsoft-entra-id.js +8 -6
  78. package/dist/providers/myanimelist.d.ts +3 -3
  79. package/dist/providers/myanimelist.js +8 -6
  80. package/dist/providers/naver.d.ts +3 -3
  81. package/dist/providers/naver.js +8 -6
  82. package/dist/providers/notion.d.ts +3 -3
  83. package/dist/providers/notion.js +8 -6
  84. package/dist/providers/okta.d.ts +3 -3
  85. package/dist/providers/okta.js +8 -6
  86. package/dist/providers/osu.d.ts +3 -3
  87. package/dist/providers/osu.js +8 -6
  88. package/dist/providers/patreon.d.ts +3 -3
  89. package/dist/providers/patreon.js +8 -6
  90. package/dist/providers/polar.d.ts +3 -3
  91. package/dist/providers/polar.js +8 -6
  92. package/dist/providers/reddit.d.ts +3 -3
  93. package/dist/providers/reddit.js +8 -6
  94. package/dist/providers/roblox.d.ts +3 -3
  95. package/dist/providers/roblox.js +8 -6
  96. package/dist/providers/salesforce.d.ts +3 -3
  97. package/dist/providers/salesforce.js +8 -6
  98. package/dist/providers/shikimori.d.ts +3 -3
  99. package/dist/providers/shikimori.js +8 -6
  100. package/dist/providers/slack.d.ts +3 -3
  101. package/dist/providers/slack.js +8 -6
  102. package/dist/providers/spotify.d.ts +3 -3
  103. package/dist/providers/spotify.js +8 -6
  104. package/dist/providers/startgg.d.ts +3 -3
  105. package/dist/providers/startgg.js +8 -6
  106. package/dist/providers/strava.d.ts +3 -3
  107. package/dist/providers/strava.js +8 -6
  108. package/dist/providers/tiktok.d.ts +3 -3
  109. package/dist/providers/tiktok.js +8 -6
  110. package/dist/providers/tiltify.d.ts +3 -3
  111. package/dist/providers/tiltify.js +8 -6
  112. package/dist/providers/tumblr.d.ts +3 -3
  113. package/dist/providers/tumblr.js +8 -6
  114. package/dist/providers/twitch.d.ts +3 -3
  115. package/dist/providers/twitch.js +8 -6
  116. package/dist/providers/twitter.d.ts +3 -3
  117. package/dist/providers/twitter.js +8 -6
  118. package/dist/providers/vk.d.ts +3 -3
  119. package/dist/providers/vk.js +8 -6
  120. package/dist/providers/withings.d.ts +3 -3
  121. package/dist/providers/withings.js +8 -6
  122. package/dist/providers/workos.d.ts +3 -3
  123. package/dist/providers/workos.js +8 -6
  124. package/dist/providers/yahoo.d.ts +3 -3
  125. package/dist/providers/yahoo.js +8 -6
  126. package/dist/providers/yandex.d.ts +3 -3
  127. package/dist/providers/yandex.js +8 -6
  128. package/dist/providers/zoom.d.ts +3 -3
  129. package/dist/providers/zoom.js +8 -6
  130. package/package.json +1 -1
  131. package/readme.md +12 -2
@@ -1,5 +1,5 @@
1
1
  import type { OAuth2Tokens } from "../oauth2.js";
2
- import type { OAuthCallbackQuery, OAuthUser, ProviderOptions } from "../auth.js";
2
+ import type { AuthorizationRequest, OAuthCallbackQuery, OAuthUser, ProviderOptions, SavedOAuthState } from "../auth.js";
3
3
  export interface RobloxOptions extends ProviderOptions {
4
4
  }
5
5
  export declare class Roblox {
@@ -11,6 +11,6 @@ export declare class Roblox {
11
11
  validateAuthorizationCode(code: string, codeVerifier: string): Promise<OAuth2Tokens>;
12
12
  refreshAccessToken(refreshToken: string): Promise<OAuth2Tokens>;
13
13
  revokeToken(token: string): Promise<void>;
14
- getAuthorizationURL(scopes?: string[]): Promise<URL>;
15
- getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
14
+ getAuthorizationURL(scopes?: string[]): Promise<AuthorizationRequest>;
15
+ getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
16
16
  }
@@ -1,6 +1,6 @@
1
1
  import { OAuth2Client, CodeChallengeMethod } from "../client.js";
2
2
  import { decodeIdToken } from "../oidc.js";
3
- import { consumeOAuthState, fetchUserProfile, generateOAuthCodeVerifier, generateOAuthState, InvalidOAuthCallbackError, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveScopes, saveOAuthState } from "../auth.js";
3
+ import { extractOAuthTokens, fetchUserProfile, generateOAuthCodeVerifier, generateOAuthState, InvalidOAuthCallbackError, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
4
4
  const authorizationEndpoint = "https://apis.roblox.com/oauth/v1/authorize";
5
5
  const tokenEndpoint = "https://apis.roblox.com/oauth/v1/token";
6
6
  const tokenRevocationEndpoint = "https://apis.roblox.com/oauth/v1/token/revoke";
@@ -39,13 +39,14 @@ export class Roblox {
39
39
  const state = generateOAuthState();
40
40
  const codeVerifier = generateOAuthCodeVerifier();
41
41
  const url = await this.createAuthorizationURL(state, codeVerifier, resolveScopes(scopes, auth, defaultScopes));
42
- await saveOAuthState(auth.store, state, { codeVerifier });
43
- return url;
42
+ const payload = { codeVerifier };
43
+ await saveOAuthState(auth.store, state, payload);
44
+ return { url, state, payload };
44
45
  }
45
- async getUser(query) {
46
+ async getUser(query, saved) {
46
47
  const auth = requireAuthConfig(this.auth);
47
48
  const { code, state } = parseCallbackQuery(query);
48
- const stored = await consumeOAuthState(auth.store, state);
49
+ const stored = await resolveOAuthState(auth.store, state, saved);
49
50
  if (typeof stored.codeVerifier !== "string") {
50
51
  throw new InvalidOAuthCallbackError("Missing PKCE code verifier for OAuth state");
51
52
  }
@@ -62,7 +63,8 @@ export class Roblox {
62
63
  name: profileString(claims.name) ?? profileString(claims.preferred_username),
63
64
  email: null,
64
65
  image: profileString(claims.picture),
65
- raw: claims
66
+ raw: claims,
67
+ ...extractOAuthTokens(tokens)
66
68
  };
67
69
  }
68
70
  }
@@ -1,5 +1,5 @@
1
1
  import type { OAuth2Tokens } from "../oauth2.js";
2
- import type { OAuthCallbackQuery, OAuthUser, ProviderOptions } from "../auth.js";
2
+ import type { AuthorizationRequest, OAuthCallbackQuery, OAuthUser, ProviderOptions, SavedOAuthState } from "../auth.js";
3
3
  export interface SalesforceOptions extends ProviderOptions {
4
4
  domain?: string;
5
5
  }
@@ -16,6 +16,6 @@ export declare class Salesforce {
16
16
  validateAuthorizationCode(code: string, codeVerifier: string): Promise<OAuth2Tokens>;
17
17
  refreshAccessToken(refreshToken: string): Promise<OAuth2Tokens>;
18
18
  revokeToken(token: string): Promise<void>;
19
- getAuthorizationURL(scopes?: string[]): Promise<URL>;
20
- getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
19
+ getAuthorizationURL(scopes?: string[]): Promise<AuthorizationRequest>;
20
+ getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
21
21
  }
@@ -1,6 +1,6 @@
1
1
  import { OAuth2Client, CodeChallengeMethod } from "../client.js";
2
2
  import { decodeIdToken } from "../oidc.js";
3
- import { consumeOAuthState, fetchUserProfile, generateOAuthCodeVerifier, generateOAuthState, InvalidOAuthCallbackError, parseCallbackQuery, profileId, profileString, requireAuthConfig, requireProviderOption, resolveAuthConfig, resolveScopes, saveOAuthState } from "../auth.js";
3
+ import { extractOAuthTokens, fetchUserProfile, generateOAuthCodeVerifier, generateOAuthState, InvalidOAuthCallbackError, parseCallbackQuery, profileId, profileString, requireAuthConfig, requireProviderOption, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
4
4
  const envPrefix = "SALESFORCE";
5
5
  const defaultScopes = ["openid", "profile", "email"];
6
6
  export class Salesforce {
@@ -46,13 +46,14 @@ export class Salesforce {
46
46
  const state = generateOAuthState();
47
47
  const codeVerifier = generateOAuthCodeVerifier();
48
48
  const url = await this.createAuthorizationURL(state, codeVerifier, resolveScopes(scopes, auth, defaultScopes));
49
- await saveOAuthState(auth.store, state, { codeVerifier });
50
- return url;
49
+ const payload = { codeVerifier };
50
+ await saveOAuthState(auth.store, state, payload);
51
+ return { url, state, payload };
51
52
  }
52
- async getUser(query) {
53
+ async getUser(query, saved) {
53
54
  const auth = requireAuthConfig(this.auth);
54
55
  const { code, state } = parseCallbackQuery(query);
55
- const stored = await consumeOAuthState(auth.store, state);
56
+ const stored = await resolveOAuthState(auth.store, state, saved);
56
57
  if (typeof stored.codeVerifier !== "string") {
57
58
  throw new InvalidOAuthCallbackError("Missing PKCE code verifier for OAuth state");
58
59
  }
@@ -69,7 +70,8 @@ export class Salesforce {
69
70
  name: profileString(claims.name) ?? profileString(claims.preferred_username),
70
71
  email: profileString(claims.email),
71
72
  image: profileString(claims.picture),
72
- raw: claims
73
+ raw: claims,
74
+ ...extractOAuthTokens(tokens)
73
75
  };
74
76
  }
75
77
  }
@@ -1,5 +1,5 @@
1
1
  import type { OAuth2Tokens } from "../oauth2.js";
2
- import type { OAuthCallbackQuery, OAuthUser, ProviderOptions } from "../auth.js";
2
+ import type { AuthorizationRequest, OAuthCallbackQuery, OAuthUser, ProviderOptions, SavedOAuthState } from "../auth.js";
3
3
  export interface ShikimoriOptions extends ProviderOptions {
4
4
  }
5
5
  export declare class Shikimori {
@@ -12,6 +12,6 @@ export declare class Shikimori {
12
12
  createAuthorizationURL(state: string): URL;
13
13
  validateAuthorizationCode(code: string): Promise<OAuth2Tokens>;
14
14
  refreshAccessToken(refreshToken: string): Promise<OAuth2Tokens>;
15
- getAuthorizationURL(): Promise<URL>;
16
- getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
15
+ getAuthorizationURL(): Promise<AuthorizationRequest>;
16
+ getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
17
17
  }
@@ -1,5 +1,5 @@
1
1
  import { createOAuth2Request, sendTokenRequest } from "../request.js";
2
- import { consumeOAuthState, fetchUserProfile, generateOAuthState, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, saveOAuthState } from "../auth.js";
2
+ import { extractOAuthTokens, fetchUserProfile, generateOAuthState, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveOAuthState, saveOAuthState } from "../auth.js";
3
3
  const authorizationEndpoint = "https://shikimori.one/oauth/authorize";
4
4
  const tokenEndpoint = "https://shikimori.one/oauth/token";
5
5
  const userEndpoint = "https://shikimori.one/api/users/whoami";
@@ -58,13 +58,14 @@ export class Shikimori {
58
58
  const auth = requireAuthConfig(this.auth);
59
59
  const state = generateOAuthState();
60
60
  const url = this.createAuthorizationURL(state);
61
- await saveOAuthState(auth.store, state, {});
62
- return url;
61
+ const payload = {};
62
+ await saveOAuthState(auth.store, state, payload);
63
+ return { url, state, payload };
63
64
  }
64
- async getUser(query) {
65
+ async getUser(query, saved) {
65
66
  const auth = requireAuthConfig(this.auth);
66
67
  const { code, state } = parseCallbackQuery(query);
67
- await consumeOAuthState(auth.store, state);
68
+ await resolveOAuthState(auth.store, state, saved);
68
69
  const tokens = await this.validateAuthorizationCode(code);
69
70
  const profile = await fetchUserProfile(userEndpoint, tokens.accessToken());
70
71
  let image = null;
@@ -76,7 +77,8 @@ export class Shikimori {
76
77
  name: profileString(profile.nickname),
77
78
  email: null,
78
79
  image: image ?? profileString(profile.avatar),
79
- raw: profile
80
+ raw: profile,
81
+ ...extractOAuthTokens(tokens)
80
82
  };
81
83
  }
82
84
  }
@@ -1,5 +1,5 @@
1
1
  import type { OAuth2Tokens } from "../oauth2.js";
2
- import type { OAuthCallbackQuery, OAuthUser, ProviderOptions } from "../auth.js";
2
+ import type { AuthorizationRequest, OAuthCallbackQuery, OAuthUser, ProviderOptions, SavedOAuthState } from "../auth.js";
3
3
  export interface SlackOptions extends ProviderOptions {
4
4
  }
5
5
  export declare class Slack {
@@ -9,6 +9,6 @@ export declare class Slack {
9
9
  constructor(clientId: string, clientSecret: string, redirectURI: string | null);
10
10
  createAuthorizationURL(state: string, scopes: string[]): URL;
11
11
  validateAuthorizationCode(code: string): Promise<OAuth2Tokens>;
12
- getAuthorizationURL(scopes?: string[]): Promise<URL>;
13
- getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
12
+ getAuthorizationURL(scopes?: string[]): Promise<AuthorizationRequest>;
13
+ getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
14
14
  }
@@ -1,6 +1,6 @@
1
1
  import { OAuth2Client } from "../client.js";
2
2
  import { decodeIdToken } from "../oidc.js";
3
- import { consumeOAuthState, fetchUserProfile, generateOAuthState, OAuthProviderError, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveScopes, saveOAuthState } from "../auth.js";
3
+ import { extractOAuthTokens, fetchUserProfile, generateOAuthState, OAuthProviderError, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
4
4
  const authorizationEndpoint = "https://slack.com/openid/connect/authorize";
5
5
  const tokenEndpoint = "https://slack.com/api/openid.connect.token";
6
6
  const userinfoEndpoint = "https://slack.com/api/openid.connect.userInfo";
@@ -30,13 +30,14 @@ export class Slack {
30
30
  const auth = requireAuthConfig(this.auth);
31
31
  const state = generateOAuthState();
32
32
  const url = this.createAuthorizationURL(state, resolveScopes(scopes, auth, defaultScopes));
33
- await saveOAuthState(auth.store, state, {});
34
- return url;
33
+ const payload = {};
34
+ await saveOAuthState(auth.store, state, payload);
35
+ return { url, state, payload };
35
36
  }
36
- async getUser(query) {
37
+ async getUser(query, saved) {
37
38
  const auth = requireAuthConfig(this.auth);
38
39
  const { code, state } = parseCallbackQuery(query);
39
- await consumeOAuthState(auth.store, state);
40
+ await resolveOAuthState(auth.store, state, saved);
40
41
  const tokens = await this.validateAuthorizationCode(code);
41
42
  let claims;
42
43
  if ("id_token" in tokens.data) {
@@ -54,7 +55,8 @@ export class Slack {
54
55
  name: profileString(claims.name),
55
56
  email: profileString(claims.email),
56
57
  image: profileString(claims.picture),
57
- raw: claims
58
+ raw: claims,
59
+ ...extractOAuthTokens(tokens)
58
60
  };
59
61
  }
60
62
  }
@@ -1,5 +1,5 @@
1
1
  import type { OAuth2Tokens } from "../oauth2.js";
2
- import type { OAuthCallbackQuery, OAuthUser, ProviderOptions } from "../auth.js";
2
+ import type { AuthorizationRequest, OAuthCallbackQuery, OAuthUser, ProviderOptions, SavedOAuthState } from "../auth.js";
3
3
  export interface SpotifyOptions extends ProviderOptions {
4
4
  }
5
5
  export declare class Spotify {
@@ -10,6 +10,6 @@ export declare class Spotify {
10
10
  createAuthorizationURL(state: string, codeVerifier: string | null, scopes: string[]): Promise<URL>;
11
11
  validateAuthorizationCode(code: string, codeVerifier: string | null): Promise<OAuth2Tokens>;
12
12
  refreshAccessToken(refreshToken: string): Promise<OAuth2Tokens>;
13
- getAuthorizationURL(scopes?: string[]): Promise<URL>;
14
- getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
13
+ getAuthorizationURL(scopes?: string[]): Promise<AuthorizationRequest>;
14
+ getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
15
15
  }
@@ -1,5 +1,5 @@
1
1
  import { CodeChallengeMethod, OAuth2Client } from "../client.js";
2
- import { consumeOAuthState, fetchUserProfile, generateOAuthCodeVerifier, generateOAuthState, InvalidOAuthCallbackError, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveScopes, saveOAuthState } from "../auth.js";
2
+ import { extractOAuthTokens, fetchUserProfile, generateOAuthCodeVerifier, generateOAuthState, InvalidOAuthCallbackError, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
3
3
  const authorizationEndpoint = "https://accounts.spotify.com/authorize";
4
4
  const tokenEndpoint = "https://accounts.spotify.com/api/token";
5
5
  const userEndpoint = "https://api.spotify.com/v1/me";
@@ -40,13 +40,14 @@ export class Spotify {
40
40
  const state = generateOAuthState();
41
41
  const codeVerifier = generateOAuthCodeVerifier();
42
42
  const url = await this.createAuthorizationURL(state, codeVerifier, resolveScopes(scopes, auth, defaultScopes));
43
- await saveOAuthState(auth.store, state, { codeVerifier });
44
- return url;
43
+ const payload = { codeVerifier };
44
+ await saveOAuthState(auth.store, state, payload);
45
+ return { url, state, payload };
45
46
  }
46
- async getUser(query) {
47
+ async getUser(query, saved) {
47
48
  const auth = requireAuthConfig(this.auth);
48
49
  const { code, state } = parseCallbackQuery(query);
49
- const stored = await consumeOAuthState(auth.store, state);
50
+ const stored = await resolveOAuthState(auth.store, state, saved);
50
51
  if (typeof stored.codeVerifier !== "string") {
51
52
  throw new InvalidOAuthCallbackError("Missing PKCE code verifier for OAuth state");
52
53
  }
@@ -62,7 +63,8 @@ export class Spotify {
62
63
  name: profileString(profile.display_name),
63
64
  email: profileString(profile.email),
64
65
  image,
65
- raw: profile
66
+ raw: profile,
67
+ ...extractOAuthTokens(tokens)
66
68
  };
67
69
  }
68
70
  }
@@ -1,5 +1,5 @@
1
1
  import type { OAuth2Tokens } from "../oauth2.js";
2
- import type { OAuthCallbackQuery, OAuthUser, ProviderOptions } from "../auth.js";
2
+ import type { AuthorizationRequest, OAuthCallbackQuery, OAuthUser, ProviderOptions, SavedOAuthState } from "../auth.js";
3
3
  export interface StartGGOptions extends ProviderOptions {
4
4
  }
5
5
  export declare class StartGG {
@@ -12,6 +12,6 @@ export declare class StartGG {
12
12
  createAuthorizationURL(state: string, scopes: string[]): URL;
13
13
  validateAuthorizationCode(code: string, scopes: string[]): Promise<OAuth2Tokens>;
14
14
  refreshAccessToken(refreshToken: string, scopes: string[]): Promise<OAuth2Tokens>;
15
- getAuthorizationURL(scopes?: string[]): Promise<URL>;
16
- getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
15
+ getAuthorizationURL(scopes?: string[]): Promise<AuthorizationRequest>;
16
+ getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
17
17
  }
@@ -1,5 +1,5 @@
1
1
  import { createOAuth2Request, sendTokenRequest } from "../request.js";
2
- import { consumeOAuthState, generateOAuthState, OAuthProviderError, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveScopes, saveOAuthState } from "../auth.js";
2
+ import { extractOAuthTokens, generateOAuthState, OAuthProviderError, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
3
3
  const authorizationEndpoint = "https://start.gg/oauth/authorize";
4
4
  const tokenEndpoint = "https://api.start.gg/oauth/access_token";
5
5
  const refreshEndpoint = "https://api.start.gg/oauth/refresh";
@@ -119,13 +119,14 @@ export class StartGG {
119
119
  const state = generateOAuthState();
120
120
  const resolved = resolveScopes(scopes, auth, defaultScopes);
121
121
  const url = this.createAuthorizationURL(state, resolved);
122
- await saveOAuthState(auth.store, state, { scopes: resolved });
123
- return url;
122
+ const payload = { scopes: resolved };
123
+ await saveOAuthState(auth.store, state, payload);
124
+ return { url, state, payload };
124
125
  }
125
- async getUser(query) {
126
+ async getUser(query, saved) {
126
127
  const auth = requireAuthConfig(this.auth);
127
128
  const { code, state } = parseCallbackQuery(query);
128
- const stored = await consumeOAuthState(auth.store, state);
129
+ const stored = await resolveOAuthState(auth.store, state, saved);
129
130
  const tokens = await this.validateAuthorizationCode(code, stored.scopes ?? resolveScopes(undefined, auth, defaultScopes));
130
131
  const profile = await fetchCurrentUser(tokens.accessToken());
131
132
  let image = null;
@@ -138,7 +139,8 @@ export class StartGG {
138
139
  name: profileString(profile.name),
139
140
  email: profileString(profile.email),
140
141
  image,
141
- raw: profile
142
+ raw: profile,
143
+ ...extractOAuthTokens(tokens)
142
144
  };
143
145
  }
144
146
  }
@@ -1,5 +1,5 @@
1
1
  import type { OAuth2Tokens } from "../oauth2.js";
2
- import type { OAuthCallbackQuery, OAuthUser, ProviderOptions } from "../auth.js";
2
+ import type { AuthorizationRequest, OAuthCallbackQuery, OAuthUser, ProviderOptions, SavedOAuthState } from "../auth.js";
3
3
  export interface StravaOptions extends ProviderOptions {
4
4
  }
5
5
  export declare class Strava {
@@ -12,6 +12,6 @@ export declare class Strava {
12
12
  createAuthorizationURL(state: string, scopes: string[]): URL;
13
13
  validateAuthorizationCode(code: string): Promise<OAuth2Tokens>;
14
14
  refreshAccessToken(refreshToken: string): Promise<OAuth2Tokens>;
15
- getAuthorizationURL(scopes?: string[]): Promise<URL>;
16
- getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
15
+ getAuthorizationURL(scopes?: string[]): Promise<AuthorizationRequest>;
16
+ getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
17
17
  }
@@ -1,5 +1,5 @@
1
1
  import { createOAuth2Request, sendTokenRequest } from "../request.js";
2
- import { consumeOAuthState, fetchUserProfile, generateOAuthState, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveScopes, saveOAuthState } from "../auth.js";
2
+ import { extractOAuthTokens, fetchUserProfile, generateOAuthState, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
3
3
  const authorizationEndpoint = "https://www.strava.com/oauth/authorize";
4
4
  const tokenEndpoint = "https://www.strava.com/api/v3/oauth/token";
5
5
  const userEndpoint = "https://www.strava.com/api/v3/athlete";
@@ -63,13 +63,14 @@ export class Strava {
63
63
  const auth = requireAuthConfig(this.auth);
64
64
  const state = generateOAuthState();
65
65
  const url = this.createAuthorizationURL(state, resolveScopes(scopes, auth, defaultScopes));
66
- await saveOAuthState(auth.store, state, {});
67
- return url;
66
+ const payload = {};
67
+ await saveOAuthState(auth.store, state, payload);
68
+ return { url, state, payload };
68
69
  }
69
- async getUser(query) {
70
+ async getUser(query, saved) {
70
71
  const auth = requireAuthConfig(this.auth);
71
72
  const { code, state } = parseCallbackQuery(query);
72
- await consumeOAuthState(auth.store, state);
73
+ await resolveOAuthState(auth.store, state, saved);
73
74
  const tokens = await this.validateAuthorizationCode(code);
74
75
  const profile = await fetchUserProfile(userEndpoint, tokens.accessToken());
75
76
  const firstName = profileString(profile.firstname);
@@ -80,7 +81,8 @@ export class Strava {
80
81
  name: name !== "" ? name : null,
81
82
  email: null,
82
83
  image: profileString(profile.profile),
83
- raw: profile
84
+ raw: profile,
85
+ ...extractOAuthTokens(tokens)
84
86
  };
85
87
  }
86
88
  }
@@ -1,5 +1,5 @@
1
1
  import type { OAuth2Tokens } from "../oauth2.js";
2
- import type { OAuthCallbackQuery, OAuthUser, ProviderOptions } from "../auth.js";
2
+ import type { AuthorizationRequest, OAuthCallbackQuery, OAuthUser, ProviderOptions, SavedOAuthState } from "../auth.js";
3
3
  export interface TikTokOptions extends ProviderOptions {
4
4
  }
5
5
  export declare class TikTok {
@@ -13,6 +13,6 @@ export declare class TikTok {
13
13
  validateAuthorizationCode(code: string, codeVerifier: string): Promise<OAuth2Tokens>;
14
14
  refreshAccessToken(refreshToken: string): Promise<OAuth2Tokens>;
15
15
  revokeToken(token: string): Promise<void>;
16
- getAuthorizationURL(scopes?: string[]): Promise<URL>;
17
- getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
16
+ getAuthorizationURL(scopes?: string[]): Promise<AuthorizationRequest>;
17
+ getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
18
18
  }
@@ -1,6 +1,6 @@
1
1
  import { createS256CodeChallenge } from "../oauth2.js";
2
2
  import { createOAuth2Request, sendTokenRequest, sendTokenRevocationRequest } from "../request.js";
3
- import { consumeOAuthState, fetchUserProfile, generateOAuthCodeVerifier, generateOAuthState, InvalidOAuthCallbackError, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveScopes, saveOAuthState } from "../auth.js";
3
+ import { extractOAuthTokens, fetchUserProfile, generateOAuthCodeVerifier, generateOAuthState, InvalidOAuthCallbackError, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
4
4
  const authorizationEndpoint = "https://www.tiktok.com/v2/auth/authorize";
5
5
  const tokenEndpoint = "https://open.tiktokapis.com/v2/oauth/token/";
6
6
  const tokenRevocationEndpoint = "https://open.tiktokapis.com/v2/oauth/revoke/";
@@ -77,13 +77,14 @@ export class TikTok {
77
77
  const state = generateOAuthState();
78
78
  const codeVerifier = generateOAuthCodeVerifier();
79
79
  const url = await this.createAuthorizationURL(state, codeVerifier, resolveScopes(scopes, auth, defaultScopes));
80
- await saveOAuthState(auth.store, state, { codeVerifier });
81
- return url;
80
+ const payload = { codeVerifier };
81
+ await saveOAuthState(auth.store, state, payload);
82
+ return { url, state, payload };
82
83
  }
83
- async getUser(query) {
84
+ async getUser(query, saved) {
84
85
  const auth = requireAuthConfig(this.auth);
85
86
  const { code, state } = parseCallbackQuery(query);
86
- const stored = await consumeOAuthState(auth.store, state);
87
+ const stored = await resolveOAuthState(auth.store, state, saved);
87
88
  if (typeof stored.codeVerifier !== "string") {
88
89
  throw new InvalidOAuthCallbackError("Missing PKCE code verifier for OAuth state");
89
90
  }
@@ -104,7 +105,8 @@ export class TikTok {
104
105
  name: profileString(user.display_name),
105
106
  email: null,
106
107
  image: profileString(user.avatar_url),
107
- raw: user
108
+ raw: user,
109
+ ...extractOAuthTokens(tokens)
108
110
  };
109
111
  }
110
112
  }
@@ -1,5 +1,5 @@
1
1
  import type { OAuth2Tokens } from "../oauth2.js";
2
- import type { OAuthCallbackQuery, OAuthUser, ProviderOptions } from "../auth.js";
2
+ import type { AuthorizationRequest, OAuthCallbackQuery, OAuthUser, ProviderOptions, SavedOAuthState } from "../auth.js";
3
3
  export interface TiltifyOptions extends ProviderOptions {
4
4
  }
5
5
  export declare class Tiltify {
@@ -12,6 +12,6 @@ export declare class Tiltify {
12
12
  createAuthorizationURL(state: string, scopes: string[]): URL;
13
13
  validateAuthorizationCode(code: string): Promise<OAuth2Tokens>;
14
14
  refreshAccessToken(refreshToken: string): Promise<OAuth2Tokens>;
15
- getAuthorizationURL(scopes?: string[]): Promise<URL>;
16
- getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
15
+ getAuthorizationURL(scopes?: string[]): Promise<AuthorizationRequest>;
16
+ getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
17
17
  }
@@ -1,5 +1,5 @@
1
1
  import { createOAuth2Request, sendTokenRequest } from "../request.js";
2
- import { consumeOAuthState, fetchUserProfile, generateOAuthState, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveScopes, saveOAuthState } from "../auth.js";
2
+ import { extractOAuthTokens, fetchUserProfile, generateOAuthState, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
3
3
  const authorizationEndpoint = "https://v5api.tiltify.com/oauth/authorize";
4
4
  const tokenEndpoint = "https://v5api.tiltify.com/oauth/token";
5
5
  const userEndpoint = "https://v5api.tiltify.com/api/public/current-user";
@@ -62,13 +62,14 @@ export class Tiltify {
62
62
  const auth = requireAuthConfig(this.auth);
63
63
  const state = generateOAuthState();
64
64
  const url = this.createAuthorizationURL(state, resolveScopes(scopes, auth, defaultScopes));
65
- await saveOAuthState(auth.store, state, {});
66
- return url;
65
+ const payload = {};
66
+ await saveOAuthState(auth.store, state, payload);
67
+ return { url, state, payload };
67
68
  }
68
- async getUser(query) {
69
+ async getUser(query, saved) {
69
70
  const auth = requireAuthConfig(this.auth);
70
71
  const { code, state } = parseCallbackQuery(query);
71
- await consumeOAuthState(auth.store, state);
72
+ await resolveOAuthState(auth.store, state, saved);
72
73
  const tokens = await this.validateAuthorizationCode(code);
73
74
  const profile = await fetchUserProfile(userEndpoint, tokens.accessToken());
74
75
  let user = {};
@@ -85,7 +86,8 @@ export class Tiltify {
85
86
  name: profileString(user.username),
86
87
  email: null,
87
88
  image,
88
- raw: user
89
+ raw: user,
90
+ ...extractOAuthTokens(tokens)
89
91
  };
90
92
  }
91
93
  }
@@ -1,5 +1,5 @@
1
1
  import type { OAuth2Tokens } from "../oauth2.js";
2
- import type { OAuthCallbackQuery, OAuthUser, ProviderOptions } from "../auth.js";
2
+ import type { AuthorizationRequest, OAuthCallbackQuery, OAuthUser, ProviderOptions, SavedOAuthState } from "../auth.js";
3
3
  export interface TumblrOptions extends ProviderOptions {
4
4
  }
5
5
  export declare class Tumblr {
@@ -10,6 +10,6 @@ export declare class Tumblr {
10
10
  createAuthorizationURL(state: string, scopes: string[]): URL;
11
11
  validateAuthorizationCode(code: string): Promise<OAuth2Tokens>;
12
12
  refreshAccessToken(refreshToken: string): Promise<OAuth2Tokens>;
13
- getAuthorizationURL(scopes?: string[]): Promise<URL>;
14
- getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
13
+ getAuthorizationURL(scopes?: string[]): Promise<AuthorizationRequest>;
14
+ getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
15
15
  }
@@ -1,5 +1,5 @@
1
1
  import { OAuth2Client } from "../client.js";
2
- import { consumeOAuthState, fetchUserProfile, generateOAuthState, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveScopes, saveOAuthState } from "../auth.js";
2
+ import { extractOAuthTokens, fetchUserProfile, generateOAuthState, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
3
3
  const authorizationEndpoint = "https://www.tumblr.com/oauth2/authorize";
4
4
  const tokenEndpoint = "https://api.tumblr.com/v2/oauth2/token";
5
5
  const userEndpoint = "https://api.tumblr.com/v2/user/info";
@@ -36,13 +36,14 @@ export class Tumblr {
36
36
  const auth = requireAuthConfig(this.auth);
37
37
  const state = generateOAuthState();
38
38
  const url = this.createAuthorizationURL(state, resolveScopes(scopes, auth, defaultScopes));
39
- await saveOAuthState(auth.store, state, {});
40
- return url;
39
+ const payload = {};
40
+ await saveOAuthState(auth.store, state, payload);
41
+ return { url, state, payload };
41
42
  }
42
- async getUser(query) {
43
+ async getUser(query, saved) {
43
44
  const auth = requireAuthConfig(this.auth);
44
45
  const { code, state } = parseCallbackQuery(query);
45
- await consumeOAuthState(auth.store, state);
46
+ await resolveOAuthState(auth.store, state, saved);
46
47
  const tokens = await this.validateAuthorizationCode(code);
47
48
  const profile = await fetchUserProfile(userEndpoint, tokens.accessToken());
48
49
  let user = {};
@@ -58,7 +59,8 @@ export class Tumblr {
58
59
  name: profileString(user.name),
59
60
  email: null,
60
61
  image: null,
61
- raw: user
62
+ raw: user,
63
+ ...extractOAuthTokens(tokens)
62
64
  };
63
65
  }
64
66
  }
@@ -1,5 +1,5 @@
1
1
  import type { OAuth2Tokens } from "../oauth2.js";
2
- import type { OAuthCallbackQuery, OAuthUser, ProviderOptions } from "../auth.js";
2
+ import type { AuthorizationRequest, OAuthCallbackQuery, OAuthUser, ProviderOptions, SavedOAuthState } from "../auth.js";
3
3
  export interface TwitchOptions extends ProviderOptions {
4
4
  }
5
5
  export declare class Twitch {
@@ -12,6 +12,6 @@ export declare class Twitch {
12
12
  createAuthorizationURL(state: string, scopes: string[]): URL;
13
13
  validateAuthorizationCode(code: string): Promise<OAuth2Tokens>;
14
14
  refreshAccessToken(refreshToken: string): Promise<OAuth2Tokens>;
15
- getAuthorizationURL(scopes?: string[]): Promise<URL>;
16
- getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
15
+ getAuthorizationURL(scopes?: string[]): Promise<AuthorizationRequest>;
16
+ getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
17
17
  }
@@ -1,6 +1,6 @@
1
1
  // Does not support HTTP Basic Auth scheme.
2
2
  import { createOAuth2Request, sendTokenRequest } from "../request.js";
3
- import { consumeOAuthState, fetchUserProfile, generateOAuthState, OAuthProviderError, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveScopes, saveOAuthState } from "../auth.js";
3
+ import { extractOAuthTokens, fetchUserProfile, generateOAuthState, OAuthProviderError, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
4
4
  const authorizationEndpoint = "https://id.twitch.tv/oauth2/authorize";
5
5
  const tokenEndpoint = "https://id.twitch.tv/oauth2/token";
6
6
  const userEndpoint = "https://api.twitch.tv/helix/users";
@@ -64,13 +64,14 @@ export class Twitch {
64
64
  const auth = requireAuthConfig(this.auth);
65
65
  const state = generateOAuthState();
66
66
  const url = this.createAuthorizationURL(state, resolveScopes(scopes, auth, defaultScopes));
67
- await saveOAuthState(auth.store, state, {});
68
- return url;
67
+ const payload = {};
68
+ await saveOAuthState(auth.store, state, payload);
69
+ return { url, state, payload };
69
70
  }
70
- async getUser(query) {
71
+ async getUser(query, saved) {
71
72
  const auth = requireAuthConfig(this.auth);
72
73
  const { code, state } = parseCallbackQuery(query);
73
- await consumeOAuthState(auth.store, state);
74
+ await resolveOAuthState(auth.store, state, saved);
74
75
  const tokens = await this.validateAuthorizationCode(code);
75
76
  // Helix requires the Client-Id header alongside the user access token.
76
77
  const profile = await fetchUserProfile(userEndpoint, tokens.accessToken(), {
@@ -86,7 +87,8 @@ export class Twitch {
86
87
  name: profileString(user.display_name) ?? profileString(user.login),
87
88
  email: profileString(user.email),
88
89
  image: profileString(user.profile_image_url),
89
- raw: user
90
+ raw: user,
91
+ ...extractOAuthTokens(tokens)
90
92
  };
91
93
  }
92
94
  }
@@ -1,5 +1,5 @@
1
1
  import type { OAuth2Tokens } from "../oauth2.js";
2
- import type { OAuthCallbackQuery, OAuthUser, ProviderOptions } from "../auth.js";
2
+ import type { AuthorizationRequest, OAuthCallbackQuery, OAuthUser, ProviderOptions, SavedOAuthState } from "../auth.js";
3
3
  export interface TwitterOptions extends ProviderOptions {
4
4
  }
5
5
  export declare class Twitter {
@@ -11,6 +11,6 @@ export declare class Twitter {
11
11
  validateAuthorizationCode(code: string, codeVerifier: string): Promise<OAuth2Tokens>;
12
12
  refreshAccessToken(refreshToken: string): Promise<OAuth2Tokens>;
13
13
  revokeToken(token: string): Promise<void>;
14
- getAuthorizationURL(scopes?: string[]): Promise<URL>;
15
- getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
14
+ getAuthorizationURL(scopes?: string[]): Promise<AuthorizationRequest>;
15
+ getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
16
16
  }