@absolutejs/auth 0.13.3 → 0.13.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -402,7 +402,7 @@ var providers = defineProviders({
402
402
  extractSubjectFromIdentity(identity) {
403
403
  const subject = extractPropFromIdentity(identity, ["account_id"]);
404
404
  if (typeof subject !== "number") {
405
- throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);
405
+ throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);
406
406
  }
407
407
  return subject;
408
408
  },
@@ -510,7 +510,7 @@ var providers = defineProviders({
510
510
  extractSubjectFromIdentity(identity) {
511
511
  const subject = extractPropFromIdentity(identity, ["uuid"]);
512
512
  if (typeof subject !== "number") {
513
- throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);
513
+ throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);
514
514
  }
515
515
  return subject;
516
516
  },
@@ -534,7 +534,7 @@ var providers = defineProviders({
534
534
  extractSubjectFromIdentity(identity) {
535
535
  const subject = extractPropFromIdentity(identity, ["id"]);
536
536
  if (typeof subject !== "number") {
537
- throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);
537
+ throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);
538
538
  }
539
539
  return subject;
540
540
  },
@@ -567,7 +567,7 @@ var providers = defineProviders({
567
567
  "membershipId"
568
568
  ]);
569
569
  if (typeof subject !== "number") {
570
- throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);
570
+ throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);
571
571
  }
572
572
  return subject;
573
573
  },
@@ -594,7 +594,7 @@ var providers = defineProviders({
594
594
  extractSubjectFromIdentity(identity) {
595
595
  const subject = extractPropFromIdentity(identity, ["data", "id"]);
596
596
  if (typeof subject !== "number") {
597
- throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);
597
+ throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);
598
598
  }
599
599
  return subject;
600
600
  },
@@ -685,7 +685,7 @@ var providers = defineProviders({
685
685
  extractSubjectFromIdentity(identity) {
686
686
  const subject = extractPropFromIdentity(identity, ["account_id"]);
687
687
  if (typeof subject !== "number") {
688
- throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);
688
+ throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);
689
689
  }
690
690
  return subject;
691
691
  },
@@ -714,7 +714,7 @@ var providers = defineProviders({
714
714
  extractSubjectFromIdentity(identity) {
715
715
  const subject = extractPropFromIdentity(identity, ["account_id"]);
716
716
  if (typeof subject !== "number") {
717
- throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);
717
+ throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);
718
718
  }
719
719
  return subject;
720
720
  },
@@ -1010,7 +1010,7 @@ var providers = defineProviders({
1010
1010
  extractSubjectFromIdentity(identity) {
1011
1011
  const subject = extractPropFromIdentity(identity, ["id"]);
1012
1012
  if (typeof subject !== "number") {
1013
- throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);
1013
+ throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);
1014
1014
  }
1015
1015
  return subject;
1016
1016
  },
@@ -1057,7 +1057,7 @@ var providers = defineProviders({
1057
1057
  "viewer",
1058
1058
  "id"
1059
1059
  ]);
1060
- if (typeof subject !== "number") {
1060
+ if (typeof subject !== "string") {
1061
1061
  throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);
1062
1062
  }
1063
1063
  return subject;
@@ -1113,7 +1113,7 @@ var providers = defineProviders({
1113
1113
  extractSubjectFromIdentity(identity) {
1114
1114
  const subject = extractPropFromIdentity(identity, ["id"]);
1115
1115
  if (typeof subject !== "number") {
1116
- throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);
1116
+ throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);
1117
1117
  }
1118
1118
  return subject;
1119
1119
  },
@@ -1144,7 +1144,7 @@ var providers = defineProviders({
1144
1144
  extractSubjectFromIdentity(identity) {
1145
1145
  const subject = extractPropFromIdentity(identity, ["id"]);
1146
1146
  if (typeof subject !== "number") {
1147
- throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);
1147
+ throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);
1148
1148
  }
1149
1149
  return subject;
1150
1150
  },
@@ -1169,7 +1169,7 @@ var providers = defineProviders({
1169
1169
  extractSubjectFromIdentity(identity) {
1170
1170
  const subject = extractPropFromIdentity(identity, ["id"]);
1171
1171
  if (typeof subject !== "number") {
1172
- throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);
1172
+ throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);
1173
1173
  }
1174
1174
  return subject;
1175
1175
  },
@@ -1240,7 +1240,7 @@ var providers = defineProviders({
1240
1240
  "id"
1241
1241
  ]);
1242
1242
  if (typeof subject !== "number") {
1243
- throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);
1243
+ throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);
1244
1244
  }
1245
1245
  return subject;
1246
1246
  },
@@ -1264,7 +1264,7 @@ var providers = defineProviders({
1264
1264
  extractSubjectFromIdentity(identity) {
1265
1265
  const subject = extractPropFromIdentity(identity, ["id"]);
1266
1266
  if (typeof subject !== "number") {
1267
- throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);
1267
+ throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);
1268
1268
  }
1269
1269
  return subject;
1270
1270
  },
@@ -1340,7 +1340,7 @@ var providers = defineProviders({
1340
1340
  extractSubjectFromIdentity(identity) {
1341
1341
  const subject = extractPropFromIdentity(identity, ["data", "id"]);
1342
1342
  if (typeof subject !== "number") {
1343
- throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);
1343
+ throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);
1344
1344
  }
1345
1345
  return subject;
1346
1346
  },
@@ -1439,7 +1439,7 @@ var providers = defineProviders({
1439
1439
  extractSubjectFromIdentity(identity) {
1440
1440
  const subject = extractPropFromIdentity(identity, ["id"]);
1441
1441
  if (typeof subject !== "number") {
1442
- throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);
1442
+ throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);
1443
1443
  }
1444
1444
  return subject;
1445
1445
  },
@@ -1562,7 +1562,7 @@ var providers = defineProviders({
1562
1562
  extractSubjectFromIdentity(identity) {
1563
1563
  const subject = extractPropFromIdentity(identity, ["id"]);
1564
1564
  if (typeof subject !== "number") {
1565
- throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);
1565
+ throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);
1566
1566
  }
1567
1567
  return subject;
1568
1568
  },
@@ -1591,7 +1591,7 @@ var providers = defineProviders({
1591
1591
  "id"
1592
1592
  ]);
1593
1593
  if (typeof subject !== "number") {
1594
- throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);
1594
+ throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);
1595
1595
  }
1596
1596
  return subject;
1597
1597
  },
@@ -1656,7 +1656,7 @@ var providers = defineProviders({
1656
1656
  extractSubjectFromIdentity(identity) {
1657
1657
  const subject = extractPropFromIdentity(identity, ["data", "id"]);
1658
1658
  if (typeof subject !== "number") {
1659
- throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);
1659
+ throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);
1660
1660
  }
1661
1661
  return subject;
1662
1662
  },
@@ -1686,7 +1686,7 @@ var providers = defineProviders({
1686
1686
  "open_id"
1687
1687
  ]);
1688
1688
  if (typeof subject !== "number") {
1689
- throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);
1689
+ throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);
1690
1690
  }
1691
1691
  return subject;
1692
1692
  },
@@ -1717,7 +1717,7 @@ var providers = defineProviders({
1717
1717
  extractSubjectFromIdentity(identity) {
1718
1718
  const subject = extractPropFromIdentity(identity, ["data", "id"]);
1719
1719
  if (typeof subject !== "number") {
1720
- throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);
1720
+ throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);
1721
1721
  }
1722
1722
  return subject;
1723
1723
  },
@@ -1745,7 +1745,7 @@ var providers = defineProviders({
1745
1745
  "name"
1746
1746
  ]);
1747
1747
  if (typeof subject !== "number") {
1748
- throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);
1748
+ throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);
1749
1749
  }
1750
1750
  return subject;
1751
1751
  },
@@ -1799,7 +1799,7 @@ var providers = defineProviders({
1799
1799
  extractSubjectFromIdentity(identity) {
1800
1800
  const subject = extractPropFromIdentity(identity, ["data", "id"]);
1801
1801
  if (typeof subject !== "number") {
1802
- throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);
1802
+ throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);
1803
1803
  }
1804
1804
  return subject;
1805
1805
  },
@@ -1967,7 +1967,7 @@ var providers = defineProviders({
1967
1967
  extractSubjectFromIdentity(identity) {
1968
1968
  const subject = extractPropFromIdentity(identity, ["id"]);
1969
1969
  if (typeof subject !== "number") {
1970
- throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);
1970
+ throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);
1971
1971
  }
1972
1972
  return subject;
1973
1973
  },
@@ -1998,7 +1998,7 @@ var providers = defineProviders({
1998
1998
  extractSubjectFromIdentity(identity) {
1999
1999
  const subject = extractPropFromIdentity(identity, ["id"]);
2000
2000
  if (typeof subject !== "number") {
2001
- throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);
2001
+ throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);
2002
2002
  }
2003
2003
  return subject;
2004
2004
  },
@@ -2778,5 +2778,5 @@ export {
2778
2778
  absoluteAuth
2779
2779
  };
2780
2780
 
2781
- //# debugId=94BD555970DA5FF264756E2164756E21
2781
+ //# debugId=DE01A97FD6403C5E64756E2164756E21
2782
2782
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -2,7 +2,7 @@
2
2
  "version": 3,
3
3
  "sources": ["../node_modules/citra/dist/index.js", "../src/index.ts", "../src/authorize.ts", "../src/constants.ts", "../src/callback.ts", "../src/sessionStore.ts", "../src/typeGuards.ts", "../src/profile.ts", "../src/protectRoute.ts", "../src/refresh.ts", "../src/revoke.ts", "../src/signout.ts", "../src/status.ts", "../src/utils.ts"],
