stack-analyze 1.2.4 → 1.2.6
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 +102 -80
- package/about.js +5 -0
- package/functions/gitUser.js +0 -1
- package/functions/hardware.js +2 -4
- package/functions/password.js +1 -1
- package/functions/pokemon.js +106 -0
- package/functions/scraping.js +3 -3
- package/hash/infoTools.js +1 -1
- package/hash/queryTools.js +45 -3
- package/hash/utilityTools.js +0 -2
- package/package.json +10 -15
- package/readme.md +3 -22
- package/utils.js +1 -1
- package/hardware.csv +0 -0
- package/index.cjs +0 -487
- package/index.mjs +0 -486
package/index.mjs
DELETED
|
@@ -1,486 +0,0 @@
|
|
|
1
|
-
// modules
|
|
2
|
-
import {default as axios} from "axios";
|
|
3
|
-
import {
|
|
4
|
-
cpu,
|
|
5
|
-
mem,
|
|
6
|
-
osInfo,
|
|
7
|
-
diskLayout,
|
|
8
|
-
graphics,
|
|
9
|
-
bios
|
|
10
|
-
} from "systeminformation";
|
|
11
|
-
import Wappalyzer from "wappalyzer";
|
|
12
|
-
import { load } from "cheerio";
|
|
13
|
-
|
|
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 }) => {
|
|
27
|
-
/* error manager */
|
|
28
|
-
try {
|
|
29
|
-
// call api
|
|
30
|
-
const { data } = await axios.get("https://api.jikan.moe/v/anime", {
|
|
31
|
-
params: { q: query }
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
results(data.results);
|
|
35
|
-
|
|
36
|
-
} catch (err) { failed(err); }
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
const bitlyInfo = async ({ link, token, results, failed }) => {
|
|
40
|
-
try {
|
|
41
|
-
const { data } = await axios.post(
|
|
42
|
-
"https://api-ssl.bitly.com/v4/expand",
|
|
43
|
-
{ bitlink_id: link },
|
|
44
|
-
{
|
|
45
|
-
headers: {
|
|
46
|
-
Authorization: `Bearer ${token}`,
|
|
47
|
-
"Content-Type": "application/json"
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
);
|
|
51
|
-
|
|
52
|
-
results(data);
|
|
53
|
-
} catch (err) { failed(err); }
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
const cryptoMarket = async ({results, failed}) => {
|
|
57
|
-
try {
|
|
58
|
-
// start crypto
|
|
59
|
-
const { data } = await axios.get(
|
|
60
|
-
"https://api.coingecko.com/api/v3/coins/markets", {
|
|
61
|
-
params: { vs_currency: "usd" }
|
|
62
|
-
}
|
|
63
|
-
);
|
|
64
|
-
|
|
65
|
-
// map coinData
|
|
66
|
-
results(data);
|
|
67
|
-
} catch (err) { failed(err); }
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
async function githubInfo({ user, results, failed }) {
|
|
71
|
-
try {
|
|
72
|
-
const { data } = await axios.get(`https://api.github.com/users/${user}`);
|
|
73
|
-
|
|
74
|
-
results(data);
|
|
75
|
-
} catch (err) { failed(err); }
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
async function cpuInfo(callback) {
|
|
79
|
-
try {
|
|
80
|
-
const {
|
|
81
|
-
manufacturer,
|
|
82
|
-
brand,
|
|
83
|
-
speed,
|
|
84
|
-
cores,
|
|
85
|
-
physicalCores,
|
|
86
|
-
processors,
|
|
87
|
-
vendor,
|
|
88
|
-
family,
|
|
89
|
-
model
|
|
90
|
-
} = await cpu();
|
|
91
|
-
|
|
92
|
-
// show results
|
|
93
|
-
callback({
|
|
94
|
-
manufacturer,
|
|
95
|
-
brand,
|
|
96
|
-
speed,
|
|
97
|
-
cores,
|
|
98
|
-
physicalCores,
|
|
99
|
-
processors,
|
|
100
|
-
vendor,
|
|
101
|
-
family,
|
|
102
|
-
model
|
|
103
|
-
});
|
|
104
|
-
} catch (err) { callback(err); }
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
async function ramMemInfo(callback) {
|
|
108
|
-
try {
|
|
109
|
-
const {
|
|
110
|
-
total,
|
|
111
|
-
free,
|
|
112
|
-
used,
|
|
113
|
-
active,
|
|
114
|
-
available
|
|
115
|
-
} = await mem();
|
|
116
|
-
|
|
117
|
-
// show results
|
|
118
|
-
callback({
|
|
119
|
-
total_mem: `${gigabyteConvert(total)} GB`,
|
|
120
|
-
free_mem: `${gigabyteConvert(free)} GB`,
|
|
121
|
-
used_mem: `${gigabyteConvert(used)} GB`,
|
|
122
|
-
active_mem: `${gigabyteConvert(active)} GB`,
|
|
123
|
-
available_mem: `${gigabyteConvert(available)} GB`
|
|
124
|
-
});
|
|
125
|
-
} catch (err) { callback(err); }
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
async function osDetail(callback) {
|
|
129
|
-
try {
|
|
130
|
-
const {
|
|
131
|
-
hostname,
|
|
132
|
-
platform,
|
|
133
|
-
distro,
|
|
134
|
-
release,
|
|
135
|
-
kernel,
|
|
136
|
-
arch,
|
|
137
|
-
serial,
|
|
138
|
-
uefi
|
|
139
|
-
} = await osInfo();
|
|
140
|
-
|
|
141
|
-
// show results
|
|
142
|
-
callback({
|
|
143
|
-
hostname,
|
|
144
|
-
platform,
|
|
145
|
-
distro,
|
|
146
|
-
release,
|
|
147
|
-
kernel,
|
|
148
|
-
arch,
|
|
149
|
-
serial,
|
|
150
|
-
uefi
|
|
151
|
-
});
|
|
152
|
-
} catch (err) { callback(err); }
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
async function diskInfo(callback) {
|
|
156
|
-
try {
|
|
157
|
-
const disks = await diskLayout();
|
|
158
|
-
|
|
159
|
-
const disksList = disks.map(({
|
|
160
|
-
type,
|
|
161
|
-
name,
|
|
162
|
-
vendor,
|
|
163
|
-
size,
|
|
164
|
-
interfaceType
|
|
165
|
-
}) => ({
|
|
166
|
-
type,
|
|
167
|
-
name,
|
|
168
|
-
vendor,
|
|
169
|
-
diskSize: `${gigabyteConvert(size)} GB`,
|
|
170
|
-
interfaceType
|
|
171
|
-
}));
|
|
172
|
-
|
|
173
|
-
callback(disksList);
|
|
174
|
-
|
|
175
|
-
} catch (err) { callback(err); }
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
async function controllerInfo(callback) {
|
|
179
|
-
try {
|
|
180
|
-
const { controllers } = await graphics();
|
|
181
|
-
|
|
182
|
-
const controllersList = controllers.map(({
|
|
183
|
-
model,
|
|
184
|
-
vendor,
|
|
185
|
-
vram
|
|
186
|
-
}) => ({
|
|
187
|
-
model,
|
|
188
|
-
vendor,
|
|
189
|
-
vramSize: vram < 1024
|
|
190
|
-
? `${vram} MB`
|
|
191
|
-
: `${gigabyteConvert(vram, 1024)} GB`
|
|
192
|
-
}));
|
|
193
|
-
|
|
194
|
-
callback(controllersList);
|
|
195
|
-
} catch (err) { callback(err); }
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
async function displayInfo(callback) {
|
|
199
|
-
try {
|
|
200
|
-
const { displays } = await graphics();
|
|
201
|
-
|
|
202
|
-
const displayList = displays.map(({
|
|
203
|
-
model,
|
|
204
|
-
main,
|
|
205
|
-
connection,
|
|
206
|
-
resolutionX,
|
|
207
|
-
resolutionY
|
|
208
|
-
}) => ({
|
|
209
|
-
model,
|
|
210
|
-
main,
|
|
211
|
-
connection,
|
|
212
|
-
resolutionX,
|
|
213
|
-
resolutionY
|
|
214
|
-
}));
|
|
215
|
-
|
|
216
|
-
callback(displayList);
|
|
217
|
-
} catch (err) { callback(err); }
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
async function biosInfo(callback) {
|
|
221
|
-
try {
|
|
222
|
-
const {
|
|
223
|
-
releaseDate,
|
|
224
|
-
vendor,
|
|
225
|
-
revision,
|
|
226
|
-
version
|
|
227
|
-
} = await bios();
|
|
228
|
-
|
|
229
|
-
callback({ releaseDate, vendor, revision, version });
|
|
230
|
-
} catch (err) { callback(err); }
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
const movieDB = async ({ api_key, query, results, failed }) => {
|
|
234
|
-
try {
|
|
235
|
-
const { data } = await axios.get("https://api.themoviedb.org/3/search/movie", {
|
|
236
|
-
params: { api_key, query, }
|
|
237
|
-
});
|
|
238
|
-
|
|
239
|
-
const movieData = data.results
|
|
240
|
-
.map(({
|
|
241
|
-
title,
|
|
242
|
-
original_language,
|
|
243
|
-
popularity,
|
|
244
|
-
vote_average,
|
|
245
|
-
release_date
|
|
246
|
-
}) => ({
|
|
247
|
-
title,
|
|
248
|
-
original_language,
|
|
249
|
-
popularity,
|
|
250
|
-
vote_average,
|
|
251
|
-
release_date
|
|
252
|
-
}))
|
|
253
|
-
.sort((x, y) => {
|
|
254
|
-
// date values
|
|
255
|
-
const primaryDate = new Date(x.release_date);
|
|
256
|
-
const secondaryDate = new Date(y.release_date);
|
|
257
|
-
|
|
258
|
-
return primaryDate.getTime() - secondaryDate.getTime();
|
|
259
|
-
})
|
|
260
|
-
.filter((data) => data?.release_date);
|
|
261
|
-
|
|
262
|
-
results(movieData);
|
|
263
|
-
} catch (err) { failed(err); }
|
|
264
|
-
};
|
|
265
|
-
|
|
266
|
-
async function multipleStack({ urls, results, failed }) {
|
|
267
|
-
let result;
|
|
268
|
-
|
|
269
|
-
try {
|
|
270
|
-
await wappalyzer.init();
|
|
271
|
-
result = await Promise.all(
|
|
272
|
-
urls.map(async (url) => {
|
|
273
|
-
const { technologies } = await wappalyzer.open(url).analyze();
|
|
274
|
-
return {
|
|
275
|
-
url,
|
|
276
|
-
technologies
|
|
277
|
-
};
|
|
278
|
-
})
|
|
279
|
-
);
|
|
280
|
-
results(result);
|
|
281
|
-
} catch (err) { failed(err); }
|
|
282
|
-
await wappalyzer.destroy();
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
const pageSpeed = async ({ url, results, failed }) => {
|
|
286
|
-
try {
|
|
287
|
-
const resMobile = await pagespeedApi(url, "mobile");
|
|
288
|
-
|
|
289
|
-
const resDesktop = await pagespeedApi(url, "desktop");
|
|
290
|
-
|
|
291
|
-
// extract results
|
|
292
|
-
const mobile = Math.round(resMobile.data.lighthouseResult.categories.performance.score * 100);
|
|
293
|
-
const desktop = Math.round(resDesktop.data.lighthouseResult.categories.performance.score * 100);
|
|
294
|
-
|
|
295
|
-
results({ mobile, desktop });
|
|
296
|
-
} catch (err) { failed(err); }
|
|
297
|
-
};
|
|
298
|
-
|
|
299
|
-
async function singleStack({ url, results, failed }) {
|
|
300
|
-
let result;
|
|
301
|
-
|
|
302
|
-
try {
|
|
303
|
-
await wappalyzer.init();
|
|
304
|
-
|
|
305
|
-
const { technologies } = await wappalyzer.open(url).analyze();
|
|
306
|
-
|
|
307
|
-
result = technologies.map(({
|
|
308
|
-
name,
|
|
309
|
-
website,
|
|
310
|
-
categories
|
|
311
|
-
}) => ({
|
|
312
|
-
techName: name,
|
|
313
|
-
techWebsite: website,
|
|
314
|
-
techCategories: categories.map(({ name }) => name).join(", ")
|
|
315
|
-
}));
|
|
316
|
-
results(result);
|
|
317
|
-
} catch (err) { failed(err); }
|
|
318
|
-
|
|
319
|
-
await wappalyzer.destroy();
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
async function twitchInfo({ query, token, clientID, results, failed }) {
|
|
323
|
-
try {
|
|
324
|
-
const { data: twitchData } = await axios.get("https://api.twitch.tv/helix/users",
|
|
325
|
-
{
|
|
326
|
-
params: { login: query },
|
|
327
|
-
headers: {
|
|
328
|
-
Authorization: `Bearer ${token}`,
|
|
329
|
-
"Client-Id": clientID
|
|
330
|
-
}
|
|
331
|
-
});
|
|
332
|
-
|
|
333
|
-
results(twitchData.data);
|
|
334
|
-
} catch (err) { failed(err); }
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
async function scrape({url, options, results, failed}) {
|
|
338
|
-
let scrapingResult;
|
|
339
|
-
|
|
340
|
-
try {
|
|
341
|
-
const { data } = await axios.get(url);
|
|
342
|
-
const $ = load(data);
|
|
343
|
-
|
|
344
|
-
const scraping = {
|
|
345
|
-
title() {
|
|
346
|
-
results($("title").text());
|
|
347
|
-
},
|
|
348
|
-
images() {
|
|
349
|
-
const imageList = $("img").map((i, el) => ({
|
|
350
|
-
imagePath: $(el).attr("src"),
|
|
351
|
-
imageTitle: $(el).attr("alt")
|
|
352
|
-
})).toArray();
|
|
353
|
-
|
|
354
|
-
scrapingResult = imageList.length === 0
|
|
355
|
-
? "no found images"
|
|
356
|
-
: imageList;
|
|
357
|
-
|
|
358
|
-
results(scrapingResult);
|
|
359
|
-
},
|
|
360
|
-
metadata() {
|
|
361
|
-
const metadataList = $("meta").map((i, el) => ({
|
|
362
|
-
metaInfo: $(el).attr("name"),
|
|
363
|
-
metaContent: $(el).attr("content")
|
|
364
|
-
})).toArray()
|
|
365
|
-
.filter((data) => data?.metaInfo);
|
|
366
|
-
|
|
367
|
-
results(metadataList);
|
|
368
|
-
},
|
|
369
|
-
headings() {
|
|
370
|
-
const headingList = $("h1, h2, h3, h4, h5, h6").map((i, el) => ({
|
|
371
|
-
headingTag: $(el).prop("tagName"),
|
|
372
|
-
headingText: $(el).text()
|
|
373
|
-
})).toArray();
|
|
374
|
-
|
|
375
|
-
results(headingList);
|
|
376
|
-
},
|
|
377
|
-
tableHead() {
|
|
378
|
-
const tableHeadList = $("th").map((i, el) => ({
|
|
379
|
-
headingRow: i,
|
|
380
|
-
text: $(el).text()
|
|
381
|
-
})).toArray();
|
|
382
|
-
|
|
383
|
-
scrapingResult = tableHeadList.length === 0
|
|
384
|
-
? "no found th tags" : tableHeadList;
|
|
385
|
-
|
|
386
|
-
results(scrapingResult);
|
|
387
|
-
},
|
|
388
|
-
tableData() {
|
|
389
|
-
const tableColumnList = $("td").map((i, el) => ({
|
|
390
|
-
tableRow: i + 1,
|
|
391
|
-
tableData: $(el).text(),
|
|
392
|
-
})).toArray();
|
|
393
|
-
|
|
394
|
-
scrapingResult = tableColumnList.length === 0
|
|
395
|
-
? "no found td tags" : tableColumnList;
|
|
396
|
-
|
|
397
|
-
results(scrapingResult);
|
|
398
|
-
},
|
|
399
|
-
links() {
|
|
400
|
-
const linkList = $("a").map((i, el) => ({
|
|
401
|
-
url: $(el).attr("href"),
|
|
402
|
-
text: $(el).text()
|
|
403
|
-
})).toArray()
|
|
404
|
-
.filter(({ url }) => url.indexOf("#") !== 0);
|
|
405
|
-
|
|
406
|
-
results(linkList);
|
|
407
|
-
},
|
|
408
|
-
cites() {
|
|
409
|
-
const citeList = $("q, blockquote").map((i, el) => ({
|
|
410
|
-
citeTag: $(el).prop("tagName"),
|
|
411
|
-
citeLink: $(el).attr("cite"),
|
|
412
|
-
citeText: $(el).text()
|
|
413
|
-
})).toArray();
|
|
414
|
-
|
|
415
|
-
scrapingResult = citeList.length === 0
|
|
416
|
-
? "no found q and/or blockquote tags" : citeList;
|
|
417
|
-
|
|
418
|
-
results(scrapingResult);
|
|
419
|
-
}
|
|
420
|
-
};
|
|
421
|
-
|
|
422
|
-
scraping[options]();
|
|
423
|
-
} catch (err) {
|
|
424
|
-
failed(err.message);
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
const password = () => {
|
|
429
|
-
const chars = "0123456789abcdefghijklmnopqrstuvwxyz!@#$%^&*()ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
430
|
-
|
|
431
|
-
// blank password var
|
|
432
|
-
let password = "";
|
|
433
|
-
|
|
434
|
-
// loop generate chars
|
|
435
|
-
for(let i = 0; i < 12; i++) {
|
|
436
|
-
const randomNumber = Math.floor(Math.random() * chars.length);
|
|
437
|
-
|
|
438
|
-
password += chars.substring(randomNumber, randomNumber + 1);
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
// print new passwors
|
|
442
|
-
return password;
|
|
443
|
-
};
|
|
444
|
-
|
|
445
|
-
const bundlephobia = async (pkg) {
|
|
446
|
-
try {
|
|
447
|
-
const { data } = await axios.get("https://bundlephobia.com/api/size", {
|
|
448
|
-
params: { package: pkg }
|
|
449
|
-
});
|
|
450
|
-
|
|
451
|
-
console.table({
|
|
452
|
-
module_name: data.name,
|
|
453
|
-
module_version: data.version,
|
|
454
|
-
module_repo: data.repository,
|
|
455
|
-
module_size: kilobyteConvert(data.size),
|
|
456
|
-
module_gzip: kilobyteConvert(data.gzip),
|
|
457
|
-
});
|
|
458
|
-
|
|
459
|
-
stackSave(`${pkg}-pkg-info.json`, JSON.stringify(data, null, 2));
|
|
460
|
-
} catch (err) {
|
|
461
|
-
console.error(colors.red(err.message));
|
|
462
|
-
}
|
|
463
|
-
};
|
|
464
|
-
|
|
465
|
-
// exports
|
|
466
|
-
export {
|
|
467
|
-
animeSearch,
|
|
468
|
-
bitlyInfo,
|
|
469
|
-
cryptoMarket,
|
|
470
|
-
githubInfo,
|
|
471
|
-
controllerInfo,
|
|
472
|
-
osDetail,
|
|
473
|
-
diskInfo,
|
|
474
|
-
displayInfo,
|
|
475
|
-
biosInfo,
|
|
476
|
-
cpuInfo,
|
|
477
|
-
ramMemInfo,
|
|
478
|
-
movieDB,
|
|
479
|
-
multipleStack,
|
|
480
|
-
pageSpeed,
|
|
481
|
-
singleStack,
|
|
482
|
-
twitchInfo,
|
|
483
|
-
scrape,
|
|
484
|
-
password,
|
|
485
|
-
bundlephobia
|
|
486
|
-
};
|