UNPKG

6.47 kBJavaScriptView Raw
1"use strict";
2var __importStar = (this && this.__importStar) || function (mod) {
3 if (mod && mod.__esModule) return mod;
4 var result = {};
5 if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
6 result["default"] = mod;
7 return result;
8};
9var __importDefault = (this && this.__importDefault) || function (mod) {
10 return (mod && mod.__esModule) ? mod : { "default": mod };
11};
12Object.defineProperty(exports, "__esModule", { value: true });
13const react_1 = __importStar(require("react"));
14const ink_1 = require("ink");
15const opn_1 = __importDefault(require("opn"));
16const algolia_1 = require("../algolia");
17const SPACE = ' ';
18const ARROW_LEFT = '\u001B[D';
19const ARROW_RIGHT = '\u001B[C';
20/* Package */
21class Package extends react_1.PureComponent {
22 constructor() {
23 super(...arguments);
24 this.state = {
25 showDetails: false,
26 };
27 this.handleInput = (data) => {
28 const { active, onClick, pkg } = this.props;
29 const char = String(data);
30 if (!active)
31 return;
32 switch (char) {
33 case SPACE: {
34 return onClick(pkg);
35 }
36 case ARROW_RIGHT: {
37 if (this.state.showDetails && pkg.repository) {
38 opn_1.default(pkg.repository.url);
39 }
40 return this.setState({ showDetails: true });
41 }
42 case ARROW_LEFT: {
43 return this.setState({ showDetails: false });
44 }
45 }
46 };
47 }
48 componentDidMount() {
49 const { stdin, setRawMode } = this.props;
50 if (setRawMode)
51 setRawMode(true);
52 stdin.on('data', this.handleInput);
53 }
54 componentWillUnmount() {
55 const { stdin, setRawMode } = this.props;
56 stdin.removeListener('data', this.handleInput);
57 if (setRawMode)
58 setRawMode(false);
59 }
60 /**
61 *
62 * Removes details view when not active anymore.
63 *
64 * @param props
65 * @param state
66 */
67 static getDerivedStateFromProps(props, state) {
68 if (props.active === false)
69 return Object.assign({}, state, { showDetails: false });
70 return null;
71 }
72 render() {
73 const { pkg, active, type } = this.props;
74 const { showDetails } = this.state;
75 const Cursor = () => (react_1.default.createElement(ink_1.Box, { marginRight: 1 }, (() => {
76 if (active) {
77 if (type === 'dependency')
78 return react_1.default.createElement(ink_1.Color, { cyan: true }, `›`);
79 if (type === 'devDependency')
80 return react_1.default.createElement(ink_1.Color, { blue: true }, `›`);
81 return react_1.default.createElement(ink_1.Color, { magenta: true }, `›`);
82 }
83 else {
84 if (type === 'dependency')
85 return react_1.default.createElement(ink_1.Color, { cyan: true }, `◉`);
86 if (type === 'devDependency')
87 return react_1.default.createElement(ink_1.Color, { blue: true }, `◉`);
88 return react_1.default.createElement(ink_1.Text, null, ` `);
89 }
90 })()));
91 const Downloads = () => (react_1.default.createElement(ink_1.Box, { width: this.getColumnWidth('humanDownloadsLast30Days'), marginRight: 1 },
92 react_1.default.createElement(ink_1.Text, null, pkg.humanDownloadsLast30Days)));
93 const Name = () => (react_1.default.createElement(ink_1.Box, { width: this.getColumnWidth('name'), marginRight: 1 },
94 react_1.default.createElement(ink_1.Text, { bold: true }, pkg.name)));
95 const Owner = () => (react_1.default.createElement(ink_1.Box, { width: this.getColumnWidth('owner') },
96 react_1.default.createElement(ink_1.Text, null,
97 react_1.default.createElement(ink_1.Color, { grey: true }, pkg.owner.name))));
98 const Description = () => (react_1.default.createElement(ink_1.Box, { flexDirection: "row", marginX: 2 },
99 react_1.default.createElement(ink_1.Text, null, pkg.description)));
100 if (showDetails) {
101 return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginY: 1 },
102 react_1.default.createElement(ink_1.Box, { flexDirection: "row" },
103 react_1.default.createElement(Cursor, null),
104 react_1.default.createElement(Downloads, null),
105 react_1.default.createElement(Name, null),
106 react_1.default.createElement(Owner, null)),
107 react_1.default.createElement(ink_1.Box, null,
108 react_1.default.createElement(Description, null))));
109 }
110 return (react_1.default.createElement(ink_1.Box, { flexDirection: "row", marginY: 0, marginX: 0 },
111 react_1.default.createElement(Cursor, null),
112 react_1.default.createElement(Downloads, null),
113 react_1.default.createElement(Name, null),
114 react_1.default.createElement(Owner, null)));
115 }
116 /**
117 *
118 * Calculates the width of each column in the list.
119 *
120 * @param column
121 */
122 getColumnWidth(column) {
123 const hits = this.props.hits
124 .map(hit => {
125 switch (column) {
126 case 'owner': {
127 return hit.owner.name;
128 }
129 case 'repository': {
130 if (hit.repository) {
131 return hit.repository.url;
132 }
133 else {
134 return '';
135 }
136 }
137 default: {
138 return hit[column];
139 }
140 }
141 })
142 .map(c => c.length);
143 return Math.max(...hits);
144 }
145}
146class PackageWithStdinAndHits extends react_1.default.Component {
147 render() {
148 return (react_1.default.createElement(algolia_1.SearchContext.Consumer, null, values => (react_1.default.createElement(ink_1.StdinContext.Consumer, null, ({ stdin, setRawMode }) => (react_1.default.createElement(Package, Object.assign({}, this.props, { stdin: stdin, setRawMode: setRawMode, hits: values })))))));
149 }
150}
151exports.default = PackageWithStdinAndHits;
152//# sourceMappingURL=Package.js.map
\No newline at end of file