logggai
Version:
AI-powered CLI for transforming your development work into professional content
130 lines • 6.07 kB
JavaScript
;
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