Aller au contenu

effect/google

Ce contenu n’est pas encore disponible dans votre langue.

Defined in: studiocms/packages/@studiocms/google/src/effect/google.ts:68^

Provides Google OAuth authentication effects for the StudioCMS API.

This service handles the OAuth flow for Google authentication, including session initialization, authorization code validation, user account linking, and user creation. It integrates with session management, user data libraries, and email verification.

const googleOAuth = new GoogleOAuthAPI();
yield* googleOAuth.initSession(context);
yield* googleOAuth.initCallback(context);

initSession Initializes the OAuth session by generating a state and code verifier, setting cookies, and redirecting the user to Google’s authorization URL.

The API context containing request and response information.

initCallback Handles the OAuth callback from Google. Validates the authorization code and state, fetches user information, links or creates user accounts, verifies email, and creates a user session.

The API context containing request and response information.

  • Session.Default: Session management utilities.
  • SDKCore.Default: Core SDK for user and OAuth provider operations.
  • VerifyEmail.Default: Email verification utilities.
  • User.Default: User data management utilities.
  • { initCallback: (context: APIContext) => Effect<Response, Error | SDKCoreError, never>; initSession: (context: APIContext) => Effect<Response, SessionError, never>; } & { _tag: "GoogleOAuthAPI"; }

new GoogleOAuthAPI(_: {
initCallback: (context: APIContext) => Effect<Response, Error | SDKCoreError, never>;
initSession: (context: APIContext) => Effect<Response, SessionError, never>;
}): GoogleOAuthAPI;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Effect.d.ts:26559

(context: APIContext) => Effect<Response, Error | SDKCoreError, never> = ...

(context: APIContext) => Effect<Response, SessionError, never> = ...

GoogleOAuthAPI

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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

readonly _tag: "GoogleOAuthAPI";

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Effect.d.ts:26560

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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: (context: APIContext) => Effect<Response, Error | SDKCoreError, never>;

Defined in: studiocms/packages/@studiocms/google/src/effect/google.ts:127^

APIContext

Effect<Response, Error | SDKCoreError, never>

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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: (context: APIContext) => Effect<Response, SessionError, never>;

Defined in: studiocms/packages/@studiocms/google/src/effect/google.ts:109^

APIContext

Effect<Response, SessionError, never>

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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

readonly static [ChannelTypeId]: VarianceStruct<never, unknown, never, unknown, GoogleOAuthAPI, unknown, GoogleOAuthAPI>;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Channel.d.ts:108

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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]

readonly static [EffectTypeId]: VarianceStruct<GoogleOAuthAPI, never, GoogleOAuthAPI>;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Effect.d.ts:195

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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]

static optional [ignoreSymbol]: TagUnifyIgnore;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Context.d.ts:41

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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]

readonly static [SinkTypeId]: VarianceStruct<GoogleOAuthAPI, unknown, never, never, GoogleOAuthAPI>;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Sink.d.ts:82

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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]

readonly static [STMTypeId]: {
_A: Covariant<GoogleOAuthAPI>;
_E: Covariant<never>;
_R: Covariant<GoogleOAuthAPI>;
};

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/STM.d.ts:136

readonly _A: Covariant<GoogleOAuthAPI>;
readonly _E: Covariant<never>;
readonly _R: Covariant<GoogleOAuthAPI>;
Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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]

readonly static [StreamTypeId]: VarianceStruct<GoogleOAuthAPI, never, GoogleOAuthAPI>;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Stream.d.ts:111

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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]

readonly static [TagTypeId]: {
_Identifier: Invariant<GoogleOAuthAPI>;
_Service: Invariant<GoogleOAuthAPI>;
};

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Context.d.ts:31

readonly _Identifier: Invariant<GoogleOAuthAPI>;
readonly _Service: Invariant<GoogleOAuthAPI>;
Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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]

static optional [typeSymbol]: unknown;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Context.d.ts:39

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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]

