Jaga Santagostino
8 years ago
committed by
Leo Lamprecht
3 changed files with 141 additions and 1 deletions
@ -0,0 +1,138 @@ |
|||||
|
#!/usr/bin/env node
|
||||
|
|
||||
|
// Packages
|
||||
|
const fs = require('fs-promise') |
||||
|
const minimist = require('minimist') |
||||
|
const chalk = require('chalk') |
||||
|
const opn = require('opn') |
||||
|
|
||||
|
// Ours
|
||||
|
const Now = require('../lib') |
||||
|
const login = require('../lib/login') |
||||
|
const cfg = require('../lib/cfg') |
||||
|
const {handleError, error} = require('../lib/error') |
||||
|
|
||||
|
const argv = minimist(process.argv.slice(2), { |
||||
|
string: ['config', 'token'], |
||||
|
boolean: ['help', 'debug'], |
||||
|
alias: { |
||||
|
help: 'h', |
||||
|
config: 'c', |
||||
|
debug: 'd', |
||||
|
token: 't' |
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
const help = () => { |
||||
|
console.log(` |
||||
|
${chalk.bold('𝚫 now browse')} |
||||
|
|
||||
|
${chalk.dim('Options:')} |
||||
|
|
||||
|
-h, --help Output usage information |
||||
|
-c ${chalk.bold.underline('FILE')}, --config=${chalk.bold.underline('FILE')} Config file |
||||
|
-d, --debug Debug mode [off] |
||||
|
-t ${chalk.bold.underline('TOKEN')}, --token=${chalk.bold.underline('TOKEN')} Login token |
||||
|
|
||||
|
${chalk.dim('Examples:')} |
||||
|
|
||||
|
${chalk.gray('–')} Open latest deployment for current app |
||||
|
|
||||
|
${chalk.cyan('$ now browse')} |
||||
|
|
||||
|
`)
|
||||
|
} |
||||
|
|
||||
|
if (argv.help) { |
||||
|
help() |
||||
|
process.exit(0) |
||||
|
} |
||||
|
|
||||
|
const app = argv._[0] |
||||
|
|
||||
|
// options
|
||||
|
const debug = argv.debug |
||||
|
const apiUrl = argv.url || 'https://api.zeit.co' |
||||
|
|
||||
|
if (argv.config) { |
||||
|
cfg.setConfigFile(argv.config) |
||||
|
} |
||||
|
|
||||
|
const config = cfg.read() |
||||
|
|
||||
|
Promise.resolve(argv.token || config.token || login(apiUrl)) |
||||
|
.then(async token => { |
||||
|
try { |
||||
|
await browse(token) |
||||
|
} catch (err) { |
||||
|
error(`Unknown error: ${err}\n${err.stack}`) |
||||
|
process.exit(1) |
||||
|
} |
||||
|
}) |
||||
|
.catch(e => { |
||||
|
error(`Authentication error – ${e.message}`) |
||||
|
process.exit(1) |
||||
|
}) |
||||
|
|
||||
|
async function browse(token) { |
||||
|
const now = new Now(apiUrl, token, {debug}) |
||||
|
|
||||
|
let deployments |
||||
|
try { |
||||
|
deployments = await now.list(app) |
||||
|
} catch (err) { |
||||
|
handleError(err) |
||||
|
process.exit(1) |
||||
|
} |
||||
|
|
||||
|
now.close() |
||||
|
|
||||
|
const apps = new Map() |
||||
|
|
||||
|
for (const dep of deployments) { |
||||
|
const deps = apps.get(dep.name) || [] |
||||
|
apps.set(dep.name, deps.concat(dep)) |
||||
|
} |
||||
|
|
||||
|
let pkg |
||||
|
try { |
||||
|
const json = await fs.readFile('package.json') |
||||
|
pkg = JSON.parse(json) |
||||
|
} catch (err) { |
||||
|
pkg = {} |
||||
|
} |
||||
|
|
||||
|
const [currentProjectDeployments] = await getCurrentProjectDeployments([...apps], pkg) |
||||
|
|
||||
|
if (typeof currentProjectDeployments === 'undefined') { |
||||
|
console.log(`no deployments found for ${chalk.bold(pkg.name)}`) |
||||
|
process.exit(0) |
||||
|
} |
||||
|
|
||||
|
const sorted = await sortByCreation([...currentProjectDeployments]) |
||||
|
const latestDeploy = sorted[0] |
||||
|
|
||||
|
try { |
||||
|
const url = `https://${latestDeploy.url}` |
||||
|
console.log(`opening your latest deployment url for ${chalk.bold(pkg.name)} in browser - ${chalk.underline(url)}`) |
||||
|
|
||||
|
opn(url) |
||||
|
process.exit(0) |
||||
|
} catch (err) { |
||||
|
error(`Unknown error: ${err}\n${err.stack}`) |
||||
|
process.exit(1) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
async function getCurrentProjectDeployments(apps, pkg) { |
||||
|
return apps |
||||
|
.filter(app => pkg.name === app[0]) |
||||
|
.map(app => app[1]) |
||||
|
} |
||||
|
|
||||
|
async function sortByCreation(deps) { |
||||
|
return deps |
||||
|
.sort((depA, depB) => { |
||||
|
return depB.created - depA.created |
||||
|
}) |
||||
|
} |
Loading…
Reference in new issue