effect/github
Dieser Inhalt ist noch nicht in deiner Sprache verfügbar.
Classes
Section titled “Classes”GitHubOAuthAPI
Section titled “GitHubOAuthAPI”Defined in: studiocms/packages/@studiocms/github/src/effect/github.ts:67^
Provides GitHub OAuth authentication effects for the StudioCMS API.
This service handles the OAuth flow with GitHub, including:
- Initializing the OAuth session and redirecting users to GitHub for authorization.
- Validating the authorization code returned by GitHub and fetching user data.
- Handling the callback from GitHub, including:
- Linking OAuth accounts to existing users.
- Creating new users from GitHub profile data.
- Verifying user email addresses.
- Creating user sessions and redirecting to appropriate pages.
Remarks
Section titled “Remarks”- Depends on session management, user library, email verification, and SDK core services.
- Handles both first-time setup and linking additional OAuth providers to existing accounts.
Example
Section titled “Example”const githubOAuth = new GitHubOAuthAPI();yield* githubOAuth.initSession(context);yield* githubOAuth.initCallback(context);
- Session
- SDKCore
- VerifyEmail
- User
Extends
Section titled “Extends”- {
initCallback
: (context
:APIContext
) =>Effect
<Response
,Error
|SDKCoreError
,never
>;initSession
: (context
:APIContext
) =>Effect
<Response
,SessionError
,never
>; } & {_tag
:"GitHubOAuthAPI"
; }
Constructors
Section titled “Constructors”Constructor
Section titled “Constructor”new GitHubOAuthAPI(_: { initCallback: (context: APIContext) => Effect<Response, Error | SDKCoreError, never>; initSession: (context: APIContext) => Effect<Response, SessionError, never>;}): GitHubOAuthAPI;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Effect.d.ts:26559
Parameters
Section titled “Parameters”initCallback
Section titled “initCallback”(context
: APIContext
) => Effect
<Response
, Error
| SDKCoreError
, never
> = ...
initSession
Section titled “initSession”(context
: APIContext
) => Effect
<Response
, SessionError
, never
> = ...
Returns
Section titled “Returns”Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).constructor
Properties
Section titled “Properties”readonly _tag: "GitHubOAuthAPI";
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Effect.d.ts:26560
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),})._tag
initCallback()
Section titled “initCallback()”initCallback: (context: APIContext) => Effect<Response, Error | SDKCoreError, never>;
Defined in: studiocms/packages/@studiocms/github/src/effect/github.ts:117^
Parameters
Section titled “Parameters”context
Section titled “context”APIContext
Returns
Section titled “Returns”Effect
<Response
, Error
| SDKCoreError
, never
>
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).initCallback
initSession()
Section titled “initSession()”initSession: (context: APIContext) => Effect<Response, SessionError, never>;
Defined in: studiocms/packages/@studiocms/github/src/effect/github.ts:106^
Parameters
Section titled “Parameters”context
Section titled “context”APIContext
Returns
Section titled “Returns”Effect
<Response
, SessionError
, never
>
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).initSession
readonly static _op: "Tag";
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Context.d.ts:28
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),})._op
[ChannelTypeId]
Section titled “[ChannelTypeId]”readonly static [ChannelTypeId]: VarianceStruct<never, unknown, never, unknown, GitHubOAuthAPI, unknown, GitHubOAuthAPI>;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Channel.d.ts:108
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).[ChannelTypeId]
[EffectTypeId]
Section titled “[EffectTypeId]”readonly static [EffectTypeId]: VarianceStruct<GitHubOAuthAPI, never, GitHubOAuthAPI>;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Effect.d.ts:195
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).[EffectTypeId]
[ignoreSymbol]?
Section titled “[ignoreSymbol]?”static optional [ignoreSymbol]: TagUnifyIgnore;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Context.d.ts:41
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).[ignoreSymbol]
[SinkTypeId]
Section titled “[SinkTypeId]”readonly static [SinkTypeId]: VarianceStruct<GitHubOAuthAPI, unknown, never, never, GitHubOAuthAPI>;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Sink.d.ts:82
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).[SinkTypeId]
[STMTypeId]
Section titled “[STMTypeId]”readonly static [STMTypeId]: { _A: Covariant<GitHubOAuthAPI>; _E: Covariant<never>; _R: Covariant<GitHubOAuthAPI>;};
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/STM.d.ts:136
readonly _A: Covariant<GitHubOAuthAPI>;
readonly _E: Covariant<never>;
readonly _R: Covariant<GitHubOAuthAPI>;
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).[STMTypeId]
[StreamTypeId]
Section titled “[StreamTypeId]”readonly static [StreamTypeId]: VarianceStruct<GitHubOAuthAPI, never, GitHubOAuthAPI>;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Stream.d.ts:111
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).[StreamTypeId]
[TagTypeId]
Section titled “[TagTypeId]”readonly static [TagTypeId]: { _Identifier: Invariant<GitHubOAuthAPI>; _Service: Invariant<GitHubOAuthAPI>;};
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Context.d.ts:31
_Identifier
Section titled “_Identifier”readonly _Identifier: Invariant<GitHubOAuthAPI>;
_Service
Section titled “_Service”readonly _Service: Invariant<GitHubOAuthAPI>;
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).[TagTypeId]
[typeSymbol]?
Section titled “[typeSymbol]?”static optional [typeSymbol]: unknown;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Context.d.ts:39
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).[typeSymbol]
[unifySymbol]?
Section titled “[unifySymbol]?”static optional [unifySymbol]: TagUnify<Class<GitHubOAuthAPI, "GitHubOAuthAPI", { dependencies: readonly [Layer<VerifyEmail, Error, never>, Layer<HttpClient, never, never>]; effect: Effect<{ initCallback: (context: APIContext) => Effect<Response, Error | SDKCoreError, never>; initSession: (context: APIContext) => Effect<Response, SessionError, never>; }, SessionError | UserError, VerifyEmail | HttpClient>;}>>;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Context.d.ts:40
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).[unifySymbol]
Default
Section titled “Default”readonly static Default: Layer<GitHubOAuthAPI, Error | SessionError | UserError, never>;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Effect.d.ts:26570
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).Default
DefaultWithoutDependencies
Section titled “DefaultWithoutDependencies”readonly static DefaultWithoutDependencies: Layer<GitHubOAuthAPI, SessionError | UserError, VerifyEmail | HttpClient>;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Effect.d.ts:26569
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).DefaultWithoutDependencies
Identifier
Section titled “Identifier”readonly static Identifier: GitHubOAuthAPI;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Context.d.ts:30
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).Identifier
readonly static key: "GitHubOAuthAPI";
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Context.d.ts:38
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).key
make()
Section titled “make()”readonly static make: (_: { initCallback: (context: APIContext) => Effect<Response, Error | SDKCoreError, never>; initSession: (context: APIContext) => Effect<Response, SessionError, never>;}) => GitHubOAuthAPI;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Effect.d.ts:26563
Parameters
Section titled “Parameters”initCallback
Section titled “initCallback”(context
: APIContext
) => Effect
<Response
, Error
| SDKCoreError
, never
> = ...
initSession
Section titled “initSession”(context
: APIContext
) => Effect
<Response
, SessionError
, never
> = ...
Returns
Section titled “Returns”Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).make
ProviderCookieName
Section titled “ProviderCookieName”static ProviderCookieName: string = 'github_oauth_state';
Defined in: studiocms/packages/@studiocms/github/src/effect/github.ts:236^
ProviderID
Section titled “ProviderID”static ProviderID: string = 'github';
Defined in: studiocms/packages/@studiocms/github/src/effect/github.ts:235^
Service
Section titled “Service”readonly static Service: GitHubOAuthAPI;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Context.d.ts:29
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).Service
stack?
Section titled “stack?”readonly static optional stack: string;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Context.d.ts:37
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).stack
readonly static use: <X>(body: (_: GitHubOAuthAPI) => X) => [X] extends [Effect<A, E, R>] ? Effect<A, E, | GitHubOAuthAPI| R> : [X] extends [PromiseLike<A>] ? Effect<A, UnknownException, GitHubOAuthAPI> : Effect<X, never, GitHubOAuthAPI>;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Effect.d.ts:26562
Type Parameters
Section titled “Type Parameters”X
Parameters
Section titled “Parameters”(_
: GitHubOAuthAPI
) => X
Returns
Section titled “Returns”[X
] extends [Effect
<A
, E
, R
>] ? Effect
<A
, E
,
| GitHubOAuthAPI
| R
> : [X
] extends [PromiseLike
<A
>] ? Effect
<A
, UnknownException
, GitHubOAuthAPI
> : Effect
<X
, never
, GitHubOAuthAPI
>
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).use
Methods
Section titled “Methods”[iterator]()
Section titled “[iterator]()”static iterator: EffectGenerator<Tag<GitHubOAuthAPI, GitHubOAuthAPI>>;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Effect.d.ts:137
Returns
Section titled “Returns”EffectGenerator
<Tag
<GitHubOAuthAPI
, GitHubOAuthAPI
>>
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).[iterator]
[NodeInspectSymbol]()
Section titled “[NodeInspectSymbol]()”static NodeInspectSymbol: unknown;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Inspectable.d.ts:22
Returns
Section titled “Returns”unknown
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).[NodeInspectSymbol]
context()
Section titled “context()”static context(self: GitHubOAuthAPI): Context<GitHubOAuthAPI>;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Context.d.ts:36
Parameters
Section titled “Parameters”Returns
Section titled “Returns”Context
<GitHubOAuthAPI
>
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).context
static of(self: GitHubOAuthAPI): GitHubOAuthAPI;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Context.d.ts:35
Parameters
Section titled “Parameters”Returns
Section titled “Returns”Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).of
pipe()
Section titled “pipe()”Call Signature
Section titled “Call Signature”static pipe<A>(this: A): A;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:10
Type Parameters
Section titled “Type Parameters”A
Parameters
Section titled “Parameters”A
Returns
Section titled “Returns”A
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B>(this: A, ab: (_: A) => B): B;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:11
Type Parameters
Section titled “Type Parameters”A
B
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
Returns
Section titled “Returns”B
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C>( this: A, ab: (_: A) => B, bc: (_: B) => C): C;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:12
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
Returns
Section titled “Returns”C
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:13
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
Returns
Section titled “Returns”D
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E): E;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:14
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
Returns
Section titled “Returns”E
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F): F;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:15
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
Returns
Section titled “Returns”F
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G): G;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:16
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
Returns
Section titled “Returns”G
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H): H;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:17
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
Returns
Section titled “Returns”H
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I): I;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:18
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
Returns
Section titled “Returns”I
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I, J>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J): J;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:19
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
J
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
(_
: I
) => J
Returns
Section titled “Returns”J
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I, J, K>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K): K;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:20
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
J
= never
K
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
(_
: I
) => J
(_
: J
) => K
Returns
Section titled “Returns”K
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I, J, K, L>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L): L;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:21
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
J
= never
K
= never
L
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
(_
: I
) => J
(_
: J
) => K
(_
: K
) => L
Returns
Section titled “Returns”L
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M): M;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:22
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
J
= never
K
= never
L
= never
M
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
(_
: I
) => J
(_
: J
) => K
(_
: K
) => L
(_
: L
) => M
Returns
Section titled “Returns”M
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N): N;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:23
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
J
= never
K
= never
L
= never
M
= never
N
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
(_
: I
) => J
(_
: J
) => K
(_
: K
) => L
(_
: L
) => M
(_
: M
) => N
Returns
Section titled “Returns”N
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O): O;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:24
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
J
= never
K
= never
L
= never
M
= never
N
= never
O
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
(_
: I
) => J
(_
: J
) => K
(_
: K
) => L
(_
: L
) => M
(_
: M
) => N
(_
: N
) => O
Returns
Section titled “Returns”O
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P): P;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:25
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
J
= never
K
= never
L
= never
M
= never
N
= never
O
= never
P
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
(_
: I
) => J
(_
: J
) => K
(_
: K
) => L
(_
: L
) => M
(_
: M
) => N
(_
: N
) => O
(_
: O
) => P
Returns
Section titled “Returns”P
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q): Q;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:26
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
J
= never
K
= never
L
= never
M
= never
N
= never
O
= never
P
= never
Q
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
(_
: I
) => J
(_
: J
) => K
(_
: K
) => L
(_
: L
) => M
(_
: M
) => N
(_
: N
) => O
(_
: O
) => P
(_
: P
) => Q
Returns
Section titled “Returns”Q
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R): R;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:27
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
J
= never
K
= never
L
= never
M
= never
N
= never
O
= never
P
= never
Q
= never
R
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
(_
: I
) => J
(_
: J
) => K
(_
: K
) => L
(_
: L
) => M
(_
: M
) => N
(_
: N
) => O
(_
: O
) => P
(_
: P
) => Q
(_
: Q
) => R
Returns
Section titled “Returns”R
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S): S;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:28
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
J
= never
K
= never
L
= never
M
= never
N
= never
O
= never
P
= never
Q
= never
R
= never
S
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
(_
: I
) => J
(_
: J
) => K
(_
: K
) => L
(_
: L
) => M
(_
: M
) => N
(_
: N
) => O
(_
: O
) => P
(_
: P
) => Q
(_
: Q
) => R
(_
: R
) => S
Returns
Section titled “Returns”S
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T): T;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:29
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
J
= never
K
= never
L
= never
M
= never
N
= never
O
= never
P
= never
Q
= never
R
= never
S
= never
T
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
(_
: I
) => J
(_
: J
) => K
(_
: K
) => L
(_
: L
) => M
(_
: M
) => N
(_
: N
) => O
(_
: O
) => P
(_
: P
) => Q
(_
: Q
) => R
(_
: R
) => S
(_
: S
) => T
Returns
Section titled “Returns”T
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T, tu: (_: T) => U): U;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:30
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
J
= never
K
= never
L
= never
M
= never
N
= never
O
= never
P
= never
Q
= never
R
= never
S
= never
T
= never
U
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
(_
: I
) => J
(_
: J
) => K
(_
: K
) => L
(_
: L
) => M
(_
: M
) => N
(_
: N
) => O
(_
: O
) => P
(_
: P
) => Q
(_
: Q
) => R
(_
: R
) => S
(_
: S
) => T
(_
: T
) => U
Returns
Section titled “Returns”U
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T, tu: (_: T) => U): U;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:31
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
J
= never
K
= never
L
= never
M
= never
N
= never
O
= never
P
= never
Q
= never
R
= never
S
= never
T
= never
U
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
(_
: I
) => J
(_
: J
) => K
(_
: K
) => L
(_
: L
) => M
(_
: M
) => N
(_
: N
) => O
(_
: O
) => P
(_
: P
) => Q
(_
: Q
) => R
(_
: R
) => S
(_
: S
) => T
(_
: T
) => U
Returns
Section titled “Returns”U
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).pipe
toJSON()
Section titled “toJSON()”static toJSON(): unknown;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Inspectable.d.ts:21
Returns
Section titled “Returns”unknown
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).toJSON
toString()
Section titled “toString()”static toString(): string;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Inspectable.d.ts:20
Returns
Section titled “Returns”string
Inherited from
Section titled “Inherited from”Effect.Service<GitHubOAuthAPI>()('GitHubOAuthAPI', { dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer], effect: genLogger('studiocms/routes/api/auth/github/effect')(function () { const [ sdk, fetchClient, { setOAuthSessionTokenCookie, createUserSession }, { isEmailVerified, sendVerificationEmail }, { getUserData, createOAuthUser }, ] = yield Effect.all([SDKCore, Platform.HttpClient.HttpClient, Session, VerifyEmail, User]);
const { CLIENT_ID, CLIENT_SECRET, REDIRECT_URI } = GITHUB;
const github = new GitHub(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string) => genLogger('studiocms/routes/api/auth/github/effect.validateAuthCode')(function () { const tokens = yield Effect.tryPromise(() => github.validateAuthorizationCode(code));
return yield fetchClient .get('https://api.github.com/user', { headers: { Authorization: Bearer ${tokens.accessToken}, }, }) .pipe( Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GitHubUser)), Effect.catchAll((error) => Effect.fail( new ValidateAuthCodeError({ provider: GitHubOAuthAPI.ProviderID, message: Failed to fetch user info: ${error.message}, }) ) ) ); });
return { initSession: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initSession')(function () { const state = generateState(); const scopes = ['user:email', 'repo'];
const url = github.createAuthorizationURL(state, scopes);
yield setOAuthSessionTokenCookie(context, GitHubOAuthAPI.ProviderCookieName, state);
return context.redirect(url.toString()); }), initCallback: (context: APIContext) => genLogger('studiocms/routes/api/auth/github/effect.initCallback')(function () { const { cookies, redirect } = context;
const [code, state, storedState] = yield Effect.all([ getUrlParam(context, 'code'), getUrlParam(context, 'state'), getCookie(context, GitHubOAuthAPI.ProviderCookieName), ]);
if (!code || !state || !storedState || state !== storedState) { return redirect(StudioCMSRoutes.authLinks.loginURL); }
const githubUser = yield validateAuthCode(code);
const { id: githubUserId, login: githubUsername } = githubUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId( GitHubOAuthAPI.ProviderID, ${githubUserId} );
if (existingOAuthAccount) { const user = yield sdk.GET.users.byId(existingOAuthAccount.userId);
if (!user) { return new Response('User not found', { status: 404 }); }
const isEmailAccountVerified = yield isEmailVerified(user);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(user.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }
const loggedInUser = yield getUserData(context); const linkNewOAuth = !!cookies.get(LinkNewOAuthCookieName)?.value;
if (loggedInUser.user && linkNewOAuth) { const existingUser = yield sdk.GET.users.byId(loggedInUser.user.id);
if (existingUser) { yield sdk.AUTH.oAuth.create({ userId: existingUser.id, provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId}, });
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(existingUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); } }
const newUser = yield createOAuthUser( { id: crypto.randomUUID(), username: githubUsername, email: githubUser.email || null, name: githubUser.name || githubUsername, avatar: githubUser.avatar_url, createdAt: new Date(), url: githubUser.blog || null, emailVerified: false, notifications: null, password: null, updatedAt: new Date(), }, { provider: GitHubOAuthAPI.ProviderID, providerUserId: ${githubUserId} } );
if ('error' in newUser) { return new Response('Error creating user', { status: 500 }); }
// FIRST-TIME-SETUP if (config.dbStartPage) { return redirect('/done'); }
yield sendVerificationEmail(newUser.id, true);
const existingUser = yield sdk.GET.users.byId(newUser.id);
const isEmailAccountVerified = yield isEmailVerified(existingUser);
// If Mailer is enabled, is the user verified? if (!isEmailAccountVerified) { return new Response('Email not verified, please verify your account first.', { status: 400, }); }
yield createUserSession(newUser.id, context);
return redirect(StudioCMSRoutes.mainLinks.dashboardIndex); }), }; }),}).toString
GitHubUser
Section titled “GitHubUser”Defined in: studiocms/packages/@studiocms/github/src/effect/github.ts:23^
Represents a GitHub user profile as returned by the GitHub API.
Extends
Section titled “Extends”- {
id
:number
; } & {html_url
:string
; } & {login
:string
; } & {avatar_url
:string
; } & {name?
:string
; } & {blog?
:string
; } & {email?
:string
; }
Constructors
Section titled “Constructors”Constructor
Section titled “Constructor”new GitHubUser(props: { avatar_url: string; blog?: string; email?: string; html_url: string; id: number; login: string; name?: string;}, options?: MakeOptions): GitHubUser;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Schema.d.ts:4265
Parameters
Section titled “Parameters”avatar_url
Section titled “avatar_url”string
= Schema.String
string
= ...
email?
Section titled “email?”string
= ...
html_url
Section titled “html_url”string
= Schema.String
number
= Schema.Number
string
= Schema.String
string
= ...
options?
Section titled “options?”MakeOptions
Returns
Section titled “Returns”Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).constructor
Properties
Section titled “Properties”avatar_url
Section titled “avatar_url”readonly avatar_url: string = Schema.String;
Defined in: studiocms/packages/@studiocms/github/src/effect/github.ts:27^
The URL to the user’s avatar image.
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).avatar_url
readonly optional blog: string;
Defined in: studiocms/packages/@studiocms/github/src/effect/github.ts:29^
The user’s blog URL.
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).blog
email?
Section titled “email?”readonly optional email: string;
Defined in: studiocms/packages/@studiocms/github/src/effect/github.ts:30^
The user’s public email address.
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).email
html_url
Section titled “html_url”readonly html_url: string = Schema.String;
Defined in: studiocms/packages/@studiocms/github/src/effect/github.ts:25^
The URL to the user’s GitHub profile.
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).html_url
readonly id: number = Schema.Number;
Defined in: studiocms/packages/@studiocms/github/src/effect/github.ts:24^
The unique identifier for the user.
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).id
readonly login: string = Schema.String;
Defined in: studiocms/packages/@studiocms/github/src/effect/github.ts:26^
The user’s GitHub username.
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).login
readonly optional name: string;
Defined in: studiocms/packages/@studiocms/github/src/effect/github.ts:28^
The user’s display name.
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).name
[TypeId]
Section titled “[TypeId]”readonly static [TypeId]: { _A: Invariant<GitHubUser>; _I: Invariant<{ avatar_url: string; blog?: string; email?: string; html_url: string; id: number; login: string; name?: string; }>; _R: Covariant<never>;};
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Schema.d.ts:160
readonly _A: Invariant<GitHubUser>;
readonly _I: Invariant<{ avatar_url: string; blog?: string; email?: string; html_url: string; id: number; login: string; name?: string;}>;
readonly _R: Covariant<never>;
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).[TypeId]
readonly static ast: Transformation;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Schema.d.ts:4267
3.10.0
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).ast
Context
Section titled “Context”readonly static Context: never;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Schema.d.ts:63
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).Context
Encoded
Section titled “Encoded”readonly static Encoded: { avatar_url: string; blog?: string; email?: string; html_url: string; id: number; login: string; name?: string;};
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Schema.d.ts:62
avatar_url
Section titled “avatar_url”avatar_url: string;
optional blog: string;
email?
Section titled “email?”optional email: string;
html_url
Section titled “html_url”html_url: string;
id: number;
login: string;
optional name: string;
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).Encoded
fields
Section titled “fields”readonly static fields: { avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$>;};
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Schema.d.ts:4270
avatar_url
Section titled “avatar_url”readonly avatar_url: typeof String$ = Schema.String;
readonly blog: optional<typeof String$>;
readonly email: optional<typeof String$>;
html_url
Section titled “html_url”readonly html_url: typeof String$ = Schema.String;
readonly id: typeof Number$ = Schema.Number;
readonly login: typeof String$ = Schema.String;
readonly name: optional<typeof String$>;
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).fields
identifier
Section titled “identifier”readonly static identifier: string;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Schema.d.ts:4273
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).identifier
readonly static Type: GitHubUser;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Schema.d.ts:61
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).Type
Methods
Section titled “Methods”annotations()
Section titled “annotations()”static annotations(annotations: Schema<GitHubUser>): SchemaClass<GitHubUser, { avatar_url: string; blog?: string; email?: string; html_url: string; id: number; login: string; name?: string;}, never>;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Schema.d.ts:4269
Merges a set of new annotations with existing ones, potentially overwriting any duplicates.
Parameters
Section titled “Parameters”annotations
Section titled “annotations”Schema
<GitHubUser
>
Returns
Section titled “Returns”SchemaClass
<GitHubUser
, {
avatar_url
: string
;
blog?
: string
;
email?
: string
;
html_url
: string
;
id
: number
;
login
: string
;
name?
: string
;
}, never
>
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).annotations
extend()
Section titled “extend()”static extend<Extended>(identifier: string): <NewFields>(fields: NewFields | HasFields<NewFields>, annotations?: ClassAnnotations<Extended, { [K in string | number | symbol]: Type<{ avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$> } & NewFields>[K] }>) => [Extended] extends [never] ? "Missing `Self` generic - use `class Self extends Base.extend<Self>()({ ... })`" : Class<Extended, { avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$>;} & NewFields, { avatar_url: string; html_url: string; id: number; login: string;} & { blog?: string; email?: string; name?: string;} & { readonly [K in string | number | symbol as Key<NewFields, K>]: Encoded<NewFields[K]> } & { readonly [K in string | number | symbol as Key<NewFields, K>]?: Encoded<NewFields[K]> }, Context<NewFields[keyof NewFields]>, { id: number;} & { html_url: string;} & { login: string;} & { avatar_url: string;} & { name?: string;} & { blog?: string;} & { email?: string;} & Constructor<NewFields>, GitHubUser, {}>;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Schema.d.ts:4296
Type Parameters
Section titled “Type Parameters”Extended
Section titled “Extended”Extended
= never
Parameters
Section titled “Parameters”identifier
Section titled “identifier”string
Returns
Section titled “Returns”<NewFields>(fields: NewFields | HasFields<NewFields>, annotations?: ClassAnnotations<Extended, { [K in string | number | symbol]: Type<{ avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$> } & NewFields>[K] }>): [Extended] extends [never] ? "Missing `Self` generic - use `class Self extends Base.extend<Self>()({ ... })`" : Class<Extended, { avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$>;} & NewFields, { avatar_url: string; html_url: string; id: number; login: string;} & { blog?: string; email?: string; name?: string;} & { readonly [K in string | number | symbol as Key<NewFields, K>]: Encoded<NewFields[K]> } & { readonly [K in string | number | symbol as Key<NewFields, K>]?: Encoded<NewFields[K]> }, Context<NewFields[keyof NewFields]>, { id: number;} & { html_url: string;} & { login: string;} & { avatar_url: string;} & { name?: string;} & { blog?: string;} & { email?: string;} & Constructor<NewFields>, GitHubUser, {}>;
Type Parameters
Section titled “Type Parameters”NewFields
Section titled “NewFields”NewFields
extends Fields
Parameters
Section titled “Parameters”fields
Section titled “fields”NewFields
| HasFields
<NewFields
>
annotations?
Section titled “annotations?”ClassAnnotations
<Extended
, { [K in string | number | symbol]: Type<{ avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$> } & NewFields>[K] }>
Returns
Section titled “Returns”[Extended
] extends [never
] ? "Missing `Self` generic - use `class Self extends Base.extend<Self>()({ ... })`"
: Class
<Extended
, {
avatar_url
: typeof String$
;
blog
: optional
<typeof String$
>;
email
: optional
<typeof String$
>;
html_url
: typeof String$
;
id
: typeof Number$
;
login
: typeof String$
;
name
: optional
<typeof String$
>;
} & NewFields
, {
avatar_url
: string
;
html_url
: string
;
id
: number
;
login
: string
;
} & {
blog?
: string
;
email?
: string
;
name?
: string
;
} & { readonly [K in string | number | symbol as Key<NewFields, K>]: Encoded<NewFields[K]> } & { readonly [K in string | number | symbol as Key<NewFields, K>]?: Encoded<NewFields[K]> }, Context
<NewFields
[keyof NewFields
]>, {
id
: number
;
} & {
html_url
: string
;
} & {
login
: string
;
} & {
avatar_url
: string
;
} & {
name?
: string
;
} & {
blog?
: string
;
} & {
email?
: string
;
} & Constructor
<NewFields
>, GitHubUser
, {
}>
Example
Section titled “Example”import { Schema } from "effect"
class MyClass extends Schema.Class<MyClass>("MyClass")({ myField: Schema.String}) { myMethod() { return this.myField + "my" }}
class NextClass extends MyClass.extend<NextClass>("NextClass")({ nextField: Schema.Number}) { nextMethod() { return this.myMethod() + this.myField + this.nextField }}
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).extend
make()
Section titled “make()”static make<C>(this: C, ...args: ConstructorParameters<C>): InstanceType<C>;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Schema.d.ts:4268
Type Parameters
Section titled “Type Parameters”C
extends (…args
: any
[]) => any
Parameters
Section titled “Parameters”C
…ConstructorParameters
<C
>
Returns
Section titled “Returns”InstanceType
<C
>
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).make
pipe()
Section titled “pipe()”Call Signature
Section titled “Call Signature”static pipe<A>(this: A): A;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:10
Type Parameters
Section titled “Type Parameters”A
Parameters
Section titled “Parameters”A
Returns
Section titled “Returns”A
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B>(this: A, ab: (_: A) => B): B;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:11
Type Parameters
Section titled “Type Parameters”A
B
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
Returns
Section titled “Returns”B
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C>( this: A, ab: (_: A) => B, bc: (_: B) => C): C;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:12
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
Returns
Section titled “Returns”C
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:13
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
Returns
Section titled “Returns”D
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E): E;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:14
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
Returns
Section titled “Returns”E
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F): F;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:15
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
Returns
Section titled “Returns”F
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G): G;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:16
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
Returns
Section titled “Returns”G
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H): H;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:17
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
Returns
Section titled “Returns”H
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I): I;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:18
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
Returns
Section titled “Returns”I
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I, J>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J): J;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:19
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
J
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
(_
: I
) => J
Returns
Section titled “Returns”J
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I, J, K>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K): K;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:20
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
J
= never
K
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
(_
: I
) => J
(_
: J
) => K
Returns
Section titled “Returns”K
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I, J, K, L>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L): L;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:21
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
J
= never
K
= never
L
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
(_
: I
) => J
(_
: J
) => K
(_
: K
) => L
Returns
Section titled “Returns”L
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M): M;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:22
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
J
= never
K
= never
L
= never
M
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
(_
: I
) => J
(_
: J
) => K
(_
: K
) => L
(_
: L
) => M
Returns
Section titled “Returns”M
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N): N;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:23
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
J
= never
K
= never
L
= never
M
= never
N
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
(_
: I
) => J
(_
: J
) => K
(_
: K
) => L
(_
: L
) => M
(_
: M
) => N
Returns
Section titled “Returns”N
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O): O;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:24
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
J
= never
K
= never
L
= never
M
= never
N
= never
O
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
(_
: I
) => J
(_
: J
) => K
(_
: K
) => L
(_
: L
) => M
(_
: M
) => N
(_
: N
) => O
Returns
Section titled “Returns”O
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P): P;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:25
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
J
= never
K
= never
L
= never
M
= never
N
= never
O
= never
P
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
(_
: I
) => J
(_
: J
) => K
(_
: K
) => L
(_
: L
) => M
(_
: M
) => N
(_
: N
) => O
(_
: O
) => P
Returns
Section titled “Returns”P
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q): Q;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:26
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
J
= never
K
= never
L
= never
M
= never
N
= never
O
= never
P
= never
Q
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
(_
: I
) => J
(_
: J
) => K
(_
: K
) => L
(_
: L
) => M
(_
: M
) => N
(_
: N
) => O
(_
: O
) => P
(_
: P
) => Q
Returns
Section titled “Returns”Q
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R): R;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:27
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
J
= never
K
= never
L
= never
M
= never
N
= never
O
= never
P
= never
Q
= never
R
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
(_
: I
) => J
(_
: J
) => K
(_
: K
) => L
(_
: L
) => M
(_
: M
) => N
(_
: N
) => O
(_
: O
) => P
(_
: P
) => Q
(_
: Q
) => R
Returns
Section titled “Returns”R
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S): S;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:28
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
J
= never
K
= never
L
= never
M
= never
N
= never
O
= never
P
= never
Q
= never
R
= never
S
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
(_
: I
) => J
(_
: J
) => K
(_
: K
) => L
(_
: L
) => M
(_
: M
) => N
(_
: N
) => O
(_
: O
) => P
(_
: P
) => Q
(_
: Q
) => R
(_
: R
) => S
Returns
Section titled “Returns”S
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T): T;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:29
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
J
= never
K
= never
L
= never
M
= never
N
= never
O
= never
P
= never
Q
= never
R
= never
S
= never
T
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
(_
: I
) => J
(_
: J
) => K
(_
: K
) => L
(_
: L
) => M
(_
: M
) => N
(_
: N
) => O
(_
: O
) => P
(_
: P
) => Q
(_
: Q
) => R
(_
: R
) => S
(_
: S
) => T
Returns
Section titled “Returns”T
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T, tu: (_: T) => U): U;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:30
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
J
= never
K
= never
L
= never
M
= never
N
= never
O
= never
P
= never
Q
= never
R
= never
S
= never
T
= never
U
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
(_
: I
) => J
(_
: J
) => K
(_
: K
) => L
(_
: L
) => M
(_
: M
) => N
(_
: N
) => O
(_
: O
) => P
(_
: P
) => Q
(_
: Q
) => R
(_
: R
) => S
(_
: S
) => T
(_
: T
) => U
Returns
Section titled “Returns”U
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).pipe
Call Signature
Section titled “Call Signature”static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U>( this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T, tu: (_: T) => U): U;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:31
Type Parameters
Section titled “Type Parameters”A
B
= never
C
= never
D
= never
E
= never
F
= never
G
= never
H
= never
I
= never
J
= never
K
= never
L
= never
M
= never
N
= never
O
= never
P
= never
Q
= never
R
= never
S
= never
T
= never
U
= never
Parameters
Section titled “Parameters”A
(_
: A
) => B
(_
: B
) => C
(_
: C
) => D
(_
: D
) => E
(_
: E
) => F
(_
: F
) => G
(_
: G
) => H
(_
: H
) => I
(_
: I
) => J
(_
: J
) => K
(_
: K
) => L
(_
: L
) => M
(_
: M
) => N
(_
: N
) => O
(_
: O
) => P
(_
: P
) => Q
(_
: Q
) => R
(_
: R
) => S
(_
: S
) => T
(_
: T
) => U
Returns
Section titled “Returns”U
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).pipe
transformOrFail()
Section titled “transformOrFail()”static transformOrFail<Transformed>(identifier: string): <NewFields, R2, R3>(fields: NewFields, options: { decode: (input: { avatar_url: string; blog?: string; email?: string; html_url: string; id: number; login: string; name?: string; }, options: ParseOptions, ast: Transformation) => Effect<{ [K in string | number | symbol]: Type<{ avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$> } & NewFields>[K] }, ParseIssue, R2>; encode: (input: { [K in string | number | symbol]: Type<{ avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$> } & NewFields>[K] }, options: ParseOptions, ast: Transformation) => Effect<{ id: number; } & { html_url: string; } & { login: string; } & { avatar_url: string; } & { name?: string; } & { blog?: string; } & { email?: string; }, ParseIssue, R3>;}, annotations?: ClassAnnotations<Transformed, { [K in string | number | symbol]: Type<{ avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$> } & NewFields>[K] }>) => [Transformed] extends [never] ? "Missing `Self` generic - use `class Self extends Base.transformOrFail<Self>()({ ... })`" : Class<Transformed, { avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$>;} & NewFields, Encoded<{ avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$>;}>, R2 | R3 | Context<NewFields[keyof NewFields]>, { id: number;} & { html_url: string;} & { login: string;} & { avatar_url: string;} & { name?: string;} & { blog?: string;} & { email?: string;} & Constructor<NewFields>, GitHubUser, {}>;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Schema.d.ts:4326
Type Parameters
Section titled “Type Parameters”Transformed
Section titled “Transformed”Transformed
= never
Parameters
Section titled “Parameters”identifier
Section titled “identifier”string
Returns
Section titled “Returns”<NewFields, R2, R3>( fields: NewFields, options: { decode: (input: { avatar_url: string; blog?: string; email?: string; html_url: string; id: number; login: string; name?: string; }, options: ParseOptions, ast: Transformation) => Effect<{ [K in string | number | symbol]: Type<{ avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$> } & NewFields>[K] }, ParseIssue, R2>; encode: (input: { [K in string | number | symbol]: Type<{ avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$> } & NewFields>[K] }, options: ParseOptions, ast: Transformation) => Effect<{ id: number; } & { html_url: string; } & { login: string; } & { avatar_url: string; } & { name?: string; } & { blog?: string; } & { email?: string; }, ParseIssue, R3>;}, annotations?: ClassAnnotations<Transformed, { [K in string | number | symbol]: Type<{ avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$> } & NewFields>[K] }>): [Transformed] extends [never] ? "Missing `Self` generic - use `class Self extends Base.transformOrFail<Self>()({ ... })`" : Class<Transformed, { avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$>;} & NewFields, Encoded<{ avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$>;}>, R2 | R3 | Context<NewFields[keyof NewFields]>, { id: number;} & { html_url: string;} & { login: string;} & { avatar_url: string;} & { name?: string;} & { blog?: string;} & { email?: string;} & Constructor<NewFields>, GitHubUser, {}>;
Type Parameters
Section titled “Type Parameters”NewFields
Section titled “NewFields”NewFields
extends Fields
R2
R3
Parameters
Section titled “Parameters”fields
Section titled “fields”NewFields
options
Section titled “options”decode
Section titled “decode”(input
: {
avatar_url
: string
;
blog?
: string
;
email?
: string
;
html_url
: string
;
id
: number
;
login
: string
;
name?
: string
;
}, options
: ParseOptions
, ast
: Transformation
) => Effect
<{ [K in string | number | symbol]: Type<{ avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$> } & NewFields>[K] }, ParseIssue
, R2
>
encode
Section titled “encode”(input
: { [K in string | number | symbol]: Type<{ avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$> } & NewFields>[K] }, options
: ParseOptions
, ast
: Transformation
) => Effect
<{
id
: number
;
} & {
html_url
: string
;
} & {
login
: string
;
} & {
avatar_url
: string
;
} & {
name?
: string
;
} & {
blog?
: string
;
} & {
email?
: string
;
}, ParseIssue
, R3
>
annotations?
Section titled “annotations?”ClassAnnotations
<Transformed
, { [K in string | number | symbol]: Type<{ avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$> } & NewFields>[K] }>
Returns
Section titled “Returns”[Transformed
] extends [never
] ? "Missing `Self` generic - use `class Self extends Base.transformOrFail<Self>()({ ... })`"
: Class
<Transformed
, {
avatar_url
: typeof String$
;
blog
: optional
<typeof String$
>;
email
: optional
<typeof String$
>;
html_url
: typeof String$
;
id
: typeof Number$
;
login
: typeof String$
;
name
: optional
<typeof String$
>;
} & NewFields
, Encoded
<{
avatar_url
: typeof String$
;
blog
: optional
<typeof String$
>;
email
: optional
<typeof String$
>;
html_url
: typeof String$
;
id
: typeof Number$
;
login
: typeof String$
;
name
: optional
<typeof String$
>;
}>, R2
| R3
| Context
<NewFields
[keyof NewFields
]>, {
id
: number
;
} & {
html_url
: string
;
} & {
login
: string
;
} & {
avatar_url
: string
;
} & {
name?
: string
;
} & {
blog?
: string
;
} & {
email?
: string
;
} & Constructor
<NewFields
>, GitHubUser
, {
}>
Example
Section titled “Example”import { Effect, Schema } from "effect"
class MyClass extends Schema.Class<MyClass>("MyClass")({ myField: Schema.String}) { myMethod() { return this.myField + "my" }}
class NextClass extends MyClass.transformOrFail<NextClass>("NextClass")({ nextField: Schema.Number}, { decode: (i) => Effect.succeed({ myField: i.myField, nextField: i.myField.length }), encode: (a) => Effect.succeed({ myField: a.myField })}) { nextMethod() { return this.myMethod() + this.myField + this.nextField }}
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).transformOrFail
transformOrFailFrom()
Section titled “transformOrFailFrom()”static transformOrFailFrom<Transformed>(identifier: string): <NewFields, R2, R3>(fields: NewFields, options: { decode: (input: { avatar_url: string; blog?: string; email?: string; html_url: string; id: number; login: string; name?: string; }, options: ParseOptions, ast: Transformation) => Effect<{ [K in string | number | symbol]: ({ avatar_url: string; html_url: string; id: number; login: string } & { blog?: string; email?: string; name?: string } & { readonly [K in string | number | symbol as Key<NewFields, K>]: Encoded<NewFields[K]> } & { readonly [K in string | number | symbol as Key<NewFields, K>]?: Encoded<(...)[(...)]> })[K] }, ParseIssue, R2>; encode: (input: { [K in string | number | symbol]: ({ avatar_url: string; html_url: string; id: number; login: string } & { blog?: string; email?: string; name?: string } & { readonly [K in string | number | symbol as Key<NewFields, K>]: Encoded<NewFields[K]> } & { readonly [K in string | number | symbol as Key<NewFields, K>]?: Encoded<NewFields[K]> })[K] }, options: ParseOptions, ast: Transformation) => Effect<Encoded<{ avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$>; }>, ParseIssue, R3>;}, annotations?: ClassAnnotations<Transformed, { [K in string | number | symbol]: Type<{ avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$> } & NewFields>[K] }>) => [Transformed] extends [never] ? "Missing `Self` generic - use `class Self extends Base.transformOrFailFrom<Self>()({ ... })`" : Class<Transformed, { avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$>;} & NewFields, Encoded<{ avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$>;}>, R2 | R3 | Context<NewFields[keyof NewFields]>, { id: number;} & { html_url: string;} & { login: string;} & { avatar_url: string;} & { name?: string;} & { blog?: string;} & { email?: string;} & Constructor<NewFields>, GitHubUser, {}>;
Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Schema.d.ts:4359
Type Parameters
Section titled “Type Parameters”Transformed
Section titled “Transformed”Transformed
= never
Parameters
Section titled “Parameters”identifier
Section titled “identifier”string
Returns
Section titled “Returns”<NewFields, R2, R3>( fields: NewFields, options: { decode: (input: { avatar_url: string; blog?: string; email?: string; html_url: string; id: number; login: string; name?: string; }, options: ParseOptions, ast: Transformation) => Effect<{ [K in string | number | symbol]: ({ avatar_url: string; html_url: string; id: number; login: string } & { blog?: string; email?: string; name?: string } & { readonly [K in string | number | symbol as Key<NewFields, K>]: Encoded<NewFields[K]> } & { readonly [K in string | number | symbol as Key<NewFields, K>]?: Encoded<(...)[(...)]> })[K] }, ParseIssue, R2>; encode: (input: { [K in string | number | symbol]: ({ avatar_url: string; html_url: string; id: number; login: string } & { blog?: string; email?: string; name?: string } & { readonly [K in string | number | symbol as Key<NewFields, K>]: Encoded<NewFields[K]> } & { readonly [K in string | number | symbol as Key<NewFields, K>]?: Encoded<NewFields[K]> })[K] }, options: ParseOptions, ast: Transformation) => Effect<Encoded<{ avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$>; }>, ParseIssue, R3>;}, annotations?: ClassAnnotations<Transformed, { [K in string | number | symbol]: Type<{ avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$> } & NewFields>[K] }>): [Transformed] extends [never] ? "Missing `Self` generic - use `class Self extends Base.transformOrFailFrom<Self>()({ ... })`" : Class<Transformed, { avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$>;} & NewFields, Encoded<{ avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$>;}>, R2 | R3 | Context<NewFields[keyof NewFields]>, { id: number;} & { html_url: string;} & { login: string;} & { avatar_url: string;} & { name?: string;} & { blog?: string;} & { email?: string;} & Constructor<NewFields>, GitHubUser, {}>;
Type Parameters
Section titled “Type Parameters”NewFields
Section titled “NewFields”NewFields
extends Fields
R2
R3
Parameters
Section titled “Parameters”fields
Section titled “fields”NewFields
options
Section titled “options”decode
Section titled “decode”(input
: {
avatar_url
: string
;
blog?
: string
;
email?
: string
;
html_url
: string
;
id
: number
;
login
: string
;
name?
: string
;
}, options
: ParseOptions
, ast
: Transformation
) => Effect
<{ [K in string | number | symbol]: ({ avatar_url: string; html_url: string; id: number; login: string } & { blog?: string; email?: string; name?: string } & { readonly [K in string | number | symbol as Key<NewFields, K>]: Encoded<NewFields[K]> } & { readonly [K in string | number | symbol as Key<NewFields, K>]?: Encoded<(…)[(…)]> })[K] }, ParseIssue
, R2
>
encode
Section titled “encode”(input
: { [K in string | number | symbol]: ({ avatar_url: string; html_url: string; id: number; login: string } & { blog?: string; email?: string; name?: string } & { readonly [K in string | number | symbol as Key<NewFields, K>]: Encoded<NewFields[K]> } & { readonly [K in string | number | symbol as Key<NewFields, K>]?: Encoded<NewFields[K]> })[K] }, options
: ParseOptions
, ast
: Transformation
) => Effect
<Encoded
<{
avatar_url
: typeof String$
;
blog
: optional
<typeof String$
>;
email
: optional
<typeof String$
>;
html_url
: typeof String$
;
id
: typeof Number$
;
login
: typeof String$
;
name
: optional
<typeof String$
>;
}>, ParseIssue
, R3
>
annotations?
Section titled “annotations?”ClassAnnotations
<Transformed
, { [K in string | number | symbol]: Type<{ avatar_url: typeof String$; blog: optional<typeof String$>; email: optional<typeof String$>; html_url: typeof String$; id: typeof Number$; login: typeof String$; name: optional<typeof String$> } & NewFields>[K] }>
Returns
Section titled “Returns”[Transformed
] extends [never
] ? "Missing `Self` generic - use `class Self extends Base.transformOrFailFrom<Self>()({ ... })`"
: Class
<Transformed
, {
avatar_url
: typeof String$
;
blog
: optional
<typeof String$
>;
email
: optional
<typeof String$
>;
html_url
: typeof String$
;
id
: typeof Number$
;
login
: typeof String$
;
name
: optional
<typeof String$
>;
} & NewFields
, Encoded
<{
avatar_url
: typeof String$
;
blog
: optional
<typeof String$
>;
email
: optional
<typeof String$
>;
html_url
: typeof String$
;
id
: typeof Number$
;
login
: typeof String$
;
name
: optional
<typeof String$
>;
}>, R2
| R3
| Context
<NewFields
[keyof NewFields
]>, {
id
: number
;
} & {
html_url
: string
;
} & {
login
: string
;
} & {
avatar_url
: string
;
} & {
name?
: string
;
} & {
blog?
: string
;
} & {
email?
: string
;
} & Constructor
<NewFields
>, GitHubUser
, {
}>
Example
Section titled “Example”import { Effect, Schema } from "effect"
class MyClass extends Schema.Class<MyClass>("MyClass")({ myField: Schema.String}) { myMethod() { return this.myField + "my" }}
class NextClass extends MyClass.transformOrFailFrom<NextClass>("NextClass")({ nextField: Schema.Number}, { decode: (i) => Effect.succeed({ myField: i.myField, nextField: i.myField.length }), encode: (a) => Effect.succeed({ myField: a.myField })}) { nextMethod() { return this.myMethod() + this.myField + this.nextField }}
Inherited from
Section titled “Inherited from”Schema.Class<GitHubUser>('GitHubUser')({ id: Schema.Number, html_url: Schema.String, login: Schema.String, avatar_url: Schema.String, name: Schema.optional(Schema.String), blog: Schema.optional(Schema.String), email: Schema.optional(Schema.String),}).transformOrFailFrom