static optional [unifySymbol]: TagUnify<Class<GoogleOAuthAPI, "GoogleOAuthAPI", {
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

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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]

readonly static Default: Layer<GoogleOAuthAPI, Error | SessionError | UserError, never>;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Effect.d.ts:26570

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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

readonly static DefaultWithoutDependencies: Layer<GoogleOAuthAPI, SessionError | UserError, VerifyEmail | HttpClient>;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Effect.d.ts:26569

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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

readonly static Identifier: GoogleOAuthAPI;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Context.d.ts:30

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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: "GoogleOAuthAPI";

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Context.d.ts:38

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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

readonly static make: (_: {
initCallback: (context: APIContext) => Effect<Response, Error | SDKCoreError, never>;
initSession: (context: APIContext) => Effect<Response, SessionError, never>;
}) => GoogleOAuthAPI;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Effect.d.ts:26563

(context: APIContext) => Effect<Response, Error | SDKCoreError, never> = ...

(context: APIContext) => Effect<Response, SessionError, never> = ...

GoogleOAuthAPI

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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

static ProviderCodeVerifier: string = 'google_oauth_code_verifier';

Defined in: studiocms/packages/@studiocms/google/src/effect/google.ts:248^

static ProviderCookieName: string = 'google_oauth_state';

Defined in: studiocms/packages/@studiocms/google/src/effect/google.ts:247^

static ProviderID: string = 'google';

Defined in: studiocms/packages/@studiocms/google/src/effect/google.ts:246^

readonly static Service: GoogleOAuthAPI;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Context.d.ts:29

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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

readonly static optional stack: string;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Context.d.ts:37

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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: (_: GoogleOAuthAPI) => X) => [X] extends [Effect<A, E, R>] ? Effect<A, E,
| GoogleOAuthAPI
| R> : [X] extends [PromiseLike<A>] ? Effect<A, UnknownException, GoogleOAuthAPI> : Effect<X, never, GoogleOAuthAPI>;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Effect.d.ts:26562

X

(_: GoogleOAuthAPI) => X

[X] extends [Effect<A, E, R>] ? Effect<A, E, | GoogleOAuthAPI | R> : [X] extends [PromiseLike<A>] ? Effect<A, UnknownException, GoogleOAuthAPI> : Effect<X, never, GoogleOAuthAPI>

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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

static iterator: EffectGenerator<Tag<GoogleOAuthAPI, GoogleOAuthAPI>>;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Effect.d.ts:137

EffectGenerator<Tag<GoogleOAuthAPI, GoogleOAuthAPI>>

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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]

static NodeInspectSymbol: unknown;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Inspectable.d.ts:22

unknown

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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]

static context(self: GoogleOAuthAPI): Context<GoogleOAuthAPI>;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Context.d.ts:36

GoogleOAuthAPI

Context<GoogleOAuthAPI>

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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: GoogleOAuthAPI): GoogleOAuthAPI;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Context.d.ts:35

GoogleOAuthAPI

GoogleOAuthAPI

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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

static pipe<A>(this: A): A;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:10

A

A

A

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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
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

A

B = never

A

(_: A) => B

B

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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
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

A

B = never

C = never

A

(_: A) => B

(_: B) => C

C

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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
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

A

B = never

C = never

D = never

A

(_: A) => B

(_: B) => C

(_: C) => D

D

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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
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

A

B = never

C = never

D = never

E = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

E

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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
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

A

B = never

C = never

D = never

E = never

F = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

F

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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
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

A

B = never

C = never

D = never

E = never

F = never

G = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

G

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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
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

A

B = never

C = never

D = never

E = never

F = never

G = never

H = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

(_: G) => H

H

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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
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

A

B = never

C = never

D = never

E = never

F = never

G = never

H = never

I = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

(_: G) => H

(_: H) => I

I

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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
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

A

B = never

C = never

D = never

E = never

F = never

G = never

H = never

I = never

J = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

