#!/usr/bin/env node // Packages const minimist = require('minimist'); const chalk = require('chalk'); const fetch = require('node-fetch'); const ora = require('ora'); // Utilities const cfg = require('../lib/cfg'); const logo = require('../lib/utils/output/logo'); const argv = minimist(process.argv.slice(2), { string: ['config'], boolean: ['help'], alias: { help: 'h', config: 'c' } }); const help = () => { console.log( ` ${chalk.bold(`${logo} now logout`)} ${chalk.dim('Options:')} -h, --help output usage information -c ${chalk.bold.underline('FILE')}, --config=${chalk.bold.underline('FILE')} config file ${chalk.dim('Examples:')} ${chalk.gray('–')} Logout from the CLI: ${chalk.cyan('$ now logout')} ` ); }; if (argv.help) { help(); process.exit(0); } const apiUrl = argv.url || 'https://api.zeit.co'; const endpoint = apiUrl + '/www/user/tokens/'; if (argv.config) { cfg.setConfigFile(argv.config); } const requestHeaders = token => ({ headers: { Authorization: `bearer ${token}` } }); const getTokenId = async token => { const result = await fetch(endpoint, requestHeaders(token)); const tokenList = await result.json(); if (!tokenList.tokens) { return; } const tokenInfo = tokenList.tokens.find(t => token === t.token); if (!tokenInfo) { return; } return tokenInfo.id; }; const revokeToken = async (token, tokenId) => { const details = { method: 'DELETE' }; Object.assign(details, requestHeaders(token)); const result = await fetch(endpoint + encodeURIComponent(tokenId), details); if (!result.ok) { console.error('Not able to log out'); } }; const logout = async () => { const spinner = ora({ text: 'Logging out...' }).start(); const config = await cfg.read(); try { await cfg.removeFile(); } catch (err) { spinner.fail(`Couldn't remove config while logging out`); process.exit(1); } let tokenId; try { tokenId = await getTokenId(argv.token || config.token); } catch (err) { spinner.fail('Not able to get token id on logout'); process.exit(1); } if (!tokenId) { return; } try { await revokeToken(argv.token || config.token, tokenId); } catch (err) { spinner.fail('Could not revoke token on logout'); process.exit(1); } spinner.succeed('Logged out!'); }; logout();