4
4
  "sourcesContent": [
5
- "// @bun\n// src/constants.ts\nvar NUM_GENERATOR_BYTES = 32;\nvar BASE64_BLOCK_SIZE = 4;\n\n// src/utils.ts\nvar createOAuth2FetchError = async (response) => {\n const clone = response.clone();\n const prefix = `HTTP ${response.status} ${response.statusText} for ${response.url}`;\n const payload = await response.json().catch(() => null);\n if (payload && typeof payload === \"object\" && Object.keys(payload).length) {\n return new Error(`${prefix}\n${JSON.stringify(payload)}`);\n }\n const text = await clone.text().catch(() => \"\");\n if (text) {\n return new Error(`${prefix}\n${text}`);\n }\n return new Error(prefix);\n};\nvar encodeBase64 = (input) => {\n let raw;\n if (typeof input === \"string\") {\n raw = input;\n } else {\n const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);\n raw = bytes.reduce((acc, byte) => acc + String.fromCharCode(byte), \"\");\n }\n return btoa(raw);\n};\nvar decodeBase64 = (input, toUint8Array = false) => {\n const b64 = input.replace(/-/g, \"+\").replace(/_/g, \"/\") + \"==\".slice(0, (BASE64_BLOCK_SIZE - input.length % BASE64_BLOCK_SIZE) % BASE64_BLOCK_SIZE);\n const raw = atob(b64);\n if (!toUint8Array) {\n return raw;\n }\n const bytes = new Uint8Array(raw.length);\n for (let i = 0;i < raw.length; i++) {\n bytes[i] = raw.charCodeAt(i);\n }\n return bytes;\n};\nvar hmacSha256 = async (message, secret) => {\n const encoder = new TextEncoder;\n const key = await crypto.subtle.importKey(\"raw\", encoder.encode(secret), { hash: \"SHA-256\", name: \"HMAC\" }, false, [\"sign\"]);\n const sigBuffer = await crypto.subtle.sign(\"HMAC\", key, encoder.encode(message));\n return Array.from(new Uint8Array(sigBuffer)).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n};\nvar decodeJWT = (tokenString) => {\n const [headerSegment, payloadSegment, signatureSegment] = tokenString.split(\".\");\n if (!headerSegment || !payloadSegment || !signatureSegment) {\n throw new Error(\"Invalid JWT format\");\n }\n const decodedPayload = decodeBase64(payloadSegment);\n if (typeof decodedPayload !== \"string\") {\n throw new Error(\"Expected JWT payload to be a UTF-8 string\");\n }\n return JSON.parse(decodedPayload);\n};\nvar getWithingsProps = async (config) => {\n const timestamp = Math.floor(Date.now() / 1000);\n const signature = `getnonce,${config.clientId},${timestamp}`;\n const hashedSignature = await hmacSha256(signature, config.clientSecret);\n const nonceUrl = new URL(\"https://wbsapi.withings.net/v2/signature\");\n nonceUrl.searchParams.set(\"action\", \"getnonce\");\n nonceUrl.searchParams.set(\"client_id\", config.clientId);\n nonceUrl.searchParams.set(\"timestamp\", timestamp.toString());\n nonceUrl.searchParams.set(\"signature\", hashedSignature);\n const nonceResponse = await fetch(nonceUrl.toString(), {\n method: \"POST\"\n });\n const nonceData = await nonceResponse.json();\n if (nonceData.status === 0) {\n return {\n hashedSignature,\n nonce: nonceData.body.nonce\n };\n }\n return;\n};\nvar createOAuth2Request = ({\n url,\n body,\n authIn,\n headers,\n encoding,\n clientId,\n clientSecret\n}) => {\n const oauthHeaders = new Headers(headers);\n oauthHeaders.set(\"Accept\", \"application/json\");\n oauthHeaders.set(\"User-Agent\", \"citra\");\n if (authIn === \"header\") {\n if (!clientSecret) {\n throw new Error(\"clientSecret required for header auth\");\n }\n oauthHeaders.set(\"Authorization\", `Basic ${encodeBase64(`${clientId}:${clientSecret}`)}`);\n }\n if (encoding === \"application/json\") {\n oauthHeaders.set(\"Content-Type\", \"application/json\");\n return new Request(url, {\n body: JSON.stringify(body),\n headers: oauthHeaders,\n method: \"POST\"\n });\n }\n oauthHeaders.set(\"Content-Type\", \"application/x-www-form-urlencoded\");\n const entries = body instanceof URLSearchParams ? Array.from(body.entries()) : Object.entries(body).filter((entry) => typeof entry[1] === \"string\");\n const params = new URLSearchParams(entries);\n if (authIn === \"body\") {\n params.set(\"client_id\", clientId);\n clientSecret && params.set(\"client_secret\", clientSecret);\n }\n return new Request(url, {\n body: params.toString(),\n headers: oauthHeaders,\n method: \"POST\"\n });\n};\n\n// src/arctic-utils.ts\nvar createS256CodeChallenge = async (codeVerifier) => {\n const data = new TextEncoder().encode(codeVerifier);\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", data);\n return base64Url(hashBuffer);\n};\nvar createRandomBase64UrlGenerator = (length) => () => {\n const buffer = crypto.getRandomValues(new Uint8Array(length));\n return base64Url(buffer);\n};\nvar generateCodeVerifier = createRandomBase64UrlGenerator(NUM_GENERATOR_BYTES);\nvar generateState = createRandomBase64UrlGenerator(NUM_GENERATOR_BYTES);\nvar base64Url = (input) => encodeBase64(input).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n\n// src/graphqlQueries.ts\nvar anilistProfileQuery = `query {\n Viewer {\n id\n name\n about\n avatar {\n large\n medium\n }\n bannerImage\n siteUrl\n createdAt\n updatedAt\n donatorTier\n donatorBadge\n unreadNotificationCount\n options {\n titleLanguage\n displayAdultContent\n airingNotifications\n profileColor\n activityMergeTime\n staffNameLanguage\n }\n mediaListOptions {\n scoreFormat\n rowOrder\n animeList {\n sectionOrder\n customLists\n advancedScoringEnabled\n }\n mangaList {\n sectionOrder\n customLists\n advancedScoringEnabled\n }\n }\n statistics {\n anime {\n count\n meanScore\n minutesWatched\n episodesWatched\n }\n manga {\n count\n meanScore\n chaptersRead\n volumesRead\n }\n }\n favourites {\n anime {\n nodes {\n id\n title {\n romaji\n english\n }\n siteUrl\n }\n }\n manga {\n nodes {\n id\n title {\n romaji\n english\n }\n siteUrl\n }\n }\n characters {\n nodes {\n id\n name {\n full\n }\n image {\n large\n }\n }\n }\n staff {\n nodes {\n id\n name {\n full\n }\n image {\n large\n }\n }\n }\n studios {\n nodes {\n id\n name\n siteUrl\n }\n }\n }\n isFollower\n isFollowing\n }\n}`;\n\n// src/typeGuards.ts\nvar isValidProviderOption = (option) => Object.hasOwn(providers, option);\nvar isRefreshableProviderOption = (option) => {\n if (!isValidProviderOption(option))\n return false;\n const provider = providers[option];\n return provider.isRefreshable;\n};\nvar isRevocableProviderOption = (option) => {\n if (!isValidProviderOption(option))\n return false;\n const provider = providers[option];\n return provider.revocationRequest !== undefined;\n};\nvar isPKCEProviderOption = (option) => {\n if (!isValidProviderOption(option))\n return false;\n const provider = providers[option];\n return provider.PKCEMethod !== undefined;\n};\nvar isOIDCProviderOption = (option) => {\n if (!isValidProviderOption(option))\n return false;\n const provider = providers[option];\n return provider.isOIDC;\n};\nvar isScopeRequiredProviderOption = (option) => {\n if (!isValidProviderOption(option))\n return false;\n const provider = providers[option];\n return provider.scopeRequired;\n};\nvar isRefreshableOAuth2Client = (providerName, client) => isRefreshableProviderOption(providerName);\nvar isRevocableOAuth2Client = (providerName, client) => isRevocableProviderOption(providerName);\nvar hasClientSecret = (credentials) => {\n if (typeof credentials !== \"object\" || credentials === null)\n return false;\n const secret = Reflect.get(credentials, \"clientSecret\");\n return typeof secret === \"string\";\n};\nvar isObject = (x) => x !== null && typeof x === \"object\" && !Array.isArray(x) && Object.prototype.toString.call(x) === \"[object Object]\";\n\n// src/providers.ts\nvar extractPropFromIdentity = (identity, keys) => {\n let value = identity;\n for (const key of keys) {\n if (Array.isArray(value)) {\n value = value[0];\n }\n if (!isObject(value)) {\n throw new Error(`Invalid identity data shape: expected object, got ${typeof value}`);\n }\n value = value[key];\n }\n return value;\n};\nvar extractSubFromOIDCIdentity = (identity) => {\n const sub = extractPropFromIdentity(identity, [\"sub\"]);\n if (typeof sub !== \"string\") {\n throw new Error(\"Invalid identity data shape\");\n }\n return sub;\n};\nvar defineProviders = (providers2) => providers2;\nvar providers = defineProviders({\n \"42\": {\n authorizationUrl: \"https://api.intra.42.fr/oauth/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.intra.42.fr/v2/me\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.intra.42.fr/oauth/token\"\n }\n },\n amazoncognito: {\n authorizationUrl: \"https://${domain}/oauth2/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: (config) => `https://${config.domain}/oauth2/userInfo`\n },\n revocationRequest: {\n authIn: \"body\",\n encoding: \"application/json\",\n tokenParamName: \"token\",\n url: (config) => `https://${config.domain}/oauth2/revoke`\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: (config) => `https://${config.domain}/oauth2/token`\n }\n },\n anilist: {\n authorizationUrl: \"https://anilist.co/api/v2/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\n \"data\",\n \"Viewer\",\n \"id\"\n ]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n body: {\n query: anilistProfileQuery\n },\n encoding: \"application/json\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n method: \"POST\",\n url: \"https://graphql.anilist.co\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://anilist.co/api/v2/oauth/token\"\n }\n },\n apple: {\n authorizationUrl: \"https://appleid.apple.com/auth/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://appleid.apple.com/auth/userinfo\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://appleid.apple.com/auth/token\"\n }\n },\n atlassian: {\n authorizationUrl: \"https://auth.atlassian.com/authorize\",\n createAuthorizationURLSearchParams: {\n audience: \"api.atlassian.com\"\n },\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"account_id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.atlassian.com/me\"\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://auth.atlassian.com/oauth/token\"\n }\n },\n auth0: {\n authorizationUrl: (config) => `https://${config.domain}/authorize`,\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: (config) => `https://${config.domain}/userinfo`\n },\n revocationRequest: {\n authIn: \"body\",\n body: new URLSearchParams({\n token_type_hint: \"refresh_token\"\n }),\n encoding: \"application/json\",\n tokenParamName: \"token\",\n url: (config) => `https://${config.domain}/oauth/revoke`\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: (config) => `https://${config.domain}/oauth/token`\n }\n },\n authentik: {\n authorizationUrl: (config) => `https://${config.baseURL}/oauth/authorize`,\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: (config) => `https://${config.baseURL}/api/v3/user/`\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: (config) => `https://${config.baseURL}/oauth/token`\n }\n },\n autodesk: {\n authorizationUrl: \"https://developer.api.autodesk.com/authentication/v2/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.userprofile.autodesk.com/userinfo\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://developer.api.autodesk.com/authentication/v2/token\"\n }\n },\n battlenet: {\n authorizationUrl: \"https://oauth.battle.net/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: false,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://oauth.battle.net/userinfo\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://oauth.battle.net/token\"\n }\n },\n bitbucket: {\n authorizationUrl: \"https://bitbucket.org/site/oauth2/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"uuid\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.bitbucket.org/2.0/user\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://bitbucket.org/site/oauth2/access_token\"\n }\n },\n box: {\n authorizationUrl: \"https://account.box.com/api/oauth2/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.box.com/2.0/users/me\"\n },\n revocationRequest: {\n authIn: \"body\",\n encoding: \"application/json\",\n tokenParamName: \"token\",\n url: \"https://api.box.com/oauth2/revoke\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.box.com/oauth2/token\"\n }\n },\n bungie: {\n authorizationUrl: \"https://www.bungie.net/en/OAuth/Authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\n \"Response\",\n \"membershipId\"\n ]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n headers: {\n \"X-API-Key\": \"<YOUR_API_KEY>\"\n },\n method: \"GET\",\n url: \"https://www.bungie.net/Platform/User/GetCurrentBungieNetUser\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://www.bungie.net/Platform/App/OAuth/token\"\n }\n },\n coinbase: {\n authorizationUrl: \"https://www.coinbase.com/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"data\", \"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.coinbase.com/v2/user\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.coinbase.com/oauth/token\"\n }\n },\n discord: {\n authorizationUrl: \"https://discord.com/api/oauth2/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://discord.com/api/users/@me\"\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://discord.com/api/oauth2/token\"\n }\n },\n donationalerts: {\n authorizationUrl: \"https://www.donationalerts.com/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"data\", \"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://www.donationalerts.com/api/v1/user/oauth\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://www.donationalerts.com/oauth/token\"\n }\n },\n dribbble: {\n authorizationUrl: \"https://dribbble.com/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: false,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.dribbble.com/v2/user\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://dribbble.com/oauth/token\"\n }\n },\n dropbox: {\n authorizationUrl: \"https://www.dropbox.com/oauth2/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"account_id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"POST\",\n url: \"https://api.dropboxapi.com/2/users/get_current_account\"\n },\n revocationRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n url: \"https://api.dropboxapi.com/2/auth/token/revoke\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.dropboxapi.com/oauth2/token\"\n }\n },\n epicgames: {\n authorizationUrl: \"https://www.epicgames.com/id/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"account_id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.epicgames.dev/epic/oauth/v2/userInfo\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.epicgames.dev/epic/oauth/v1/token\"\n }\n },\n etsy: {\n authorizationUrl: \"https://www.etsy.com/oauth/connect\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\n \"results\",\n \"0\",\n \"user_id\"\n ]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://openapi.etsy.com/v3/application/users/me\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.etsy.com/v3/public/oauth/token\"\n }\n },\n facebook: {\n authorizationUrl: \"https://www.facebook.com/v16.0/dialog/oauth\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: false,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"query\",\n encoding: \"application/json\",\n method: \"GET\",\n searchParams: [[\"fields\", \"id,name,email,picture\"]],\n url: \"https://graph.facebook.com/me\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://graph.facebook.com/v16.0/oauth/access_token\"\n }\n },\n figma: {\n authorizationUrl: \"https://www.figma.com/oauth\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"string\") {\n throw new Error(`Invalid identity data shape: expected string, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.figma.com/v1/me\"\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.figma.com/v1/oauth/token\"\n }\n },\n gitea: {\n authorizationUrl: (config) => `${config.baseURL}/login/oauth/authorize`,\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: (config) => `${config.baseURL}/api/v1/user`\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: (config) => `${config.baseURL}/login/oauth/access_token`\n }\n },\n github: {\n authorizationUrl: \"https://github.com/login/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: false,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.github.com/user\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://github.com/login/oauth/access_token\"\n }\n },\n gitlab: {\n authorizationUrl: (config) => `${config.baseURL}/oauth/authorize`,\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://gitlab.com/api/v4/user\"\n },\n revocationRequest: {\n authIn: \"body\",\n encoding: \"application/json\",\n tokenParamName: \"token\",\n url: (config) => `${config.baseURL}/oauth/revoke`\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: (config) => `${config.baseURL}/oauth/token`\n }\n },\n google: {\n authorizationUrl: \"https://accounts.google.com/o/oauth2/v2/auth\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n searchParams: [[\"personFields\", \"names,emailAddresses,photos\"]],\n url: \"https://people.googleapis.com/v1/people/me\"\n },\n revocationRequest: {\n authIn: \"body\",\n encoding: \"application/json\",\n tokenParamName: \"token\",\n url: \"https://oauth2.googleapis.com/revoke\"\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://oauth2.googleapis.com/token\"\n }\n },\n intuit: {\n authorizationUrl: \"https://appcenter.intuit.com/connect/oauth2\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: (config) => config.environment === \"production\" ? \"https://accounts.platform.intuit.com/v1/openid_connect/userinfo\" : \"https://sandbox-accounts.platform.intuit.com/v1/openid_connect/userinfo\"\n },\n revocationRequest: {\n authIn: \"body\",\n encoding: \"application/json\",\n headers: (config) => ({\n Authorization: `Basic ${encodeBase64(`${config.clientId}:${config.clientSecret}`)}`\n }),\n tokenParamName: \"token\",\n url: \"https://developer.api.intuit.com/v2/oauth2/tokens/revoke\"\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer\"\n }\n },\n kakao: {\n authorizationUrl: \"https://kauth.kakao.com/oauth/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://kapi.kakao.com/v2/user/me\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://kauth.kakao.com/oauth/token\"\n }\n },\n keycloak: {\n authorizationUrl: (config) => `${config.realmURL}/protocol/openid-connect/auth`,\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.kick.com/v1/user\"\n },\n revocationRequest: {\n authIn: \"body\",\n encoding: \"application/json\",\n tokenParamName: \"token\",\n url: (config) => `${config.realmURL}/protocol/openid-connect/revoke`\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: (config) => `${config.realmURL}/protocol/openid-connect/token`\n }\n },\n kick: {\n authorizationUrl: \"https://id.kick.com/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\n \"data\",\n \"user_id\"\n ]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.kick.com/public/v1/users\"\n },\n revocationRequest: {\n authIn: \"body\",\n encoding: \"application/json\",\n tokenParamName: \"token\",\n url: \"https://id.kick.com/oauth/revoke\"\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://id.kick.com/oauth/token\"\n }\n },\n lichess: {\n authorizationUrl: \"https://lichess.org/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: false,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://lichess.org/api/account\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://lichess.org/api/token\"\n }\n },\n line: {\n authorizationUrl: \"https://access.line.me/oauth2/v2.1/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.line.me/v2/profile\"\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.line.me/oauth2/v2.1/token\"\n }\n },\n linear: {\n authorizationUrl: \"https://linear.app/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\n \"data\",\n \"viewer\",\n \"id\"\n ]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: false,\n profileRequest: {\n authIn: \"header\",\n body: {\n query: `query { viewer { id name } }`\n },\n encoding: \"application/json\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n method: \"POST\",\n url: \"https://api.linear.app/graphql\"\n },\n revocationRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n url: \"https://api.linear.app/oauth/revoke\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.linear.app/oauth/token\"\n }\n },\n linkedin: {\n authorizationUrl: \"https://www.linkedin.com/oauth/v2/authorization\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.linkedin.com/v2/me\"\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://www.linkedin.com/oauth/v2/accessToken\"\n }\n },\n mastodon: {\n authorizationUrl: (config) => `${config.baseURL}/oauth/authorize`,\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: false,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: (config) => `${config.baseURL}/api/v1/accounts/verify_credentials`\n },\n revocationRequest: {\n authIn: \"body\",\n encoding: \"application/json\",\n tokenParamName: \"token\",\n url: (config) => `${config.baseURL}/oauth/revoke`\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: (config) => `${config.baseURL}/oauth/token`\n }\n },\n mercadolibre: {\n authorizationUrl: \"https://auth.mercadolibre.com/authorization\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.mercadolibre.com/users/me\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.mercadolibre.com/oauth/token\"\n }\n },\n mercadopago: {\n authorizationUrl: \"https://auth.mercadopago.com/authorization\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.mercadopago.com/v1/users/me\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.mercadopago.com/oauth/token\"\n }\n },\n microsoftentraid: {\n authorizationUrl: (config) => `https://${config.tenantId}.b2clogin.com/${config.tenantId}/oauth2/v2.0/authorize`,\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: (config) => `https://${config.tenantId}.b2clogin.com/${config.tenantId}/openid/userinfo`\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: (config) => `https://${config.tenantId}.b2clogin.com/${config.tenantId}/oauth2/v2.0/token`\n }\n },\n myanimelist: {\n authorizationUrl: \"https://myanimelist.net/v1/oauth2/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n PKCEMethod: \"plain\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.myanimelist.net/v2/users/@me\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://myanimelist.net/v1/oauth2/token\"\n }\n },\n naver: {\n authorizationUrl: \"https://nid.naver.com/oauth2.0/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\n \"response\",\n \"id\"\n ]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://openapi.naver.com/v1/nid/me\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://nid.naver.com/oauth2.0/token\"\n }\n },\n notion: {\n authorizationUrl: \"https://api.notion.com/v1/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: false,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n headers: {\n \"Notion-Version\": \"2022-06-28\"\n },\n method: \"GET\",\n url: \"https://api.notion.com/v1/users/me\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n url: \"https://api.notion.com/v1/oauth/token\"\n }\n },\n okta: {\n authorizationUrl: (config) => `https://${config.domain}/oauth2/default/v1/authorize`,\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: (config) => `https://${config.domain}/oauth2/default/v1/userinfo`\n },\n revocationRequest: {\n authIn: \"body\",\n encoding: \"application/json\",\n tokenParamName: \"token\",\n url: (config) => `https://${config.domain}/oauth2/default/v1/revoke`\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: (config) => `https://${config.domain}/oauth2/default/v1/token`\n }\n },\n osu: {\n authorizationUrl: \"https://osu.ppy.sh/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://osu.ppy.sh/api/v2/me\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://osu.ppy.sh/oauth/token\"\n }\n },\n patreon: {\n authorizationUrl: \"https://www.patreon.com/oauth2/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"data\", \"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://www.patreon.com/api/oauth2/v2/identity\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://www.patreon.com/api/oauth2/token\"\n }\n },\n polar: {\n authorizationUrl: \"https://polar.sh/oauth2/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.polar.sh/v1/oauth2/userinfo\"\n },\n revocationRequest: {\n authIn: \"body\",\n encoding: \"application/json\",\n tokenParamName: \"token\",\n url: \"https://api.polar.sh/v1/oauth2/revoke\"\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.polar.sh/v1/oauth2/token\"\n }\n },\n polaraccesslink: {\n authorizationUrl: \"https://flow.polar.com/oauth2/authorization\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"x_user_id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: false,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://www.polaraccesslink.com/v3/users/me\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"header\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://polarremote.com/v2/oauth2/token\"\n }\n },\n polarteampro: {\n authorizationUrl: \"https://auth.polar.com/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"x_user_id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://www.polaraccesslink.com/v3/users/<USER_ID>\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"header\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://auth.polar.com/oauth/token\"\n }\n },\n reddit: {\n authorizationUrl: \"https://www.reddit.com/api/v1/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://oauth.reddit.com/api/v1/me\"\n },\n revocationRequest: {\n authIn: \"header\",\n body: new URLSearchParams({\n token_type_hint: \"refresh_token\"\n }),\n encoding: \"application/json\",\n url: \"https://www.reddit.com/api/v1/revoke_token\"\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"header\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://www.reddit.com/api/v1/access_token\"\n }\n },\n roblox: {\n authorizationUrl: \"https://apis.roblox.com/oauth/v1/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://apis.roblox.com/oauth/v1/userinfo\"\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://apis.roblox.com/oauth/v1/token\"\n }\n },\n salesforce: {\n authorizationUrl: \"https://login.salesforce.com/services/oauth2/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://login.salesforce.com/services/oauth2/userinfo\"\n },\n revocationRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n url: \"https://login.salesforce.com/services/oauth2/revoke\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://login.salesforce.com/services/oauth2/token\"\n }\n },\n shikimori: {\n authorizationUrl: \"https://shikimori.org/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://shikimori.one/api/users/whoami\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://shikimori.org/oauth/token\"\n }\n },\n slack: {\n authorizationUrl: \"https://slack.com/openid/connect/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n profileRequest: {\n authIn: \"query\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://slack.com/api/users.identity\"\n },\n revocationRequest: {\n authIn: \"body\",\n encoding: \"application/json\",\n tokenParamName: \"token\",\n url: \"https://slack.com/api/auth.revoke\"\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://slack.com/api/openid.connect.token\"\n }\n },\n spotify: {\n authorizationUrl: \"https://accounts.spotify.com/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.spotify.com/v1/me\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://accounts.spotify.com/api/token\"\n }\n },\n startgg: {\n authorizationUrl: \"https://start.gg/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\n \"data\",\n \"currentUser\",\n \"id\"\n ]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n body: {\n query: `query { currentUser { id slug email player { gamerTag } } }`\n },\n encoding: \"application/json\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n method: \"POST\",\n url: \"https://api.start.gg/gql/alpha\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.start.gg/oauth/access_token\"\n }\n },\n strava: {\n authorizationUrl: \"https://www.strava.com/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://www.strava.com/api/v3/athlete\"\n },\n revocationRequest: {\n authIn: \"query\",\n body: new URLSearchParams({\n token_type_hint: \"access_token\"\n }),\n encoding: \"application/json\",\n tokenParamName: \"access_token\",\n url: \"https://www.strava.com/oauth/deauthorize\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://www.strava.com/oauth/token\"\n }\n },\n synology: {\n authorizationUrl: (config) => `${config.baseURL}/webman/sso/SSOOauth.cgi?client_id=${config.clientId}&response_type=code&redirect_uri=${config.redirectUri}`,\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"data\", \"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: false,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: (config) => `${config.baseURL}/webman/sso/SSOUserInfo.cgi?client_id=${config.clientId}&access_token=${config.accessToken}`\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: (config) => `${config.baseURL}/webman/sso/SSOAccessToken.cgi?client_id=${config.clientId}&client_secret=${config.clientSecret}`\n }\n },\n tiktok: {\n authorizationUrl: \"https://www.tiktok.com/v2/auth/authorize\",\n createAuthorizationURLSearchParams: (config) => ({\n client_key: config.clientId\n }),\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\n \"data\",\n \"open_id\"\n ]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"query\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://open.douyin.com/oauth/userinfo\"\n },\n revocationRequest: {\n authIn: \"body\",\n encoding: \"application/json\",\n tokenParamName: \"token\",\n url: \"https://open.tiktokapis.com/v2/oauth/revoke/\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://open.tiktokapis.com/v2/oauth/token/\"\n }\n },\n tiltify: {\n authorizationUrl: \"https://v5api.tiltify.com/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"data\", \"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://v5api.tiltify.com/api/public/current-user\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://v5api.tiltify.com/oauth/token\"\n }\n },\n tumblr: {\n authorizationUrl: \"https://www.tumblr.com/oauth2/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\n \"response\",\n \"user\",\n \"name\"\n ]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.tumblr.com/v2/user/info\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.tumblr.com/v2/oauth2/token\"\n }\n },\n twitch: {\n authorizationUrl: \"https://id.twitch.tv/oauth2/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n headers: (config) => ({\n \"Client-Id\": config.clientId\n }),\n method: \"GET\",\n url: \"https://api.twitch.tv/helix/users\"\n },\n revocationRequest: {\n authIn: \"query\",\n encoding: \"application/json\",\n headers: (config) => ({\n \"Client-Id\": config.clientId\n }),\n tokenParamName: \"token\",\n url: \"https://id.twitch.tv/oauth2/revoke\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://id.twitch.tv/oauth2/token\"\n }\n },\n twitter: {\n authorizationUrl: \"https://twitter.com/i/oauth2/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"data\", \"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.twitter.com/2/users/me\"\n },\n revocationRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n url: \"https://api.twitter.com/2/oauth2/revoke\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.twitter.com/2/oauth2/token\"\n }\n },\n vk: {\n authorizationUrl: \"https://oauth.vk.com/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\n \"response\",\n \"0\",\n \"id\"\n ]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: false,\n profileRequest: {\n authIn: \"query\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.vk.com/method/users.get\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://oauth.vk.com/access_token\"\n }\n },\n withings: {\n authorizationUrl: \"https://account.withings.com/oauth2_user/authorize2\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\n \"body\",\n \"userid\"\n ]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n body: async (config) => {\n const props = await getWithingsProps(config);\n if (props === undefined)\n throw new Error(\"Failed to get Withings search properties\");\n const { nonce, hashedSignature } = props;\n return [\n [\"action\", \"getuser\"],\n [\"nonce\", nonce],\n [\"client_id\", config.clientId],\n [\"signature\", hashedSignature]\n ];\n },\n encoding: \"application/x-www-form-urlencoded\",\n method: \"POST\",\n url: \"https://wbsapi.withings.net/v2/oauth2\"\n },\n refreshAccessTokenBody: {\n action: \"requesttoken\"\n },\n revocationRequest: {\n authIn: \"header\",\n body: async (config) => {\n const props = await getWithingsProps(config);\n if (!props)\n throw new Error(\"Failed to get Withings props\");\n const { nonce, hashedSignature } = props;\n return [\n [\"action\", \"revoke\"],\n [\"client_id\", config.clientId],\n [\"nonce\", nonce],\n [\"signature\", hashedSignature]\n ];\n },\n encoding: \"application/x-www-form-urlencoded\",\n method: \"POST\",\n url: \"https://wbsapi.withings.net/v2/oauth2\"\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://wbsapi.withings.net/v2/oauth2\"\n },\n validateAuthorizationCodeBody: {\n action: \"requesttoken\"\n }\n },\n workos: {\n authorizationUrl: \"https://api.workos.com/sso/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.workos.com/sso/userinfo\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.workos.com/sso/token\"\n }\n },\n yahoo: {\n authorizationUrl: \"https://api.login.yahoo.com/oauth2/request_auth\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.login.yahoo.com/openid/v1/userinfo\"\n },\n revocationRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n url: \"https://api.login.yahoo.com/oauth2/revoke\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.login.yahoo.com/oauth2/get_token\"\n }\n },\n yandex: {\n authorizationUrl: \"https://oauth.yandex.com/authorize\",\n createAuthorizationURLSearchParams: {\n device_id: crypto.randomUUID(),\n device_name: `${navigator.platform ?? \"Unknown\"} \\u2014 ${(navigator.userAgent.split(\")\")[0] || \"\").split(\"(\").pop() || \"Unknown\"}`\n },\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://login.yandex.ru/info\"\n },\n revocationRequest: {\n authIn: \"body\",\n encoding: \"application/json\",\n tokenParamName: \"access_token\",\n url: \"https://oauth.yandex.com/revoke_token\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://oauth.yandex.com/token\"\n }\n },\n zoom: {\n authorizationUrl: \"https://zoom.us/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.zoom.us/v2/users/me\"\n },\n revocationRequest: {\n authIn: \"query\",\n encoding: \"application/json\",\n headers: (config) => ({\n Authorization: `Basic ${btoa(`${config.clientId}:${config.clientSecret}`)}`\n }),\n tokenParamName: \"token\",\n url: \"https://zoom.us/oauth/revoke\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://zoom.us/oauth/token\"\n }\n }\n});\nvar providerOptions = Object.keys(providers).filter(isValidProviderOption);\nvar refreshableProviderOptions = Object.keys(providers).filter(isRefreshableProviderOption);\nvar oidcProviderOptions = Object.keys(providers).filter(isOIDCProviderOption);\nvar revocableProviderOptions = Object.keys(providers).filter(isRevocableProviderOption);\nvar scopeRequiredProviderOptions = Object.keys(providers).filter(isScopeRequiredProviderOption);\nvar pkceProviderOptions = Object.keys(providers).filter(isPKCEProviderOption);\n\n// src/index.ts\nvar createOAuth2Client = async (providerName, config) => {\n const meta = providers[providerName];\n const isConfigPropertyFunction = (cfgProp) => typeof cfgProp === \"function\";\n const resolveConfigProp = async (cfgProp) => {\n const result = isConfigPropertyFunction(cfgProp) ? cfgProp(config) : cfgProp;\n return await result;\n };\n const authorizationUrl = await resolveConfigProp(meta.authorizationUrl);\n const tokenUrl = await resolveConfigProp(meta.tokenRequest.url);\n return {\n async createAuthorizationUrl(opts) {\n const { state, scope = [], searchParams = [], codeVerifier } = opts;\n const url = new URL(authorizationUrl);\n url.searchParams.set(\"response_type\", \"code\");\n url.searchParams.set(\"client_id\", config.clientId);\n if (config.redirectUri)\n url.searchParams.set(\"redirect_uri\", config.redirectUri);\n if (state)\n url.searchParams.set(\"state\", state);\n if (scope.length !== 0) {\n const delimeter = providerName === \"withings\" ? \",\" : \" \";\n url.searchParams.set(\"scope\", scope.join(delimeter));\n }\n if (meta.PKCEMethod !== undefined) {\n if (!codeVerifier) {\n throw new Error(\"`codeVerifier` is required when PKCE is enabled\");\n }\n const codeChallenge = meta.PKCEMethod === \"S256\" ? await createS256CodeChallenge(codeVerifier) : codeVerifier;\n url.searchParams.set(\"code_challenge_method\", meta.PKCEMethod);\n url.searchParams.set(\"code_challenge\", codeChallenge);\n }\n Object.entries(resolveConfigProp(meta.createAuthorizationURLSearchParams) ?? {}).forEach(([key, value]) => url.searchParams.set(key, value));\n searchParams.forEach(([key, value]) => url.searchParams.set(key, value));\n return url;\n },\n async fetchUserProfile(accessToken) {\n const { profileRequest } = meta;\n const {\n url,\n method,\n authIn,\n searchParams,\n body: profileBody,\n headers,\n encoding\n } = profileRequest;\n const endpoint = new URL(await resolveConfigProp(url));\n const resolvedBody = await resolveConfigProp(profileBody);\n new URLSearchParams(await resolveConfigProp(searchParams)).forEach((value, key) => endpoint.searchParams.append(key, value));\n let headerEntries = [];\n const rawHeaders = headers ? await resolveConfigProp(headers) : undefined;\n if (rawHeaders instanceof Headers)\n headerEntries = Array.from(rawHeaders.entries());\n else if (Array.isArray(rawHeaders))\n headerEntries = rawHeaders;\n else if (rawHeaders && typeof rawHeaders === \"object\")\n headerEntries = Object.entries(rawHeaders);\n const profileHeaders = Object.fromEntries(headerEntries.filter(([, v]) => v !== \"\"));\n if (authIn === \"header\") {\n profileHeaders.Authorization = `Bearer ${accessToken}`;\n } else {\n endpoint.searchParams.append(\"access_token\", accessToken);\n }\n const init = { headers: profileHeaders, method };\n if (method === \"POST\" && resolvedBody != null) {\n profileHeaders[\"Content-Type\"] = encoding;\n init.body = encoding === \"application/json\" ? JSON.stringify(resolvedBody) : new URLSearchParams(resolvedBody).toString();\n }\n const response = await fetch(endpoint.toString(), init);\n if (!response.ok)\n throw await createOAuth2FetchError(response);\n return response.json();\n },\n async refreshAccessToken(refreshToken) {\n const { authIn, encoding } = meta.tokenRequest;\n const params = new URLSearchParams(meta.refreshAccessTokenBody);\n params.set(\"grant_type\", \"refresh_token\");\n params.set(\"refresh_token\", refreshToken);\n const { clientId } = config;\n let clientSecretValue;\n if (hasClientSecret(config)) {\n clientSecretValue = config.clientSecret;\n params.set(\"client_id\", clientId);\n params.set(\"client_secret\", clientSecretValue);\n }\n const request = createOAuth2Request({\n authIn,\n body: params,\n clientId,\n clientSecret: clientSecretValue,\n encoding,\n url: tokenUrl\n });\n const response = await fetch(request);\n if (!response.ok)\n throw await createOAuth2FetchError(response);\n return response.json();\n },\n async revokeToken(token) {\n const { revocationRequest } = meta;\n if (!revocationRequest) {\n throw new Error(\"Token revocation not defined for this provider\");\n }\n const { url, authIn, body, headers, tokenParamName } = revocationRequest;\n const endpoint = await resolveConfigProp(url);\n const resolvedBody = await resolveConfigProp(body);\n const revocationBody = new URLSearchParams(resolvedBody);\n const revocationHeaders = new Headers(headers && await resolveConfigProp(headers));\n const { clientId } = config;\n const clientSecret = hasClientSecret(config) ? config.clientSecret : undefined;\n let request;\n if (authIn === \"body\") {\n revocationBody.set(tokenParamName, token);\n revocationBody.set(\"client_id\", clientId);\n if (clientSecret)\n revocationBody.set(\"client_secret\", clientSecret);\n request = createOAuth2Request({\n authIn: \"body\",\n body: revocationBody,\n clientId,\n clientSecret,\n encoding: \"application/x-www-form-urlencoded\",\n headers: revocationHeaders,\n url: endpoint.toString()\n });\n } else if (authIn === \"header\") {\n revocationHeaders.set(\"Authorization\", `Bearer ${token}`);\n request = createOAuth2Request({\n authIn: \"header\",\n body: revocationBody,\n clientId,\n clientSecret,\n encoding: \"application/x-www-form-urlencoded\",\n headers: revocationHeaders,\n url: endpoint.toString()\n });\n } else {\n request = createOAuth2Request({\n authIn: \"query\",\n body: revocationBody,\n clientId,\n clientSecret,\n encoding: \"application/x-www-form-urlencoded\",\n headers: revocationHeaders,\n url: `${endpoint.toString()}?${tokenParamName}=${token}`\n });\n }\n const response = await fetch(request);\n if (!response.ok)\n throw await createOAuth2FetchError(response);\n },\n async validateAuthorizationCode(opts) {\n const { code, codeVerifier } = opts;\n const { authIn, encoding } = meta.tokenRequest;\n const bodyObj = {};\n for (const key in meta.validateAuthorizationCodeBody ?? {}) {\n const value = meta.validateAuthorizationCodeBody[key];\n if (typeof value === \"string\")\n bodyObj[key] = value;\n }\n bodyObj.grant_type = \"authorization_code\";\n bodyObj.code = code;\n if (config.redirectUri)\n bodyObj.redirect_uri = config.redirectUri;\n if (meta.PKCEMethod !== undefined) {\n if (!codeVerifier) {\n throw new Error(\"codeVerifier required when PKCE is enabled\");\n }\n bodyObj.code_verifier = codeVerifier;\n }\n const payload = encoding === \"application/json\" ? bodyObj : new URLSearchParams(bodyObj);\n const request = createOAuth2Request({\n authIn,\n body: payload,\n clientId: config.clientId,\n clientSecret: hasClientSecret(config) ? config.clientSecret : undefined,\n encoding,\n url: tokenUrl\n });\n const response = await fetch(request);\n if (!response.ok)\n throw await createOAuth2FetchError(response);\n return response.json();\n }\n };\n};\nexport {\n scopeRequiredProviderOptions,\n revocableProviderOptions,\n refreshableProviderOptions,\n providers,\n providerOptions,\n pkceProviderOptions,\n oidcProviderOptions,\n isValidProviderOption,\n isScopeRequiredProviderOption,\n isRevocableProviderOption,\n isRevocableOAuth2Client,\n isRefreshableProviderOption,\n isRefreshableOAuth2Client,\n isPKCEProviderOption,\n isObject,\n isOIDCProviderOption,\n hmacSha256,\n hasClientSecret,\n getWithingsProps,\n generateState,\n generateCodeVerifier,\n encodeBase64,\n defineProviders,\n decodeJWT,\n decodeBase64,\n createS256CodeChallenge,\n createOAuth2Request,\n createOAuth2FetchError,\n createOAuth2Client\n};\n",
5
+ "// @bun\n// src/constants.ts\nvar NUM_GENERATOR_BYTES = 32;\nvar BASE64_BLOCK_SIZE = 4;\n\n// src/utils.ts\nvar createOAuth2FetchError = async (response) => {\n const clone = response.clone();\n const prefix = `HTTP ${response.status} ${response.statusText} for ${response.url}`;\n const payload = await response.json().catch(() => null);\n if (payload && typeof payload === \"object\" && Object.keys(payload).length) {\n return new Error(`${prefix}\n${JSON.stringify(payload)}`);\n }\n const text = await clone.text().catch(() => \"\");\n if (text) {\n return new Error(`${prefix}\n${text}`);\n }\n return new Error(prefix);\n};\nvar encodeBase64 = (input) => {\n let raw;\n if (typeof input === \"string\") {\n raw = input;\n } else {\n const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);\n raw = bytes.reduce((acc, byte) => acc + String.fromCharCode(byte), \"\");\n }\n return btoa(raw);\n};\nvar decodeBase64 = (input, toUint8Array = false) => {\n const b64 = input.replace(/-/g, \"+\").replace(/_/g, \"/\") + \"==\".slice(0, (BASE64_BLOCK_SIZE - input.length % BASE64_BLOCK_SIZE) % BASE64_BLOCK_SIZE);\n const raw = atob(b64);\n if (!toUint8Array) {\n return raw;\n }\n const bytes = new Uint8Array(raw.length);\n for (let i = 0;i < raw.length; i++) {\n bytes[i] = raw.charCodeAt(i);\n }\n return bytes;\n};\nvar hmacSha256 = async (message, secret) => {\n const encoder = new TextEncoder;\n const key = await crypto.subtle.importKey(\"raw\", encoder.encode(secret), { hash: \"SHA-256\", name: \"HMAC\" }, false, [\"sign\"]);\n const sigBuffer = await crypto.subtle.sign(\"HMAC\", key, encoder.encode(message));\n return Array.from(new Uint8Array(sigBuffer)).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n};\nvar decodeJWT = (tokenString) => {\n const [headerSegment, payloadSegment, signatureSegment] = tokenString.split(\".\");\n if (!headerSegment || !payloadSegment || !signatureSegment) {\n throw new Error(\"Invalid JWT format\");\n }\n const decodedPayload = decodeBase64(payloadSegment);\n if (typeof decodedPayload !== \"string\") {\n throw new Error(\"Expected JWT payload to be a UTF-8 string\");\n }\n return JSON.parse(decodedPayload);\n};\nvar getWithingsProps = async (config) => {\n const timestamp = Math.floor(Date.now() / 1000);\n const signature = `getnonce,${config.clientId},${timestamp}`;\n const hashedSignature = await hmacSha256(signature, config.clientSecret);\n const nonceUrl = new URL(\"https://wbsapi.withings.net/v2/signature\");\n nonceUrl.searchParams.set(\"action\", \"getnonce\");\n nonceUrl.searchParams.set(\"client_id\", config.clientId);\n nonceUrl.searchParams.set(\"timestamp\", timestamp.toString());\n nonceUrl.searchParams.set(\"signature\", hashedSignature);\n const nonceResponse = await fetch(nonceUrl.toString(), {\n method: \"POST\"\n });\n const nonceData = await nonceResponse.json();\n if (nonceData.status === 0) {\n return {\n hashedSignature,\n nonce: nonceData.body.nonce\n };\n }\n return;\n};\nvar createOAuth2Request = ({\n url,\n body,\n authIn,\n headers,\n encoding,\n clientId,\n clientSecret\n}) => {\n const oauthHeaders = new Headers(headers);\n oauthHeaders.set(\"Accept\", \"application/json\");\n oauthHeaders.set(\"User-Agent\", \"citra\");\n if (authIn === \"header\") {\n if (!clientSecret) {\n throw new Error(\"clientSecret required for header auth\");\n }\n oauthHeaders.set(\"Authorization\", `Basic ${encodeBase64(`${clientId}:${clientSecret}`)}`);\n }\n if (encoding === \"application/json\") {\n oauthHeaders.set(\"Content-Type\", \"application/json\");\n return new Request(url, {\n body: JSON.stringify(body),\n headers: oauthHeaders,\n method: \"POST\"\n });\n }\n oauthHeaders.set(\"Content-Type\", \"application/x-www-form-urlencoded\");\n const entries = body instanceof URLSearchParams ? Array.from(body.entries()) : Object.entries(body).filter((entry) => typeof entry[1] === \"string\");\n const params = new URLSearchParams(entries);\n if (authIn === \"body\") {\n params.set(\"client_id\", clientId);\n clientSecret && params.set(\"client_secret\", clientSecret);\n }\n return new Request(url, {\n body: params.toString(),\n headers: oauthHeaders,\n method: \"POST\"\n });\n};\n\n// src/arctic-utils.ts\nvar createS256CodeChallenge = async (codeVerifier) => {\n const data = new TextEncoder().encode(codeVerifier);\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", data);\n return base64Url(hashBuffer);\n};\nvar createRandomBase64UrlGenerator = (length) => () => {\n const buffer = crypto.getRandomValues(new Uint8Array(length));\n return base64Url(buffer);\n};\nvar generateCodeVerifier = createRandomBase64UrlGenerator(NUM_GENERATOR_BYTES);\nvar generateState = createRandomBase64UrlGenerator(NUM_GENERATOR_BYTES);\nvar base64Url = (input) => encodeBase64(input).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n\n// src/graphqlQueries.ts\nvar anilistProfileQuery = `query {\n Viewer {\n id\n name\n about\n avatar {\n large\n medium\n }\n bannerImage\n siteUrl\n createdAt\n updatedAt\n donatorTier\n donatorBadge\n unreadNotificationCount\n options {\n titleLanguage\n displayAdultContent\n airingNotifications\n profileColor\n activityMergeTime\n staffNameLanguage\n }\n mediaListOptions {\n scoreFormat\n rowOrder\n animeList {\n sectionOrder\n customLists\n advancedScoringEnabled\n }\n mangaList {\n sectionOrder\n customLists\n advancedScoringEnabled\n }\n }\n statistics {\n anime {\n count\n meanScore\n minutesWatched\n episodesWatched\n }\n manga {\n count\n meanScore\n chaptersRead\n volumesRead\n }\n }\n favourites {\n anime {\n nodes {\n id\n title {\n romaji\n english\n }\n siteUrl\n }\n }\n manga {\n nodes {\n id\n title {\n romaji\n english\n }\n siteUrl\n }\n }\n characters {\n nodes {\n id\n name {\n full\n }\n image {\n large\n }\n }\n }\n staff {\n nodes {\n id\n name {\n full\n }\n image {\n large\n }\n }\n }\n studios {\n nodes {\n id\n name\n siteUrl\n }\n }\n }\n isFollower\n isFollowing\n }\n}`;\n\n// src/typeGuards.ts\nvar isValidProviderOption = (option) => Object.hasOwn(providers, option);\nvar isRefreshableProviderOption = (option) => {\n if (!isValidProviderOption(option))\n return false;\n const provider = providers[option];\n return provider.isRefreshable;\n};\nvar isRevocableProviderOption = (option) => {\n if (!isValidProviderOption(option))\n return false;\n const provider = providers[option];\n return provider.revocationRequest !== undefined;\n};\nvar isPKCEProviderOption = (option) => {\n if (!isValidProviderOption(option))\n return false;\n const provider = providers[option];\n return provider.PKCEMethod !== undefined;\n};\nvar isOIDCProviderOption = (option) => {\n if (!isValidProviderOption(option))\n return false;\n const provider = providers[option];\n return provider.isOIDC;\n};\nvar isScopeRequiredProviderOption = (option) => {\n if (!isValidProviderOption(option))\n return false;\n const provider = providers[option];\n return provider.scopeRequired;\n};\nvar isRefreshableOAuth2Client = (providerName, client) => isRefreshableProviderOption(providerName);\nvar isRevocableOAuth2Client = (providerName, client) => isRevocableProviderOption(providerName);\nvar hasClientSecret = (credentials) => {\n if (typeof credentials !== \"object\" || credentials === null)\n return false;\n const secret = Reflect.get(credentials, \"clientSecret\");\n return typeof secret === \"string\";\n};\nvar isObject = (x) => x !== null && typeof x === \"object\" && !Array.isArray(x) && Object.prototype.toString.call(x) === \"[object Object]\";\n\n// src/providers.ts\nvar extractPropFromIdentity = (identity, keys) => {\n let value = identity;\n for (const key of keys) {\n if (Array.isArray(value)) {\n value = value[0];\n }\n if (!isObject(value)) {\n throw new Error(`Invalid identity data shape: expected object, got ${typeof value}`);\n }\n value = value[key];\n }\n return value;\n};\nvar extractSubFromOIDCIdentity = (identity) => {\n const sub = extractPropFromIdentity(identity, [\"sub\"]);\n if (typeof sub !== \"string\") {\n throw new Error(\"Invalid identity data shape\");\n }\n return sub;\n};\nvar defineProviders = (providers2) => providers2;\nvar providers = defineProviders({\n \"42\": {\n authorizationUrl: \"https://api.intra.42.fr/oauth/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.intra.42.fr/v2/me\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.intra.42.fr/oauth/token\"\n }\n },\n amazoncognito: {\n authorizationUrl: \"https://${domain}/oauth2/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: (config) => `https://${config.domain}/oauth2/userInfo`\n },\n revocationRequest: {\n authIn: \"body\",\n encoding: \"application/json\",\n tokenParamName: \"token\",\n url: (config) => `https://${config.domain}/oauth2/revoke`\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: (config) => `https://${config.domain}/oauth2/token`\n }\n },\n anilist: {\n authorizationUrl: \"https://anilist.co/api/v2/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\n \"data\",\n \"Viewer\",\n \"id\"\n ]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n body: {\n query: anilistProfileQuery\n },\n encoding: \"application/json\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n method: \"POST\",\n url: \"https://graphql.anilist.co\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://anilist.co/api/v2/oauth/token\"\n }\n },\n apple: {\n authorizationUrl: \"https://appleid.apple.com/auth/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://appleid.apple.com/auth/userinfo\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://appleid.apple.com/auth/token\"\n }\n },\n atlassian: {\n authorizationUrl: \"https://auth.atlassian.com/authorize\",\n createAuthorizationURLSearchParams: {\n audience: \"api.atlassian.com\"\n },\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"account_id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.atlassian.com/me\"\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://auth.atlassian.com/oauth/token\"\n }\n },\n auth0: {\n authorizationUrl: (config) => `https://${config.domain}/authorize`,\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: (config) => `https://${config.domain}/userinfo`\n },\n revocationRequest: {\n authIn: \"body\",\n body: new URLSearchParams({\n token_type_hint: \"refresh_token\"\n }),\n encoding: \"application/json\",\n tokenParamName: \"token\",\n url: (config) => `https://${config.domain}/oauth/revoke`\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: (config) => `https://${config.domain}/oauth/token`\n }\n },\n authentik: {\n authorizationUrl: (config) => `https://${config.baseURL}/oauth/authorize`,\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: (config) => `https://${config.baseURL}/api/v3/user/`\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: (config) => `https://${config.baseURL}/oauth/token`\n }\n },\n autodesk: {\n authorizationUrl: \"https://developer.api.autodesk.com/authentication/v2/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.userprofile.autodesk.com/userinfo\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://developer.api.autodesk.com/authentication/v2/token\"\n }\n },\n battlenet: {\n authorizationUrl: \"https://oauth.battle.net/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: false,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://oauth.battle.net/userinfo\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://oauth.battle.net/token\"\n }\n },\n bitbucket: {\n authorizationUrl: \"https://bitbucket.org/site/oauth2/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"uuid\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.bitbucket.org/2.0/user\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://bitbucket.org/site/oauth2/access_token\"\n }\n },\n box: {\n authorizationUrl: \"https://account.box.com/api/oauth2/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.box.com/2.0/users/me\"\n },\n revocationRequest: {\n authIn: \"body\",\n encoding: \"application/json\",\n tokenParamName: \"token\",\n url: \"https://api.box.com/oauth2/revoke\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.box.com/oauth2/token\"\n }\n },\n bungie: {\n authorizationUrl: \"https://www.bungie.net/en/OAuth/Authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\n \"Response\",\n \"membershipId\"\n ]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n headers: {\n \"X-API-Key\": \"<YOUR_API_KEY>\"\n },\n method: \"GET\",\n url: \"https://www.bungie.net/Platform/User/GetCurrentBungieNetUser\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://www.bungie.net/Platform/App/OAuth/token\"\n }\n },\n coinbase: {\n authorizationUrl: \"https://www.coinbase.com/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"data\", \"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.coinbase.com/v2/user\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.coinbase.com/oauth/token\"\n }\n },\n discord: {\n authorizationUrl: \"https://discord.com/api/oauth2/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://discord.com/api/users/@me\"\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://discord.com/api/oauth2/token\"\n }\n },\n donationalerts: {\n authorizationUrl: \"https://www.donationalerts.com/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"data\", \"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://www.donationalerts.com/api/v1/user/oauth\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://www.donationalerts.com/oauth/token\"\n }\n },\n dribbble: {\n authorizationUrl: \"https://dribbble.com/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: false,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.dribbble.com/v2/user\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://dribbble.com/oauth/token\"\n }\n },\n dropbox: {\n authorizationUrl: \"https://www.dropbox.com/oauth2/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"account_id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"POST\",\n url: \"https://api.dropboxapi.com/2/users/get_current_account\"\n },\n revocationRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n url: \"https://api.dropboxapi.com/2/auth/token/revoke\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.dropboxapi.com/oauth2/token\"\n }\n },\n epicgames: {\n authorizationUrl: \"https://www.epicgames.com/id/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"account_id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.epicgames.dev/epic/oauth/v2/userInfo\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.epicgames.dev/epic/oauth/v1/token\"\n }\n },\n etsy: {\n authorizationUrl: \"https://www.etsy.com/oauth/connect\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\n \"results\",\n \"0\",\n \"user_id\"\n ]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://openapi.etsy.com/v3/application/users/me\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.etsy.com/v3/public/oauth/token\"\n }\n },\n facebook: {\n authorizationUrl: \"https://www.facebook.com/v16.0/dialog/oauth\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: false,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"query\",\n encoding: \"application/json\",\n method: \"GET\",\n searchParams: [[\"fields\", \"id,name,email,picture\"]],\n url: \"https://graph.facebook.com/me\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://graph.facebook.com/v16.0/oauth/access_token\"\n }\n },\n figma: {\n authorizationUrl: \"https://www.figma.com/oauth\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"string\") {\n throw new Error(`Invalid identity data shape: expected string, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.figma.com/v1/me\"\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.figma.com/v1/oauth/token\"\n }\n },\n gitea: {\n authorizationUrl: (config) => `${config.baseURL}/login/oauth/authorize`,\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: (config) => `${config.baseURL}/api/v1/user`\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: (config) => `${config.baseURL}/login/oauth/access_token`\n }\n },\n github: {\n authorizationUrl: \"https://github.com/login/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: false,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.github.com/user\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://github.com/login/oauth/access_token\"\n }\n },\n gitlab: {\n authorizationUrl: (config) => `${config.baseURL}/oauth/authorize`,\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://gitlab.com/api/v4/user\"\n },\n revocationRequest: {\n authIn: \"body\",\n encoding: \"application/json\",\n tokenParamName: \"token\",\n url: (config) => `${config.baseURL}/oauth/revoke`\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: (config) => `${config.baseURL}/oauth/token`\n }\n },\n google: {\n authorizationUrl: \"https://accounts.google.com/o/oauth2/v2/auth\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n searchParams: [[\"personFields\", \"names,emailAddresses,photos\"]],\n url: \"https://people.googleapis.com/v1/people/me\"\n },\n revocationRequest: {\n authIn: \"body\",\n encoding: \"application/json\",\n tokenParamName: \"token\",\n url: \"https://oauth2.googleapis.com/revoke\"\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://oauth2.googleapis.com/token\"\n }\n },\n intuit: {\n authorizationUrl: \"https://appcenter.intuit.com/connect/oauth2\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: (config) => config.environment === \"production\" ? \"https://accounts.platform.intuit.com/v1/openid_connect/userinfo\" : \"https://sandbox-accounts.platform.intuit.com/v1/openid_connect/userinfo\"\n },\n revocationRequest: {\n authIn: \"body\",\n encoding: \"application/json\",\n headers: (config) => ({\n Authorization: `Basic ${encodeBase64(`${config.clientId}:${config.clientSecret}`)}`\n }),\n tokenParamName: \"token\",\n url: \"https://developer.api.intuit.com/v2/oauth2/tokens/revoke\"\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer\"\n }\n },\n kakao: {\n authorizationUrl: \"https://kauth.kakao.com/oauth/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://kapi.kakao.com/v2/user/me\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://kauth.kakao.com/oauth/token\"\n }\n },\n keycloak: {\n authorizationUrl: (config) => `${config.realmURL}/protocol/openid-connect/auth`,\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.kick.com/v1/user\"\n },\n revocationRequest: {\n authIn: \"body\",\n encoding: \"application/json\",\n tokenParamName: \"token\",\n url: (config) => `${config.realmURL}/protocol/openid-connect/revoke`\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: (config) => `${config.realmURL}/protocol/openid-connect/token`\n }\n },\n kick: {\n authorizationUrl: \"https://id.kick.com/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\n \"data\",\n \"user_id\"\n ]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.kick.com/public/v1/users\"\n },\n revocationRequest: {\n authIn: \"body\",\n encoding: \"application/json\",\n tokenParamName: \"token\",\n url: \"https://id.kick.com/oauth/revoke\"\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://id.kick.com/oauth/token\"\n }\n },\n lichess: {\n authorizationUrl: \"https://lichess.org/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: false,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://lichess.org/api/account\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://lichess.org/api/token\"\n }\n },\n line: {\n authorizationUrl: \"https://access.line.me/oauth2/v2.1/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.line.me/v2/profile\"\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.line.me/oauth2/v2.1/token\"\n }\n },\n linear: {\n authorizationUrl: \"https://linear.app/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\n \"data\",\n \"viewer\",\n \"id\"\n ]);\n if (typeof subject !== \"string\") {\n throw new Error(`Invalid identity data shape: expected string got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: false,\n profileRequest: {\n authIn: \"header\",\n body: {\n query: `query { viewer { id name } }`\n },\n encoding: \"application/json\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n method: \"POST\",\n url: \"https://api.linear.app/graphql\"\n },\n revocationRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n url: \"https://api.linear.app/oauth/revoke\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.linear.app/oauth/token\"\n }\n },\n linkedin: {\n authorizationUrl: \"https://www.linkedin.com/oauth/v2/authorization\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.linkedin.com/v2/me\"\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://www.linkedin.com/oauth/v2/accessToken\"\n }\n },\n mastodon: {\n authorizationUrl: (config) => `${config.baseURL}/oauth/authorize`,\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: false,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: (config) => `${config.baseURL}/api/v1/accounts/verify_credentials`\n },\n revocationRequest: {\n authIn: \"body\",\n encoding: \"application/json\",\n tokenParamName: \"token\",\n url: (config) => `${config.baseURL}/oauth/revoke`\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: (config) => `${config.baseURL}/oauth/token`\n }\n },\n mercadolibre: {\n authorizationUrl: \"https://auth.mercadolibre.com/authorization\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.mercadolibre.com/users/me\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.mercadolibre.com/oauth/token\"\n }\n },\n mercadopago: {\n authorizationUrl: \"https://auth.mercadopago.com/authorization\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.mercadopago.com/v1/users/me\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.mercadopago.com/oauth/token\"\n }\n },\n microsoftentraid: {\n authorizationUrl: (config) => `https://${config.tenantId}.b2clogin.com/${config.tenantId}/oauth2/v2.0/authorize`,\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: (config) => `https://${config.tenantId}.b2clogin.com/${config.tenantId}/openid/userinfo`\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: (config) => `https://${config.tenantId}.b2clogin.com/${config.tenantId}/oauth2/v2.0/token`\n }\n },\n myanimelist: {\n authorizationUrl: \"https://myanimelist.net/v1/oauth2/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n PKCEMethod: \"plain\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.myanimelist.net/v2/users/@me\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://myanimelist.net/v1/oauth2/token\"\n }\n },\n naver: {\n authorizationUrl: \"https://nid.naver.com/oauth2.0/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\n \"response\",\n \"id\"\n ]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://openapi.naver.com/v1/nid/me\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://nid.naver.com/oauth2.0/token\"\n }\n },\n notion: {\n authorizationUrl: \"https://api.notion.com/v1/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: false,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n headers: {\n \"Notion-Version\": \"2022-06-28\"\n },\n method: \"GET\",\n url: \"https://api.notion.com/v1/users/me\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n url: \"https://api.notion.com/v1/oauth/token\"\n }\n },\n okta: {\n authorizationUrl: (config) => `https://${config.domain}/oauth2/default/v1/authorize`,\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: (config) => `https://${config.domain}/oauth2/default/v1/userinfo`\n },\n revocationRequest: {\n authIn: \"body\",\n encoding: \"application/json\",\n tokenParamName: \"token\",\n url: (config) => `https://${config.domain}/oauth2/default/v1/revoke`\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: (config) => `https://${config.domain}/oauth2/default/v1/token`\n }\n },\n osu: {\n authorizationUrl: \"https://osu.ppy.sh/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://osu.ppy.sh/api/v2/me\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://osu.ppy.sh/oauth/token\"\n }\n },\n patreon: {\n authorizationUrl: \"https://www.patreon.com/oauth2/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"data\", \"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://www.patreon.com/api/oauth2/v2/identity\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://www.patreon.com/api/oauth2/token\"\n }\n },\n polar: {\n authorizationUrl: \"https://polar.sh/oauth2/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.polar.sh/v1/oauth2/userinfo\"\n },\n revocationRequest: {\n authIn: \"body\",\n encoding: \"application/json\",\n tokenParamName: \"token\",\n url: \"https://api.polar.sh/v1/oauth2/revoke\"\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.polar.sh/v1/oauth2/token\"\n }\n },\n polaraccesslink: {\n authorizationUrl: \"https://flow.polar.com/oauth2/authorization\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"x_user_id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: false,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://www.polaraccesslink.com/v3/users/me\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"header\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://polarremote.com/v2/oauth2/token\"\n }\n },\n polarteampro: {\n authorizationUrl: \"https://auth.polar.com/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"x_user_id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://www.polaraccesslink.com/v3/users/<USER_ID>\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"header\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://auth.polar.com/oauth/token\"\n }\n },\n reddit: {\n authorizationUrl: \"https://www.reddit.com/api/v1/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://oauth.reddit.com/api/v1/me\"\n },\n revocationRequest: {\n authIn: \"header\",\n body: new URLSearchParams({\n token_type_hint: \"refresh_token\"\n }),\n encoding: \"application/json\",\n url: \"https://www.reddit.com/api/v1/revoke_token\"\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"header\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://www.reddit.com/api/v1/access_token\"\n }\n },\n roblox: {\n authorizationUrl: \"https://apis.roblox.com/oauth/v1/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://apis.roblox.com/oauth/v1/userinfo\"\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://apis.roblox.com/oauth/v1/token\"\n }\n },\n salesforce: {\n authorizationUrl: \"https://login.salesforce.com/services/oauth2/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://login.salesforce.com/services/oauth2/userinfo\"\n },\n revocationRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n url: \"https://login.salesforce.com/services/oauth2/revoke\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://login.salesforce.com/services/oauth2/token\"\n }\n },\n shikimori: {\n authorizationUrl: \"https://shikimori.org/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://shikimori.one/api/users/whoami\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://shikimori.org/oauth/token\"\n }\n },\n slack: {\n authorizationUrl: \"https://slack.com/openid/connect/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n profileRequest: {\n authIn: \"query\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://slack.com/api/users.identity\"\n },\n revocationRequest: {\n authIn: \"body\",\n encoding: \"application/json\",\n tokenParamName: \"token\",\n url: \"https://slack.com/api/auth.revoke\"\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://slack.com/api/openid.connect.token\"\n }\n },\n spotify: {\n authorizationUrl: \"https://accounts.spotify.com/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.spotify.com/v1/me\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://accounts.spotify.com/api/token\"\n }\n },\n startgg: {\n authorizationUrl: \"https://start.gg/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\n \"data\",\n \"currentUser\",\n \"id\"\n ]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n body: {\n query: `query { currentUser { id slug email player { gamerTag } } }`\n },\n encoding: \"application/json\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n method: \"POST\",\n url: \"https://api.start.gg/gql/alpha\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.start.gg/oauth/access_token\"\n }\n },\n strava: {\n authorizationUrl: \"https://www.strava.com/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://www.strava.com/api/v3/athlete\"\n },\n revocationRequest: {\n authIn: \"query\",\n body: new URLSearchParams({\n token_type_hint: \"access_token\"\n }),\n encoding: \"application/json\",\n tokenParamName: \"access_token\",\n url: \"https://www.strava.com/oauth/deauthorize\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://www.strava.com/oauth/token\"\n }\n },\n synology: {\n authorizationUrl: (config) => `${config.baseURL}/webman/sso/SSOOauth.cgi?client_id=${config.clientId}&response_type=code&redirect_uri=${config.redirectUri}`,\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"data\", \"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: false,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: (config) => `${config.baseURL}/webman/sso/SSOUserInfo.cgi?client_id=${config.clientId}&access_token=${config.accessToken}`\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: (config) => `${config.baseURL}/webman/sso/SSOAccessToken.cgi?client_id=${config.clientId}&client_secret=${config.clientSecret}`\n }\n },\n tiktok: {\n authorizationUrl: \"https://www.tiktok.com/v2/auth/authorize\",\n createAuthorizationURLSearchParams: (config) => ({\n client_key: config.clientId\n }),\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\n \"data\",\n \"open_id\"\n ]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"query\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://open.douyin.com/oauth/userinfo\"\n },\n revocationRequest: {\n authIn: \"body\",\n encoding: \"application/json\",\n tokenParamName: \"token\",\n url: \"https://open.tiktokapis.com/v2/oauth/revoke/\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://open.tiktokapis.com/v2/oauth/token/\"\n }\n },\n tiltify: {\n authorizationUrl: \"https://v5api.tiltify.com/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"data\", \"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://v5api.tiltify.com/api/public/current-user\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://v5api.tiltify.com/oauth/token\"\n }\n },\n tumblr: {\n authorizationUrl: \"https://www.tumblr.com/oauth2/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\n \"response\",\n \"user\",\n \"name\"\n ]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.tumblr.com/v2/user/info\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.tumblr.com/v2/oauth2/token\"\n }\n },\n twitch: {\n authorizationUrl: \"https://id.twitch.tv/oauth2/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n headers: (config) => ({\n \"Client-Id\": config.clientId\n }),\n method: \"GET\",\n url: \"https://api.twitch.tv/helix/users\"\n },\n revocationRequest: {\n authIn: \"query\",\n encoding: \"application/json\",\n headers: (config) => ({\n \"Client-Id\": config.clientId\n }),\n tokenParamName: \"token\",\n url: \"https://id.twitch.tv/oauth2/revoke\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://id.twitch.tv/oauth2/token\"\n }\n },\n twitter: {\n authorizationUrl: \"https://twitter.com/i/oauth2/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"data\", \"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.twitter.com/2/users/me\"\n },\n revocationRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n url: \"https://api.twitter.com/2/oauth2/revoke\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.twitter.com/2/oauth2/token\"\n }\n },\n vk: {\n authorizationUrl: \"https://oauth.vk.com/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\n \"response\",\n \"0\",\n \"id\"\n ]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: false,\n profileRequest: {\n authIn: \"query\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.vk.com/method/users.get\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://oauth.vk.com/access_token\"\n }\n },\n withings: {\n authorizationUrl: \"https://account.withings.com/oauth2_user/authorize2\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\n \"body\",\n \"userid\"\n ]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number, got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n profileRequest: {\n authIn: \"header\",\n body: async (config) => {\n const props = await getWithingsProps(config);\n if (props === undefined)\n throw new Error(\"Failed to get Withings search properties\");\n const { nonce, hashedSignature } = props;\n return [\n [\"action\", \"getuser\"],\n [\"nonce\", nonce],\n [\"client_id\", config.clientId],\n [\"signature\", hashedSignature]\n ];\n },\n encoding: \"application/x-www-form-urlencoded\",\n method: \"POST\",\n url: \"https://wbsapi.withings.net/v2/oauth2\"\n },\n refreshAccessTokenBody: {\n action: \"requesttoken\"\n },\n revocationRequest: {\n authIn: \"header\",\n body: async (config) => {\n const props = await getWithingsProps(config);\n if (!props)\n throw new Error(\"Failed to get Withings props\");\n const { nonce, hashedSignature } = props;\n return [\n [\"action\", \"revoke\"],\n [\"client_id\", config.clientId],\n [\"nonce\", nonce],\n [\"signature\", hashedSignature]\n ];\n },\n encoding: \"application/x-www-form-urlencoded\",\n method: \"POST\",\n url: \"https://wbsapi.withings.net/v2/oauth2\"\n },\n scopeRequired: true,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://wbsapi.withings.net/v2/oauth2\"\n },\n validateAuthorizationCodeBody: {\n action: \"requesttoken\"\n }\n },\n workos: {\n authorizationUrl: \"https://api.workos.com/sso/authorize\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.workos.com/sso/userinfo\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.workos.com/sso/token\"\n }\n },\n yahoo: {\n authorizationUrl: \"https://api.login.yahoo.com/oauth2/request_auth\",\n extractSubjectFromIdentity: extractSubFromOIDCIdentity,\n isOIDC: true,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.login.yahoo.com/openid/v1/userinfo\"\n },\n revocationRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n url: \"https://api.login.yahoo.com/oauth2/revoke\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://api.login.yahoo.com/oauth2/get_token\"\n }\n },\n yandex: {\n authorizationUrl: \"https://oauth.yandex.com/authorize\",\n createAuthorizationURLSearchParams: {\n device_id: crypto.randomUUID(),\n device_name: `${navigator.platform ?? \"Unknown\"} \\u2014 ${(navigator.userAgent.split(\")\")[0] || \"\").split(\"(\").pop() || \"Unknown\"}`\n },\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://login.yandex.ru/info\"\n },\n revocationRequest: {\n authIn: \"body\",\n encoding: \"application/json\",\n tokenParamName: \"access_token\",\n url: \"https://oauth.yandex.com/revoke_token\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://oauth.yandex.com/token\"\n }\n },\n zoom: {\n authorizationUrl: \"https://zoom.us/oauth/authorize\",\n extractSubjectFromIdentity(identity) {\n const subject = extractPropFromIdentity(identity, [\"id\"]);\n if (typeof subject !== \"number\") {\n throw new Error(`Invalid identity data shape: expected number got ${typeof subject}`);\n }\n return subject;\n },\n isOIDC: false,\n isRefreshable: true,\n PKCEMethod: \"S256\",\n profileRequest: {\n authIn: \"header\",\n encoding: \"application/json\",\n method: \"GET\",\n url: \"https://api.zoom.us/v2/users/me\"\n },\n revocationRequest: {\n authIn: \"query\",\n encoding: \"application/json\",\n headers: (config) => ({\n Authorization: `Basic ${btoa(`${config.clientId}:${config.clientSecret}`)}`\n }),\n tokenParamName: \"token\",\n url: \"https://zoom.us/oauth/revoke\"\n },\n scopeRequired: false,\n tokenRequest: {\n authIn: \"body\",\n encoding: \"application/x-www-form-urlencoded\",\n url: \"https://zoom.us/oauth/token\"\n }\n }\n});\nvar providerOptions = Object.keys(providers).filter(isValidProviderOption);\nvar refreshableProviderOptions = Object.keys(providers).filter(isRefreshableProviderOption);\nvar oidcProviderOptions = Object.keys(providers).filter(isOIDCProviderOption);\nvar revocableProviderOptions = Object.keys(providers).filter(isRevocableProviderOption);\nvar scopeRequiredProviderOptions = Object.keys(providers).filter(isScopeRequiredProviderOption);\nvar pkceProviderOptions = Object.keys(providers).filter(isPKCEProviderOption);\n\n// src/index.ts\nvar createOAuth2Client = async (providerName, config) => {\n const meta = providers[providerName];\n const isConfigPropertyFunction = (cfgProp) => typeof cfgProp === \"function\";\n const resolveConfigProp = async (cfgProp) => {\n const result = isConfigPropertyFunction(cfgProp) ? cfgProp(config) : cfgProp;\n return await result;\n };\n const authorizationUrl = await resolveConfigProp(meta.authorizationUrl);\n const tokenUrl = await resolveConfigProp(meta.tokenRequest.url);\n return {\n async createAuthorizationUrl(opts) {\n const { state, scope = [], searchParams = [], codeVerifier } = opts;\n const url = new URL(authorizationUrl);\n url.searchParams.set(\"response_type\", \"code\");\n url.searchParams.set(\"client_id\", config.clientId);\n if (config.redirectUri)\n url.searchParams.set(\"redirect_uri\", config.redirectUri);\n if (state)\n url.searchParams.set(\"state\", state);\n if (scope.length !== 0) {\n const delimeter = providerName === \"withings\" ? \",\" : \" \";\n url.searchParams.set(\"scope\", scope.join(delimeter));\n }\n if (meta.PKCEMethod !== undefined) {\n if (!codeVerifier) {\n throw new Error(\"`codeVerifier` is required when PKCE is enabled\");\n }\n const codeChallenge = meta.PKCEMethod === \"S256\" ? await createS256CodeChallenge(codeVerifier) : codeVerifier;\n url.searchParams.set(\"code_challenge_method\", meta.PKCEMethod);\n url.searchParams.set(\"code_challenge\", codeChallenge);\n }\n Object.entries(resolveConfigProp(meta.createAuthorizationURLSearchParams) ?? {}).forEach(([key, value]) => url.searchParams.set(key, value));\n searchParams.forEach(([key, value]) => url.searchParams.set(key, value));\n return url;\n },\n async fetchUserProfile(accessToken) {\n const { profileRequest } = meta;\n const {\n url,\n method,\n authIn,\n searchParams,\n body: profileBody,\n headers,\n encoding\n } = profileRequest;\n const endpoint = new URL(await resolveConfigProp(url));\n const resolvedBody = await resolveConfigProp(profileBody);\n new URLSearchParams(await resolveConfigProp(searchParams)).forEach((value, key) => endpoint.searchParams.append(key, value));\n let headerEntries = [];\n const rawHeaders = headers ? await resolveConfigProp(headers) : undefined;\n if (rawHeaders instanceof Headers)\n headerEntries = Array.from(rawHeaders.entries());\n else if (Array.isArray(rawHeaders))\n headerEntries = rawHeaders;\n else if (rawHeaders && typeof rawHeaders === \"object\")\n headerEntries = Object.entries(rawHeaders);\n const profileHeaders = Object.fromEntries(headerEntries.filter(([, v]) => v !== \"\"));\n if (authIn === \"header\") {\n profileHeaders.Authorization = `Bearer ${accessToken}`;\n } else {\n endpoint.searchParams.append(\"access_token\", accessToken);\n }\n const init = { headers: profileHeaders, method };\n if (method === \"POST\" && resolvedBody != null) {\n profileHeaders[\"Content-Type\"] = encoding;\n init.body = encoding === \"application/json\" ? JSON.stringify(resolvedBody) : new URLSearchParams(resolvedBody).toString();\n }\n const response = await fetch(endpoint.toString(), init);\n if (!response.ok)\n throw await createOAuth2FetchError(response);\n return response.json();\n },\n async refreshAccessToken(refreshToken) {\n const { authIn, encoding } = meta.tokenRequest;\n const params = new URLSearchParams(meta.refreshAccessTokenBody);\n params.set(\"grant_type\", \"refresh_token\");\n params.set(\"refresh_token\", refreshToken);\n const { clientId } = config;\n let clientSecretValue;\n if (hasClientSecret(config)) {\n clientSecretValue = config.clientSecret;\n params.set(\"client_id\", clientId);\n params.set(\"client_secret\", clientSecretValue);\n }\n const request = createOAuth2Request({\n authIn,\n body: params,\n clientId,\n clientSecret: clientSecretValue,\n encoding,\n url: tokenUrl\n });\n const response = await fetch(request);\n if (!response.ok)\n throw await createOAuth2FetchError(response);\n return response.json();\n },\n async revokeToken(token) {\n const { revocationRequest } = meta;\n if (!revocationRequest) {\n throw new Error(\"Token revocation not defined for this provider\");\n }\n const { url, authIn, body, headers, tokenParamName } = revocationRequest;\n const endpoint = await resolveConfigProp(url);\n const resolvedBody = await resolveConfigProp(body);\n const revocationBody = new URLSearchParams(resolvedBody);\n const revocationHeaders = new Headers(headers && await resolveConfigProp(headers));\n const { clientId } = config;\n const clientSecret = hasClientSecret(config) ? config.clientSecret : undefined;\n let request;\n if (authIn === \"body\") {\n revocationBody.set(tokenParamName, token);\n revocationBody.set(\"client_id\", clientId);\n if (clientSecret)\n revocationBody.set(\"client_secret\", clientSecret);\n request = createOAuth2Request({\n authIn: \"body\",\n body: revocationBody,\n clientId,\n clientSecret,\n encoding: \"application/x-www-form-urlencoded\",\n headers: revocationHeaders,\n url: endpoint.toString()\n });\n } else if (authIn === \"header\") {\n revocationHeaders.set(\"Authorization\", `Bearer ${token}`);\n request = createOAuth2Request({\n authIn: \"header\",\n body: revocationBody,\n clientId,\n clientSecret,\n encoding: \"application/x-www-form-urlencoded\",\n headers: revocationHeaders,\n url: endpoint.toString()\n });\n } else {\n request = createOAuth2Request({\n authIn: \"query\",\n body: revocationBody,\n clientId,\n clientSecret,\n encoding: \"application/x-www-form-urlencoded\",\n headers: revocationHeaders,\n url: `${endpoint.toString()}?${tokenParamName}=${token}`\n });\n }\n const response = await fetch(request);\n if (!response.ok)\n throw await createOAuth2FetchError(response);\n },\n async validateAuthorizationCode(opts) {\n const { code, codeVerifier } = opts;\n const { authIn, encoding } = meta.tokenRequest;\n const bodyObj = {};\n for (const key in meta.validateAuthorizationCodeBody ?? {}) {\n const value = meta.validateAuthorizationCodeBody[key];\n if (typeof value === \"string\")\n bodyObj[key] = value;\n }\n bodyObj.grant_type = \"authorization_code\";\n bodyObj.code = code;\n if (config.redirectUri)\n bodyObj.redirect_uri = config.redirectUri;\n if (meta.PKCEMethod !== undefined) {\n if (!codeVerifier) {\n throw new Error(\"codeVerifier required when PKCE is enabled\");\n }\n bodyObj.code_verifier = codeVerifier;\n }\n const payload = encoding === \"application/json\" ? bodyObj : new URLSearchParams(bodyObj);\n const request = createOAuth2Request({\n authIn,\n body: payload,\n clientId: config.clientId,\n clientSecret: hasClientSecret(config) ? config.clientSecret : undefined,\n encoding,\n url: tokenUrl\n });\n const response = await fetch(request);\n if (!response.ok)\n throw await createOAuth2FetchError(response);\n return response.json();\n }\n };\n};\nexport {\n scopeRequiredProviderOptions,\n revocableProviderOptions,\n refreshableProviderOptions,\n providers,\n providerOptions,\n pkceProviderOptions,\n oidcProviderOptions,\n isValidProviderOption,\n isScopeRequiredProviderOption,\n isRevocableProviderOption,\n isRevocableOAuth2Client,\n isRefreshableProviderOption,\n isRefreshableOAuth2Client,\n isPKCEProviderOption,\n isObject,\n isOIDCProviderOption,\n hmacSha256,\n hasClientSecret,\n getWithingsProps,\n generateState,\n generateCodeVerifier,\n encodeBase64,\n defineProviders,\n decodeJWT,\n decodeBase64,\n createS256CodeChallenge,\n createOAuth2Request,\n createOAuth2FetchError,\n createOAuth2Client\n};\n",
6
6
  "import { isValidProviderOption, createOAuth2Client } from 'citra';\nimport { Elysia } from 'elysia';\nimport { authorize } from './authorize';\nimport { callback } from './callback';\nimport { profile } from './profile';\nimport { protectRoute } from './protectRoute';\nimport { refresh } from './refresh';\nimport { revoke } from './revoke';\nimport { signout } from './signout';\nimport { status } from './status';\nimport { AbsoluteAuthProps, ClientProviders } from './types';\n\nexport const absoluteAuth = async <UserType>({\n\tprovidersConfiguration,\n\tauthorizeRoute,\n\tcallbackRoute,\n\tprofileRoute,\n\tsignoutRoute,\n\tstatusRoute,\n\trefreshRoute,\n\trevokeRoute,\n\tonAuthorizeSuccess,\n\tonAuthorizeError,\n\tonProfileSuccess,\n\tonProfileError,\n\tonCallbackSuccess,\n\tonCallbackError,\n\tonStatus,\n\tonRefreshSuccess,\n\tonRefreshError,\n\tonSignOut,\n\tonRevocationSuccess,\n\tonRevocationError\n}: AbsoluteAuthProps<UserType>) => {\n\tconst entryPromises: Array<Promise<[string, ClientProviders[string]]>> = [];\n\n\tfor (const [providerName, providerConfig] of Object.entries(\n\t\tprovidersConfiguration\n\t)) {\n\t\tif (!isValidProviderOption(providerName)) continue;\n\n\t\tentryPromises.push(\n\t\t\tcreateOAuth2Client(providerName, providerConfig.credentials).then(\n\t\t\t\t(providerInstance) => [\n\t\t\t\t\tproviderName,\n\t\t\t\t\t{\n\t\t\t\t\t\tproviderInstance,\n\t\t\t\t\t\tscope: providerConfig.scope,\n\t\t\t\t\t\tsearchParams: providerConfig.searchParams\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t)\n\t\t);\n\t}\n\n\tconst clientProviders: ClientProviders = Object.fromEntries(\n\t\tawait Promise.all(entryPromises)\n\t);\n\n\treturn new Elysia()\n\t\t.use(signout({ onSignOut, signoutRoute }))\n\t\t.use(\n\t\t\trevoke({\n\t\t\t\tclientProviders,\n\t\t\t\tonRevocationError,\n\t\t\t\tonRevocationSuccess,\n\t\t\t\trevokeRoute\n\t\t\t})\n\t\t)\n\t\t.use(status<UserType>({ onStatus, statusRoute }))\n\t\t.use(\n\t\t\trefresh({\n\t\t\t\tclientProviders,\n\t\t\t\tonRefreshError,\n\t\t\t\tonRefreshSuccess,\n\t\t\t\trefreshRoute\n\t\t\t})\n\t\t)\n\t\t.use(\n\t\t\tauthorize({\n\t\t\t\tauthorizeRoute,\n\t\t\t\tclientProviders,\n\t\t\t\tonAuthorizeError,\n\t\t\t\tonAuthorizeSuccess\n\t\t\t})\n\t\t)\n\t\t.use(\n\t\t\tcallback<UserType>({\n\t\t\t\tcallbackRoute,\n\t\t\t\tclientProviders,\n\t\t\t\tonCallbackError,\n\t\t\t\tonCallbackSuccess\n\t\t\t})\n\t\t)\n\t\t.use(\n\t\t\tprofile({\n\t\t\t\tclientProviders,\n\t\t\t\tonProfileError,\n\t\t\t\tonProfileSuccess,\n\t\t\t\tprofileRoute\n\t\t\t})\n\t\t)\n\t\t.use(protectRoute());\n};\n\nexport * from './types';\nexport { isValidUser } from './typeGuards';\nexport * from './utils';\nexport type {\n\tOAuth2TokenResponse,\n\tOAuth2Client,\n\tProviderOption,\n\tPKCEProvider,\n\tOIDCProvider,\n\tRefreshableProvider,\n\tRevocableProvider,\n\tScopeRequiredProvider,\n\tCredentialsFor\n} from 'citra';\n\nexport {\n\tproviderOptions,\n\trefreshableProviderOptions,\n\trevocableProviderOptions,\n\toidcProviderOptions,\n\tpkceProviderOptions,\n\tscopeRequiredProviderOptions,\n\tdecodeJWT,\n\tisValidProviderOption,\n\tisRefreshableOAuth2Client,\n\tisRefreshableProviderOption,\n\tisOIDCProviderOption,\n\tisPKCEProviderOption,\n\tisRevocableProviderOption,\n\tisRevocableOAuth2Client\n} from 'citra';\n",