(_: G) => H

(_: H) => I

(_: I) => J

J

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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
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

A

B = never

C = never

D = never

E = never

F = never

G = never

H = never

I = never

J = never

K = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

(_: G) => H

(_: H) => I

(_: I) => J

(_: J) => K

K

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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
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

A

B = never

C = never

D = never

E = never

F = never

G = never

H = never

I = never

J = never

K = never

L = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

(_: G) => H

(_: H) => I

(_: I) => J

(_: J) => K

(_: K) => L

L

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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
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

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

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

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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
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

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

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

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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
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

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

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

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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
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

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

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

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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
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

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

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

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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
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

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

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

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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
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

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

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

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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
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

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

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

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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
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

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

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

U

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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
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

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

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

U

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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

static toJSON(): unknown;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Inspectable.d.ts:21

unknown

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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

static toString(): string;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Inspectable.d.ts:20

string

Effect.Service<GoogleOAuthAPI>()('GoogleOAuthAPI', {
dependencies: [VerifyEmail.Default, Platform.FetchHttpClient.layer],
effect: genLogger('studiocms/routes/api/auth/google/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 } = GOOGLE;
const google = new Google(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);
const validateAuthCode = (code: string, codeVerifier: string) =>
genLogger('studiocms/routes/api/auth/google/effect.validateAuthCode')(function () {
const tokens = yield Effect.tryPromise(() =>
google.validateAuthorizationCode(code, codeVerifier)
);
return yield fetchClient
.get('https://openidconnect.googleapis.com/v1/userinfo', {
headers: {
Authorization: Bearer ${tokens.accessToken},
},
})
.pipe(
Effect.flatMap(Platform.HttpClientResponse.schemaBodyJson(GoogleUser)),
Effect.catchAll((error) =>
Effect.fail(
new ValidateAuthCodeError({
provider: GoogleOAuthAPI.ProviderID,
message: Failed to fetch user info: ${error.message},
})
)
)
);
});
return {
initSession: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initSession')(function () {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const scopes = ['profile', 'email'];
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
yield setOAuthSessionTokenCookie(context, GoogleOAuthAPI.ProviderCookieName, state);
yield setOAuthSessionTokenCookie(
context,
GoogleOAuthAPI.ProviderCodeVerifier,
codeVerifier
);
return context.redirect(url.toString());
}),
initCallback: (context: APIContext) =>
genLogger('studiocms/routes/api/auth/google/effect.initCallback')(function () {
const { cookies, redirect } = context;
const [code, state, storedState, codeVerifier] = yield Effect.all([
getUrlParam(context, 'code'),
getUrlParam(context, 'state'),
getCookie(context, GoogleOAuthAPI.ProviderCookieName),
getCookie(context, GoogleOAuthAPI.ProviderCodeVerifier),
]);
if (!code || !storedState || !codeVerifier || state !== storedState) {
return redirect(StudioCMSRoutes.authLinks.loginURL);
}
const googleUser = yield validateAuthCode(code, codeVerifier);
const { sub: googleUserId, name: googleUsername } = googleUser;
const existingOAuthAccount = yield sdk.AUTH.oAuth.searchProvidersForId(
GoogleOAuthAPI.ProviderID,
googleUserId
);
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: GoogleOAuthAPI.ProviderID,
providerUserId: googleUserId,
});
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: googleUsername,
email: googleUser.email,
name: googleUser.name,
avatar: googleUser.picture,
createdAt: new Date(),
emailVerified: false,
notifications: null,
password: null,
updatedAt: new Date(),
url: null,
},
{ provider: GoogleOAuthAPI.ProviderID, providerUserId: googleUserId }
);
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

Defined in: studiocms/packages/@studiocms/google/src/effect/google.ts:20^

Represents a user authenticated via Google OAuth.

  • { sub: string; } & { picture: string; } & { name: string; } & { email: string; }

