@shriyanss/js-recon 1.1.4-alpha.4 → 1.2.1-alpha.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.
Files changed (45) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +4 -0
  3. package/build/analyze/engine/{esqueryEngine.js → astEngine.js} +31 -1
  4. package/build/analyze/engine/astEngine.js.map +1 -0
  5. package/build/analyze/engine/index.js +6 -4
  6. package/build/analyze/engine/index.js.map +1 -1
  7. package/build/analyze/engine/requestEngine.js +18 -4
  8. package/build/analyze/engine/requestEngine.js.map +1 -1
  9. package/build/analyze/helpers/engineHelpers/findDirectAssignment.js +27 -0
  10. package/build/analyze/helpers/engineHelpers/findDirectAssignment.js.map +1 -0
  11. package/build/analyze/helpers/outputHelper.js +8 -0
  12. package/build/analyze/helpers/outputHelper.js.map +1 -0
  13. package/build/analyze/helpers/schemas.js +2 -2
  14. package/build/analyze/helpers/schemas.js.map +1 -1
  15. package/build/analyze/index.js +11 -3
  16. package/build/analyze/index.js.map +1 -1
  17. package/build/globalConfig.js +1 -1
  18. package/build/index.js +18 -6
  19. package/build/index.js.map +1 -1
  20. package/build/lazyLoad/index.js +5 -1
  21. package/build/lazyLoad/index.js.map +1 -1
  22. package/build/report/index.js +53 -0
  23. package/build/report/index.js.map +1 -0
  24. package/build/report/utility/genHtml.js +184 -0
  25. package/build/report/utility/genHtml.js.map +1 -0
  26. package/build/report/utility/initReportDb.js +71 -0
  27. package/build/report/utility/initReportDb.js.map +1 -0
  28. package/build/report/utility/markdownGen/addAnalyze.js +45 -0
  29. package/build/report/utility/markdownGen/addAnalyze.js.map +1 -0
  30. package/build/report/utility/markdownGen/addMappedJson.js +25 -0
  31. package/build/report/utility/markdownGen/addMappedJson.js.map +1 -0
  32. package/build/report/utility/populateDb/populateAnalysisFindings.js +23 -0
  33. package/build/report/utility/populateDb/populateAnalysisFindings.js.map +1 -0
  34. package/build/report/utility/populateDb/populateEndpoints.js +42 -0
  35. package/build/report/utility/populateDb/populateEndpoints.js.map +1 -0
  36. package/build/report/utility/populateDb/populateMappedJson.js +23 -0
  37. package/build/report/utility/populateDb/populateMappedJson.js.map +1 -0
  38. package/build/report/utility/populateDb/populateMappedOpenapi.js +41 -0
  39. package/build/report/utility/populateDb/populateMappedOpenapi.js.map +1 -0
  40. package/build/run/index.js +22 -9
  41. package/build/run/index.js.map +1 -1
  42. package/build/utility/urlUtils.js +1 -1
  43. package/build/utility/urlUtils.js.map +1 -1
  44. package/package.json +6 -2
  45. package/build/analyze/engine/esqueryEngine.js.map +0 -1
