import chalk from "chalk"; import { authenticateClerk, initializeClerk, logoutClerk, tokenStore, } from "./auth"; import { browserAuth } from "./authServer"; import ora from "ora"; import type { UserConfig } from "../types"; import { getUserConfig, removeUserConfig, saveUserConfig } from "../config"; import { userConfigSchema } from "../schema"; export async function createClerkSession(): Promise { const spinner = ora(`${chalk.bold("logging in...")} `).start(); // initiate login oauth login flow const authData = await browserAuth(); if ("error" in authData) { spinner.warn(chalk.red(authData.error)); process.exit(1); } const userConfig = await authenticateClerk(authData.token); spinner.succeed(`${chalk.green(" signed in sucessfully :)")}`); spinner.stop(); if (userConfig) return userConfigSchema.parse(userConfig); //! ideally never reaching here! throw new Error("Login failed. Please try again later"); } export const getUser = async () => { let config: UserConfig | undefined; config = getUserConfig(); if (!config) { const session = await createClerkSession(); if (!session) { throw new Error("Login failed, Please try again later"); } config = session; } saveUserConfig(config); const clerk = await initializeClerk({}, tokenStore(config.accessToken)); return { config: config, clerk, }; }; export const logout = async () => { const config = getUserConfig(); if (!config) return; removeUserConfig(); try { await logoutClerk(config.accessToken); } catch (error) {} };