new GoogleUser(props: {
email: string;
name: string;
picture: string;
sub: string;
}, options?: MakeOptions): GoogleUser;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Schema.d.ts:4265

string = Schema.String

string = Schema.String

string = Schema.String

string = Schema.String

MakeOptions

GoogleUser

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).constructor

readonly email: string = Schema.String;

Defined in: studiocms/packages/@studiocms/google/src/effect/google.ts:24^

The user’s email address.

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).email

readonly name: string = Schema.String;

Defined in: studiocms/packages/@studiocms/google/src/effect/google.ts:23^

The full name of the user.

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).name

readonly picture: string = Schema.String;

Defined in: studiocms/packages/@studiocms/google/src/effect/google.ts:22^

The URL of the user’s profile picture.

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).picture

readonly sub: string = Schema.String;

Defined in: studiocms/packages/@studiocms/google/src/effect/google.ts:21^

The unique identifier for the user (subject).

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).sub

readonly static [TypeId]: {
_A: Invariant<GoogleUser>;
_I: Invariant<{
email: string;
name: string;
picture: string;
sub: 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<GoogleUser>;
readonly _I: Invariant<{
email: string;
name: string;
picture: string;
sub: string;
}>;
readonly _R: Covariant<never>;
Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: 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

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).ast

readonly static Context: never;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Schema.d.ts:63

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).Context

readonly static Encoded: {
email: string;
name: string;
picture: string;
sub: string;
};

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Schema.d.ts:62

email: string;
name: string;
picture: string;
sub: string;
Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).Encoded

readonly static fields: {
email: typeof String$;
name: typeof String$;
picture: typeof String$;
sub: typeof String$;
};

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Schema.d.ts:4270

readonly email: typeof String$ = Schema.String;
readonly name: typeof String$ = Schema.String;
readonly picture: typeof String$ = Schema.String;
readonly sub: typeof String$ = Schema.String;
Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).fields

readonly static identifier: string;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Schema.d.ts:4273

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).identifier

readonly static Type: GoogleUser;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Schema.d.ts:61

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).Type

static annotations(annotations: Schema<GoogleUser>): SchemaClass<GoogleUser, {
email: string;
name: string;
picture: string;
sub: 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.

Schema<GoogleUser>

SchemaClass<GoogleUser, { email: string; name: string; picture: string; sub: string; }, never>

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).annotations

static extend<Extended>(identifier: string): <NewFields>(fields: NewFields | HasFields<NewFields>, annotations?: ClassAnnotations<Extended, { [K in string | number | symbol]: Type<{ email: typeof String$; name: typeof String$; picture: typeof String$; sub: typeof String$ } & NewFields>[K] }>) => [Extended] extends [never] ? "Missing `Self` generic - use `class Self extends Base.extend<Self>()({ ... })`" : Class<Extended, {
email: typeof String$;
name: typeof String$;
picture: typeof String$;
sub: typeof String$;
} & NewFields, {
email: string;
name: string;
picture: string;
sub: 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]>, {
sub: string;
} & {
picture: string;
} & {
name: string;
} & {
email: string;
} & Constructor<NewFields>, GoogleUser, {
}>;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Schema.d.ts:4296

Extended = never

string

<NewFields>(fields: NewFields | HasFields<NewFields>, annotations?: ClassAnnotations<Extended, { [K in string | number | symbol]: Type<{ email: typeof String$; name: typeof String$; picture: typeof String$; sub: typeof String$ } & NewFields>[K] }>): [Extended] extends [never] ? "Missing `Self` generic - use `class Self extends Base.extend<Self>()({ ... })`" : Class<Extended, {
email: typeof String$;
name: typeof String$;
picture: typeof String$;
sub: typeof String$;
} & NewFields, {
email: string;
name: string;
picture: string;
sub: 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]>, {
sub: string;
} & {
picture: string;
} & {
name: string;
} & {
email: string;
} & Constructor<NewFields>, GoogleUser, {
}>;

NewFields extends Fields