@@ -0,0 +1,184 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import chalk from "chalk";
11
+ import fs from "fs";
12
+ import { marked } from "marked";
13
+ import hljs from "highlight.js";
14
+ import addAnalyze from "./markdownGen/addAnalyze.js";
15
+ import CONFIG from "../../globalConfig.js";
16
+ import addMappedJson from "./markdownGen/addMappedJson.js";
17
+ const html = (analyzeMarkdown, mappedJsonMarkdown) => __awaiter(void 0, void 0, void 0, function* () {
18
+ return `<!DOCTYPE html>
19
+ <html>
20
+ <head>
21
+ <meta charset="UTF-8">
22
+ <title>JS Recon Report</title>
23
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/highlight.js@11.9.0/styles/github-dark.css">
24
+ <style>
25
+ h2, h3, h4 {
26
+ cursor: pointer;
27
+ position: relative;
28
+ padding-left: 20px;
29
+ }
30
+ h2::before, h3::before, h4::before {
31
+ content: '▼';
32
+ position: absolute;
33
+ left: 0;
34
+ transition: transform 0.2s;
35
+ }
36
+ .collapsed::before {
37
+ transform: rotate(-90deg);
38
+ }
39
+ body {
40
+ padding-top: 80px; /* Height of the navbar */
41
+ }
42
+ .navbar {
43
+ position: fixed;
44
+ top: 0;
45
+ left: 0;
46
+ width: 100%;
47
+ background-color: #ffffff;
48
+ border-bottom: 1px solid #e0e0e0;
49
+ display: flex;
50
+ align-items: center;
51
+ padding: 10px 20px;
52
+ z-index: 1000;
53
+ box-shadow: 0 2px 5px rgba(0,0,0,0.1);
54
+ }
55
+ .navbar-logo img {
56
+ height: 40px;
57
+ }
58
+ .navbar-links {
59
+ list-style: none;
60
+ margin: 0 0 0 20px;
61
+ padding: 0;
62
+ display: flex;
63
+ gap: 15px;
64
+ }
65
+ </style>
66
+ </head>
67
+ <body>
68
+ <nav class="navbar">
69
+ <div class="navbar-logo">
70
+ <img src="https://js-recon.io/img/js-recon-logo.png" alt="JS Recon Logo">
71
+ </div>
72
+ <ul class="navbar-links" id="navbar-links">
73
+ <li><a href="#home">Home</a></li>
74
+ <li><a href="#mappedJson">Mapped JSON</a></li>
75
+ <li><a href="#about">About</a></li>
76
+ </ul>
77
+ </nav>
78
+ <div id="content"></div>
79
+ <script id="page-data" type="application/json">
80
+ ${JSON.stringify({
81
+ home: yield marked.parse(analyzeMarkdown),
82
+ mappedJson: yield marked.parse(mappedJsonMarkdown),
83
+ about: `# About\n\n The documentation for this tool is available at [JS Recon Docs](https://js-recon.io/).\n\n## Version\n\nThis report is generated with JS Recon [v${CONFIG.version}](https://github.com/shriyanss/js-recon/releases/tag/v${CONFIG.version}).`,
84
+ })}
85
+ </script>
86
+ <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
87
+ <script>
88
+ document.addEventListener('DOMContentLoaded', () => {
89
+ const contentDiv = document.getElementById('content');
90
+ const navbarLinks = document.getElementById('navbar-links');
91
+ const pages = JSON.parse(document.getElementById('page-data').textContent);
92
+
93
+ const updateVisibility = () => {
94
+ const headers = contentDiv.querySelectorAll('h2, h3, h4');
95
+ let parentCollapsedLevels = [];
96
+ headers.forEach(header => {
97
+ const level = parseInt(header.tagName.substring(1));
98
+ parentCollapsedLevels = parentCollapsedLevels.filter(l => l < level);
99
+ if (parentCollapsedLevels.length > 0) {
100
+ header.style.display = 'none';
101
+ } else {
102
+ header.style.display = '';
103
+ }
104
+ if (header.classList.contains('collapsed')) {
105
+ parentCollapsedLevels.push(level);
106
+ }
107
+ let nextEl = header.nextElementSibling;
108
+ while (nextEl && !nextEl.tagName.match(/^H[1-4]$/)) {
109
+ if (parentCollapsedLevels.length > 0) {
110
+ nextEl.style.display = 'none';
111
+ } else {
112
+ nextEl.style.display = '';
113
+ }
114
+ nextEl = nextEl.nextElementSibling;
115
+ }
116
+ });
117
+ };
118
+
119
+ const initializeCollapsibleHeaders = () => {
120
+ const headers = contentDiv.querySelectorAll('h2, h3, h4');
121
+ headers.forEach((header) => {
122
+ if (header.tagName.toLowerCase() === 'h3') {
123
+ header.classList.add('collapsed');
124
+ }
125
+ header.addEventListener('click', () => {
126
+ header.classList.toggle('collapsed');
127
+ updateVisibility();
128
+ });
129
+ });
130
+ updateVisibility();
131
+ };
132
+
133
+ const renderPage = (pageName) => {
134
+ const markdownContent = pages[pageName] || '<h2>Page Not Found: ' + pageName + '</h2>';
135
+ contentDiv.innerHTML = pageName === 'home' ? markdownContent : window.marked.parse(markdownContent);
136
+ initializeCollapsibleHeaders();
137
+ };
138
+
139
+ const handleHashChange = () => {
140
+ const pageName = window.location.hash.substring(1) || 'home';
141
+ renderPage(pageName);
142
+ };
143
+
144
+ navbarLinks.addEventListener('click', (event) => {
145
+ if (event.target.tagName === 'A') {
146
+ event.preventDefault();
147
+ const pageName = event.target.hash.substring(1);
148
+ window.location.hash = pageName;
149
+ }
150
+ });
151
+
152
+ window.addEventListener('hashchange', handleHashChange);
153
+
154
+ // Initial page load
155
+ handleHashChange();
156
+ });
157
+ </script>
158
+ </body>
159
+ </html>`;
160
+ });
161
+ const genHtml = (outputReportFile, db) => __awaiter(void 0, void 0, void 0, function* () {
162
+ console.log(chalk.cyan("[i] Generating HTML report..."));
163
+ let analyzeMarkdown = `# JS Recon Report generated at ${new Date().toISOString()}\n\n`;
164
+ let mappedJsonMarkdown = analyzeMarkdown;
165
+ analyzeMarkdown = yield addAnalyze(analyzeMarkdown, db);
166
+ mappedJsonMarkdown = yield addMappedJson(mappedJsonMarkdown, db);
167
+ const renderer = new marked.Renderer();
168
+ renderer.code = ({ text, lang }) => {
169
+ const language = hljs.getLanguage(lang) ? lang : "plaintext";
170
+ const highlightedCode = hljs.highlight(text, { language, ignoreIllegals: true }).value;
171
+ return `<pre><code class="hljs ${language}">${highlightedCode}</code></pre>`;
172
+ };
173
+ marked.setOptions({
174
+ renderer,
175
+ async: true,
176
+ pedantic: false,
177
+ gfm: true,
178
+ });
179
+ const renderedHtml = yield html(analyzeMarkdown, mappedJsonMarkdown);
180
+ fs.writeFileSync(outputReportFile, renderedHtml);
181
+ console.log(chalk.green("[✓] HTML report generated successfully"));
182
+ });
183
+ export default genHtml;
184
+ //# sourceMappingURL=genHtml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"genHtml.js","sourceRoot":"","sources":["../../../src/report/utility/genHtml.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,IAAI,MAAM,cAAc,CAAC;AAEhC,OAAO,UAAU,MAAM,6BAA6B,CAAC;AACrD,OAAO,MAAM,MAAM,uBAAuB,CAAC;AAC3C,OAAO,aAAa,MAAM,gCAAgC,CAAC;AAQ3D,MAAM,IAAI,GAAG,CAAO,eAAuB,EAAE,kBAA0B,EAAE,EAAE;IACvE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA8DL,IAAI,CAAC,SAAS,CAAC;QACb,IAAI,EAAE,MAAM,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC;QACzC,UAAU,EAAE,MAAM,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC;QAClD,KAAK,EAAE,gKAAgK,MAAM,CAAC,OAAO,yDAAyD,MAAM,CAAC,OAAO,IAAI;KACnQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA2EE,CAAC;AACT,CAAC,CAAA,CAAC;AAEF,MAAM,OAAO,GAAG,CAAO,gBAAwB,EAAE,EAAqB,EAAE,EAAE;IACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;IAEzD,IAAI,eAAe,GAAG,kCAAkC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC;IACvF,IAAI,kBAAkB,GAAG,eAAe,CAAC;IAEzC,eAAe,GAAG,MAAM,UAAU,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IACxD,kBAAkB,GAAG,MAAM,aAAa,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAEjE,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;IACvC,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,IAAc,CAAC,CAAC,CAAC,CAAE,IAAe,CAAC,CAAC,CAAC,WAAW,CAAC;QACnF,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC;QACvF,OAAO,0BAA0B,QAAQ,KAAK,eAAe,eAAe,CAAC;IACjF,CAAC,CAAC;IAEF,MAAM,CAAC,UAAU,CAAC;QACd,QAAQ;QACR,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,KAAK;QACf,GAAG,EAAE,IAAI;KACZ,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;IACrE,EAAE,CAAC,aAAa,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAEjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC,CAAC;AACvE,CAAC,CAAA,CAAC;AAEF,eAAe,OAAO,CAAC"}
@@ -0,0 +1,71 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import Database from "better-sqlite3";
11
+ const createMappedTable = (db) => {
12
+ db.prepare(`
13
+ CREATE TABLE IF NOT EXISTS mapped (
14
+ id TEXT PRIMARY KEY,
15
+ description TEXT,
16
+ loadedOn TEXT,
17
+ containsFetch BOOLEAN,
18
+ isAxiosClient BOOLEAN,
19
+ exports TEXT,
20
+ callStack TEXT,
21
+ code TEXT,
22
+ imports TEXT,
23
+ file TEXT
24
+ )
25
+ `).run();
26
+ };
27
+ const createMappedOpenapiTable = (db) => {
28
+ db.prepare(`
29
+ CREATE TABLE IF NOT EXISTS mapped_openapi (
30
+ path TEXT,
31
+ method TEXT,
32
+ summary TEXT,
33
+ parameters TEXT,
34
+ requestBody TEXT,
35
+ tags TEXT,
36
+ PRIMARY KEY (path, method)
37
+ )
38
+ `).run();
39
+ };
40
+ const createEndpointsTable = (db) => {
41
+ db.prepare(`
42
+ CREATE TABLE IF NOT EXISTS endpoints (
43
+ url TEXT PRIMARY KEY
44
+ )
45
+ `).run();
46
+ };
47
+ const createAnalysisFindingsTable = (db) => {
48
+ db.prepare(`
49
+ CREATE TABLE IF NOT EXISTS analysis_findings (
50
+ ruleId TEXT,
51
+ ruleName TEXT,
52
+ ruleType TEXT,
53
+ ruleDescription TEXT,
54
+ ruleAuthor TEXT,
55
+ ruleTech TEXT,
56
+ severity TEXT,
57
+ message TEXT,
58
+ findingLocation TEXT
59
+ )
60
+ `).run();
61
+ };
62
+ const initReportDb = (sqliteDbPath) => __awaiter(void 0, void 0, void 0, function* () {
63
+ const db = new Database(sqliteDbPath);
64
+ createMappedTable(db);
65
+ createMappedOpenapiTable(db);
66
+ createEndpointsTable(db);
67
+ createAnalysisFindingsTable(db);
68
+ db.close();
69
+ });
70
+ export default initReportDb;
71
+ //# sourceMappingURL=initReportDb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initReportDb.js","sourceRoot":"","sources":["../../../src/report/utility/initReportDb.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,MAAM,iBAAiB,GAAG,CAAC,EAAqB,EAAE,EAAE;IAChD,EAAE,CAAC,OAAO,CACN;;;;;;;;;;;;;KAaH,CACA,CAAC,GAAG,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAG,CAAC,EAAqB,EAAE,EAAE;IACvD,EAAE,CAAC,OAAO,CACN;;;;;;;;;;KAUH,CACA,CAAC,GAAG,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,EAAqB,EAAE,EAAE;IACnD,EAAE,CAAC,OAAO,CACN;;;;KAIH,CACA,CAAC,GAAG,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,2BAA2B,GAAG,CAAC,EAAqB,EAAE,EAAE;IAC1D,EAAE,CAAC,OAAO,CACN;;;;;;;;;;;;KAYH,CACA,CAAC,GAAG,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAO,YAAoB,EAAE,EAAE;IAChD,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,YAAY,CAAC,CAAC;IAEtC,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACtB,wBAAwB,CAAC,EAAE,CAAC,CAAC;IAC7B,oBAAoB,CAAC,EAAE,CAAC,CAAC;IACzB,2BAA2B,CAAC,EAAE,CAAC,CAAC;IAEhC,EAAE,CAAC,KAAK,EAAE,CAAC;AACf,CAAC,CAAA,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,45 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ const addAnalyze = (markdown, db) => __awaiter(void 0, void 0, void 0, function* () {
11
+ let toReturn = markdown;
12
+ toReturn += `\n## Analyze Results\n`;
13
+ const findings = db.prepare(`SELECT * FROM analysis_findings`).all();
14
+ if (findings.length > 0) {
15
+ const groupedFindings = {};
16
+ for (const finding of findings) {
17
+ if (!groupedFindings[finding.ruleType]) {
18
+ groupedFindings[finding.ruleType] = [];
19
+ }
20
+ groupedFindings[finding.ruleType].push(finding);
21
+ }
22
+ for (const ruleType in groupedFindings) {
23
+ toReturn += `### ${ruleType.toUpperCase()}\n`;
24
+ for (const finding of groupedFindings[ruleType]) {
25
+ toReturn += `#### ${finding.ruleName}, ${finding.ruleDescription}\n`;
26
+ let findingLocationBlock = "";
27
+ if (ruleType.toLowerCase() === "ast") {
28
+ findingLocationBlock = "```js\n" + finding.findingLocation + "\n```";
29
+ }
30
+ else {
31
+ findingLocationBlock = "```\n" + finding.findingLocation + "\n```";
32
+ }
33
+ toReturn += `${findingLocationBlock}\n`;
34
+ toReturn += `- **Rule ID:** ${finding.ruleId}\n`;
35
+ toReturn += `- **Severity:** ${finding.severity}\n`;
36
+ toReturn += `- **Message:** ${finding.message}\n`;
37
+ toReturn += `- **Author:** ${finding.ruleAuthor}\n`;
38
+ toReturn += `- **Technology:** ${finding.ruleTech}\n\n`;
39
+ }
40
+ }
41
+ }
42
+ return toReturn;
43
+ });
44
+ export default addAnalyze;
45
+ //# sourceMappingURL=addAnalyze.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addAnalyze.js","sourceRoot":"","sources":["../../../../src/report/utility/markdownGen/addAnalyze.ts"],"names":[],"mappings":";;;;;;;;;AAcA,MAAM,UAAU,GAAG,CAAO,QAAgB,EAAE,EAAqB,EAAmB,EAAE;IAClF,IAAI,QAAQ,GAAG,QAAQ,CAAC;IACxB,QAAQ,IAAI,wBAAwB,CAAC;IACrC,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC,GAAG,EAAuB,CAAC;IAC1F,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,eAAe,GAAyC,EAAE,CAAC;QACjE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACrC,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;YAC3C,CAAC;YACD,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC;QAED,KAAK,MAAM,QAAQ,IAAI,eAAe,EAAE,CAAC;YACrC,QAAQ,IAAI,OAAO,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;YAC9C,KAAK,MAAM,OAAO,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9C,QAAQ,IAAI,QAAQ,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,eAAe,IAAI,CAAC;gBACrE,IAAI,oBAAoB,GAAG,EAAE,CAAC;gBAC9B,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;oBACnC,oBAAoB,GAAG,SAAS,GAAG,OAAO,CAAC,eAAe,GAAG,OAAO,CAAC;gBACzE,CAAC;qBAAM,CAAC;oBACJ,oBAAoB,GAAG,OAAO,GAAG,OAAO,CAAC,eAAe,GAAG,OAAO,CAAC;gBACvE,CAAC;gBACD,QAAQ,IAAI,GAAG,oBAAoB,IAAI,CAAC;gBACxC,QAAQ,IAAI,kBAAkB,OAAO,CAAC,MAAM,IAAI,CAAC;gBACjD,QAAQ,IAAI,mBAAmB,OAAO,CAAC,QAAQ,IAAI,CAAC;gBACpD,QAAQ,IAAI,kBAAkB,OAAO,CAAC,OAAO,IAAI,CAAC;gBAClD,QAAQ,IAAI,iBAAiB,OAAO,CAAC,UAAU,IAAI,CAAC;gBACpD,QAAQ,IAAI,qBAAqB,OAAO,CAAC,QAAQ,MAAM,CAAC;YAC5D,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAA,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,25 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ const addMappedJson = (markdown, db) => __awaiter(void 0, void 0, void 0, function* () {
11
+ let toReturn = markdown;
12
+ const mappedData = db.prepare(`SELECT * FROM mapped`).all();
13
+ for (const item of mappedData) {
14
+ toReturn += `## ${item.id}\n`;
15
+ toReturn += `- Description: ${item.description || "N/A"}\n`;
16
+ toReturn += `- Contains Fetch: ${!!item.containsFetch}\n`;
17
+ toReturn += `- Is Axios Client: ${!!item.isAxiosClient}\n`;
18
+ toReturn += `- Exports: ${item.exports || "N/A"}\n`;
19
+ toReturn += `- Imports: ${item.imports || "N/A"}\n`;
20
+ toReturn += `- File: ${item.file}\n\n`;
21
+ }
22
+ return toReturn;
23
+ });
24
+ export default addMappedJson;
25
+ //# sourceMappingURL=addMappedJson.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addMappedJson.js","sourceRoot":"","sources":["../../../../src/report/utility/markdownGen/addMappedJson.ts"],"names":[],"mappings":";;;;;;;;;AAYA,MAAM,aAAa,GAAG,CAAO,QAAgB,EAAE,EAAqB,EAAmB,EAAE;IACrF,IAAI,QAAQ,GAAG,QAAQ,CAAC;IAExB,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,GAAG,EAAkB,CAAC;IAE5E,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC5B,QAAQ,IAAI,MAAM,IAAI,CAAC,EAAE,IAAI,CAAC;QAC9B,QAAQ,IAAI,kBAAkB,IAAI,CAAC,WAAW,IAAI,KAAK,IAAI,CAAC;QAC5D,QAAQ,IAAI,qBAAqB,CAAC,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC;QAC1D,QAAQ,IAAI,sBAAsB,CAAC,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC;QAC3D,QAAQ,IAAI,cAAc,IAAI,CAAC,OAAO,IAAI,KAAK,IAAI,CAAC;QACpD,QAAQ,IAAI,cAAc,IAAI,CAAC,OAAO,IAAI,KAAK,IAAI,CAAC;QACpD,QAAQ,IAAI,WAAW,IAAI,CAAC,IAAI,MAAM,CAAC;IAC3C,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAA,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -0,0 +1,23 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import chalk from "chalk";
11
+ export const populateAnalysisFindings = (db, findings) => __awaiter(void 0, void 0, void 0, function* () {
12
+ // Clear the table before inserting new data
13
+ db.prepare(`DELETE FROM analysis_findings`).run();
14
+ const insert = db.prepare(`INSERT INTO analysis_findings (ruleId, ruleName, ruleType, ruleDescription, ruleAuthor, ruleTech, severity, message, findingLocation) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`);
15
+ const insertMany = db.transaction((items) => {
16
+ for (const item of items) {
17
+ insert.run(item.ruleId, item.ruleName, item.ruleType, item.ruleDescription, item.ruleAuthor, item.ruleTech, item.severity, item.message, item.findingLocation);
18
+ }
19
+ });
20
+ insertMany(findings);
21
+ console.log(chalk.green("[✓] Populated analysis findings into the database..."));
22
+ });
23
+ //# sourceMappingURL=populateAnalysisFindings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"populateAnalysisFindings.js","sourceRoot":"","sources":["../../../../src/report/utility/populateDb/populateAnalysisFindings.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAO,EAAqB,EAAE,QAAwB,EAAE,EAAE;IAC9F,4CAA4C;IAC5C,EAAE,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,GAAG,EAAE,CAAC;IAElD,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACrB,0KAA0K,CAC7K,CAAC;IAEF,MAAM,UAAU,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,EAAE;QACxC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,CACN,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,eAAe,CACvB,CAAC;QACN,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,QAAQ,CAAC,CAAC;IACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC,CAAC;AACrF,CAAC,CAAA,CAAC"}
@@ -0,0 +1,42 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import chalk from "chalk";
11
+ const populateEndpoints = (db, endpoints) => __awaiter(void 0, void 0, void 0, function* () {
12
+ const insert = db.prepare("INSERT OR IGNORE INTO endpoints (url) VALUES (?)");
13
+ // clear the endpoints table
14
+ db.prepare("DELETE FROM endpoints").run();
15
+ const insertPaths = (base, paths) => {
16
+ for (const path in paths) {
17
+ // The path is the key itself, which is a full path
18
+ const fullUrl = base + path;
19
+ try {
20
+ insert.run(fullUrl);
21
+ }
22
+ catch (error) {
23
+ // Ignore unique constraint errors if a URL is already present
24
+ if (!error.message.includes("UNIQUE constraint failed")) {
25
+ console.error(`Error inserting ${fullUrl}:`, error);
26
+ }
27
+ }
28
+ // Recursively process nested paths
29
+ if (Object.keys(paths[path]).length > 0) {
30
+ insertPaths(base, paths[path]);
31
+ }
32
+ }
33
+ };
34
+ db.transaction(() => {
35
+ for (const baseUrl in endpoints) {
36
+ insertPaths(baseUrl, endpoints[baseUrl]);
37
+ }
38
+ })();
39
+ console.log(chalk.green("[✓] Populated endpoints into the database..."));
40
+ });
41
+ export default populateEndpoints;
42
+ //# sourceMappingURL=populateEndpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"populateEndpoints.js","sourceRoot":"","sources":["../../../../src/report/utility/populateDb/populateEndpoints.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,iBAAiB,GAAG,CAAO,EAAqB,EAAE,SAAc,EAAE,EAAE;IACtE,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,kDAAkD,CAAC,CAAC;IAE9E,4BAA4B;IAC5B,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,GAAG,EAAE,CAAC;IAE1C,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,EAAE;QAChD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,mDAAmD;YACnD,MAAM,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;YAC5B,IAAI,CAAC;gBACD,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,8DAA8D;gBAC9D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,CAAC;oBACtD,OAAO,CAAC,KAAK,CAAC,mBAAmB,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC;gBACxD,CAAC;YACL,CAAC;YAED,mCAAmC;YACnC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACnC,CAAC;QACL,CAAC;IACL,CAAC,CAAC;IAEF,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QAChB,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;YAC9B,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7C,CAAC;IACL,CAAC,CAAC,EAAE,CAAC;IAEL,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC,CAAC;AAC7E,CAAC,CAAA,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,23 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import chalk from "chalk";
11
+ export const populateMappedJson = (db, chunks) => __awaiter(void 0, void 0, void 0, function* () {
12
+ // Clear the table before inserting new data
13
+ db.prepare(`DELETE FROM mapped`).run();
14
+ const insert = db.prepare(`INSERT INTO mapped (id, description, loadedOn, containsFetch, isAxiosClient, exports, callStack, code, imports, file) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
15
+ const insertMany = db.transaction((items) => {
16
+ for (const item of items) {
17
+ insert.run(item.id, item.description, JSON.stringify(item.loadedOn), item.containsFetch ? 1 : 0, item.isAxiosClient ? 1 : 0, JSON.stringify(item.exports), JSON.stringify(item.callStack), item.code, JSON.stringify(item.imports), item.file);
18
+ }
19
+ });
20
+ insertMany(Object.values(chunks));
21
+ console.log(chalk.green("[✓] Populated mapped data into the database..."));
22
+ });
23
+ //# sourceMappingURL=populateMappedJson.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"populateMappedJson.js","sourceRoot":"","sources":["../../../../src/report/utility/populateDb/populateMappedJson.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAO,EAAqB,EAAE,MAAc,EAAE,EAAE;IAC9E,4CAA4C;IAC5C,EAAE,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,GAAG,EAAE,CAAC;IAEvC,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACrB,6JAA6J,CAChK,CAAC;IAEF,MAAM,UAAU,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,EAAE;QACxC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,CACN,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAC7B,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC1B,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC1B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAC5B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAC9B,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAC5B,IAAI,CAAC,IAAI,CACZ,CAAC;QACN,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC,CAAC;AAC/E,CAAC,CAAA,CAAC"}
@@ -0,0 +1,41 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import chalk from "chalk";
11
+ const populateMappedOpenapi = (db, openapi) => __awaiter(void 0, void 0, void 0, function* () {
12
+ const insert = db.prepare(`INSERT OR REPLACE INTO mapped_openapi (path, method, summary, parameters, requestBody, tags)
13
+ VALUES (@path, @method, @summary, @parameters, @requestBody, @tags)`);
14
+ db.transaction(() => {
15
+ if (!openapi.paths) {
16
+ return;
17
+ }
18
+ for (const path in openapi.paths) {
19
+ const methods = openapi.paths[path];
20
+ for (const method in methods) {
21
+ const details = methods[method];
22
+ try {
23
+ insert.run({
24
+ path: path,
25
+ method: method,
26
+ summary: details.summary || null,
27
+ parameters: details.parameters ? JSON.stringify(details.parameters) : null,
28
+ requestBody: details.requestBody ? JSON.stringify(details.requestBody) : null,
29
+ tags: details.tags ? JSON.stringify(details.tags) : null,
30
+ });
31
+ }
32
+ catch (error) {
33
+ console.error(`Error inserting OpenAPI path: ${path} [${method}]`, error);
34
+ }
35
+ }
36
+ }
37
+ })();
38
+ console.log(chalk.green("[✓] Populated mapped openapi into the database..."));
39
+ });
40
+ export default populateMappedOpenapi;
41
+ //# sourceMappingURL=populateMappedOpenapi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"populateMappedOpenapi.js","sourceRoot":"","sources":["../../../../src/report/utility/populateDb/populateMappedOpenapi.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,qBAAqB,GAAG,CAAO,EAAqB,EAAE,OAAY,EAAE,EAAE;IACxE,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACrB;6EACqE,CACxE,CAAC;IAEF,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QAChB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO;QACX,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;gBAChC,IAAI,CAAC;oBACD,MAAM,CAAC,GAAG,CAAC;wBACP,IAAI,EAAE,IAAI;wBACV,MAAM,EAAE,MAAM;wBACd,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI;wBAChC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI;wBAC1E,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI;wBAC7E,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;qBAC3D,CAAC,CAAC;gBACP,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACb,OAAO,CAAC,KAAK,CAAC,iCAAiC,IAAI,KAAK,MAAM,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC9E,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC,CAAC,EAAE,CAAC;IAEL,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC;AAClF,CAAC,CAAA,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
@@ -15,6 +15,8 @@ import * as fs from "fs";
15
15
  import lazyLoad from "../lazyLoad/index.js";
16
16
  import chalk from "chalk";
17
17
  import CONFIG from "../globalConfig.js";
18
+ import analyze from "../analyze/index.js";
19
+ import report from "../report/index.js";
18
20
  export default (cmd) => __awaiter(void 0, void 0, void 0, function* () {
19
21
  globalsUtil.setApiGatewayConfigFile(cmd.apiGatewayConfig);
20
22
  globalsUtil.setUseApiGateway(cmd.apiGateway);
@@ -35,10 +37,10 @@ export default (cmd) => __awaiter(void 0, void 0, void 0, function* () {
35
37
  console.log(chalk.yellow(`[i] For advanced users: use the individual modules separately. See docs at ${CONFIG.modulesDocs}`));
36
38
  return;
37
39
  }
38
- const targetHost = new URL(cmd.url).host;
40
+ const targetHost = new URL(cmd.url).host.replace(":", "_");
39
41
  console.log(chalk.bgGreenBright("[+] Starting analysis..."));
40
- console.log(chalk.bgCyan("[1/6] Running lazyload to download JavaScript files..."));
41
- yield lazyLoad(cmd.url, cmd.output, cmd.strictScope, cmd.scope.split(","), cmd.threads, false, "");
42
+ console.log(chalk.bgCyan("[1/8] Running lazyload to download JavaScript files..."));
43
+ yield lazyLoad(cmd.url, cmd.output, cmd.strictScope, cmd.scope.split(","), cmd.threads, false, "", cmd.insecure);
42
44
  console.log(chalk.bgGreen("[+] Lazyload complete."));
43
45
  // if tech is undefined, i.e. it can't be detected, quit. Nothing to be done :(
44
46
  if (globalsUtil.getTech() === "") {
@@ -51,23 +53,24 @@ export default (cmd) => __awaiter(void 0, void 0, void 0, function* () {
51
53
  return;
52
54
  }
53
55
  // run strings
54
- console.log(chalk.bgCyan("[2/6] Running strings to extract endpoints..."));
56
+ console.log(chalk.bgCyan("[2/8] Running strings to extract endpoints..."));
55
57
  yield strings(cmd.output, "strings.json", true, "extracted_urls", false, false, false);
56
58
  console.log(chalk.bgGreen("[+] Strings complete."));
57
59
  // run lazyload with subsequent requests
58
- console.log(chalk.bgCyan("[3/6] Running lazyload with subsequent requests to download JavaScript files..."));
59
- yield lazyLoad(cmd.url, cmd.output, cmd.strictScope, cmd.scope.split(","), cmd.threads, true, "extracted_urls.json");
60
+ console.log(chalk.bgCyan("[3/8] Running lazyload with subsequent requests to download JavaScript files..."));
61
+ yield lazyLoad(cmd.url, cmd.output, cmd.strictScope, cmd.scope.split(","), cmd.threads, true, "extracted_urls.json", cmd.insecure);
60
62
  console.log(chalk.bgGreen("[+] Lazyload with subsequent requests complete."));
61
63
  // run strings again to extract endpoints from the files that are downloaded in the previous step
62
- console.log(chalk.bgCyan("[4/6] Running strings again to extract endpoints..."));
64
+ console.log(chalk.bgCyan("[4/8] Running strings again to extract endpoints..."));
63
65
  yield strings(cmd.output, "strings.json", true, "extracted_urls", cmd.secrets, true, true);
64
66
  console.log(chalk.bgGreen("[+] Strings complete."));
65
67
  // now, run map
66
- console.log(chalk.bgCyan("[5/6] Running map to find functions..."));
68
+ console.log(chalk.bgCyan("[5/8] Running map to find functions..."));
69
+ globalsUtil.setOpenapi(true);
67
70
  yield map(cmd.output + "/" + targetHost, "mapped", ["json"], globalsUtil.getTech(), false, false);
68
71
  console.log(chalk.bgGreen("[+] Map complete."));
69
72
  // now, run endpoints
70
- console.log(chalk.bgCyan("[6/6] Running endpoints to extract endpoints..."));
73
+ console.log(chalk.bgCyan("[6/8] Running endpoints to extract endpoints..."));
71
74
  // check if the subsequent requests directory exists
72
75
  if (fs.existsSync(`${cmd.output}/${targetHost}/___subsequent_requests`)) {
73
76
  yield endpoints(cmd.url, `${cmd.output}/${targetHost}/`, "endpoints", ["json"], "next", false, "mapped.json");
@@ -76,6 +79,16 @@ export default (cmd) => __awaiter(void 0, void 0, void 0, function* () {
76
79
  yield endpoints(cmd.url, undefined, "endpoints", ["json"], "next", false, "mapped.json");
77
80
  }
78
81
  console.log(chalk.bgGreen("[+] Endpoints complete."));
82
+ // run the analyze module now
83
+ console.log(chalk.bgCyan("[7/8] Running analyze to extract endpoints..."));
84
+ // since the thirs argument is tech, and it can't be "all", so adding type ignore
85
+ // @ts-ignore
86
+ yield analyze("", "mapped.json", globalsUtil.getTech(), false, "mapped-openapi.json", false, "analyze.json");
87
+ console.log(chalk.bgGreen("[+] Analyze complete."));
88
+ // run the report module now
89
+ console.log(chalk.bgCyan("[8/8] Running report module..."));
90
+ yield report("js-recon.db", "mapped.json", "analyze.json", "endpoints.json", "mapped-openapi.json", "report");
91
+ console.log(chalk.bgGreen("[+] Report complete."));
79
92
  console.log(chalk.bgGreenBright("[+] Analysis complete."));
80
93
  });
81
94
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/run/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/run/index.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,7 @@ const getURLDirectory = (url) => {
12
12
  // Remove filename (last part after final /) if it ends with .js or any file extension
13
13
  const dir = pathname.replace(/\/[^\/?#]+\.[^\/?#]+$/, "");
14
14
  return {
15
- host: u.host, // e.g., "vercel.com" or "localhost:3000"
15
+ host: u.host.replace(":", "_"), // e.g., "vercel.com" or "localhost_3000"
16
16
  directory: dir, // e.g., "/static/js"
17
17
  };
18
18
  };
@@ -1 +1 @@
1
- {"version":3,"file":"urlUtils.js","sourceRoot":"","sources":["../../src/utility/urlUtils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,EAAE;IAC5B,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;IAE5B,sFAAsF;IACtF,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;IAE1D,OAAO;QACH,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,yCAAyC;QACvD,SAAS,EAAE,GAAG,EAAE,qBAAqB;KACxC,CAAC;AACN,CAAC,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"urlUtils.js","sourceRoot":"","sources":["../../src/utility/urlUtils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,eAAe,GAAG,CAAC,GAAW,EAAE,EAAE;IACpC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;IAE5B,sFAAsF;IACtF,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;IAE1D,OAAO;QACH,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,yCAAyC;QACzE,SAAS,EAAE,GAAG,EAAE,qBAAqB;KACxC,CAAC;AACN,CAAC,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC"}