stack-analyze 1.1.9 → 1.2.1
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 +19 -0
- package/about.js +14 -10
- package/api/webApis.js +25 -0
- package/cli.js +117 -381
- package/functions/animeInfo.js +15 -21
- package/functions/bitly.js +11 -16
- package/functions/cryptoList.js +6 -14
- package/functions/gitUser.js +13 -18
- package/functions/hardware.js +32 -16
- package/functions/moviesInfo.js +5 -6
- package/functions/multipleStack.js +11 -26
- package/functions/pageSpeed.js +52 -96
- package/functions/password.js +20 -0
- package/functions/scraping.js +84 -143
- package/functions/singleStack.js +3 -6
- package/functions/twitch.js +15 -22
- package/hash/queryTools.js +81 -0
- package/hash/webTools.js +58 -0
- package/index.cjs +162 -197
- package/index.mjs +160 -191
- package/package.json +12 -12
- package/readme.md +27 -4
- package/utils.js +40 -4
- package/validations/infoValidations.js +37 -0
- package/validations/webValidations.js +33 -0
- package/demo.js +0 -20
package/index.cjs
CHANGED
|
@@ -9,31 +9,38 @@ const {
|
|
|
9
9
|
bios
|
|
10
10
|
} = require("systeminformation");
|
|
11
11
|
const Wappalyzer = require("wappalyzer");
|
|
12
|
-
const
|
|
12
|
+
const cheerio = require("cheerio");
|
|
13
13
|
|
|
14
|
-
const
|
|
14
|
+
const gigabyteConvert = (size, base=1073741824) => (size / base).toFixed(2);
|
|
15
|
+
|
|
16
|
+
const wappalyzer = new Wappalyzer();
|
|
17
|
+
|
|
18
|
+
const pagespeedApi = async (url, strategy) => await axios.get("https://www.googleapis.com/pagespeedonline/v5/runPagespeed", {
|
|
19
|
+
params: {
|
|
20
|
+
url,
|
|
21
|
+
key: "AIzaSyBEDaW4FxSZ2s1vz5CdD5Ai6PGZGdAzij0",
|
|
22
|
+
strategy
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
const animeSearch = async ({ query, results, failed }) => {
|
|
15
27
|
/* error manager */
|
|
16
28
|
try {
|
|
17
29
|
// call api
|
|
18
|
-
const { data } = await axios.get("https://api.jikan.moe/
|
|
19
|
-
params: {
|
|
20
|
-
q: query,
|
|
21
|
-
limit: 10
|
|
22
|
-
}
|
|
30
|
+
const { data } = await axios.get("https://api.jikan.moe/v/anime", {
|
|
31
|
+
params: { q: query }
|
|
23
32
|
});
|
|
24
33
|
|
|
25
34
|
results(data.results);
|
|
26
35
|
|
|
27
|
-
} catch (err) {
|
|
36
|
+
} catch (err) { failed(err); }
|
|
28
37
|
};
|
|
29
38
|
|
|
30
|
-
const bitlyInfo = async ({ link, token, results }) => {
|
|
39
|
+
const bitlyInfo = async ({ link, token, results, failed }) => {
|
|
31
40
|
try {
|
|
32
41
|
const { data } = await axios.post(
|
|
33
42
|
"https://api-ssl.bitly.com/v4/expand",
|
|
34
|
-
{
|
|
35
|
-
bitlink_id: link
|
|
36
|
-
},
|
|
43
|
+
{ bitlink_id: link },
|
|
37
44
|
{
|
|
38
45
|
headers: {
|
|
39
46
|
Authorization: `Bearer ${token}`,
|
|
@@ -43,38 +50,32 @@ const bitlyInfo = async ({ link, token, results }) => {
|
|
|
43
50
|
);
|
|
44
51
|
|
|
45
52
|
results(data);
|
|
46
|
-
} catch (err) {
|
|
53
|
+
} catch (err) { failed(err); }
|
|
47
54
|
};
|
|
48
55
|
|
|
49
|
-
|
|
50
|
-
*
|
|
51
|
-
* @descripiton call the crypto market list
|
|
52
|
-
* @param {function(any): void} callback
|
|
53
|
-
* @returns { Promise<void> } - return results search
|
|
54
|
-
*/
|
|
55
|
-
const cryptoMarket = async (callback) => {
|
|
56
|
+
const cryptoMarket = async ({results, failed}) => {
|
|
56
57
|
try {
|
|
57
58
|
// start crypto
|
|
58
59
|
const { data } = await axios.get(
|
|
59
60
|
"https://api.coingecko.com/api/v3/coins/markets", {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
params: {
|
|
62
|
+
vs_currency: "usd",
|
|
63
|
+
per_page: 10
|
|
64
|
+
}
|
|
63
65
|
}
|
|
64
|
-
}
|
|
65
66
|
);
|
|
66
67
|
|
|
67
68
|
// map coinData
|
|
68
|
-
|
|
69
|
-
} catch (err) {
|
|
69
|
+
results(data);
|
|
70
|
+
} catch (err) { failed(err); }
|
|
70
71
|
};
|
|
71
72
|
|
|
72
|
-
async function githubInfo({ user, results }) {
|
|
73
|
+
async function githubInfo({ user, results, failed }) {
|
|
73
74
|
try {
|
|
74
75
|
const { data } = await axios.get(`https://api.github.com/users/${user}`);
|
|
75
76
|
|
|
76
77
|
results(data);
|
|
77
|
-
} catch (err) {
|
|
78
|
+
} catch (err) { failed(err); }
|
|
78
79
|
}
|
|
79
80
|
|
|
80
81
|
async function cpuInfo(callback) {
|
|
@@ -118,11 +119,11 @@ async function ramMemInfo(callback) {
|
|
|
118
119
|
|
|
119
120
|
// show results
|
|
120
121
|
callback({
|
|
121
|
-
total_mem: `${(total
|
|
122
|
-
free_mem: `${(free
|
|
123
|
-
used_mem: `${(used
|
|
124
|
-
active_mem: `${(active
|
|
125
|
-
available_mem: `${(available
|
|
122
|
+
total_mem: `${gigabyteConvert(total)} GB`,
|
|
123
|
+
free_mem: `${gigabyteConvert(free)} GB`,
|
|
124
|
+
used_mem: `${gigabyteConvert(used)} GB`,
|
|
125
|
+
active_mem: `${gigabyteConvert(active)} GB`,
|
|
126
|
+
available_mem: `${gigabyteConvert(available)} GB`
|
|
126
127
|
});
|
|
127
128
|
} catch (err) { callback(err); }
|
|
128
129
|
}
|
|
@@ -168,7 +169,7 @@ async function diskInfo(callback) {
|
|
|
168
169
|
type,
|
|
169
170
|
name,
|
|
170
171
|
vendor,
|
|
171
|
-
diskSize: `${(size
|
|
172
|
+
diskSize: `${gigabyteConvert(size)} GB`,
|
|
172
173
|
interfaceType
|
|
173
174
|
}));
|
|
174
175
|
|
|
@@ -190,7 +191,7 @@ async function controllerInfo(callback) {
|
|
|
190
191
|
vendor,
|
|
191
192
|
vramSize: vram < 1024
|
|
192
193
|
? `${vram} MB`
|
|
193
|
-
: `${(vram
|
|
194
|
+
: `${gigabyteConvert(vram, 1024)} GB`
|
|
194
195
|
}));
|
|
195
196
|
|
|
196
197
|
callback(controllersList);
|
|
@@ -232,14 +233,10 @@ async function biosInfo(callback) {
|
|
|
232
233
|
} catch (err) { callback(err); }
|
|
233
234
|
}
|
|
234
235
|
|
|
235
|
-
const movieDB = async ({ api_key, query, results }) => {
|
|
236
|
+
const movieDB = async ({ api_key, query, results, failed }) => {
|
|
236
237
|
try {
|
|
237
238
|
const { data } = await axios.get("https://api.themoviedb.org/3/search/movie", {
|
|
238
|
-
params: {
|
|
239
|
-
api_key,
|
|
240
|
-
query,
|
|
241
|
-
page: 1
|
|
242
|
-
}
|
|
239
|
+
params: { api_key, query }
|
|
243
240
|
});
|
|
244
241
|
|
|
245
242
|
const movieData = data.results
|
|
@@ -263,15 +260,14 @@ const movieDB = async ({ api_key, query, results }) => {
|
|
|
263
260
|
|
|
264
261
|
return primaryDate.getTime() - secondaryDate.getTime();
|
|
265
262
|
})
|
|
266
|
-
.filter((
|
|
263
|
+
.filter((data) => data?.release_date);
|
|
267
264
|
|
|
268
265
|
results(movieData);
|
|
269
|
-
} catch (err) {
|
|
266
|
+
} catch (err) { failed(err); }
|
|
270
267
|
};
|
|
271
268
|
|
|
272
|
-
async function multipleStack({ urls, results }) {
|
|
269
|
+
async function multipleStack({ urls, results, failed }) {
|
|
273
270
|
let result;
|
|
274
|
-
const wappalyzer = new Wappalyzer();
|
|
275
271
|
try {
|
|
276
272
|
await wappalyzer.init();
|
|
277
273
|
result = await Promise.all(
|
|
@@ -283,41 +279,28 @@ async function multipleStack({ urls, results }) {
|
|
|
283
279
|
};
|
|
284
280
|
})
|
|
285
281
|
);
|
|
286
|
-
|
|
282
|
+
results(result);
|
|
283
|
+
} catch (err) { failed(err); }
|
|
287
284
|
await wappalyzer.destroy();
|
|
288
|
-
results(result);
|
|
289
285
|
}
|
|
290
286
|
|
|
291
|
-
const pageSpeed = async ({ url, results }) => {
|
|
287
|
+
const pageSpeed = async ({ url, results, failed }) => {
|
|
292
288
|
try {
|
|
293
|
-
const resMobile = await
|
|
294
|
-
params: {
|
|
295
|
-
url,
|
|
296
|
-
key: "AIzaSyBEDaW4FxSZ2s1vz5CdD5Ai6PGZGdAzij0",
|
|
297
|
-
strategy: "mobile"
|
|
298
|
-
}
|
|
299
|
-
});
|
|
289
|
+
const resMobile = await pagespeedApi(url, "mobile");
|
|
300
290
|
|
|
301
|
-
const resDesktop = await
|
|
302
|
-
params: {
|
|
303
|
-
url,
|
|
304
|
-
key: "AIzaSyBEDaW4FxSZ2s1vz5CdD5Ai6PGZGdAzij0",
|
|
305
|
-
strategy: "desktop"
|
|
306
|
-
}
|
|
307
|
-
});
|
|
291
|
+
const resDesktop = await pagespeedApi(url, "desktop");
|
|
308
292
|
|
|
309
293
|
// extract results
|
|
310
294
|
const mobile = Math.round(resMobile.data.lighthouseResult.categories.performance.score * 100);
|
|
311
295
|
const desktop = Math.round(resDesktop.data.lighthouseResult.categories.performance.score * 100);
|
|
312
296
|
|
|
313
297
|
results({ mobile, desktop });
|
|
314
|
-
} catch (err) {
|
|
298
|
+
} catch (err) { failed(err); }
|
|
315
299
|
};
|
|
316
300
|
|
|
317
|
-
async function singleStack({ url, results }) {
|
|
318
|
-
const wappalyzer = await new Wappalyzer;
|
|
319
|
-
|
|
301
|
+
async function singleStack({ url, results, failed }) {
|
|
320
302
|
let result;
|
|
303
|
+
|
|
321
304
|
try {
|
|
322
305
|
await wappalyzer.init();
|
|
323
306
|
|
|
@@ -332,16 +315,17 @@ async function singleStack({ url, results }) {
|
|
|
332
315
|
techWebsite: website,
|
|
333
316
|
techCategories: categories.map(({ name }) => name).join(", ")
|
|
334
317
|
}));
|
|
335
|
-
|
|
318
|
+
results(result);
|
|
319
|
+
} catch (err) { failed(err); }
|
|
336
320
|
|
|
337
321
|
await wappalyzer.destroy();
|
|
338
|
-
results(result);
|
|
339
322
|
}
|
|
340
323
|
|
|
341
|
-
async function twitchInfo({ query, token, clientID, results }) {
|
|
324
|
+
async function twitchInfo({ query, token, clientID, results, failed }) {
|
|
342
325
|
try {
|
|
343
|
-
const { data: twitchData } = await axios.get(
|
|
326
|
+
const { data: twitchData } = await axios.get("https://api.twitch.tv/helix/users",
|
|
344
327
|
{
|
|
328
|
+
params: { login: query },
|
|
345
329
|
headers: {
|
|
346
330
|
Authorization: `Bearer ${token}`,
|
|
347
331
|
"Client-Id": clientID
|
|
@@ -349,136 +333,116 @@ async function twitchInfo({ query, token, clientID, results }) {
|
|
|
349
333
|
});
|
|
350
334
|
|
|
351
335
|
results(twitchData.data);
|
|
352
|
-
} catch (err) {
|
|
336
|
+
} catch (err) { failed(err); }
|
|
353
337
|
}
|
|
354
338
|
|
|
355
|
-
function scrape(url) {
|
|
356
|
-
let
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
const linkList = $("a").map((i, el) => ({
|
|
446
|
-
url: $(el).attr("href"),
|
|
447
|
-
text: $(el).text()
|
|
448
|
-
})).toArray()
|
|
449
|
-
.filter(({ url }) => url.indexOf("#") !== 0);
|
|
450
|
-
|
|
451
|
-
callback(linkList);
|
|
452
|
-
} catch (err) { console.error(colors.red(err.message)); }
|
|
453
|
-
};
|
|
454
|
-
|
|
455
|
-
const cites = async (callback) => {
|
|
456
|
-
try {
|
|
457
|
-
const { data } = await scraping.get("");
|
|
458
|
-
$ = load(data);
|
|
459
|
-
|
|
460
|
-
const citeList = $("q, blockquote").map((i, el) => ({
|
|
461
|
-
citeTag: $(el).prop("tagName"),
|
|
462
|
-
citeLink: $(el).attr("cite"),
|
|
463
|
-
citeText: $(el).text()
|
|
464
|
-
})).toArray();
|
|
465
|
-
|
|
466
|
-
callback(citeList);
|
|
467
|
-
} catch (err) { console.error(colors.red(err.message)); }
|
|
468
|
-
};
|
|
469
|
-
|
|
470
|
-
return {
|
|
471
|
-
title,
|
|
472
|
-
images,
|
|
473
|
-
metadata,
|
|
474
|
-
headings,
|
|
475
|
-
table_heading,
|
|
476
|
-
table_data,
|
|
477
|
-
links,
|
|
478
|
-
cites
|
|
479
|
-
};
|
|
339
|
+
async function scrape({url, options, results, failed}) {
|
|
340
|
+
let scrapingResult;
|
|
341
|
+
|
|
342
|
+
try {
|
|
343
|
+
const { data } = await axios.get(url);
|
|
344
|
+
const $ = cheerio.load(data);
|
|
345
|
+
|
|
346
|
+
const scraping = {
|
|
347
|
+
title() {
|
|
348
|
+
results($("title").text());
|
|
349
|
+
},
|
|
350
|
+
images() {
|
|
351
|
+
const imageList = $("img").map((i, el) => ({
|
|
352
|
+
imagePath: $(el).attr("src"),
|
|
353
|
+
imageTitle: $(el).attr("alt")
|
|
354
|
+
})).toArray();
|
|
355
|
+
|
|
356
|
+
scrapingResult = imageList.length === 0
|
|
357
|
+
? "no found images"
|
|
358
|
+
: imageList;
|
|
359
|
+
|
|
360
|
+
results(scrapingResult);
|
|
361
|
+
},
|
|
362
|
+
metadata() {
|
|
363
|
+
const metadataList = $("meta").map((i, el) => ({
|
|
364
|
+
metaInfo: $(el).attr("name"),
|
|
365
|
+
metaContent: $(el).attr("content")
|
|
366
|
+
})).toArray()
|
|
367
|
+
.filter((data) => data?.metaInfo);
|
|
368
|
+
|
|
369
|
+
results(metadataList);
|
|
370
|
+
},
|
|
371
|
+
headings() {
|
|
372
|
+
const headingList = $("h1, h2, h3, h4, h5, h6").map((i, el) => ({
|
|
373
|
+
headingTag: $(el).prop("tagName"),
|
|
374
|
+
headingText: $(el).text()
|
|
375
|
+
})).toArray();
|
|
376
|
+
|
|
377
|
+
results(headingList);
|
|
378
|
+
},
|
|
379
|
+
tableHead() {
|
|
380
|
+
const tableHeadList = $("th").map((i, el) => ({
|
|
381
|
+
headingRow: i,
|
|
382
|
+
text: $(el).text()
|
|
383
|
+
})).toArray();
|
|
384
|
+
|
|
385
|
+
scrapingResult = tableHeadList.length === 0
|
|
386
|
+
? "no found th tags" : tableHeadList;
|
|
387
|
+
|
|
388
|
+
results(scrapingResult);
|
|
389
|
+
},
|
|
390
|
+
tableData() {
|
|
391
|
+
const tableColumnList = $("td").map((i, el) => ({
|
|
392
|
+
tableRow: i + 1,
|
|
393
|
+
tableData: $(el).text(),
|
|
394
|
+
})).toArray();
|
|
395
|
+
|
|
396
|
+
scrapingResult = tableColumnList.length === 0
|
|
397
|
+
? "no found td tags" : tableColumnList;
|
|
398
|
+
|
|
399
|
+
results(scrapingResult);
|
|
400
|
+
},
|
|
401
|
+
links() {
|
|
402
|
+
const linkList = $("a").map((i, el) => ({
|
|
403
|
+
url: $(el).attr("href"),
|
|
404
|
+
text: $(el).text()
|
|
405
|
+
})).toArray()
|
|
406
|
+
.filter(({ url }) => url.indexOf("#") !== 0);
|
|
407
|
+
|
|
408
|
+
results(linkList);
|
|
409
|
+
},
|
|
410
|
+
cites() {
|
|
411
|
+
const citeList = $("q, blockquote").map((i, el) => ({
|
|
412
|
+
citeTag: $(el).prop("tagName"),
|
|
413
|
+
citeLink: $(el).attr("cite"),
|
|
414
|
+
citeText: $(el).text()
|
|
415
|
+
})).toArray();
|
|
416
|
+
|
|
417
|
+
scrapingResult = citeList.length === 0
|
|
418
|
+
? "no found q and/or blockquote tags" : citeList;
|
|
419
|
+
|
|
420
|
+
results(scrapingResult);
|
|
421
|
+
}
|
|
422
|
+
};
|
|
423
|
+
|
|
424
|
+
scraping[options]();
|
|
425
|
+
} catch (err) {
|
|
426
|
+
failed(err.message);
|
|
427
|
+
}
|
|
480
428
|
}
|
|
481
429
|
|
|
430
|
+
const password = () => {
|
|
431
|
+
const chars = "0123456789abcdefghijklmnopqrstuvwxyz!@#$%^&*()ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
432
|
+
|
|
433
|
+
// blank password var
|
|
434
|
+
let password = "";
|
|
435
|
+
|
|
436
|
+
// loop generate chars
|
|
437
|
+
for(let i = 0; i < 12; i++) {
|
|
438
|
+
const randomNumber = Math.floor(Math.random() * chars.length);
|
|
439
|
+
|
|
440
|
+
password += chars.substring(randomNumber, randomNumber + 1);
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
return password;
|
|
444
|
+
};
|
|
445
|
+
|
|
482
446
|
// exports
|
|
483
447
|
module.exports = {
|
|
484
448
|
animeSearch,
|
|
@@ -497,5 +461,6 @@ module.exports = {
|
|
|
497
461
|
pageSpeed,
|
|
498
462
|
singleStack,
|
|
499
463
|
twitchInfo,
|
|
500
|
-
scrape
|
|
464
|
+
scrape,
|
|
465
|
+
password
|
|
501
466
|
};
|