NewFields | HasFields<NewFields>

ClassAnnotations<Extended, { [K in string | number | symbol]: Type<{ email: typeof String$; name: typeof String$; picture: typeof String$; sub: typeof String$ } & NewFields>[K] }>

[Extended] extends [never] ? "Missing `Self` generic - use `class Self extends Base.extend<Self>()({ ... })`" : Class<Extended, { email: typeof String$; name: typeof String$; picture: typeof String$; sub: typeof String$; } & NewFields, { email: string; name: string; picture: string; sub: 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]>, { sub: string; } & { picture: string; } & { name: string; } & { email: string; } & Constructor<NewFields>, GoogleUser, { }>

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
}
}
Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).extend

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

C extends (…args: any[]) => any

C

ConstructorParameters<C>

InstanceType<C>

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).make

static pipe<A>(this: A): A;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Pipeable.d.ts:10

A

A

A

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).pipe
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

A

B = never

A

(_: A) => B

B

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).pipe
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

A

B = never

C = never

A

(_: A) => B

(_: B) => C

C

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).pipe
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

A

B = never

C = never

D = never

A

(_: A) => B

(_: B) => C

(_: C) => D

D

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).pipe
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

A

B = never

C = never

D = never

E = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

E

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).pipe
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

A

B = never

C = never

D = never

E = never

F = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

F

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).pipe
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

A

B = never

C = never

D = never

E = never

F = never

G = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

G

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).pipe
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

A

B = never

C = never

D = never

E = never

F = never

G = never

H = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

(_: G) => H

H

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).pipe
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

A

B = never

C = never

D = never

E = never

F = never

G = never

H = never

I = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

(_: G) => H

(_: H) => I

I

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).pipe
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

A

B = never

C = never

D = never

E = never

F = never

G = never

H = never

I = never

J = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

(_: G) => H

(_: H) => I

(_: I) => J

J

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).pipe
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

A

B = never

C = never

D = never

E = never

F = never

G = never

H = never

I = never

J = never

K = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

(_: G) => H

(_: H) => I

(_: I) => J

(_: J) => K

K

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).pipe
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

A

B = never

C = never

D = never

E = never

F = never

G = never

H = never

I = never

J = never

K = never

L = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

(_: G) => H

(_: H) => I

(_: I) => J

(_: J) => K

(_: K) => L

L

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).pipe
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

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

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

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).pipe
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

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

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

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).pipe
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

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

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

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).pipe
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

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

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

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).pipe
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

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

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

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).pipe
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

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

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

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).pipe
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

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

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

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).pipe
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

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

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

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).pipe
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

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

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

U

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).pipe
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

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

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

U

Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).pipe

static transformOrFail<Transformed>(identifier: string): <NewFields, R2, R3>(fields: NewFields, options: {
decode: (input: {
email: string;
name: string;
picture: string;
sub: string;
}, options: ParseOptions, ast: Transformation) => Effect<{ [K in string | number | symbol]: Type<{ email: typeof String$; name: typeof String$; picture: typeof String$; sub: typeof String$ } & NewFields>[K] }, ParseIssue, R2>;
encode: (input: { [K in string | number | symbol]: Type<{ email: typeof String$; name: typeof String$; picture: typeof String$; sub: typeof String$ } & NewFields>[K] }, options: ParseOptions, ast: Transformation) => Effect<{
sub: string;
} & {
picture: string;
} & {
name: string;
} & {
email: string;
}, ParseIssue, R3>;
}, annotations?: ClassAnnotations<Transformed, { [K in string | number | symbol]: Type<{ email: typeof String$; name: typeof String$; picture: typeof String$; sub: typeof String$ } & NewFields>[K] }>) => [Transformed] extends [never] ? "Missing `Self` generic - use `class Self extends Base.transformOrFail<Self>()({ ... })`" : Class<Transformed, {
email: typeof String$;
name: typeof String$;
picture: typeof String$;
sub: typeof String$;
} & NewFields, Encoded<{
email: typeof String$;
name: typeof String$;
picture: typeof String$;
sub: typeof String$;
}>, R2 | R3 | Context<NewFields[keyof NewFields]>, {
sub: string;
} & {
picture: string;
} & {
name: string;
} & {
email: string;
} & Constructor<NewFields>, GoogleUser, {
}>;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Schema.d.ts:4326

