UNPKG

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