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/readme.md CHANGED
@@ -16,11 +16,11 @@ cli tech stack analyze with **node.js** using the wappalyzer and google pagespee
16
16
 
17
17
  ## cli module
18
18
  ``` sh
19
- # old npm mode
19
+ # npm mode a
20
20
  npm i -g stack-analyze
21
21
 
22
- # new npm mode
23
- npm i --location=global
22
+ # npm mode b
23
+ npm i --location=global stack-analyze
24
24
 
25
25
  # if using global install
26
26
  stack-analyze
@@ -29,25 +29,6 @@ stack-analyze
29
29
  npx stack-analyze
30
30
  ```
31
31
 
32
- ## module
33
-
34
- ``` sh
35
- npm i stack-analyze
36
- ```
37
-
38
- ``` js
39
- // cjs
40
- const stackAnalyze = require('stack-analyze') // full
41
- const { password } = require('stack-analyze') // destructuring
42
-
43
- // esm
44
- import stackAnalyze from 'stack-analyze' // full
45
- import { password } from 'stack-analyze' // destructuring
46
-
47
- // examples
48
- password()
49
- ```
50
-
51
32
  >note: if global install fail using npx
52
33
 
53
34
  [github repo](https://github.com/stack-analyze/stack-analyze.git)
package/utils.js CHANGED
@@ -24,7 +24,7 @@ const menuInfoOpts = [
24
24
  ];
25
25
 
26
26
  const menuQueryOpts = [
27
- "anime_Search", "movie_info", "twitch_info", returnMainOpts
27
+ "anime_Search", "movie_info", "pokemon_info", "twitch_info", returnMainOpts
28
28
  ];
29
29
 
30
30
  const menuUtilityOpts = [
package/hardware.csv DELETED
File without changes
package/index.cjs DELETED
@@ -1,487 +0,0 @@
1
- // modules
2
- const axios = require("axios").default;
3
- const {
4
- cpu,
5
- mem,
6
- osInfo,
7
- diskLayout,
8
- graphics,
9
- bios
10
- } = require("systeminformation");
11
- const Wappalyzer = require("wappalyzer");
12
- const cheerio = require("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: {
62
- vs_currency: "usd",
63
- per_page: 10
64
- }
65
- }
66
- );
67
-
68
- // map coinData
69
- results(data);
70
- } catch (err) { failed(err); }
71
- };
72
-
73
- async function githubInfo({ user, results, failed }) {
74
- try {
75
- const { data } = await axios.get(`https://api.github.com/users/${user}`);
76
-
77
- results(data);
78
- } catch (err) { failed(err); }
79
- }
80
-
81
- async function cpuInfo(callback) {
82
- try {
83
- const {
84
- manufacturer,
85
- brand,
86
- speed,
87
- cores,
88
- physicalCores,
89
- processors,
90
- vendor,
91
- family,
92
- model
93
- } = await cpu();
94
-
95
- // show results
96
- callback({
97
- manufacturer,
98
- brand,
99
- speed,
100
- cores,
101
- physicalCores,
102
- processors,
103
- vendor,
104
- family,
105
- model
106
- });
107
- } catch (err) { callback(err); }
108
- }
109
-
110
- async function ramMemInfo(callback) {
111
- try {
112
- const {
113
- total,
114
- free,
115
- used,
116
- active,
117
- available
118
- } = await mem();
119
-
120
- // show results
121
- callback({
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`
127
- });
128
- } catch (err) { callback(err); }
129
- }
130
-
131
- async function osDetail(callback) {
132
- try {
133
- const {
134
- hostname,
135
- platform,
136
- distro,
137
- release,
138
- kernel,
139
- arch,
140
- serial,
141
- uefi
142
- } = await osInfo();
143
-
144
- // show results
145
- callback({
146
- hostname,
147
- platform,
148
- distro,
149
- release,
150
- kernel,
151
- arch,
152
- serial,
153
- uefi
154
- });
155
- } catch (err) { callback(err); }
156
- }
157
-
158
- async function diskInfo(callback) {
159
- try {
160
- const disks = await diskLayout();
161
-
162
- const disksList = disks.map(({
163
- type,
164
- name,
165
- vendor,
166
- size,
167
- interfaceType
168
- }) => ({
169
- type,
170
- name,
171
- vendor,
172
- diskSize: `${gigabyteConvert(size)} GB`,
173
- interfaceType
174
- }));
175
-
176
- callback(disksList);
177
-
178
- } catch (err) { callback(err); }
179
- }
180
-
181
- async function controllerInfo(callback) {
182
- try {
183
- const { controllers } = await graphics();
184
-
185
- const controllersList = controllers.map(({
186
- model,
187
- vendor,
188
- vram
189
- }) => ({
190
- model,
191
- vendor,
192
- vramSize: vram < 1024
193
- ? `${vram} MB`
194
- : `${gigabyteConvert(vram, 1024)} GB`
195
- }));
196
-
197
- callback(controllersList);
198
- } catch (err) { callback(err); }
199
- }
200
-
201
- async function displayInfo(callback) {
202
- try {
203
- const { displays } = await graphics();
204
-
205
- const displayList = displays.map(({
206
- model,
207
- main,
208
- connection,
209
- resolutionX,
210
- resolutionY
211
- }) => ({
212
- model,
213
- main,
214
- connection,
215
- resolutionX,
216
- resolutionY
217
- }));
218
-
219
- callback(displayList);
220
- } catch (err) { callback(err); }
221
- }
222
-
223
- async function biosInfo(callback) {
224
- try {
225
- const {
226
- releaseDate,
227
- vendor,
228
- revision,
229
- version
230
- } = await bios();
231
-
232
- callback({ releaseDate, vendor, revision, version });
233
- } catch (err) { callback(err); }
234
- }
235
-
236
- const movieDB = async ({ api_key, query, results, failed }) => {
237
- try {
238
- const { data } = await axios.get("https://api.themoviedb.org/3/search/movie", {
239
- params: { api_key, query }
240
- });
241
-
242
- const movieData = data.results
243
- .map(({
244
- title,
245
- original_language,
246
- popularity,
247
- vote_average,
248
- release_date
249
- }) => ({
250
- title,
251
- original_language,
252
- popularity,
253
- vote_average,
254
- release_date
255
- }))
256
- .sort((x, y) => {
257
- // date values
258
- const primaryDate = new Date(x.release_date);
259
- const secondaryDate = new Date(y.release_date);
260
-
261
- return primaryDate.getTime() - secondaryDate.getTime();
262
- })
263
- .filter((data) => data?.release_date);
264
-
265
- results(movieData);
266
- } catch (err) { failed(err); }
267
- };
268
-
269
- async function multipleStack({ urls, results, failed }) {
270
- let result;
271
- try {
272
- await wappalyzer.init();
273
- result = await Promise.all(
274
- urls.map(async (url) => {
275
- const { technologies } = await wappalyzer.open(url).analyze();
276
- return {
277
- url,
278
- technologies
279
- };
280
- })
281
- );
282
- results(result);
283
- } catch (err) { failed(err); }
284
- await wappalyzer.destroy();
285
- }
286
-
287
- const pageSpeed = async ({ url, results, failed }) => {
288
- try {
289
- const resMobile = await pagespeedApi(url, "mobile");
290
-
291
- const resDesktop = await pagespeedApi(url, "desktop");
292
-
293
- // extract results
294
- const mobile = Math.round(resMobile.data.lighthouseResult.categories.performance.score * 100);
295
- const desktop = Math.round(resDesktop.data.lighthouseResult.categories.performance.score * 100);
296
-
297
- results({ mobile, desktop });
298
- } catch (err) { failed(err); }
299
- };
300
-
301
- async function singleStack({ url, results, failed }) {
302
- let result;
303
-
304
- try {
305
- await wappalyzer.init();
306
-
307
- const { technologies } = await wappalyzer.open(url).analyze();
308
-
309
- result = technologies.map(({
310
- name,
311
- website,
312
- categories
313
- }) => ({
314
- techName: name,
315
- techWebsite: website,
316
- techCategories: categories.map(({ name }) => name).join(", ")
317
- }));
318
- results(result);
319
- } catch (err) { failed(err); }
320
-
321
- await wappalyzer.destroy();
322
- }
323
-
324
- async function twitchInfo({ query, token, clientID, results, failed }) {
325
- try {
326
- const { data: twitchData } = await axios.get("https://api.twitch.tv/helix/users",
327
- {
328
- params: { login: query },
329
- headers: {
330
- Authorization: `Bearer ${token}`,
331
- "Client-Id": clientID
332
- }
333
- });
334
-
335
- results(twitchData.data);
336
- } catch (err) { failed(err); }
337
- }
338
-
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
- }
428
- }
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
-
446
- const bundlephobia = async (pkg) {
447
- try {
448
- const { data } = await axios.get("https://bundlephobia.com/api/size", {
449
- params: { package: pkg }
450
- });
451
-
452
- console.table({
453
- module_name: data.name,
454
- module_version: data.version,
455
- module_repo: data.repository,
456
- module_size: kilobyteConvert(data.size),
457
- module_gzip: kilobyteConvert(data.gzip),
458
- });
459
-
460
- stackSave(`${pkg}-pkg-info.json`, JSON.stringify(data, null, 2));
461
- } catch (err) {
462
- console.error(colors.red(err.message));
463
- }
464
- };
465
-
466
- // exports
467
- module.exports = {
468
- animeSearch,
469
- bitlyInfo,
470
- cryptoMarket,
471
- githubInfo,
472
- controllerInfo,
473
- osDetail,
474
- diskInfo,
475
- displayInfo,
476
- biosInfo,
477
- cpuInfo,
478
- ramMemInfo,
479
- movieDB,
480
- multipleStack,
481
- pageSpeed,
482
- singleStack,
483
- twitchInfo,
484
- scrape,
485
- password,
486
- bundlephobia
487
- };