Transformed = never

string

<NewFields, R2, R3>(
fields: NewFields,
options: {
decode: (input: {
email: string;
name: string;
picture: string;
sub: string;
}, options: ParseOptions, ast: Transformation) => Effect<{ [K in string | number | symbol]: Type<{ email: typeof String$; name: typeof String$; picture: typeof String$; sub: typeof String$ } & NewFields>[K] }, ParseIssue, R2>;
encode: (input: { [K in string | number | symbol]: Type<{ email: typeof String$; name: typeof String$; picture: typeof String$; sub: typeof String$ } & NewFields>[K] }, options: ParseOptions, ast: Transformation) => Effect<{
sub: string;
} & {
picture: string;
} & {
name: string;
} & {
email: string;
}, ParseIssue, R3>;
},
annotations?: ClassAnnotations<Transformed, { [K in string | number | symbol]: Type<{ email: typeof String$; name: typeof String$; picture: typeof String$; sub: typeof String$ } & NewFields>[K] }>): [Transformed] extends [never] ? "Missing `Self` generic - use `class Self extends Base.transformOrFail<Self>()({ ... })`" : Class<Transformed, {
email: typeof String$;
name: typeof String$;
picture: typeof String$;
sub: typeof String$;
} & NewFields, Encoded<{
email: typeof String$;
name: typeof String$;
picture: typeof String$;
sub: typeof String$;
}>, R2 | R3 | Context<NewFields[keyof NewFields]>, {
sub: string;
} & {
picture: string;
} & {
name: string;
} & {
email: string;
} & Constructor<NewFields>, GoogleUser, {
}>;

NewFields extends Fields

R2

R3

NewFields

(input: { email: string; name: string; picture: string; sub: string; }, options: ParseOptions, ast: Transformation) => Effect<{ [K in string | number | symbol]: Type<{ email: typeof String$; name: typeof String$; picture: typeof String$; sub: typeof String$ } & NewFields>[K] }, ParseIssue, R2>

(input: { [K in string | number | symbol]: Type<{ email: typeof String$; name: typeof String$; picture: typeof String$; sub: typeof String$ } & NewFields>[K] }, options: ParseOptions, ast: Transformation) => Effect<{ sub: string; } & { picture: string; } & { name: string; } & { email: string; }, ParseIssue, R3>

ClassAnnotations<Transformed, { [K in string | number | symbol]: Type<{ email: typeof String$; name: typeof String$; picture: typeof String$; sub: typeof String$ } & NewFields>[K] }>

[Transformed] extends [never] ? "Missing `Self` generic - use `class Self extends Base.transformOrFail<Self>()({ ... })`" : Class<Transformed, { email: typeof String$; name: typeof String$; picture: typeof String$; sub: typeof String$; } & NewFields, Encoded<{ email: typeof String$; name: typeof String$; picture: typeof String$; sub: typeof String$; }>, R2 | R3 | Context<NewFields[keyof NewFields]>, { sub: string; } & { picture: string; } & { name: string; } & { email: string; } & Constructor<NewFields>, GoogleUser, { }>

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
}
}
Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).transformOrFail

