stack-analyze 1.1.6 → 1.1.9

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.mjs ADDED
@@ -0,0 +1,496 @@
1
+ // modules
2
+ import {default as axios} from "axios";
3
+ import CoinGecko from "coingecko-api";
4
+ import {
5
+ cpu,
6
+ mem,
7
+ osInfo,
8
+ diskLayout,
9
+ graphics,
10
+ bios
11
+ } from "systeminformation";
12
+ import Wappalyzer from "wappalyzer";
13
+
14
+ const animeSearch = async ({ query, results }) => {
15
+ /* error manager */
16
+ try {
17
+ // call api
18
+ const { data } = await axios.get("https://api.jikan.moe/v3/search/anime", {
19
+ params: {
20
+ q: query,
21
+ limit: 10
22
+ }
23
+ });
24
+
25
+ results(data.results);
26
+
27
+ } catch (err) { results(err); }
28
+ };
29
+
30
+ const bitlyInfo = async ({ link, token, results }) => {
31
+ try {
32
+ const { data } = await axios.post(
33
+ "https://api-ssl.bitly.com/v4/expand",
34
+ {
35
+ bitlink_id: link
36
+ },
37
+ {
38
+ headers: {
39
+ Authorization: `Bearer ${token}`,
40
+ "Content-Type": "application/json"
41
+ }
42
+ }
43
+ );
44
+
45
+ results(data);
46
+ } catch (err) { results(err); }
47
+ };
48
+
49
+ const cryptoMarket = async (callback) => {
50
+ try {
51
+ // start crypto
52
+ const { data } = await axios.get(
53
+ "https://api.coingecko.com/api/v3/coins/markets", {
54
+ params: {
55
+ vs_currency: "usd",
56
+ per_page: 10
57
+ }
58
+ }
59
+ );
60
+
61
+ // map coinData
62
+ callback(data);
63
+ } catch (err) { callback(err); }
64
+ };
65
+
66
+ async function githubInfo({ user, results }) {
67
+ try {
68
+ const { data } = await axios.get(`https://api.github.com/users/${user}`);
69
+
70
+ results(data);
71
+ } catch (err) { results(err); }
72
+ }
73
+
74
+ async function cpuInfo(callback) {
75
+ try {
76
+ const {
77
+ manufacturer,
78
+ brand,
79
+ speed,
80
+ cores,
81
+ physicalCores,
82
+ processors,
83
+ vendor,
84
+ family,
85
+ model
86
+ } = await cpu();
87
+
88
+ // show results
89
+ callback({
90
+ manufacturer,
91
+ brand,
92
+ speed,
93
+ cores,
94
+ physicalCores,
95
+ processors,
96
+ vendor,
97
+ family,
98
+ model
99
+ });
100
+ } catch (err) { callback(err); }
101
+ }
102
+
103
+ async function ramMemInfo(callback) {
104
+ try {
105
+ const {
106
+ total,
107
+ free,
108
+ used,
109
+ active,
110
+ available
111
+ } = await mem();
112
+
113
+ // show results
114
+ callback({
115
+ total_mem: `${(total / 1073741824).toFixed(2)} GB`,
116
+ free_mem: `${(free / 1073741824).toFixed(2)} GB`,
117
+ used_mem: `${(used / 1073741824).toFixed(2)} GB`,
118
+ active_mem: `${(active / 1073741824).toFixed(2)} GB`,
119
+ available_mem: `${(available / 1073741824).toFixed(2)} GB`
120
+ });
121
+ } catch (err) { callback(err); }
122
+ }
123
+
124
+ async function osDetail(callback) {
125
+ try {
126
+ const {
127
+ hostname,
128
+ platform,
129
+ distro,
130
+ release,
131
+ kernel,
132
+ arch,
133
+ serial,
134
+ uefi
135
+ } = await osInfo();
136
+
137
+ // show results
138
+ callback({
139
+ hostname,
140
+ platform,
141
+ distro,
142
+ release,
143
+ kernel,
144
+ arch,
145
+ serial,
146
+ uefi
147
+ });
148
+ } catch (err) { callback(err); }
149
+ }
150
+
151
+ async function diskInfo(callback) {
152
+ try {
153
+ const disks = await diskLayout();
154
+
155
+ const disksList = disks.map(({
156
+ type,
157
+ name,
158
+ vendor,
159
+ size,
160
+ interfaceType
161
+ }) => ({
162
+ type,
163
+ name,
164
+ vendor,
165
+ diskSize: `${(size / 1073741824).toFixed(2)} GB`,
166
+ interfaceType
167
+ }));
168
+
169
+ callback(disksList);
170
+
171
+ } catch (err) { callback(err); }
172
+ }
173
+
174
+ async function controllerInfo(callback) {
175
+ try {
176
+ const { controllers } = await graphics();
177
+
178
+ const controllersList = controllers.map(({
179
+ model,
180
+ vendor,
181
+ vram
182
+ }) => ({
183
+ model,
184
+ vendor,
185
+ vramSize: vram < 1024
186
+ ? `${vram} MB`
187
+ : `${(vram / 1024).toFixed(2)} GB`
188
+ }));
189
+
190
+ callback(controllersList);
191
+ } catch (err) { callback(err); }
192
+ }
193
+
194
+ async function displayInfo(callback) {
195
+ try {
196
+ const { displays } = await graphics();
197
+
198
+ const displayList = displays.map(({
199
+ model,
200
+ main,
201
+ connection,
202
+ resolutionX,
203
+ resolutionY
204
+ }) => ({
205
+ model,
206
+ main,
207
+ connection,
208
+ resolutionX,
209
+ resolutionY
210
+ }));
211
+
212
+ callback(displayList);
213
+ } catch (err) { callback(err); }
214
+ }
215
+
216
+ async function biosInfo(callback) {
217
+ try {
218
+ const {
219
+ releaseDate,
220
+ vendor,
221
+ revision,
222
+ version
223
+ } = await bios();
224
+
225
+ callback({ releaseDate, vendor, revision, version });
226
+ } catch (err) { callback(err); }
227
+ }
228
+
229
+ const movieDB = async ({ api_key, query, results }) => {
230
+ try {
231
+ const { data } = await axios.get("https://api.themoviedb.org/3/search/movie", {
232
+ params: {
233
+ api_key,
234
+ query,
235
+ page: 1
236
+ }
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(({ release_date }) => release_date !== undefined && release_date !== "");
261
+
262
+ results(movieData);
263
+ } catch (err) { results(err); }
264
+ };
265
+
266
+ async function multipleStack({ urls, results }) {
267
+ let result;
268
+ const wappalyzer = new Wappalyzer();
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
+ } catch (err) { result = err; }
281
+ await wappalyzer.destroy();
282
+ results(result);
283
+ }
284
+
285
+ const pageSpeed = async ({ url, results }) => {
286
+ try {
287
+ const resMobile = await axios.get("https://www.googleapis.com/pagespeedonline/v5/runPagespeed", {
288
+ params: {
289
+ url,
290
+ key: "AIzaSyBEDaW4FxSZ2s1vz5CdD5Ai6PGZGdAzij0",
291
+ strategy: "mobile"
292
+ }
293
+ });
294
+
295
+ const resDesktop = await axios.get("https://www.googleapis.com/pagespeedonline/v5/runPagespeed", {
296
+ params: {
297
+ url,
298
+ key: "AIzaSyBEDaW4FxSZ2s1vz5CdD5Ai6PGZGdAzij0",
299
+ strategy: "desktop"
300
+ }
301
+ });
302
+
303
+ // extract results
304
+ const mobile = Math.round(resMobile.data.lighthouseResult.categories.performance.score * 100);
305
+ const desktop = Math.round(resDesktop.data.lighthouseResult.categories.performance.score * 100);
306
+
307
+ results({ mobile, desktop });
308
+ } catch (err) { results(err); }
309
+ };
310
+
311
+ async function singleStack({ url, results }) {
312
+ const wappalyzer = await new Wappalyzer;
313
+
314
+ let result;
315
+ try {
316
+ await wappalyzer.init();
317
+
318
+ const { technologies } = await wappalyzer.open(url).analyze();
319
+
320
+ result = technologies.map(({
321
+ name,
322
+ website,
323
+ categories
324
+ }) => ({
325
+ techName: name,
326
+ techWebsite: website,
327
+ techCategories: categories.map(({ name }) => name).join(", ")
328
+ }));
329
+ } catch (err) { results(err); }
330
+
331
+ await wappalyzer.destroy();
332
+ results(result);
333
+ }
334
+
335
+ async function twitchInfo({ query, token, clientID, results }) {
336
+ try {
337
+ const { data: twitchData } = await axios.get(`https://api.twitch.tv/helix/users?login=${query}`,
338
+ {
339
+ headers: {
340
+ Authorization: `Bearer ${token}`,
341
+ "Client-Id": clientID
342
+ }
343
+ });
344
+
345
+ results(twitchData.data);
346
+ } catch (err) { results(err); }
347
+ }
348
+
349
+ function scrape(url) {
350
+ let $;
351
+
352
+ const scraping = axios.create({
353
+ baseURL: url
354
+ });
355
+
356
+ const title = async (callback) => {
357
+ try {
358
+ const { data } = await scraping.get("");
359
+ $ = load(data);
360
+
361
+ callback($("title").text());
362
+ } catch (err) { console.error(colors.red(err.message)); }
363
+ };
364
+
365
+ const images = async (callback) => {
366
+ try {
367
+ const { data } = await scraping.get("");
368
+ $ = load(data);
369
+
370
+ const imgs = $("img").map((i, el) => ({
371
+ imagePath: $(el).attr("src"),
372
+ imageTitle: $(el).attr("alt")
373
+ })).toArray();
374
+
375
+ callback(imgs);
376
+ } catch (err) { console.error(colors.red(err.message)); }
377
+ };
378
+
379
+ const metadata = async (callback) => {
380
+ try {
381
+ const { data } = await scraping.get("");
382
+ $ = load(data);
383
+
384
+ const metadataList = $("meta").map((i, el) => ({
385
+ metaInfo: $(el).attr("name"),
386
+ metaContent: $(el).attr("content")
387
+ })).toArray()
388
+ .filter(({ metaInfo }) => metaInfo !== undefined);
389
+
390
+ callback(metadataList);
391
+ } catch (err) { console.error(colors.red(err.message)); }
392
+ };
393
+
394
+ const headings = async (callback) => {
395
+ try {
396
+ const { data } = await scraping.get("");
397
+ $ = load(data);
398
+
399
+ const headingList = $("h1, h2, h3, h4, h5, h6").map((i, el) => ({
400
+ headingTag: $(el).prop("tagName"),
401
+ headingText: $(el).text()
402
+ })).toArray();
403
+
404
+ callback(headingList);
405
+ } catch (err) { console.error(colors.red(err.message)); }
406
+ };
407
+
408
+ const table_heading = async (callback) => {
409
+ try {
410
+ const { data } = await scraping.get("");
411
+ $ = load(data);
412
+
413
+ const tableHeadList = $("th").map((i, el) => ({
414
+ headingRow: i,
415
+ text: $(el).text()
416
+ })).toArray();
417
+
418
+ callback(tableHeadList);
419
+ } catch (err) { console.error(colors.red(err.message)); }
420
+ };
421
+
422
+ const table_data = async (callback) => {
423
+ try {
424
+ const { data } = await scraping.get("");
425
+ $ = load(data);
426
+
427
+ const tableColumnList = $("td").map((i, el) => $(el).text()).toArray();
428
+
429
+ callback(tableColumnList);
430
+ } catch (err) { console.error(colors.red(err.message)); }
431
+ };
432
+
433
+
434
+ const links = async (callback) => {
435
+ try {
436
+ const { data } = await scraping.get("");
437
+ $ = load(data);
438
+
439
+ const linkList = $("a").map((i, el) => ({
440
+ url: $(el).attr("href"),
441
+ text: $(el).text()
442
+ })).toArray()
443
+ .filter(({ url }) => url.indexOf("#") !== 0);
444
+
445
+ callback(linkList);
446
+ } catch (err) { console.error(colors.red(err.message)); }
447
+ };
448
+
449
+ const cites = async (callback) => {
450
+ try {
451
+ const { data } = await scraping.get("");
452
+ $ = load(data);
453
+
454
+ const citeList = $("q, blockquote").map((i, el) => ({
455
+ citeTag: $(el).prop("tagName"),
456
+ citeLink: $(el).attr("cite"),
457
+ citeText: $(el).text()
458
+ })).toArray();
459
+
460
+ callback(citeList);
461
+ } catch (err) { console.error(colors.red(err.message)); }
462
+ };
463
+
464
+ return {
465
+ title,
466
+ images,
467
+ metadata,
468
+ headings,
469
+ table_heading,
470
+ table_data,
471
+ links,
472
+ cites
473
+ };
474
+ }
475
+
476
+
477
+ // exports
478
+ export {
479
+ animeSearch,
480
+ bitlyInfo,
481
+ cryptoMarket,
482
+ githubInfo,
483
+ controllerInfo,
484
+ osDetail,
485
+ diskInfo,
486
+ displayInfo,
487
+ biosInfo,
488
+ cpuInfo,
489
+ ramMemInfo,
490
+ movieDB,
491
+ multipleStack,
492
+ pageSpeed,
493
+ singleStack,
494
+ twitchInfo,
495
+ scrape
496
+ };
package/package.json CHANGED
@@ -1,28 +1,35 @@
1
1
  {
2
2
  "name": "stack-analyze",
3
- "version": "1.1.6",
3
+ "version": "1.1.9",
4
+ "type": "module",
4
5
  "description": "cli tech stack analyze and pagespeed with node.js using the wappalyzer module. with google pagespeed api, hardware and crypto market",
5
- "main": "index.js",
6
+ "main": "index.mjs",
6
7
  "bin": {
7
8
  "stack-analyze": "cli.js"
8
9
  },
10
+ "exports": {
11
+ ".": {
12
+ "require": "./index.cjs",
13
+ "import": "./index.mjs"
14
+ }
15
+ },
9
16
  "dependencies": {
10
- "axios": "^0.21.4",
11
- "cli-progress": "^3.9.1",
12
- "coingecko-api": "^1.0.10",
17
+ "axios": "^0.27.2",
18
+ "cheerio": "^1.0.0-rc.12",
19
+ "cli-progress": "^3.11.2",
13
20
  "colors": "^1.4.0",
14
- "console-table-printer": "^2.10.0",
21
+ "console-table-printer": "^2.11.0",
15
22
  "figlet": "^1.5.2",
16
- "inquirer": "^8.2.0",
17
- "systeminformation": "^5.9.9",
23
+ "inquirer": "^9.0.0",
24
+ "systeminformation": "^5.11.22",
18
25
  "timeago.js": "^4.0.2",
19
- "wappalyzer": "^6.9.2"
26
+ "wappalyzer": "^6.10.37"
20
27
  },
21
28
  "devDependencies": {
22
- "eslint": "^7.32.0",
23
- "gh-pages": "^3.2.3",
24
- "jest": "^27.3.1",
25
- "jsdoc": "^3.6.7",
29
+ "eslint": "^8.18.0",
30
+ "gh-pages": "^4.0.0",
31
+ "jest": "^28.1.2",
32
+ "jsdoc": "^3.6.10",
26
33
  "minami": "^1.2.3"
27
34
  },
28
35
  "scripts": {
@@ -35,7 +42,7 @@
35
42
  },
36
43
  "repository": {
37
44
  "type": "git",
38
- "url": "git+https://github.com/intermachine-developers/stack-analyze.git"
45
+ "url": "git+https://github.com/stack-analyze/stack-analyze.git"
39
46
  },
40
47
  "keywords": [
41
48
  "cli",
@@ -51,12 +58,12 @@
51
58
  "crypto market info",
52
59
  "movie info"
53
60
  ],
54
- "author": "Intermachine Developers",
61
+ "author": "stack-analyze",
55
62
  "license": "MIT",
56
63
  "bugs": {
57
- "url": "https://github.com/intermachine-developers/stack-analyze/issues"
64
+ "url": "https://github.com/stack-analyze/stack-analyze/issues"
58
65
  },
59
- "homepage": "https://intermachine-developers.github.io/stack-analyze/",
66
+ "homepage": "https://stack-analyze.github.io/stack-analyze/",
60
67
  "directories": {
61
68
  "doc": "docs",
62
69
  "test": "test"
package/readme.md CHANGED
@@ -15,13 +15,21 @@ cli tech stack analyze with **node.js** using the wappalyzer and google pagespee
15
15
  use the cli program install
16
16
 
17
17
  ## example module
18
- >npx stack-analyze "using external without install"<br>
19
- >npm i -g stack-analyze "global install"<br>
18
+ ``` sh
19
+ # global old npm versions
20
+ npm i -g stack-analyze
21
+
22
+ # global new module
23
+ npm i --location=global
24
+
25
+ # portable
26
+ npx stack-analyze
27
+ ```
20
28
  >note: if global install fail using npx
21
29
 
22
- [github repo](https://github.com/intermachine-developers/stack-analyze.git)
30
+ [github repo](https://github.com/stack-analyze/stack-analyze.git)
23
31
 
24
- [docs](https://intermachine-developers.github.io/stack-analyze)
32
+ [docs](https://stack-analyze.github.io/stack-analyze/)
25
33
 
26
34
  [gitlab repo](https://gitlab.com/Intermachine-dev/stack-analyze)
27
35
 
@@ -29,4 +37,4 @@ use the cli program install
29
37
  - [changelog module](/CHANGELOG.md)
30
38
  ## author this project Julian David Cordoba Torres as omega5300
31
39
 
32
- **Intermachine Developers LICENSE MIT**
40
+ **stack-analyze LICENSE MIT**
package/utils.js ADDED
@@ -0,0 +1,15 @@
1
+ const listFormat = new Intl.ListFormat("en", {
2
+ style: "short",
3
+ type: "conjunction"
4
+ });
5
+
6
+ const currency = Intl.NumberFormat("en-us", {
7
+ style: "currency",
8
+ currency: "USD"
9
+ });
10
+
11
+ export {
12
+ listFormat,
13
+ currency
14
+ };
15
+
package/about/index.js DELETED
@@ -1,56 +0,0 @@
1
- // version module
2
- const { license, version } = require("../package.json");
3
-
4
- /**
5
- * @type {{ mainDeveloper: string, version: string, license: string }}
6
- */
7
- const aboutApp = {
8
- mainDeveloper: "omega5300",
9
- license,
10
- version
11
- };
12
-
13
- /**
14
- * @typedef {Object} ideas
15
- * @property {string} ideas.author
16
- * @property {string} ideas.tool
17
- */
18
-
19
- /** @type {ideas[]} */
20
- const ideas = [
21
- { author: "verguiskarime", tool: "bitly info" }
22
- ];
23
-
24
- /** @type { string[] } */
25
- const developers = [ "omega5300" ];
26
-
27
- /**
28
- * @typedef {Object} youtubeDev
29
- * @property {string} youtubeDev.youtubeChannel
30
- * @property {string} youtubeDev.recomendation
31
- */
32
-
33
- /** @type {youtubeDev[]} */
34
- const youtubeDev = [
35
- { youtubeChannel: "fazt", recomendation: "recommend" },
36
- { youtubeChannel: "doriandesings", recomendation: "recommend" },
37
- { youtubeChannel: "bluuweb", recomendation: "recommend" },
38
- { youtubeChannel: "leonidas esteban", recomendation: "neutral recommend" },
39
- { youtubeChannel: "fernando herrera", recomendation: "recommend" },
40
- { youtubeChannel: "soy dalto", recomendation: "neutral recommend" },
41
- ];
42
-
43
- /** @type { string[] } */
44
- const twitch = [ "dannyaegyo" ];
45
-
46
- /** @type { string[] } */
47
- const projects = [ "Doofy's Projects" ];
48
-
49
- module.exports = {
50
- aboutApp,
51
- developers,
52
- youtubeDev,
53
- twitch,
54
- projects,
55
- ideas
56
- };