7
7
  "import {\n\tgenerateCodeVerifier,\n\tgenerateState,\n\tisPKCEProviderOption,\n\tisValidProviderOption\n} from 'citra';\nimport { Elysia } from 'elysia';\nimport { COOKIE_DURATION } from './constants';\nimport {\n\tAuthorizeRoute,\n\tClientProviders,\n\tOnAuthorizeError,\n\tOnAuthorizeSuccess\n} from './types';\n\ntype AuthorizeProps = {\n\tclientProviders: ClientProviders;\n\tauthorizeRoute?: AuthorizeRoute;\n\tonAuthorizeSuccess: OnAuthorizeSuccess;\n\tonAuthorizeError: OnAuthorizeError;\n};\n\nexport const authorize = ({\n\tclientProviders,\n\tauthorizeRoute = '/oauth2/:provider/authorization',\n\tonAuthorizeSuccess,\n\tonAuthorizeError\n}: AuthorizeProps) =>\n\tnew Elysia().get(\n\t\tauthorizeRoute,\n\t\tasync ({\n\t\t\terror,\n\t\t\tredirect,\n\t\t\tcookie: { state, code_verifier, auth_provider, origin_url },\n\t\t\tparams: { provider },\n\t\t\theaders\n\t\t}) => {\n\t\t\tif (\n\t\t\t\tauth_provider === undefined ||\n\t\t\t\torigin_url === undefined ||\n\t\t\t\tstate === undefined ||\n\t\t\t\tcode_verifier === undefined\n\t\t\t)\n\t\t\t\treturn error('Bad Request', 'Cookies are missing');\n\n\t\t\tif (provider === undefined)\n\t\t\t\treturn error('Bad Request', 'Provider is required');\n\n\t\t\tif (!isValidProviderOption(provider))\n\t\t\t\treturn error('Bad Request', 'Invalid provider');\n\n\t\t\tconst providerConfig = clientProviders[provider];\n\t\t\tif (!providerConfig)\n\t\t\t\treturn error('Unauthorized', 'Client provider not found');\n\n\t\t\tconst { providerInstance, scope, searchParams } = providerConfig;\n\t\t\tconst referer = headers['referer'] ?? '/';\n\n\t\t\torigin_url.set({\n\t\t\t\thttpOnly: true,\n\t\t\t\tmaxAge: COOKIE_DURATION,\n\t\t\t\tpath: '/',\n\t\t\t\tsameSite: 'lax',\n\t\t\t\tsecure: true,\n\t\t\t\tvalue: referer\n\t\t\t});\n\n\t\t\tauth_provider.set({\n\t\t\t\thttpOnly: true,\n\t\t\t\tmaxAge: COOKIE_DURATION,\n\t\t\t\tpath: '/',\n\t\t\t\tsameSite: 'lax',\n\t\t\t\tsecure: true,\n\t\t\t\tvalue: provider\n\t\t\t});\n\n\t\t\tconst currentState = generateState();\n\t\t\tstate.set({\n\t\t\t\thttpOnly: true,\n\t\t\t\tmaxAge: COOKIE_DURATION,\n\t\t\t\tpath: '/',\n\t\t\t\tsameSite: 'lax',\n\t\t\t\tsecure: true,\n\t\t\t\tvalue: currentState\n\t\t\t});\n\n\t\t\tconst codeVerifier = isPKCEProviderOption(provider)\n\t\t\t\t? generateCodeVerifier()\n\t\t\t\t: undefined;\n\n\t\t\tif (codeVerifier) {\n\t\t\t\tcode_verifier.set({\n\t\t\t\t\thttpOnly: true,\n\t\t\t\t\tmaxAge: COOKIE_DURATION,\n\t\t\t\t\tpath: '/',\n\t\t\t\t\tsameSite: 'lax',\n\t\t\t\t\tsecure: true,\n\t\t\t\t\tvalue: codeVerifier\n\t\t\t\t});\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst authorizationURL =\n\t\t\t\t\tawait providerInstance.createAuthorizationUrl(\n\t\t\t\t\t\tcodeVerifier\n\t\t\t\t\t\t\t? { codeVerifier, scope, state: currentState }\n\t\t\t\t\t\t\t: { scope, state: currentState }\n\t\t\t\t\t);\n\n\t\t\t\tsearchParams?.forEach(([key, value]) =>\n\t\t\t\t\tauthorizationURL.searchParams.set(key, value)\n\t\t\t\t);\n\n\t\t\t\tawait onAuthorizeSuccess?.({\n\t\t\t\t\tauthorizationUrl: authorizationURL,\n\t\t\t\t\tauthProvider: provider\n\t\t\t\t});\n\n\t\t\t\treturn redirect(authorizationURL.toString());\n\t\t\t} catch (err) {\n\t\t\t\tawait onAuthorizeError?.({\n\t\t\t\t\tauthProvider: provider,\n\t\t\t\t\terror: err\n\t\t\t\t});\n\n\t\t\t\tif (err instanceof Error) {\n\t\t\t\t\treturn error(\n\t\t\t\t\t\t'Internal Server Error',\n\t\t\t\t\t\t`${err.message} - ${err.stack ?? ''}`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn error('Internal Server Error', `Unknown error: ${err}`);\n\t\t\t}\n\t\t}\n\t);\n",
