UNPKG

2.52 kBJavaScriptView Raw
1#!/usr/bin/env node
2
3'use strict';
4
5const { about, fetchLatest, fetchRandom } = require('./');
6const argv = require('minimist')(process.argv.slice(2));
7const bold = require('ansi-bold');
8const cyan = require('ansi-cyan');
9const green = require('ansi-green');
10const html2text = require('html2plaintext');
11const pkg = require('./package.json');
12const wrapAnsi = require('wrap-ansi');
13
14const DATE = '\uD83D\uDCC5';
15const OPEN_BOOK = '\uD83D\uDCD6';
16
17const name = Object.keys(pkg.bin)[0];
18const isMacOS = process.platform === 'darwin';
19const wrap = (text, { columns = 80, ...options } = {}) => {
20 columns = Math.min(process.stdout.columns, columns);
21 return wrapAnsi(text, columns, { hard: true, ...options });
22};
23
24const flag = (argv, short, long) => ({ [long]: (short && argv[short]) || argv[long] });
25const normalize = url => url.replace(/\/$/, '');
26const toLocaleDate = timestamp => (new Date(timestamp)).toLocaleDateString();
27
28const date = timestamp => (isMacOS ? DATE : '@') + ' ' + toLocaleDate(timestamp);
29const link = url => (isMacOS ? `${OPEN_BOOK} ` : '') + cyan(normalize(url));
30const format = haiku => wrap(`
31${bold(html2text(haiku.title))}
32
33${html2text(haiku.content)}
34
35${date(haiku.createdAt)}
36${link(haiku.link)}
37`);
38
39const help = `
40 ${bold(name)} v${pkg.version}
41
42 Usage:
43 $ ${name} [command]
44 $ ${name} latest Fetch latest haiku
45 $ ${name} about Display contents of about page
46
47 Options:
48 --info Display https://haiku.ist/about page [boolean]
49 -h, --help Show help [boolean]
50 -v, --version Show version number [boolean]
51
52 Homepage: ${green(pkg.homepage)}
53 Report issue: ${green(pkg.bugs.url)}
54`;
55
56(async function program(options = getOptions(argv)) {
57 const {
58 command,
59 info: showInfo,
60 version: showVersion,
61 help: showHelp
62 } = options;
63
64 if (showVersion) return console.log(pkg.version);
65 if (showHelp) return console.log(help);
66
67 if (showInfo || command === 'about') {
68 const info = await about();
69 return console.log(format(info));
70 }
71
72 const haiku = await ((command === 'latest') ? fetchLatest() : fetchRandom());
73 haiku.content = haiku.content.replace(/(?:\r?\n)+/g, '\n');
74 console.log(format(haiku));
75}());
76
77function getOptions(argv) {
78 const [command] = argv._;
79 return {
80 ...flag(argv, 'h', 'help'),
81 ...flag(argv, 'v', 'version'),
82 ...flag(argv, null, 'info'),
83 command: (command || '').toLowerCase()
84 };
85}