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/CHANGELOG.md +47 -0
- package/about.js +58 -0
- package/cli.js +228 -0
- package/env/bitly.env.js +1 -0
- package/env/movie.env.js +1 -0
- package/env/twitchID.env.js +1 -0
- package/functions/animeInfo.js +9 -39
- package/functions/bitly.js +8 -9
- package/functions/cryptoList.js +9 -38
- package/functions/gitUser.js +6 -9
- package/functions/hardware.js +32 -24
- package/functions/moviesInfo.js +56 -0
- package/functions/multipleStack.js +9 -29
- package/functions/pageSpeed.js +68 -56
- package/functions/singleStack.js +9 -32
- package/functions/twitch.js +46 -0
- package/hash/aboutOpts.js +53 -0
- package/hash/hardwareTools.js +47 -0
- package/hash/infoTools.js +112 -0
- package/hash/mainTools.js +67 -0
- package/index.cjs +474 -0
- package/index.mjs +474 -0
- package/models/aboutTables.js +40 -0
- package/models/animeTable.js +33 -0
- package/models/cryptoTables.js +32 -0
- package/models/hardwareTables.js +87 -0
- package/models/movieTables.js +33 -0
- package/models/stackTables.js +23 -0
- package/models/twitchTables.js +28 -0
- package/package.json +21 -14
- package/about/index.js +0 -126
- package/index.js +0 -458
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
|
+
};
|