8
8
  "export const SECONDS_IN_A_MINUTE = 60;\nexport const MILLISECONDS_IN_A_SECOND = 1000;\nexport const MILLISECONDS_IN_A_MINUTE =\n\tMILLISECONDS_IN_A_SECOND * SECONDS_IN_A_MINUTE;\nexport const MINUTES_IN_AN_HOUR = 60;\nexport const HOURS_IN_A_DAY = 24;\nexport const MILLISECONDS_IN_A_DAY =\n\tMILLISECONDS_IN_A_SECOND *\n\tSECONDS_IN_A_MINUTE *\n\tMINUTES_IN_AN_HOUR *\n\tHOURS_IN_A_DAY;\nexport const COOKIE_MINUTES = 30;\nexport const COOKIE_DURATION = SECONDS_IN_A_MINUTE * COOKIE_MINUTES;\n",
@@ -18,6 +18,6 @@
18
18
  "import { decodeJWT } from 'citra';\nimport { MILLISECONDS_IN_A_DAY } from './constants';\nimport { isValidUser } from './typeGuards';\nimport {\n\tAbsoluteAuthProps,\n\tInsantiateUserSessionProps,\n\tOAuth2ConfigurationOptions\n} from './types';\n\nexport const instantiateUserSession = async <UserType>({\n\tuserSessionId,\n\tauthProvider,\n\tsession,\n\ttokenResponse,\n\tproviderInstance,\n\tgetUser,\n\tcreateUser\n}: InsantiateUserSessionProps<UserType>) => {\n\tlet userIdentity;\n\n\tif (tokenResponse.id_token) {\n\t\tuserIdentity = decodeJWT(tokenResponse.id_token);\n\t} else if (authProvider === 'withings') {\n\t\t// @ts-expect-error TODO: Withings is its own case edit the validate response to accept this case\n\t\tuserIdentity = tokenResponse.body;\n\t} else {\n\t\tuserIdentity = await providerInstance.fetchUserProfile(\n\t\t\ttokenResponse.access_token\n\t\t);\n\t}\n\n\tlet user = await getUser(userIdentity);\n\tuser = user ?? (await createUser(userIdentity));\n\n\t// TODO : See if theres a better way to check valid user and not throw an error\n\tif (!isValidUser<UserType>(user))\n\t\tthrow new Error('Internal Server Error - Invalid user schema');\n\n\tsession[userSessionId] = {\n\t\taccessToken: tokenResponse.access_token,\n\t\texpiresAt: Date.now() + MILLISECONDS_IN_A_DAY,\n\t\trefreshToken: tokenResponse.refresh_token,\n\t\tuser\n\t};\n};\n\nexport const createAuthConfiguration = <UserType>(\n\tconfiguration: AbsoluteAuthProps<UserType>\n) => configuration;\n\nexport const createProvidersConfiguration = (\n\tprovidersConfiguration: OAuth2ConfigurationOptions\n) => providersConfiguration;\n"
19
19
  ],
20
20
  "mappings": "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",
21
- "debugId": "94BD555970DA5FF264756E2164756E21",
21
+ "debugId": "DE01A97FD6403C5E64756E2164756E21",
22
22
  "names": []
23
23
  }
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.13.3",
2
+ "version": "0.13.4",
3
3
  "name": "@absolutejs/auth",
4
4
  "description": "An authorization library for absolutejs",
5
5
  "repository": {
@@ -33,7 +33,7 @@
33
33
  "elysia": ">= 1.2.25"
34
34
  },
35
35
  "dependencies": {
36
- "citra": "0.22.3"
36
+ "citra": "0.22.4"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@absolutejs/absolute": "0.4.0",