stack-analyze 1.1.4 → 1.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.cjs ADDED
@@ -0,0 +1,474 @@
1
+ // modules
2
+ const axios = require("axios").default;
3
+ const CoinGecko = require("coingecko-api");
4
+ const {
5
+ cpu,
6
+ mem,
7
+ osInfo,
8
+ diskLayout,
9
+ graphics,
10
+ bios
11
+ } = require("systeminformation");
12
+ const Wappalyzer = require("wappalyzer");
13
+
14
+ // init coingecko api
15
+ const CoinGeckoClient = new CoinGecko();
16
+
17
+ /**
18
+ * @typedef {Object} anime
19
+ * @property {string} anime.query
20
+ * @property {function(data): void} anime.results
21
+ *
22
+ * @typedef {Object} bitly
23
+ * @property {string} bitly.link
24
+ * @property {string} bitly.token
25
+ * @property {function(data): void} bitly.results
26
+ *
27
+ * @typedef {Object} github
28
+ * @property {string} github.user
29
+ * @property {string} github.results
30
+ *
31
+ * @typedef {Object} movie
32
+ * @property {string} movie.api_key
33
+ * @property {string} movie.query
34
+ * @property {function(data): void} movie.results
35
+ *
36
+ * @typedef {Object} multiple
37
+ * @property {string[]} multiple.urls
38
+ * @property {function(data): void} multiple.results
39
+ *
40
+ * @typedef {Object} stack
41
+ * @property {string} stack.urls
42
+ * @property {function(data): void} stack.results
43
+ *
44
+ * @typedef {Object} twitch
45
+ * @property {string} twitch.query
46
+ * @property {string} twitch.token
47
+ * @property {string} twitch.clientID
48
+ * @property {function(data): void} twitch.results
49
+ */
50
+
51
+ /**
52
+ * @param {anime} {query, results}
53
+ * @returns {Promise<void>}
54
+ */
55
+ const animeSearch = async ({ query, results }) => {
56
+ /* error manager */
57
+ try {
58
+ // call api
59
+ const { data } = await axios.get("https://api.jikan.moe/v3/search/anime", {
60
+ params: {
61
+ q: query,
62
+ limit: 10
63
+ }
64
+ });
65
+
66
+ results(data.results);
67
+
68
+ } catch (err) { results(err); }
69
+ };
70
+
71
+ /**
72
+ * @param {bitly} {link, token, results}
73
+ * @returns {Promise<void>}
74
+ */
75
+ const bitlyInfo = async ({ link, token, results }) => {
76
+ try {
77
+ const { data } = await axios.post(
78
+ "https://api-ssl.bitly.com/v4/expand",
79
+ {
80
+ bitlink_id: link
81
+ },
82
+ {
83
+ headers: {
84
+ Authorization: `Bearer ${token}`,
85
+ "Content-Type": "application/json"
86
+ }
87
+ }
88
+ );
89
+
90
+ results(data);
91
+ } catch (err) { results(err); }
92
+ };
93
+
94
+ /**
95
+ *
96
+ * @descripiton call the crypto market list
97
+ * @param {function(data): void} callback
98
+ * @returns { Promise<void> } - return results search
99
+ */
100
+ const cryptoMarket = async (callback) => {
101
+ try {
102
+ // start crypto
103
+ const coinData = await CoinGeckoClient.coins.markets({
104
+ per_page: 10
105
+ });
106
+
107
+ // map coinData
108
+ callback(coinData.data);
109
+ } catch (err) { callback(err); }
110
+ };
111
+
112
+ /**
113
+ *
114
+ * @param {github} {user, results}
115
+ * @returns {Promise<void>}
116
+ */
117
+ async function githubInfo({ user, results }) {
118
+ try {
119
+ const { data } = await axios.get(`https://api.github.com/users/${user}`);
120
+
121
+ results(data);
122
+ } catch (err) { results(err); }
123
+ }
124
+
125
+ /**
126
+ *
127
+ * @param {function(data): void} callback
128
+ * @returns {Promise<void>}
129
+ */
130
+ async function cpuInfo(callback) {
131
+ try {
132
+ const {
133
+ manufacturer,
134
+ brand,
135
+ speed,
136
+ cores,
137
+ physicalCores,
138
+ processors,
139
+ vendor,
140
+ family,
141
+ model
142
+ } = await cpu();
143
+
144
+ // show results
145
+ callback({
146
+ manufacturer,
147
+ brand,
148
+ speed,
149
+ cores,
150
+ physicalCores,
151
+ processors,
152
+ vendor,
153
+ family,
154
+ model
155
+ });
156
+ } catch (err) { callback(err); }
157
+ }
158
+
159
+ /**
160
+ *
161
+ * @param {function(data): void} callback
162
+ * @returns {Promise<void>}
163
+ */
164
+ async function ramMemInfo(callback) {
165
+ try {
166
+ const {
167
+ total,
168
+ free,
169
+ used,
170
+ active,
171
+ available
172
+ } = await mem();
173
+
174
+ // show results
175
+ callback({
176
+ total_mem: `${(total / 1073741824).toFixed(2)} GB`,
177
+ free_mem: `${(free / 1073741824).toFixed(2)} GB`,
178
+ used_mem: `${(used / 1073741824).toFixed(2)} GB`,
179
+ active_mem: `${(active / 1073741824).toFixed(2)} GB`,
180
+ available_mem: `${(available / 1073741824).toFixed(2)} GB`
181
+ });
182
+ } catch (err) { callback(err); }
183
+ }
184
+
185
+ /**
186
+ *
187
+ * @param {function(data): void} callback
188
+ * @returns {Promise<void>}
189
+ */
190
+ async function osDetail(callback) {
191
+ try {
192
+ const {
193
+ hostname,
194
+ platform,
195
+ distro,
196
+ release,
197
+ kernel,
198
+ arch,
199
+ serial,
200
+ uefi
201
+ } = await osInfo();
202
+
203
+ // show results
204
+ callback({
205
+ hostname,
206
+ platform,
207
+ distro,
208
+ release,
209
+ kernel,
210
+ arch,
211
+ serial,
212
+ uefi
213
+ });
214
+ } catch (err) { callback(err); }
215
+ }
216
+
217
+ /**
218
+ *
219
+ * @param {function(data): void} callback
220
+ * @returns {Promise<void>}
221
+ */
222
+ async function diskInfo(callback) {
223
+ try {
224
+ const disks = await diskLayout();
225
+
226
+ const disksList = disks.map(({
227
+ type,
228
+ name,
229
+ vendor,
230
+ size,
231
+ interfaceType
232
+ }) => ({
233
+ type,
234
+ name,
235
+ vendor,
236
+ diskSize: `${(size / 1073741824).toFixed(2)} GB`,
237
+ interfaceType
238
+ }));
239
+
240
+ callback(disksList);
241
+
242
+ } catch (err) { callback(err); }
243
+ }
244
+
245
+ /**
246
+ *
247
+ * @param {function(data): void} callback
248
+ * @returns {Promise<void>}
249
+ */
250
+ async function controllerInfo(callback) {
251
+ try {
252
+ const { controllers } = await graphics();
253
+
254
+ const controllersList = controllers.map(({
255
+ model,
256
+ vendor,
257
+ vram
258
+ }) => ({
259
+ model,
260
+ vendor,
261
+ vramSize: vram < 1024
262
+ ? `${vram} MB`
263
+ : `${(vram / 1024).toFixed(2)} GB`
264
+ }));
265
+
266
+ callback(controllersList);
267
+ } catch (err) { callback(err); }
268
+ }
269
+
270
+ /**
271
+ *
272
+ * @param {function(data): void} callback
273
+ * @returns {Promise<void>}
274
+ */
275
+ async function displayInfo(callback) {
276
+ try {
277
+ const { displays } = await graphics();
278
+
279
+ const displayList = displays.map(({
280
+ model,
281
+ main,
282
+ connection,
283
+ resolutionX,
284
+ resolutionY
285
+ }) => ({
286
+ model,
287
+ main,
288
+ connection,
289
+ resolutionX,
290
+ resolutionY
291
+ }));
292
+
293
+ callback(displayList);
294
+ } catch (err) { callback(err); }
295
+ }
296
+
297
+ /**
298
+ *
299
+ * @param {function(data): void} callback
300
+ * @returns {Promise<void>}
301
+ */
302
+ async function biosInfo(callback) {
303
+ try {
304
+ const {
305
+ releaseDate,
306
+ vendor,
307
+ revision,
308
+ version
309
+ } = await bios();
310
+
311
+ callback({ releaseDate, vendor, revision, version });
312
+ } catch (err) { callback(err); }
313
+ }
314
+
315
+ /**
316
+ * @param {movie} {api_key, query, results}
317
+ * @returns {Promise<void>} void results
318
+ */
319
+ const movieDB = async ({ api_key, query, results }) => {
320
+ try {
321
+ const { data } = await axios.get("https://api.themoviedb.org/3/search/movie", {
322
+ params: {
323
+ api_key,
324
+ query,
325
+ page: 1
326
+ }
327
+ });
328
+
329
+ const movieData = data.results
330
+ .map(({
331
+ title,
332
+ original_language,
333
+ popularity,
334
+ vote_average,
335
+ release_date
336
+ }) => ({
337
+ title,
338
+ original_language,
339
+ popularity,
340
+ vote_average,
341
+ release_date
342
+ }))
343
+ .sort((x, y) => {
344
+ // date values
345
+ const primaryDate = new Date(x.release_date);
346
+ const secondaryDate = new Date(y.release_date);
347
+
348
+ return primaryDate.getTime() - secondaryDate.getTime();
349
+ })
350
+ .filter(({ release_date }) => release_date !== undefined && release_date !== "");
351
+
352
+ results(movieData);
353
+ } catch (err) { results(err); }
354
+ };
355
+
356
+ /**
357
+ * @param {multiple} {urls, results}
358
+ * @returns {Promise<void>}
359
+ */
360
+ async function multipleStack({ urls, results }) {
361
+ let result;
362
+ const wappalyzer = new Wappalyzer();
363
+ try {
364
+ await wappalyzer.init();
365
+ result = await Promise.all(
366
+ urls.map(async (url) => {
367
+ const { technologies } = await wappalyzer.open(url).analyze();
368
+ return {
369
+ url,
370
+ technologies
371
+ };
372
+ })
373
+ );
374
+ } catch (err) { result = err; }
375
+ await wappalyzer.destroy();
376
+ results(result);
377
+ }
378
+
379
+ /**
380
+ * @param {stack} {url, results}
381
+ * @returns {Promise<void>}
382
+ */
383
+ const pageSpeed = async ({ url, results }) => {
384
+ try {
385
+ const resMobile = await axios.get("https://www.googleapis.com/pagespeedonline/v5/runPagespeed", {
386
+ params: {
387
+ url,
388
+ key: "AIzaSyBEDaW4FxSZ2s1vz5CdD5Ai6PGZGdAzij0",
389
+ strategy: "mobile"
390
+ }
391
+ });
392
+
393
+ const resDesktop = await axios.get("https://www.googleapis.com/pagespeedonline/v5/runPagespeed", {
394
+ params: {
395
+ url,
396
+ key: "AIzaSyBEDaW4FxSZ2s1vz5CdD5Ai6PGZGdAzij0",
397
+ strategy: "desktop"
398
+ }
399
+ });
400
+
401
+ // extract results
402
+ const mobile = Math.round(resMobile.data.lighthouseResult.categories.performance.score * 100);
403
+ const desktop = Math.round(resDesktop.data.lighthouseResult.categories.performance.score * 100);
404
+
405
+ results({ mobile, desktop });
406
+ } catch (err) { results(err); }
407
+ };
408
+
409
+ /**
410
+ * @param {stack} {url, results}
411
+ * @returns {Promise<void>}
412
+ */
413
+ async function singleStack({ url, results }) {
414
+ const wappalyzer = await new Wappalyzer;
415
+
416
+ let result;
417
+ try {
418
+ await wappalyzer.init();
419
+
420
+ const { technologies } = await wappalyzer.open(url).analyze();
421
+
422
+ result = technologies.map(({
423
+ name,
424
+ website,
425
+ categories
426
+ }) => ({
427
+ techName: name,
428
+ techWebsite: website,
429
+ techCategories: categories.map(({ name }) => name).join(", ")
430
+ }));
431
+ } catch (err) { results(err); }
432
+
433
+ await wappalyzer.destroy();
434
+ results(result);
435
+ }
436
+
437
+ /**
438
+ *
439
+ * @param {twitch} { query, token, clientID, results }
440
+ * @returns {Promise<void>}
441
+ */
442
+ async function twitchInfo({ query, token, clientID, results }) {
443
+ try {
444
+ const { data: twitchData } = await axios.get(`https://api.twitch.tv/helix/users?login=${query}`,
445
+ {
446
+ headers: {
447
+ Authorization: `Bearer ${token}`,
448
+ "Client-Id": clientID
449
+ }
450
+ });
451
+
452
+ results(twitchData.data);
453
+ } catch (err) { results(err); }
454
+ }
455
+
456
+ // exports
457
+ module.exports = {
458
+ animeSearch,
459
+ bitlyInfo,
460
+ cryptoMarket,
461
+ githubInfo,
462
+ controllerInfo,
463
+ osDetail,
464
+ diskInfo,
465
+ displayInfo,
466
+ biosInfo,
467
+ cpuInfo,
468
+ ramMemInfo,
469
+ movieDB,
470
+ multipleStack,
471
+ pageSpeed,
472
+ singleStack,
473
+ twitchInfo
474
+ };