static transformOrFailFrom<Transformed>(identifier: string): <NewFields, R2, R3>(fields: NewFields, options: {
decode: (input: {
email: string;
name: string;
picture: string;
sub: string;
}, options: ParseOptions, ast: Transformation) => Effect<{ [K in string | number | symbol]: ({ email: string; name: string; picture: string; sub: 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]: ({ email: string; name: string; picture: string; sub: 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<{
email: typeof String$;
name: typeof String$;
picture: typeof String$;
sub: typeof String$;
}>, ParseIssue, R3>;
}, annotations?: ClassAnnotations<Transformed, { [K in string | number | symbol]: Type<{ email: typeof String$; name: typeof String$; picture: typeof String$; sub: typeof String$ } & NewFields>[K] }>) => [Transformed] extends [never] ? "Missing `Self` generic - use `class Self extends Base.transformOrFailFrom<Self>()({ ... })`" : Class<Transformed, {
email: typeof String$;
name: typeof String$;
picture: typeof String$;
sub: typeof String$;
} & NewFields, Encoded<{
email: typeof String$;
name: typeof String$;
picture: typeof String$;
sub: typeof String$;
}>, R2 | R3 | Context<NewFields[keyof NewFields]>, {
sub: string;
} & {
picture: string;
} & {
name: string;
} & {
email: string;
} & Constructor<NewFields>, GoogleUser, {
}>;

Defined in: node_modules/.pnpm/effect@3.17.14/node_modules/effect/dist/dts/Schema.d.ts:4359

Transformed = never

string

<NewFields, R2, R3>(
fields: NewFields,
options: {
decode: (input: {
email: string;
name: string;
picture: string;
sub: string;
}, options: ParseOptions, ast: Transformation) => Effect<{ [K in string | number | symbol]: ({ email: string; name: string; picture: string; sub: 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]: ({ email: string; name: string; picture: string; sub: 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<{
email: typeof String$;
name: typeof String$;
picture: typeof String$;
sub: typeof String$;
}>, ParseIssue, R3>;
},
annotations?: ClassAnnotations<Transformed, { [K in string | number | symbol]: Type<{ email: typeof String$; name: typeof String$; picture: typeof String$; sub: typeof String$ } & NewFields>[K] }>): [Transformed] extends [never] ? "Missing `Self` generic - use `class Self extends Base.transformOrFailFrom<Self>()({ ... })`" : Class<Transformed, {
email: typeof String$;
name: typeof String$;
picture: typeof String$;
sub: typeof String$;
} & NewFields, Encoded<{
email: typeof String$;
name: typeof String$;
picture: typeof String$;
sub: typeof String$;
}>, R2 | R3 | Context<NewFields[keyof NewFields]>, {
sub: string;
} & {
picture: string;
} & {
name: string;
} & {
email: string;
} & Constructor<NewFields>, GoogleUser, {
}>;

NewFields extends Fields

R2

R3

NewFields

(input: { email: string; name: string; picture: string; sub: string; }, options: ParseOptions, ast: Transformation) => Effect<{ [K in string | number | symbol]: ({ email: string; name: string; picture: string; sub: 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>

(input: { [K in string | number | symbol]: ({ email: string; name: string; picture: string; sub: 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<{ email: typeof String$; name: typeof String$; picture: typeof String$; sub: typeof String$; }>, ParseIssue, R3>

ClassAnnotations<Transformed, { [K in string | number | symbol]: Type<{ email: typeof String$; name: typeof String$; picture: typeof String$; sub: typeof String$ } & NewFields>[K] }>

[Transformed] extends [never] ? "Missing `Self` generic - use `class Self extends Base.transformOrFailFrom<Self>()({ ... })`" : Class<Transformed, { email: typeof String$; name: typeof String$; picture: typeof String$; sub: typeof String$; } & NewFields, Encoded<{ email: typeof String$; name: typeof String$; picture: typeof String$; sub: typeof String$; }>, R2 | R3 | Context<NewFields[keyof NewFields]>, { sub: string; } & { picture: string; } & { name: string; } & { email: string; } & Constructor<NewFields>, GoogleUser, { }>

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
}
}
Schema.Class<GoogleUser>('GoogleUser')({
sub: Schema.String,
picture: Schema.String,
name: Schema.String,
email: Schema.String,
}).transformOrFailFrom