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/index.cjs CHANGED
@@ -9,31 +9,38 @@ const {
9
9
  bios
10
10
  } = require("systeminformation");
11
11
  const Wappalyzer = require("wappalyzer");
12
- const { load } = require("cheerio");
12
+ const cheerio = require("cheerio");
13
13
 
14
- const animeSearch = async ({ query, results }) => {
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/v3/search/anime", {
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) { results(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) { results(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
- params: {
61
- vs_currency: "usd",
62
- per_page: 10
61
+ params: {
62
+ vs_currency: "usd",
63
+ per_page: 10
64
+ }
63
65
  }
64
- }
65
66
  );
66
67
 
67
68
  // map coinData
68
- callback(data);
69
- } catch (err) { callback(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) { results(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 / 1073741824).toFixed(2)} GB`,
122
- free_mem: `${(free / 1073741824).toFixed(2)} GB`,
123
- used_mem: `${(used / 1073741824).toFixed(2)} GB`,
124
- active_mem: `${(active / 1073741824).toFixed(2)} GB`,
125
- available_mem: `${(available / 1073741824).toFixed(2)} GB`
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 / 1073741824).toFixed(2)} GB`,
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 / 1024).toFixed(2)} GB`
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(({ release_date }) => release_date !== undefined && release_date !== "");
263
+ .filter((data) => data?.release_date);
267
264
 
268
265
  results(movieData);
269
- } catch (err) { results(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
- } catch (err) { result = err; }
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 axios.get("https://www.googleapis.com/pagespeedonline/v5/runPagespeed", {
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 axios.get("https://www.googleapis.com/pagespeedonline/v5/runPagespeed", {
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) { results(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
- } catch (err) { results(err); }
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(`https://api.twitch.tv/helix/users?login=${query}`,
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) { results(err); }
336
+ } catch (err) { failed(err); }
353
337
  }
354
338
 
355
- function scrape(url) {
356
- let $;
357
-
358
- const scraping = axios.create({
359
- baseURL: url
360
- });
361
-
362
- const title = async (callback) => {
363
- try {
364
- const { data } = await scraping.get("");
365
- $ = load(data);
366
-
367
- callback($("title").text());
368
- } catch (err) { console.error(colors.red(err.message)); }
369
- };
370
-
371
- const images = async (callback) => {
372
- try {
373
- const { data } = await scraping.get("");
374
- $ = load(data);
375
-
376
- const imgs = $("img").map((i, el) => ({
377
- imagePath: $(el).attr("src"),
378
- imageTitle: $(el).attr("alt")
379
- })).toArray();
380
-
381
- callback(imgs);
382
- } catch (err) { console.error(colors.red(err.message)); }
383
- };
384
-
385
- const metadata = async (callback) => {
386
- try {
387
- const { data } = await scraping.get("");
388
- $ = load(data);
389
-
390
- const metadataList = $("meta").map((i, el) => ({
391
- metaInfo: $(el).attr("name"),
392
- metaContent: $(el).attr("content")
393
- })).toArray()
394
- .filter(({ metaInfo }) => metaInfo !== undefined);
395
-
396
- callback(metadataList);
397
- } catch (err) { console.error(colors.red(err.message)); }
398
- };
399
-
400
- const headings = async (callback) => {
401
- try {
402
- const { data } = await scraping.get("");
403
- $ = load(data);
404
-
405
- const headingList = $("h1, h2, h3, h4, h5, h6").map((i, el) => ({
406
- headingTag: $(el).prop("tagName"),
407
- headingText: $(el).text()
408
- })).toArray();
409
-
410
- callback(headingList);
411
- } catch (err) { console.error(colors.red(err.message)); }
412
- };
413
-
414
- const table_heading = async (callback) => {
415
- try {
416
- const { data } = await scraping.get("");
417
- $ = load(data);
418
-
419
- const tableHeadList = $("th").map((i, el) => ({
420
- headingRow: i,
421
- text: $(el).text()
422
- })).toArray();
423
-
424
- callback(tableHeadList);
425
- } catch (err) { console.error(colors.red(err.message)); }
426
- };
427
-
428
- const table_data = async (callback) => {
429
- try {
430
- const { data } = await scraping.get("");
431
- $ = load(data);
432
-
433
- const tableColumnList = $("td").map((i, el) => $(el).text()).toArray();
434
-
435
- callback(tableColumnList);
436
- } catch (err) { console.error(colors.red(err.message)); }
437
- };
438
-
439
-
440
- const links = async (callback) => {
441
- try {
442
- const { data } = await scraping.get("");
443
- $ = load(data);
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
  };