UNPKG

4.97 kBJavaScriptView Raw
1/**
2 * npmRegistry.js fetches package dependencies and others infos from npm registry
3 * It uses chain operations that are divided into 2 categories: simple() and all()
4 *
5 */
6'use strict';
7
8// Dependencies
9
10function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
11
12const chalk = require('chalk');
13const ui = require('cliui')();
14const columnify = require('columnify');
15const iPipeTo = require('ipt');
16const {
17 fetch
18} = require('./utils/promiseUtil');
19const {
20 spawn
21} = require('child_process');
22const StringUtil = require('./utils/stringUtil');
23
24/*
25 * npmRegistry has only one exposed export function.
26 * It has two dimensions of two options for output: simple() and all(), default() and fuzzy().
27 * Chain operations are flexible for future expansion with backward compatibility
28 *
29 */
30module.exports.main = (() => {
31 var _ref = _asyncToGenerator(function* (module = '') {
32 if (!module) {
33 throw chalk.redBright('No module provided');
34 }
35
36 let data;
37 try {
38 data = JSON.parse((yield fetch(`https://registry.npmjs.org/${module}`)));
39 } catch (err) {
40 console.log(chalk.redBright(err));
41 }
42
43 // First-level chain operation has simple() and all()
44 return {
45 simple() {
46 let list = parseToList(data).simple();
47
48 // Second-level chain operation has default(), fuzzy(), raw(), rawNoColor()
49 return {
50 default() {
51 if (!list || list.length === 0) return;
52
53 return list.forEach(i => console.log(i));
54 },
55 fuzzy() {
56 if (!list || list.length === 0) return;
57
58 return iPipeTo(list, {
59 size: 20,
60 autocomplete: true,
61 message: ' '
62 }).then(keys => {
63 return keys.forEach((() => {
64 var _ref2 = _asyncToGenerator(function* (key) {
65 let cleansedKey = function () {
66 let tail = key.split(' ')[1];
67 let list = StringUtil.getRidOfColors(tail);
68 list = StringUtil.getRidOfQuotationMarks(list);
69 return list;
70 }();
71
72 spawn(`npm info ${cleansedKey} | less -r`, {
73 stdio: 'inherit',
74 shell: true
75 });
76 });
77
78 return function (_x) {
79 return _ref2.apply(this, arguments);
80 };
81 })());
82 }).catch(err => {
83 console.log(err, "Error building interactive interface");
84 });
85 },
86
87 /***** For API use *****/
88 raw: (() => {
89 var _ref3 = _asyncToGenerator(function* () {
90 if (!list || list.length === 0) return;
91
92 return list;
93 });
94
95 return function raw() {
96 return _ref3.apply(this, arguments);
97 };
98 })(),
99
100 rawNoColor: (() => {
101 var _ref4 = _asyncToGenerator(function* () {
102 if (!list || list.length === 0) return;
103
104 return list.map(function (key) {
105 let result = StringUtil.getRidOfColors(key);
106 result = StringUtil.getRidOfQuotationMarks(result);
107 return result;
108 });
109 });
110
111 return function rawNoColor() {
112 return _ref4.apply(this, arguments);
113 };
114 })()
115 };
116 },
117 all() {
118 let list = parseToList(data).all();
119 list.forEach(i => console.log(i));
120 }
121 };
122 });
123
124 return function () {
125 return _ref.apply(this, arguments);
126 };
127})();
128
129/*
130 * Parsing with 2 options: simple() offers lazy evaluation, all() evaluates all defined rules
131 */
132function parseToList(data = {
133 'name': '',
134 'dist-tags': {
135 'latest': ''
136 },
137 'versions': {}
138}) {
139 if (!data['name'] || !data['dist-tags'] || !data['versions']) {
140 throw new Error('Fetched info is incomplete, therefore useless');
141 }
142
143 const title = data['name'] + '@' + data['dist-tags']['latest'];
144 const versions = Object.keys(data.versions);
145 const dependencies = (() => {
146 let latestVersion = versions[versions.length - 1];
147 return data.versions[latestVersion].dependencies; // List only the dependencies from that latest release
148 })();
149
150 // Chain operation has simple() and all()
151 return {
152 simple() {
153 if (!dependencies) {
154 console.log(chalk.blueBright(`${title} has no dependencies`));
155 return;
156 }
157 console.log(chalk.blueBright(`${title}'s Dependencies:`));
158
159 return Object.keys(dependencies).map(key => {
160 let value = dependencies[key] ? dependencies[key].replace(/[^0-9.,]/g, "") : '';
161 return '├── ' + key + '@' + chalk.grey(value);
162 });
163 },
164 all() {
165 console.log(chalk.blueBright(title));
166 ui.div({
167 text: columnify(dependencies),
168 width: 30,
169 padding: [0, 2, 0, 2]
170 }, {
171 text: columnify(versions),
172 width: 25,
173 padding: [0, 2, 0, 2]
174 });
175
176 return ui.toString().split('\n');
177 }
178 };
179}
180module.exports.parseToList = parseToList;
\No newline at end of file