@gatwech/core 0.0.1-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/.turbo/turbo-build.log +42 -0
  2. package/dist/api/index.d.mts +3 -0
  3. package/dist/api/index.mjs +26 -0
  4. package/dist/async_hooks/index.d.mts +2 -0
  5. package/dist/async_hooks/index.mjs +3 -0
  6. package/dist/async_hooks-BrLqUNsE.mjs +18 -0
  7. package/dist/context/index.d.mts +44 -0
  8. package/dist/context/index.mjs +4 -0
  9. package/dist/context-DxzHfoWW.mjs +108 -0
  10. package/dist/db/adapter/index.d.mts +3 -0
  11. package/dist/db/adapter/index.mjs +1 -0
  12. package/dist/db/index.d.mts +3 -0
  13. package/dist/db/index.mjs +61 -0
  14. package/dist/env/index.d.mts +2 -0
  15. package/dist/env/index.mjs +3 -0
  16. package/dist/env-JMSMESs1.mjs +245 -0
  17. package/dist/error/index.d.mts +35 -0
  18. package/dist/error/index.mjs +4 -0
  19. package/dist/error-41YsFQ8b.mjs +45 -0
  20. package/dist/index-CRg-E-VF.d.mts +7 -0
  21. package/dist/index-DLP-K0uY.d.mts +82 -0
  22. package/dist/index-DjrJweYn.d.mts +7312 -0
  23. package/dist/index.d.mts +3 -0
  24. package/dist/index.mjs +1 -0
  25. package/dist/oauth2/index.d.mts +3 -0
  26. package/dist/oauth2/index.mjs +3 -0
  27. package/dist/oauth2-DyI7_CNv.mjs +235 -0
  28. package/dist/social-providers/index.d.mts +3 -0
  29. package/dist/social-providers/index.mjs +2513 -0
  30. package/dist/utils/index.d.mts +9 -0
  31. package/dist/utils/index.mjs +3 -0
  32. package/dist/utils-BFQCAfNW.mjs +7 -0
  33. package/package.json +131 -0
  34. package/src/api/index.ts +57 -0
  35. package/src/async_hooks/index.ts +35 -0
  36. package/src/context/endpoint-context.ts +48 -0
  37. package/src/context/index.ts +21 -0
  38. package/src/context/request-state.test.ts +346 -0
  39. package/src/context/request-state.ts +75 -0
  40. package/src/context/transaction.ts +72 -0
  41. package/src/db/adapter/index.ts +466 -0
  42. package/src/db/index.ts +50 -0
  43. package/src/db/plugin.ts +11 -0
  44. package/src/db/schema/account.ts +34 -0
  45. package/src/db/schema/rate-limit.ts +21 -0
  46. package/src/db/schema/session.ts +17 -0
  47. package/src/db/schema/shared.ts +7 -0
  48. package/src/db/schema/user.ts +16 -0
  49. package/src/db/schema/verification.ts +15 -0
  50. package/src/db/type.ts +180 -0
  51. package/src/env/color-depth.ts +172 -0
  52. package/src/env/env-impl.ts +124 -0
  53. package/src/env/index.ts +23 -0
  54. package/src/env/logger.test.ts +33 -0
  55. package/src/env/logger.ts +145 -0
  56. package/src/error/codes.ts +31 -0
  57. package/src/error/index.ts +11 -0
  58. package/src/index.ts +1 -0
  59. package/src/oauth2/client-credentials-token.ts +102 -0
  60. package/src/oauth2/create-authorization-url.ts +85 -0
  61. package/src/oauth2/index.ts +21 -0
  62. package/src/oauth2/oauth-provider.ts +211 -0
  63. package/src/oauth2/refresh-access-token.ts +124 -0
  64. package/src/oauth2/utils.ts +36 -0
  65. package/src/oauth2/validate-authorization-code.ts +154 -0
  66. package/src/social-providers/apple.ts +213 -0
  67. package/src/social-providers/atlassian.ts +132 -0
  68. package/src/social-providers/cognito.ts +269 -0
  69. package/src/social-providers/discord.ts +169 -0
  70. package/src/social-providers/dropbox.ts +112 -0
  71. package/src/social-providers/facebook.ts +204 -0
  72. package/src/social-providers/figma.ts +115 -0
  73. package/src/social-providers/github.ts +154 -0
  74. package/src/social-providers/gitlab.ts +152 -0
  75. package/src/social-providers/google.ts +171 -0
  76. package/src/social-providers/huggingface.ts +118 -0
  77. package/src/social-providers/index.ts +124 -0
  78. package/src/social-providers/kakao.ts +178 -0
  79. package/src/social-providers/kick.ts +92 -0
  80. package/src/social-providers/line.ts +169 -0
  81. package/src/social-providers/linear.ts +120 -0
  82. package/src/social-providers/linkedin.ts +110 -0
  83. package/src/social-providers/microsoft-entra-id.ts +245 -0
  84. package/src/social-providers/naver.ts +112 -0
  85. package/src/social-providers/notion.ts +108 -0
  86. package/src/social-providers/paybin.ts +122 -0
  87. package/src/social-providers/paypal.ts +263 -0
  88. package/src/social-providers/polar.ts +107 -0
  89. package/src/social-providers/reddit.ts +122 -0
  90. package/src/social-providers/roblox.ts +110 -0
  91. package/src/social-providers/salesforce.ts +159 -0
  92. package/src/social-providers/slack.ts +111 -0
  93. package/src/social-providers/spotify.ts +93 -0
  94. package/src/social-providers/tiktok.ts +210 -0
  95. package/src/social-providers/twitch.ts +111 -0
  96. package/src/social-providers/twitter.ts +198 -0
  97. package/src/social-providers/vk.ts +126 -0
  98. package/src/social-providers/zoom.ts +217 -0
  99. package/src/types/context.ts +269 -0
  100. package/src/types/cookie.ts +7 -0
  101. package/src/types/helper.ts +6 -0
  102. package/src/types/index.ts +21 -0
  103. package/src/types/init-options.ts +1346 -0
  104. package/src/types/plugin-client.ts +100 -0
  105. package/src/types/plugin.ts +158 -0
  106. package/src/utils/error-codes.ts +51 -0
  107. package/src/utils/index.ts +1 -0
  108. package/tsconfig.json +7 -0
  109. package/tsdown.config.ts +20 -0
