UNPKG

logggai

Version:

AI-powered CLI for transforming your development work into professional content

130 lines 6.07 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.registerCommand = registerCommand; const chalk = require("chalk"); const ora_1 = require("ora"); const axios_1 = require("axios"); const crypto = require("crypto"); const nanoid_1 = require("nanoid"); const inquirer_1 = require("inquirer"); const { setConfig, getConfig, isLoggedIn } = require('../lib/config'); // Fonctions utilitaires pour PKCE function generateCodeVerifier() { return crypto.randomBytes(32).toString('base64url'); } function generateCodeChallenge(verifier) { return crypto.createHash('sha256').update(verifier).digest('base64url'); } async function registerCommand() { console.log(chalk.default.blue.bold('Register to Logggai')); console.log(); // Vérifier si l'utilisateur est déjà connecté if (isLoggedIn()) { const userEmail = getConfig('userEmail'); console.log(chalk.default.green('Already logged in!')); console.log(chalk.default.gray(`Connected as: ${userEmail}`)); console.log(); console.log(chalk.default.yellow('To create a new account, logout first: logggai logout')); return; } const apiUrl = getConfig('apiUrl'); console.log(chalk.default.gray(`API URL: ${apiUrl}`)); console.log(); try { // Générer les paramètres PKCE const codeVerifier = generateCodeVerifier(); const codeChallenge = generateCodeChallenge(codeVerifier); const state = (0, nanoid_1.nanoid)(); const redirectUri = `${apiUrl}/callback`; // Construire l'URL d'autorisation avec un paramètre pour indiquer l'inscription const authUrl = new URL(`${apiUrl}/api/oauth/authorize`); authUrl.searchParams.set('client_id', 'cli'); authUrl.searchParams.set('redirect_uri', redirectUri); authUrl.searchParams.set('response_type', 'code'); authUrl.searchParams.set('code_challenge', codeChallenge); authUrl.searchParams.set('code_challenge_method', 'S256'); authUrl.searchParams.set('state', state); authUrl.searchParams.set('action', 'register'); // Paramètre pour indiquer l'inscription console.log(chalk.default.yellow.bold('Create your account:')); console.log(); console.log(chalk.default.white(`Visit: ${chalk.default.cyan.underline(authUrl.toString())}`)); console.log(); console.log(chalk.default.cyan('You can register with GitHub or email')); console.log(); console.log(chalk.default.yellow('\n📋 After registering, you will be redirected to a page showing your authorization code.')); console.log(chalk.default.yellow('Please copy the authorization code from that page and paste it below.')); console.log(); const answers = await inquirer_1.default.prompt([ { type: 'input', name: 'authCode', message: 'Enter the authorization code:', validate: (input) => { if (!input || input.trim().length === 0) { return 'Please enter the authorization code'; } return true; } } ]); const authCode = answers.authCode.trim(); const spinner = (0, ora_1.default)('Exchanging authorization code for tokens...').start(); // Échanger le code contre un token d'accès const tokenResponse = await axios_1.default.post(`${apiUrl}/api/oauth/token`, { grant_type: 'authorization_code', client_id: 'cli', code: authCode, redirect_uri: redirectUri, code_verifier: codeVerifier }); const tokenData = tokenResponse.data; spinner.stop(); // Sauvegarder les tokens setConfig('sessionToken', tokenData.access_token); setConfig('tokenExpiresAt', tokenData.expires_at); setConfig('userId', tokenData.clerk_user_id); // Récupérer les infos utilisateur pour sauvegarder l'email try { const userResponse = await axios_1.default.get(`${apiUrl}/api/user/context`, { headers: { 'Authorization': `Bearer ${tokenData.access_token}`, 'x-clerk-user-id': tokenData.clerk_user_id } }); // Sauvegarder l'email si disponible if (userResponse.data?.user?.email) { setConfig('userEmail', userResponse.data.user.email); } console.log(chalk.default.green('Account created successfully!')); console.log(chalk.default.gray(`Welcome, ${userResponse.data?.user?.email || 'User'}!`)); console.log(); console.log(chalk.default.green.bold('Your account is ready! You can now:')); console.log(chalk.default.cyan(' logggai post "My first article"')); console.log(chalk.default.cyan(' logggai list')); return; } catch (error) { console.log(chalk.default.green('Account created successfully!')); console.log(); console.log(chalk.default.green.bold('Welcome to Logggai!')); console.log(chalk.default.cyan('You can now use the CLI to create articles.')); return; } } catch (error) { console.log(chalk.default.red('Registration error')); if (error.code === 'ECONNREFUSED') { console.log(chalk.default.red('Unable to connect to Logggai server')); console.log(chalk.default.yellow(`Check that the server is running on: ${apiUrl}`)); } else if (error.response?.status === 401) { console.log(chalk.default.red('Authentication error')); console.log(chalk.default.yellow('Check your connection and run logggai register again')); } else { console.log(chalk.default.red(error.message)); } process.exit(1); } } //# sourceMappingURL=register.js.map