@shriyanss/js-recon 1.2.2 → 1.3.1-alpha.2
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 +52 -0
- package/build/analyze/engine/astEngine.js +65 -31
- package/build/analyze/engine/astEngine.js.map +1 -1
- package/build/analyze/helpers/engineHelpers/findMemberExpressionAssignment.js.map +1 -1
- package/build/analyze/helpers/engineHelpers/taintFlow.js +218 -0
- package/build/analyze/helpers/engineHelpers/taintFlow.js.map +1 -0
- package/build/analyze/helpers/schemas.js +2 -0
- package/build/analyze/helpers/schemas.js.map +1 -1
- package/build/endpoints/next_js/client_jsFilesHref.js +4 -2
- package/build/endpoints/next_js/client_jsFilesHref.js.map +1 -1
- package/build/endpoints/next_js/client_mappedJsonFile.js.map +1 -1
- package/build/endpoints/next_js/client_subsequentRequests.js +12 -4
- package/build/endpoints/next_js/client_subsequentRequests.js.map +1 -1
- package/build/globalConfig.js +1 -1
- package/build/globalConfig.js.map +1 -1
- package/build/index.js +16 -2
- package/build/index.js.map +1 -1
- package/build/lazyLoad/downloadFilesUtil.js +74 -80
- package/build/lazyLoad/downloadFilesUtil.js.map +1 -1
- package/build/lazyLoad/downloadLoadedJsUtil.js +1 -1
- package/build/lazyLoad/downloadLoadedJsUtil.js.map +1 -1
- package/build/lazyLoad/downloadQueue.js +186 -0
- package/build/lazyLoad/downloadQueue.js.map +1 -0
- package/build/lazyLoad/index.js +76 -89
- package/build/lazyLoad/index.js.map +1 -1
- package/build/lazyLoad/next_js/NextJsCrawler.js +109 -32
- package/build/lazyLoad/next_js/NextJsCrawler.js.map +1 -1
- package/build/lazyLoad/next_js/next_GetJSScript.js +20 -3
- package/build/lazyLoad/next_js/next_GetJSScript.js.map +1 -1
- package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js +1 -1
- package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js.map +1 -1
- package/build/lazyLoad/next_js/next_SubsequentRequests.js +24 -4
- package/build/lazyLoad/next_js/next_SubsequentRequests.js.map +1 -1
- package/build/lazyLoad/next_js/next_bruteForceJsFiles.js +8 -3
- package/build/lazyLoad/next_js/next_bruteForceJsFiles.js.map +1 -1
- package/build/lazyLoad/next_js/next_getClientSidePaths.js +83 -0
- package/build/lazyLoad/next_js/next_getClientSidePaths.js.map +1 -0
- package/build/lazyLoad/next_js/next_scriptTagsSubsequentRequests.js +10 -1
- package/build/lazyLoad/next_js/next_scriptTagsSubsequentRequests.js.map +1 -1
- package/build/lazyLoad/nuxt_js/nuxt_astParse.js.map +1 -1
- package/build/lazyLoad/react/react_getScriptTags.js +29 -0
- package/build/lazyLoad/react/react_getScriptTags.js.map +1 -0
- package/build/lazyLoad/react/react_sourcemapUrls.js +44 -0
- package/build/lazyLoad/react/react_sourcemapUrls.js.map +1 -0
- package/build/lazyLoad/react/react_webpackChunkPaths.js +188 -0
- package/build/lazyLoad/react/react_webpackChunkPaths.js.map +1 -0
- package/build/lazyLoad/techDetect/checkAngularJS.js +70 -0
- package/build/lazyLoad/techDetect/checkAngularJS.js.map +1 -0
- package/build/lazyLoad/techDetect/checkNextJS.js +45 -0
- package/build/lazyLoad/techDetect/checkNextJS.js.map +1 -0
- package/build/lazyLoad/techDetect/checkNuxtJS.js +39 -0
- package/build/lazyLoad/techDetect/checkNuxtJS.js.map +1 -0
- package/build/lazyLoad/techDetect/checkReact.js +55 -0
- package/build/lazyLoad/techDetect/checkReact.js.map +1 -0
- package/build/lazyLoad/techDetect/checkSvelte.js +69 -0
- package/build/lazyLoad/techDetect/checkSvelte.js.map +1 -0
- package/build/lazyLoad/techDetect/checkVueJS.js +118 -0
- package/build/lazyLoad/techDetect/checkVueJS.js.map +1 -0
- package/build/lazyLoad/techDetect/index.js +29 -258
- package/build/lazyLoad/techDetect/index.js.map +1 -1
- package/build/lazyLoad/vue/vue_RuntimeJs.js +122 -54
- package/build/lazyLoad/vue/vue_RuntimeJs.js.map +1 -1
- package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js +4 -0
- package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js.map +1 -1
- package/build/lazyLoad/vue/vue_discoverJsFiles.js +82 -0
- package/build/lazyLoad/vue/vue_discoverJsFiles.js.map +1 -0
- package/build/lazyLoad/vue/vue_getClientSidePaths.js +149 -0
- package/build/lazyLoad/vue/vue_getClientSidePaths.js.map +1 -0
- package/build/lazyLoad/vue/vue_jsImports.js +40 -34
- package/build/lazyLoad/vue/vue_jsImports.js.map +1 -1
- package/build/lazyLoad/vue/vue_pageSrc.js +60 -0
- package/build/lazyLoad/vue/vue_pageSrc.js.map +1 -0
- package/build/lazyLoad/vue/vue_reconstructSourceMaps.js +8 -0
- package/build/lazyLoad/vue/vue_reconstructSourceMaps.js.map +1 -1
- package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js +136 -0
- package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js.map +1 -0
- package/build/lazyLoad/vue/vue_severalJsFilesHome.js +5 -0
- package/build/lazyLoad/vue/vue_severalJsFilesHome.js.map +1 -1
- package/build/lazyLoad/vue/vue_stringJsFiles.js +142 -0
- package/build/lazyLoad/vue/vue_stringJsFiles.js.map +1 -0
- package/build/lazyLoad/vue/vue_viteMapDeps.js +89 -0
- package/build/lazyLoad/vue/vue_viteMapDeps.js.map +1 -0
- package/build/map/index.js +50 -0
- package/build/map/index.js.map +1 -1
- package/build/map/next_js/getExports.js +14 -6
- package/build/map/next_js/getExports.js.map +1 -1
- package/build/map/next_js/getFetchInstances.js +11 -5
- package/build/map/next_js/getFetchInstances.js.map +1 -1
- package/build/map/next_js/getTurbopackConnections.js +255 -0
- package/build/map/next_js/getTurbopackConnections.js.map +1 -0
- package/build/map/next_js/getWebpackConnections.js +3 -4
- package/build/map/next_js/getWebpackConnections.js.map +1 -1
- package/build/map/next_js/resolveAxios.js +24 -5
- package/build/map/next_js/resolveAxios.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/astNodeToJsonString.js +2 -2
- package/build/map/next_js/resolveAxiosHelpers/astNodeToJsonString.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js +25 -15
- package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/handleAxiosCreate.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/interceptorHeaders.js +206 -0
- package/build/map/next_js/resolveAxiosHelpers/interceptorHeaders.js.map +1 -0
- package/build/map/next_js/resolveAxiosHelpers/processAxiosCall.js +25 -8
- package/build/map/next_js/resolveAxiosHelpers/processAxiosCall.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/processDirectAxiosCall.js +14 -6
- package/build/map/next_js/resolveAxiosHelpers/processDirectAxiosCall.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/traceAxiosInstanceExports.js +22 -10
- package/build/map/next_js/resolveAxiosHelpers/traceAxiosInstanceExports.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/traceBody.js +913 -0
- package/build/map/next_js/resolveAxiosHelpers/traceBody.js.map +1 -0
- package/build/map/next_js/resolveFetch.js +117 -4
- package/build/map/next_js/resolveFetch.js.map +1 -1
- package/build/map/next_js/resolveNewRequest.js +749 -0
- package/build/map/next_js/resolveNewRequest.js.map +1 -0
- package/build/map/next_js/utils.js +311 -49
- package/build/map/next_js/utils.js.map +1 -1
- package/build/map/vue_js/getViteConnections.js +293 -0
- package/build/map/vue_js/getViteConnections.js.map +1 -0
- package/build/map/vue_js/interactive.js +39 -0
- package/build/map/vue_js/interactive.js.map +1 -0
- package/build/map/vue_js/interactive_helpers/commandHandler.js +285 -0
- package/build/map/vue_js/interactive_helpers/commandHandler.js.map +1 -0
- package/build/map/vue_js/interactive_helpers/commandHelpers.js +39 -0
- package/build/map/vue_js/interactive_helpers/commandHelpers.js.map +1 -0
- package/build/map/vue_js/interactive_helpers/helpMenu.js +11 -0
- package/build/map/vue_js/interactive_helpers/helpMenu.js.map +1 -0
- package/build/map/vue_js/vue_resolveFetch.js +155 -0
- package/build/map/vue_js/vue_resolveFetch.js.map +1 -0
- package/build/mcp/cli.js +381 -0
- package/build/mcp/cli.js.map +1 -0
- package/build/mcp/commands.js +147 -0
- package/build/mcp/commands.js.map +1 -0
- package/build/mcp/config.js +68 -0
- package/build/mcp/config.js.map +1 -0
- package/build/mcp/index.js +29 -0
- package/build/mcp/index.js.map +1 -0
- package/build/mcp/providers.js +153 -0
- package/build/mcp/providers.js.map +1 -0
- package/build/mcp/tools.js +185 -0
- package/build/mcp/tools.js.map +1 -0
- package/build/run/index.js +40 -16
- package/build/run/index.js.map +1 -1
- package/build/strings/index.js +5 -1
- package/build/strings/index.js.map +1 -1
- package/build/utility/makeReq.js +90 -63
- package/build/utility/makeReq.js.map +1 -1
- package/build/utility/openapiGenerator.js +46 -2
- package/build/utility/openapiGenerator.js.map +1 -1
- package/build/utility/postmanGenerator.js +163 -0
- package/build/utility/postmanGenerator.js.map +1 -0
- package/build/utility/puppeteerInstance.js +5 -0
- package/build/utility/puppeteerInstance.js.map +1 -0
- package/package.json +11 -4
|
@@ -0,0 +1,70 @@
|
|
|
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 makeRequest from "../../utility/makeReq.js";
|
|
11
|
+
const checkAngularJS = ($, url) => __awaiter(void 0, void 0, void 0, function* () {
|
|
12
|
+
let detected = false;
|
|
13
|
+
let evidence = "";
|
|
14
|
+
// to detect angular js, first check if it has something like `main-*.js` or `main.js` in script src
|
|
15
|
+
let hasMainJs = false;
|
|
16
|
+
let mainJsURL = undefined;
|
|
17
|
+
$("script").each((_, el) => {
|
|
18
|
+
const tag = $(el).get(0).tagName;
|
|
19
|
+
const attribs = el.attribs;
|
|
20
|
+
if (attribs) {
|
|
21
|
+
for (const [attrName, attrValue] of Object.entries(attribs)) {
|
|
22
|
+
if (attrName === "src") {
|
|
23
|
+
// @ts-ignore
|
|
24
|
+
if (attrValue.includes("main-")) {
|
|
25
|
+
hasMainJs = true;
|
|
26
|
+
// if the url starts with `main-...`, then build the full url
|
|
27
|
+
if (!attrValue.startsWith("http")) {
|
|
28
|
+
mainJsURL = new URL(attrValue, url).href;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
mainJsURL = attrValue;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
// now, get the contents of the main.js file
|
|
39
|
+
if (hasMainJs) {
|
|
40
|
+
const mainJsRes = yield makeRequest(mainJsURL, {});
|
|
41
|
+
const mainJsBody = yield mainJsRes.text();
|
|
42
|
+
// check if the traces of angular js are present
|
|
43
|
+
// using regex for this, as this is simple and fast
|
|
44
|
+
// check: isAngularZone(), "isAngularZone", this.ngZone
|
|
45
|
+
// if lazyload enabled, need to check routerlink: `["routerLink",`
|
|
46
|
+
const isAngularZoneRegex = /isAngularZone\(\)/;
|
|
47
|
+
const isAngularZoneRegex2 = /"isAngularZone"/;
|
|
48
|
+
const ngZoneRegex = /this\.ngZone/;
|
|
49
|
+
const routerLinkRegex = /"routerLink"/;
|
|
50
|
+
if (isAngularZoneRegex.test(mainJsBody)) {
|
|
51
|
+
detected = true;
|
|
52
|
+
evidence = "isAngularZone()";
|
|
53
|
+
}
|
|
54
|
+
else if (isAngularZoneRegex2.test(mainJsBody)) {
|
|
55
|
+
detected = true;
|
|
56
|
+
evidence = '"isAngularZone"';
|
|
57
|
+
}
|
|
58
|
+
else if (ngZoneRegex.test(mainJsBody)) {
|
|
59
|
+
detected = true;
|
|
60
|
+
evidence = "this.ngZone";
|
|
61
|
+
}
|
|
62
|
+
else if (routerLinkRegex.test(mainJsBody)) {
|
|
63
|
+
detected = true;
|
|
64
|
+
evidence = "routerLink";
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return { detected, evidence };
|
|
68
|
+
});
|
|
69
|
+
export { checkAngularJS };
|
|
70
|
+
//# sourceMappingURL=checkAngularJS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkAngularJS.js","sourceRoot":"","sources":["../../../src/lazyLoad/techDetect/checkAngularJS.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,WAAW,MAAM,0BAA0B,CAAC;AAEnD,MAAM,cAAc,GAAG,CAAO,CAAqB,EAAE,GAAW,EAAE,EAAE;IAChE,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,QAAQ,GAAG,EAAE,CAAC;IAElB,oGAAoG;IACpG,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,SAAS,GAAuB,SAAS,CAAC;IAC9C,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;QACvB,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACjC,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;QAC3B,IAAI,OAAO,EAAE,CAAC;YACV,KAAK,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1D,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;oBACrB,aAAa;oBACb,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC9B,SAAS,GAAG,IAAI,CAAC;wBAEjB,6DAA6D;wBAC7D,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;4BAChC,SAAS,GAAG,IAAI,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC;wBAC7C,CAAC;6BAAM,CAAC;4BACJ,SAAS,GAAG,SAAS,CAAC;wBAC1B,CAAC;oBACL,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,4CAA4C;IAC5C,IAAI,SAAS,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;QAE1C,gDAAgD;QAChD,mDAAmD;QAEnD,uDAAuD;QACvD,kEAAkE;QAClE,MAAM,kBAAkB,GAAG,mBAAmB,CAAC;QAC/C,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;QAC9C,MAAM,WAAW,GAAG,cAAc,CAAC;QACnC,MAAM,eAAe,GAAG,cAAc,CAAC;QAEvC,IAAI,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACtC,QAAQ,GAAG,IAAI,CAAC;YAChB,QAAQ,GAAG,iBAAiB,CAAC;QACjC,CAAC;aAAM,IAAI,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9C,QAAQ,GAAG,IAAI,CAAC;YAChB,QAAQ,GAAG,iBAAiB,CAAC;QACjC,CAAC;aAAM,IAAI,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACtC,QAAQ,GAAG,IAAI,CAAC;YAChB,QAAQ,GAAG,aAAa,CAAC;QAC7B,CAAC;aAAM,IAAI,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1C,QAAQ,GAAG,IAAI,CAAC;YAChB,QAAQ,GAAG,YAAY,CAAC;QAC5B,CAAC;IACL,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAClC,CAAC,CAAA,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,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
|
+
/**
|
|
11
|
+
* Checks if a webpage uses Next.js by iterating through all HTML tags and checking if any src, srcset, or imageSrcSet attribute value starts with "/_next/".
|
|
12
|
+
* @returns {Promise<{detected: boolean, evidence: string}>}
|
|
13
|
+
* A promise that resolves to an object with two properties:
|
|
14
|
+
* - detected: A boolean indicating whether Next.js was detected.
|
|
15
|
+
* - evidence: A string with the evidence of the detection, or an empty string
|
|
16
|
+
* if Next.js was not detected.
|
|
17
|
+
*/
|
|
18
|
+
export const checkNextJS = ($) => __awaiter(void 0, void 0, void 0, function* () {
|
|
19
|
+
let detected = false;
|
|
20
|
+
let evidence = "";
|
|
21
|
+
// iterate through each HTML tag, and file tag value that starts with `/_next/`
|
|
22
|
+
$("*").each((_, el) => {
|
|
23
|
+
const tag = $(el).get(0).tagName;
|
|
24
|
+
// check the value of three attributes
|
|
25
|
+
const src = $(el).attr("src");
|
|
26
|
+
const srcSet = $(el).attr("srcset");
|
|
27
|
+
const imageSrcSet = $(el).attr("imageSrcSet");
|
|
28
|
+
if (src || srcSet || imageSrcSet) {
|
|
29
|
+
if (src && src.includes("/_next/")) {
|
|
30
|
+
detected = true;
|
|
31
|
+
evidence = `${tag} :: ${src}`;
|
|
32
|
+
}
|
|
33
|
+
else if (srcSet && srcSet.includes("/_next/")) {
|
|
34
|
+
detected = true;
|
|
35
|
+
evidence = `${tag} :: ${srcSet}`;
|
|
36
|
+
}
|
|
37
|
+
else if (imageSrcSet && imageSrcSet.includes("/_next/")) {
|
|
38
|
+
detected = true;
|
|
39
|
+
evidence = `${tag} :: ${imageSrcSet}`;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
return { detected, evidence };
|
|
44
|
+
});
|
|
45
|
+
//# sourceMappingURL=checkNextJS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkNextJS.js","sourceRoot":"","sources":["../../../src/lazyLoad/techDetect/checkNextJS.ts"],"names":[],"mappings":";;;;;;;;;AAAA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAO,CAAC,EAAE,EAAE;IACnC,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,+EAA+E;IAC/E,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;QAClB,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAEjC,sCAAsC;QACtC,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAE9C,IAAI,GAAG,IAAI,MAAM,IAAI,WAAW,EAAE,CAAC;YAC/B,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBACjC,QAAQ,GAAG,IAAI,CAAC;gBAChB,QAAQ,GAAG,GAAG,GAAG,OAAO,GAAG,EAAE,CAAC;YAClC,CAAC;iBAAM,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC9C,QAAQ,GAAG,IAAI,CAAC;gBAChB,QAAQ,GAAG,GAAG,GAAG,OAAO,MAAM,EAAE,CAAC;YACrC,CAAC;iBAAM,IAAI,WAAW,IAAI,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBACxD,QAAQ,GAAG,IAAI,CAAC;gBAChB,QAAQ,GAAG,GAAG,GAAG,OAAO,WAAW,EAAE,CAAC;YAC1C,CAAC;QACL,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAClC,CAAC,CAAA,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
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
|
+
/**
|
|
11
|
+
* Detects if a webpage uses Nuxt.js by checking for "/_nuxt" paths in src or href attributes.
|
|
12
|
+
*
|
|
13
|
+
* @param $ - The Cheerio API object containing the parsed HTML
|
|
14
|
+
* @returns Promise that resolves to an object with detection status and evidence
|
|
15
|
+
*/
|
|
16
|
+
export const checkNuxtJS = ($) => __awaiter(void 0, void 0, void 0, function* () {
|
|
17
|
+
let detected = false;
|
|
18
|
+
let evidence = "";
|
|
19
|
+
// go through the page source, and check for "/_nuxt" in the src or href attribute
|
|
20
|
+
$("*").each((_, el) => {
|
|
21
|
+
// @ts-ignore
|
|
22
|
+
const tag = $(el).get(0).tagName;
|
|
23
|
+
// @ts-ignore
|
|
24
|
+
const attribs = el.attribs;
|
|
25
|
+
if (attribs) {
|
|
26
|
+
for (const [attrName, attrValue] of Object.entries(attribs)) {
|
|
27
|
+
if (attrName === "src" || attrName === "href") {
|
|
28
|
+
// @ts-ignore
|
|
29
|
+
if (attrValue.includes("/_nuxt")) {
|
|
30
|
+
detected = true;
|
|
31
|
+
evidence = `${attrName} :: ${attrValue}`;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
return { detected, evidence };
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=checkNuxtJS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkNuxtJS.js","sourceRoot":"","sources":["../../../src/lazyLoad/techDetect/checkNuxtJS.ts"],"names":[],"mappings":";;;;;;;;;AAEA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAO,CAAqB,EAAE,EAAE;IACvD,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,QAAQ,GAAG,EAAE,CAAC;IAElB,kFAAkF;IAClF,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;QAClB,aAAa;QACb,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACjC,aAAa;QACb,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;QAC3B,IAAI,OAAO,EAAE,CAAC;YACV,KAAK,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1D,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;oBAC5C,aAAa;oBACb,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC/B,QAAQ,GAAG,IAAI,CAAC;wBAChB,QAAQ,GAAG,GAAG,QAAQ,OAAO,SAAS,EAAE,CAAC;oBAC7C,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAClC,CAAC,CAAA,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
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 makeRequest from "../../utility/makeReq.js";
|
|
11
|
+
const checkReact = ($, url) => __awaiter(void 0, void 0, void 0, function* () {
|
|
12
|
+
let detected = false;
|
|
13
|
+
let evidence = "";
|
|
14
|
+
// to detect react, first go through all the <script src>
|
|
15
|
+
for (const el of $("script").get()) {
|
|
16
|
+
const attribs = el.attribs;
|
|
17
|
+
if (attribs) {
|
|
18
|
+
for (const [attrName, attrValue] of Object.entries(attribs)) {
|
|
19
|
+
if (attrName === "src") {
|
|
20
|
+
// get the src
|
|
21
|
+
const src = attrValue;
|
|
22
|
+
// Resolve src against the page URL — skip if it's malformed
|
|
23
|
+
// (e.g. `data:`, `javascript:` schemes, invalid URIs).
|
|
24
|
+
let resolvedUrl;
|
|
25
|
+
try {
|
|
26
|
+
resolvedUrl = new URL(src, url).href;
|
|
27
|
+
}
|
|
28
|
+
catch (_a) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
// makeRequest returns Response | null — skip when the fetch failed.
|
|
32
|
+
const res = yield makeRequest(resolvedUrl, {});
|
|
33
|
+
if (!res)
|
|
34
|
+
continue;
|
|
35
|
+
const body = yield res.text();
|
|
36
|
+
// check if the body contains "react" or "react-dom"
|
|
37
|
+
if (body.includes("__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED") &&
|
|
38
|
+
body.includes("__REACT_DEVTOOLS_GLOBAL_HOOK__")) {
|
|
39
|
+
detected = true;
|
|
40
|
+
evidence = `Found "__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED" and "__REACT_DEVTOOLS_GLOBAL_HOOK__" in ${src}`;
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
else if (body.includes("__reactRouterVersion")) {
|
|
44
|
+
detected = true;
|
|
45
|
+
evidence = `Found "__reactRouterVersion" in ${src}`;
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return { detected, evidence };
|
|
53
|
+
});
|
|
54
|
+
export { checkReact };
|
|
55
|
+
//# sourceMappingURL=checkReact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkReact.js","sourceRoot":"","sources":["../../../src/lazyLoad/techDetect/checkReact.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,WAAW,MAAM,0BAA0B,CAAC;AAGnD,MAAM,UAAU,GAAG,CAAO,CAAqB,EAAE,GAAW,EAAoD,EAAE;IAC9G,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,QAAQ,GAAG,EAAE,CAAC;IAElB,yDAAyD;IAEzD,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;QAC3B,IAAI,OAAO,EAAE,CAAC;YACV,KAAK,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1D,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;oBACrB,cAAc;oBACd,MAAM,GAAG,GAAG,SAAS,CAAC;oBAEtB,4DAA4D;oBAC5D,uDAAuD;oBACvD,IAAI,WAAmB,CAAC;oBACxB,IAAI,CAAC;wBACD,WAAW,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC;oBACzC,CAAC;oBAAC,WAAM,CAAC;wBACL,SAAS;oBACb,CAAC;oBAED,oEAAoE;oBACpE,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;oBAC/C,IAAI,CAAC,GAAG;wBAAE,SAAS;oBACnB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;oBAE9B,oDAAoD;oBACpD,IACI,IAAI,CAAC,QAAQ,CAAC,oDAAoD,CAAC;wBACnE,IAAI,CAAC,QAAQ,CAAC,gCAAgC,CAAC,EACjD,CAAC;wBACC,QAAQ,GAAG,IAAI,CAAC;wBAChB,QAAQ,GAAG,sGAAsG,GAAG,EAAE,CAAC;wBACvH,MAAM;oBACV,CAAC;yBAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;wBAC/C,QAAQ,GAAG,IAAI,CAAC;wBAChB,QAAQ,GAAG,mCAAmC,GAAG,EAAE,CAAC;wBACpD,MAAM;oBACV,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAClC,CAAC,CAAA,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
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
|
+
/**
|
|
11
|
+
* Detects if a webpage uses Svelte/SvelteKit by checking for Svelte-specific attributes.
|
|
12
|
+
*
|
|
13
|
+
* Looks for svelte- prefixed class names, IDs, and SvelteKit-specific attributes
|
|
14
|
+
* like data-sveltekit-reload to identify Svelte applications.
|
|
15
|
+
*
|
|
16
|
+
* @param $ - The Cheerio API object containing the parsed HTML
|
|
17
|
+
* @returns Promise that resolves to an object with detection status and evidence
|
|
18
|
+
*/
|
|
19
|
+
export const checkSvelte = ($) => __awaiter(void 0, void 0, void 0, function* () {
|
|
20
|
+
let detected = false;
|
|
21
|
+
let evidence = "";
|
|
22
|
+
// go through the page source, and check for all the class names of all HTML tags
|
|
23
|
+
$("*").each((_, el) => {
|
|
24
|
+
const tag = $(el).get(0).tagName;
|
|
25
|
+
const attribs = el.attribs;
|
|
26
|
+
if (attribs) {
|
|
27
|
+
for (const [attrName, attrValue] of Object.entries(attribs)) {
|
|
28
|
+
if (attrName === "class") {
|
|
29
|
+
// @ts-ignore
|
|
30
|
+
if (attrValue.includes("svelte-")) {
|
|
31
|
+
detected = true;
|
|
32
|
+
evidence = `${attrName} :: ${attrValue}`;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
// now, search for the svelte- id of all elements
|
|
39
|
+
$("*").each((_, el) => {
|
|
40
|
+
const tag = $(el).get(0).tagName;
|
|
41
|
+
const attribs = el.attribs;
|
|
42
|
+
if (attribs) {
|
|
43
|
+
for (const [attrName, attrValue] of Object.entries(attribs)) {
|
|
44
|
+
if (attrName === "id") {
|
|
45
|
+
// @ts-ignore
|
|
46
|
+
if (attrValue.includes("svelte-")) {
|
|
47
|
+
detected = true;
|
|
48
|
+
evidence = `${attrName} :: ${attrValue}`;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
// now, check for the data-sveltekit-reload attribute
|
|
55
|
+
$("*").each((_, el) => {
|
|
56
|
+
const tag = $(el).get(0).tagName;
|
|
57
|
+
const attribs = el.attribs;
|
|
58
|
+
if (attribs) {
|
|
59
|
+
for (const [attrName, attrValue] of Object.entries(attribs)) {
|
|
60
|
+
if (attrName === "data-sveltekit-reload") {
|
|
61
|
+
detected = true;
|
|
62
|
+
evidence = `${attrName} :: ${attrValue}`;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
return { detected, evidence };
|
|
68
|
+
});
|
|
69
|
+
//# sourceMappingURL=checkSvelte.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkSvelte.js","sourceRoot":"","sources":["../../../src/lazyLoad/techDetect/checkSvelte.ts"],"names":[],"mappings":";;;;;;;;;AAAA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAO,CAAC,EAAE,EAAE;IACnC,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,QAAQ,GAAG,EAAE,CAAC;IAElB,iFAAiF;IACjF,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;QAClB,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACjC,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;QAC3B,IAAI,OAAO,EAAE,CAAC;YACV,KAAK,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1D,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;oBACvB,aAAa;oBACb,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;wBAChC,QAAQ,GAAG,IAAI,CAAC;wBAChB,QAAQ,GAAG,GAAG,QAAQ,OAAO,SAAS,EAAE,CAAC;oBAC7C,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,iDAAiD;IACjD,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;QAClB,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACjC,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;QAC3B,IAAI,OAAO,EAAE,CAAC;YACV,KAAK,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1D,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;oBACpB,aAAa;oBACb,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;wBAChC,QAAQ,GAAG,IAAI,CAAC;wBAChB,QAAQ,GAAG,GAAG,QAAQ,OAAO,SAAS,EAAE,CAAC;oBAC7C,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,qDAAqD;IACrD,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;QAClB,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACjC,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;QAC3B,IAAI,OAAO,EAAE,CAAC;YACV,KAAK,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1D,IAAI,QAAQ,KAAK,uBAAuB,EAAE,CAAC;oBACvC,QAAQ,GAAG,IAAI,CAAC;oBAChB,QAAQ,GAAG,GAAG,QAAQ,OAAO,SAAS,EAAE,CAAC;gBAC7C,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAClC,CAAC,CAAA,CAAC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
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 makeRequest from "../../utility/makeReq.js";
|
|
11
|
+
/**
|
|
12
|
+
* Checks if a webpage uses Vue.js by iterating through all HTML tags and checking if any attribute name starts with "data-v-".
|
|
13
|
+
* @returns {Promise<{detected: boolean, evidence: string}>}
|
|
14
|
+
* A promise that resolves to an object with two properties:
|
|
15
|
+
* - detected: A boolean indicating whether Vue.js was detected.
|
|
16
|
+
* - evidence: A string with the evidence of the detection, or an empty string
|
|
17
|
+
* if Vue.js was not detected.
|
|
18
|
+
*/
|
|
19
|
+
const checkVueJS = ($, url) => __awaiter(void 0, void 0, void 0, function* () {
|
|
20
|
+
let detected = false;
|
|
21
|
+
let evidence = "";
|
|
22
|
+
$("*").each((_, el) => {
|
|
23
|
+
const tag = $(el).get(0).tagName;
|
|
24
|
+
const attribs = el.attribs;
|
|
25
|
+
if (attribs) {
|
|
26
|
+
for (const [attrName, attrValue] of Object.entries(attribs)) {
|
|
27
|
+
if (attrName.startsWith("data-v-")) {
|
|
28
|
+
detected = true;
|
|
29
|
+
evidence = `${tag} :: ${attrName}`;
|
|
30
|
+
}
|
|
31
|
+
else if (attrName.startsWith("data-vue-")) {
|
|
32
|
+
detected = true;
|
|
33
|
+
evidence = `${tag} :: ${attrName}`;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
if (detected) {
|
|
39
|
+
return { detected, evidence };
|
|
40
|
+
}
|
|
41
|
+
// now, iterate through all the script tags, and find something like `app.js`
|
|
42
|
+
let appJsURL;
|
|
43
|
+
$("script").each((_, el) => {
|
|
44
|
+
const tag = $(el).get(0).tagName;
|
|
45
|
+
const attribs = el.attribs;
|
|
46
|
+
if (attribs) {
|
|
47
|
+
for (const [attrName, attrValue] of Object.entries(attribs)) {
|
|
48
|
+
if (attrName === "src") {
|
|
49
|
+
// @ts-ignore
|
|
50
|
+
if (attrValue.includes("app.js")) {
|
|
51
|
+
// get the URL of the app.js file
|
|
52
|
+
// @ts-ignore
|
|
53
|
+
if (attrValue.startsWith("/")) {
|
|
54
|
+
// @ts-ignore
|
|
55
|
+
appJsURL = new URL(attrValue, url).href;
|
|
56
|
+
// @ts-ignore
|
|
57
|
+
}
|
|
58
|
+
else if (attrValue.startsWith("http")) {
|
|
59
|
+
// @ts-ignore
|
|
60
|
+
appJsURL = attrValue;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// @ts-ignore
|
|
64
|
+
appJsURL = new URL(attrValue, url).href;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
if (appJsURL) {
|
|
72
|
+
const appJsContent = yield makeRequest(appJsURL).then((res) => res.text());
|
|
73
|
+
if (appJsContent) {
|
|
74
|
+
if (appJsContent.includes("Vue.component(")) {
|
|
75
|
+
detected = true;
|
|
76
|
+
evidence = `${appJsURL} :: Vue.component()`;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (detected) {
|
|
81
|
+
return { detected, evidence };
|
|
82
|
+
}
|
|
83
|
+
// collect script[src] and link[rel="modulepreload"][href] URLs
|
|
84
|
+
const assetURLs = [];
|
|
85
|
+
$("script[src]").each((_, el) => {
|
|
86
|
+
const src = $(el).attr("src");
|
|
87
|
+
if (src) {
|
|
88
|
+
try {
|
|
89
|
+
assetURLs.push(new URL(src, url).href);
|
|
90
|
+
}
|
|
91
|
+
catch (_a) { }
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
$('link[rel="modulepreload"][href]').each((_, el) => {
|
|
95
|
+
const href = $(el).attr("href");
|
|
96
|
+
if (href) {
|
|
97
|
+
try {
|
|
98
|
+
assetURLs.push(new URL(href, url).href);
|
|
99
|
+
}
|
|
100
|
+
catch (_a) { }
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
for (const assetURL of assetURLs) {
|
|
104
|
+
try {
|
|
105
|
+
const res = yield makeRequest(assetURL);
|
|
106
|
+
if (!res)
|
|
107
|
+
continue;
|
|
108
|
+
const content = yield res.text();
|
|
109
|
+
if (content && content.toLowerCase().includes("__vue")) {
|
|
110
|
+
return { detected: true, evidence: `__vue in ${assetURL}` };
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (_a) { }
|
|
114
|
+
}
|
|
115
|
+
return { detected, evidence };
|
|
116
|
+
});
|
|
117
|
+
export { checkVueJS };
|
|
118
|
+
//# sourceMappingURL=checkVueJS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkVueJS.js","sourceRoot":"","sources":["../../../src/lazyLoad/techDetect/checkVueJS.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,WAAW,MAAM,0BAA0B,CAAC;AAGnD;;;;;;;GAOG;AACH,MAAM,UAAU,GAAG,CAAO,CAAC,EAAE,GAAW,EAAE,EAAE;IACxC,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,QAAQ,GAAG,EAAE,CAAC;IAElB,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;QAClB,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACjC,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;QAC3B,IAAI,OAAO,EAAE,CAAC;YACV,KAAK,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1D,IAAI,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBACjC,QAAQ,GAAG,IAAI,CAAC;oBAChB,QAAQ,GAAG,GAAG,GAAG,OAAO,QAAQ,EAAE,CAAC;gBACvC,CAAC;qBAAM,IAAI,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC1C,QAAQ,GAAG,IAAI,CAAC;oBAChB,QAAQ,GAAG,GAAG,GAAG,OAAO,QAAQ,EAAE,CAAC;gBACvC,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC,CAAC,CAAC;IACH,IAAI,QAAQ,EAAE,CAAC;QACX,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAClC,CAAC;IAED,6EAA6E;IAC7E,IAAI,QAA4B,CAAC;IACjC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;QACvB,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACjC,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;QAC3B,IAAI,OAAO,EAAE,CAAC;YACV,KAAK,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1D,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;oBACrB,aAAa;oBACb,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC/B,iCAAiC;wBACjC,aAAa;wBACb,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;4BAC5B,aAAa;4BACb,QAAQ,GAAG,IAAI,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC;4BACxC,aAAa;wBACjB,CAAC;6BAAM,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;4BACtC,aAAa;4BACb,QAAQ,GAAG,SAAS,CAAC;wBACzB,CAAC;6BAAM,CAAC;4BACJ,aAAa;4BACb,QAAQ,GAAG,IAAI,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC;wBAC5C,CAAC;oBACL,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,QAAQ,EAAE,CAAC;QACX,MAAM,YAAY,GAAW,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACnF,IAAI,YAAY,EAAE,CAAC;YACf,IAAI,YAAY,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAC1C,QAAQ,GAAG,IAAI,CAAC;gBAChB,QAAQ,GAAG,GAAG,QAAQ,qBAAqB,CAAC;YAChD,CAAC;QACL,CAAC;IACL,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACX,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAClC,CAAC;IAED,+DAA+D;IAC/D,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAS,EAAE,EAAgC,EAAE,EAAE;QAClE,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,GAAG,EAAE,CAAC;YACN,IAAI,CAAC;gBACD,SAAS,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3C,CAAC;YAAC,WAAM,CAAC,CAAA,CAAC;QACd,CAAC;IACL,CAAC,CAAC,CAAC;IACH,CAAC,CAAC,iCAAiC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAS,EAAE,EAAgC,EAAE,EAAE;QACtF,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,IAAI,EAAE,CAAC;YACP,IAAI,CAAC;gBACD,SAAS,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;YAC5C,CAAC;YAAC,WAAM,CAAC,CAAA,CAAC;QACd,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;YACxC,IAAI,CAAC,GAAG;gBAAE,SAAS;YACnB,MAAM,OAAO,GAAW,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YACzC,IAAI,OAAO,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,QAAQ,EAAE,EAAE,CAAC;YAChE,CAAC;QACL,CAAC;QAAC,WAAM,CAAC,CAAA,CAAC;IACd,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAClC,CAAC,CAAA,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,CAAC"}
|