@@ -0,0 +1,3 @@
1
+ import { En as PayvoAuthCookies, Tn as LiteralUnion, _ as PayvoAuthRateLimitOptions, c as ClientStore, d as AuthContext, f as GenericEndpointContext, g as PayvoAuthOptions, h as PayvoAuthAdvancedOptions, l as PayvoAuthClientOptions, m as GenerateIdFn, o as StandardSchemaV1, p as InternalAdapter, s as ClientAtomListener, u as PayvoAuthClientPlugin, v as HookEndpointContext, wn as LiteralString, y as PayvoAuthPlugin } from "./index-DjrJweYn.mjs";
2
+ import "./index-DLP-K0uY.mjs";
3
+ export { AuthContext, ClientAtomListener, ClientStore, GenerateIdFn, GenericEndpointContext, HookEndpointContext, InternalAdapter, LiteralString, LiteralUnion, PayvoAuthAdvancedOptions, PayvoAuthClientOptions, PayvoAuthClientPlugin, PayvoAuthCookies, PayvoAuthOptions, PayvoAuthPlugin, PayvoAuthRateLimitOptions, StandardSchemaV1 };
package/dist/index.mjs ADDED
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,3 @@
1
+ import { An as generateCodeChallenge, Bn as ProviderOptions, Dn as createAuthorizationCodeRequest, Fn as clientCredentialsToken, In as createClientCredentialsTokenRequest, Ln as OAuth2Tokens, Mn as createRefreshAccessTokenRequest, Nn as refreshAccessToken, On as validateAuthorizationCode, Pn as createAuthorizationURL, Rn as OAuth2UserInfo, jn as getOAuth2Tokens, kn as validateToken, zn as OAuthProvider } from "../index-DjrJweYn.mjs";
2
+ import "../index-DLP-K0uY.mjs";
3
+ export { OAuth2Tokens, OAuth2UserInfo, OAuthProvider, ProviderOptions, clientCredentialsToken, createAuthorizationCodeRequest, createAuthorizationURL, createClientCredentialsTokenRequest, createRefreshAccessTokenRequest, generateCodeChallenge, getOAuth2Tokens, refreshAccessToken, validateAuthorizationCode, validateToken };
@@ -0,0 +1,3 @@
1
+ import { a as refreshAccessToken, c as getOAuth2Tokens, i as createRefreshAccessTokenRequest, l as clientCredentialsToken, n as validateAuthorizationCode, o as createAuthorizationURL, r as validateToken, s as generateCodeChallenge, t as createAuthorizationCodeRequest, u as createClientCredentialsTokenRequest } from "../oauth2-DyI7_CNv.mjs";
2
+
3
+ export { clientCredentialsToken, createAuthorizationCodeRequest, createAuthorizationURL, createClientCredentialsTokenRequest, createRefreshAccessTokenRequest, generateCodeChallenge, getOAuth2Tokens, refreshAccessToken, validateAuthorizationCode, validateToken };
@@ -0,0 +1,235 @@
1
+ import { base64, base64Url } from "@gatwech/utils/base64";
2
+ import { betterFetch } from "@better-fetch/fetch";
3
+ import { jwtVerify } from "jose";
4
+
5
+ //#region src/oauth2/client-credentials-token.ts
6
+ function createClientCredentialsTokenRequest({ options, scope, authentication, resource }) {
7
+ const body = new URLSearchParams();
8
+ const headers = {
9
+ "content-type": "application/x-www-form-urlencoded",
10
+ accept: "application/json"
11
+ };
12
+ body.set("grant_type", "client_credentials");
13
+ scope && body.set("scope", scope);
14
+ if (resource) if (typeof resource === "string") body.append("resource", resource);
15
+ else for (const _resource of resource) body.append("resource", _resource);
16
+ if (authentication === "basic") {
17
+ const primaryClientId = Array.isArray(options.clientId) ? options.clientId[0] : options.clientId;
18
+ headers["authorization"] = `Basic ${base64Url.encode(`${primaryClientId}:${options.clientSecret}`)}`;
19
+ } else {
20
+ const primaryClientId = Array.isArray(options.clientId) ? options.clientId[0] : options.clientId;
21
+ body.set("client_id", primaryClientId);
22
+ body.set("client_secret", options.clientSecret);
23
+ }
24
+ return {
25
+ body,
26
+ headers
27
+ };
28
+ }
29
+ async function clientCredentialsToken({ options, tokenEndpoint, scope, authentication, resource }) {
30
+ const { body, headers } = createClientCredentialsTokenRequest({
31
+ options,
32
+ scope,
33
+ authentication,
34
+ resource
35
+ });
36
+ const { data, error } = await betterFetch(tokenEndpoint, {
37
+ method: "POST",
38
+ body,
39
+ headers
40
+ });
41
+ if (error) throw error;
42
+ const tokens = {
43
+ accessToken: data.access_token,
44
+ tokenType: data.token_type,
45
+ scopes: data.scope?.split(" ")
46
+ };
47
+ if (data.expires_in) {
48
+ const now = /* @__PURE__ */ new Date();
49
+ tokens.accessTokenExpiresAt = new Date(now.getTime() + data.expires_in * 1e3);
50
+ }
51
+ return tokens;
52
+ }
53
+
54
+ //#endregion
55
+ //#region src/oauth2/utils.ts
56
+ function getOAuth2Tokens(data) {
57
+ const getDate = (seconds) => {
58
+ const now = /* @__PURE__ */ new Date();
59
+ return new Date(now.getTime() + seconds * 1e3);
60
+ };
61
+ return {
62
+ tokenType: data.token_type,
63
+ accessToken: data.access_token,
64
+ refreshToken: data.refresh_token,
65
+ accessTokenExpiresAt: data.expires_in ? getDate(data.expires_in) : void 0,
66
+ refreshTokenExpiresAt: data.refresh_token_expires_in ? getDate(data.refresh_token_expires_in) : void 0,
67
+ scopes: data?.scope ? typeof data.scope === "string" ? data.scope.split(" ") : data.scope : [],
68
+ idToken: data.id_token
69
+ };
70
+ }
71
+ async function generateCodeChallenge(codeVerifier) {
72
+ const data = new TextEncoder().encode(codeVerifier);
73
+ const hash = await crypto.subtle.digest("SHA-256", data);
74
+ return base64Url.encode(new Uint8Array(hash), { padding: false });
75
+ }
76
+
77
+ //#endregion
78
+ //#region src/oauth2/create-authorization-url.ts
79
+ async function createAuthorizationURL({ id, options, authorizationEndpoint, state, codeVerifier, scopes, claims, redirectURI, duration, prompt, accessType, responseType, display, loginHint, hd, responseMode, additionalParams, scopeJoiner }) {
80
+ const url = new URL(authorizationEndpoint);
81
+ url.searchParams.set("response_type", responseType || "code");
82
+ const primaryClientId = Array.isArray(options.clientId) ? options.clientId[0] : options.clientId;
83
+ url.searchParams.set("client_id", primaryClientId);
84
+ url.searchParams.set("state", state);
85
+ url.searchParams.set("scope", scopes.join(scopeJoiner || " "));
86
+ url.searchParams.set("redirect_uri", options.redirectURI || redirectURI);
87
+ duration && url.searchParams.set("duration", duration);
88
+ display && url.searchParams.set("display", display);
89
+ loginHint && url.searchParams.set("login_hint", loginHint);
90
+ prompt && url.searchParams.set("prompt", prompt);
91
+ hd && url.searchParams.set("hd", hd);
92
+ accessType && url.searchParams.set("access_type", accessType);
93
+ responseMode && url.searchParams.set("response_mode", responseMode);
94
+ if (codeVerifier) {
95
+ const codeChallenge = await generateCodeChallenge(codeVerifier);
96
+ url.searchParams.set("code_challenge_method", "S256");
97
+ url.searchParams.set("code_challenge", codeChallenge);
98
+ }
99
+ if (claims) {
100
+ const claimsObj = claims.reduce((acc, claim) => {
101
+ acc[claim] = null;
102
+ return acc;
103
+ }, {});
104
+ url.searchParams.set("claims", JSON.stringify({ id_token: {
105
+ email: null,
106
+ email_verified: null,
107
+ ...claimsObj
108
+ } }));
109
+ }
110
+ if (additionalParams) Object.entries(additionalParams).forEach(([key, value]) => {
111
+ url.searchParams.set(key, value);
112
+ });
113
+ return url;
114
+ }
115
+
116
+ //#endregion
117
+ //#region src/oauth2/refresh-access-token.ts
118
+ function createRefreshAccessTokenRequest({ refreshToken, options, authentication, extraParams, resource }) {
119
+ const body = new URLSearchParams();
120
+ const headers = {
121
+ "content-type": "application/x-www-form-urlencoded",
122
+ accept: "application/json"
123
+ };
124
+ body.set("grant_type", "refresh_token");
125
+ body.set("refresh_token", refreshToken);
126
+ if (authentication === "basic") {
127
+ const primaryClientId = Array.isArray(options.clientId) ? options.clientId[0] : options.clientId;
128
+ if (primaryClientId) headers["authorization"] = "Basic " + base64.encode(`${primaryClientId}:${options.clientSecret ?? ""}`);
129
+ else headers["authorization"] = "Basic " + base64.encode(`:${options.clientSecret ?? ""}`);
130
+ } else {
131
+ const primaryClientId = Array.isArray(options.clientId) ? options.clientId[0] : options.clientId;
132
+ body.set("client_id", primaryClientId);
133
+ if (options.clientSecret) body.set("client_secret", options.clientSecret);
134
+ }
135
+ if (resource) if (typeof resource === "string") body.append("resource", resource);
136
+ else for (const _resource of resource) body.append("resource", _resource);
137
+ if (extraParams) for (const [key, value] of Object.entries(extraParams)) body.set(key, value);
138
+ return {
139
+ body,
140
+ headers
141
+ };
142
+ }
143
+ async function refreshAccessToken({ refreshToken, options, tokenEndpoint, authentication, extraParams }) {
144
+ const { body, headers } = createRefreshAccessTokenRequest({
145
+ refreshToken,
146
+ options,
147
+ authentication,
148
+ extraParams
149
+ });
150
+ const { data, error } = await betterFetch(tokenEndpoint, {
151
+ method: "POST",
152
+ body,
153
+ headers
154
+ });
155
+ if (error) throw error;
156
+ const tokens = {
157
+ accessToken: data.access_token,
158
+ refreshToken: data.refresh_token,
159
+ tokenType: data.token_type,
160
+ scopes: data.scope?.split(" "),
161
+ idToken: data.id_token
162
+ };
163
+ if (data.expires_in) {
164
+ const now = /* @__PURE__ */ new Date();
165
+ tokens.accessTokenExpiresAt = new Date(now.getTime() + data.expires_in * 1e3);
166
+ }
167
+ return tokens;
168
+ }
169
+
170
+ //#endregion
171
+ //#region src/oauth2/validate-authorization-code.ts
172
+ function createAuthorizationCodeRequest({ code, codeVerifier, redirectURI, options, authentication, deviceId, headers, additionalParams = {}, resource }) {
173
+ const body = new URLSearchParams();
174
+ const requestHeaders = {
175
+ "content-type": "application/x-www-form-urlencoded",
176
+ accept: "application/json",
177
+ ...headers
178
+ };
179
+ body.set("grant_type", "authorization_code");
180
+ body.set("code", code);
181
+ codeVerifier && body.set("code_verifier", codeVerifier);
182
+ options.clientKey && body.set("client_key", options.clientKey);
183
+ deviceId && body.set("device_id", deviceId);
184
+ body.set("redirect_uri", options.redirectURI || redirectURI);
185
+ if (resource) if (typeof resource === "string") body.append("resource", resource);
186
+ else for (const _resource of resource) body.append("resource", _resource);
187
+ if (authentication === "basic") {
188
+ const primaryClientId = Array.isArray(options.clientId) ? options.clientId[0] : options.clientId;
189
+ requestHeaders["authorization"] = `Basic ${base64.encode(`${primaryClientId}:${options.clientSecret ?? ""}`)}`;
190
+ } else {
191
+ const primaryClientId = Array.isArray(options.clientId) ? options.clientId[0] : options.clientId;
192
+ body.set("client_id", primaryClientId);
193
+ if (options.clientSecret) body.set("client_secret", options.clientSecret);
194
+ }
195
+ for (const [key, value] of Object.entries(additionalParams)) if (!body.has(key)) body.append(key, value);
196
+ return {
197
+ body,
198
+ headers: requestHeaders
199
+ };
200
+ }
201
+ async function validateAuthorizationCode({ code, codeVerifier, redirectURI, options, tokenEndpoint, authentication, deviceId, headers, additionalParams = {}, resource }) {
202
+ const { body, headers: requestHeaders } = createAuthorizationCodeRequest({
203
+ code,
204
+ codeVerifier,
205
+ redirectURI,
206
+ options,
207
+ authentication,
208
+ deviceId,
209
+ headers,
210
+ additionalParams,
211
+ resource
212
+ });
213
+ const { data, error } = await betterFetch(tokenEndpoint, {
214
+ method: "POST",
215
+ body,
216
+ headers: requestHeaders
217
+ });
218
+ if (error) throw error;
219
+ return getOAuth2Tokens(data);
220
+ }
221
+ async function validateToken(token, jwksEndpoint) {
222
+ const { data, error } = await betterFetch(jwksEndpoint, {
223
+ method: "GET",
224
+ headers: { accept: "application/json" }
225
+ });
226
+ if (error) throw error;
227
+ const keys = data["keys"];
228
+ const header = JSON.parse(atob(token.split(".")[0]));
229
+ const key = keys.find((key$1) => key$1.kid === header.kid);
230
+ if (!key) throw new Error("Key not found");
231
+ return await jwtVerify(token, key);
232
+ }
233
+
234
+ //#endregion
235
+ export { refreshAccessToken as a, getOAuth2Tokens as c, createRefreshAccessTokenRequest as i, clientCredentialsToken as l, validateAuthorizationCode as n, createAuthorizationURL as o, validateToken as r, generateCodeChallenge as s, createAuthorizationCodeRequest as t, createClientCredentialsTokenRequest as u };
@@ -0,0 +1,3 @@
1
+ import { $ as ZoomOptions, $t as microsoft, A as PayPalProfile, At as DropboxOptions, B as NaverOptions, Bt as SpotifyProfile, C as SocialProviders, Cn as getApplePublicKey, Ct as LinearOptions, D as PolarProfile, Dt as KickOptions, E as PolarOptions, Et as linear, F as paybin, Ft as twitter, G as kakao, Gt as HuggingFaceOptions, H as naver, Ht as SlackOptions, I as LineIdTokenPayload, It as TwitchOptions, J as notion, Jt as GoogleOptions, K as NotionOptions, Kt as HuggingFaceProfile, L as LineOptions, Lt as TwitchProfile, M as paypal, Mt as dropbox, N as PaybinOptions, Nt as TwitterOption, O as polar, Ot as KickProfile, P as PaybinProfile, Pt as TwitterProfile, Q as PronounOption, Qt as MicrosoftOptions, R as LineUserInfo, Rt as twitch, S as SocialProviderListEnum, Sn as apple, St as linkedin, T as socialProviders, Tt as LinearUser, U as KakaoOptions, Ut as SlackProfile, V as NaverProfile, Vt as spotify, W as KakaoProfile, Wt as slack, X as LoginType, Xt as google, Y as AccountStatus, Yt as GoogleProfile, Z as PhoneNumber, Zt as MicrosoftEntraIDProfile, _n as AtlassianProfile, _t as GitlabOptions, an as figma, at as SalesforceOptions, b as SocialProvider, bn as AppleOptions, bt as LinkedInOptions, cn as facebook, ct as RobloxOptions, dn as discord, dt as RedditOptions, en as GithubOptions, et as ZoomProfile, fn as CognitoOptions, ft as RedditProfile, gn as AtlassianOptions, gt as tiktok, hn as getCognitoPublicKey, ht as TiktokProfile, in as FigmaProfile, it as vk, j as PayPalTokenResponse, jt as DropboxProfile, k as PayPalOptions, kt as kick, ln as DiscordOptions, lt as RobloxProfile, mn as cognito, mt as TiktokOptions, nn as github, nt as VkOption, on as FacebookOptions, ot as SalesforceProfile, pn as CognitoProfile, pt as reddit, q as NotionProfile, qt as huggingface, rn as FigmaOptions, rt as VkProfile, sn as FacebookProfile, st as salesforce, tn as GithubProfile, tt as zoom, un as DiscordProfile, ut as roblox, vn as atlassian, vt as GitlabProfile, w as socialProviderList, wt as LinearProfile, x as SocialProviderList, xn as AppleProfile, xt as LinkedInProfile, yn as AppleNonConformUser, yt as gitlab, z as line, zt as SpotifyOptions } from "../index-DjrJweYn.mjs";
2
+ import "../index-DLP-K0uY.mjs";
3
+ export { AccountStatus, AppleNonConformUser, AppleOptions, AppleProfile, AtlassianOptions, AtlassianProfile, CognitoOptions, CognitoProfile, DiscordOptions, DiscordProfile, DropboxOptions, DropboxProfile, FacebookOptions, FacebookProfile, FigmaOptions, FigmaProfile, GithubOptions, GithubProfile, GitlabOptions, GitlabProfile, GoogleOptions, GoogleProfile, HuggingFaceOptions, HuggingFaceProfile, KakaoOptions, KakaoProfile, KickOptions, KickProfile, LineIdTokenPayload, LineOptions, LineUserInfo, LinearOptions, LinearProfile, LinearUser, LinkedInOptions, LinkedInProfile, LoginType, MicrosoftEntraIDProfile, MicrosoftOptions, NaverOptions, NaverProfile, NotionOptions, NotionProfile, PayPalOptions, PayPalProfile, PayPalTokenResponse, PaybinOptions, PaybinProfile, PhoneNumber, PolarOptions, PolarProfile, PronounOption, RedditOptions, RedditProfile, RobloxOptions, RobloxProfile, SalesforceOptions, SalesforceProfile, SlackOptions, SlackProfile, SocialProvider, SocialProviderList, SocialProviderListEnum, SocialProviders, SpotifyOptions, SpotifyProfile, TiktokOptions, TiktokProfile, TwitchOptions, TwitchProfile, TwitterOption, TwitterProfile, VkOption, VkProfile, ZoomOptions, ZoomProfile, apple, atlassian, cognito, discord, dropbox, facebook, figma, getApplePublicKey, getCognitoPublicKey, github, gitlab, google, huggingface, kakao, kick, line, linear, linkedin, microsoft, naver, notion, paybin, paypal, polar, reddit, roblox, salesforce, slack, socialProviderList, socialProviders, spotify, tiktok, twitch, twitter, vk, zoom };