@js-recon/js-recon 1.3.1-beta.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/.gitattributes +2 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +29 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- package/.github/ISSUE_TEMPLATE/new_tech_support_request.md +26 -0
- package/.github/workflows/build-and-prettify.yaml +121 -0
- package/.github/workflows/pr_checker.yml +22 -0
- package/.github/workflows/publish-js-recon.yml +169 -0
- package/.prettierignore +2 -0
- package/.prettierrc +6 -0
- package/CHANGELOG.md +692 -0
- package/CLAUDE.md +290 -0
- package/Dockerfile +34 -0
- package/LICENSE +21 -0
- package/README.md +101 -0
- package/SECURITY.md +37 -0
- package/build/analyze/engine/astEngine.js +224 -0
- package/build/analyze/engine/astEngine.js.map +1 -0
- package/build/analyze/engine/index.js +59 -0
- package/build/analyze/engine/index.js.map +1 -0
- package/build/analyze/engine/requestEngine.js +100 -0
- package/build/analyze/engine/requestEngine.js.map +1 -0
- package/build/analyze/helpers/engineHelpers/findDirectAssignment.js +37 -0
- package/build/analyze/helpers/engineHelpers/findDirectAssignment.js.map +1 -0
- package/build/analyze/helpers/engineHelpers/findMemberExpressionAssignment.js +29 -0
- package/build/analyze/helpers/engineHelpers/findMemberExpressionAssignment.js.map +1 -0
- package/build/analyze/helpers/engineHelpers/resolveFunctionIdentifier.js +38 -0
- package/build/analyze/helpers/engineHelpers/resolveFunctionIdentifier.js.map +1 -0
- package/build/analyze/helpers/engineHelpers/taintFlow.js +250 -0
- package/build/analyze/helpers/engineHelpers/taintFlow.js.map +1 -0
- package/build/analyze/helpers/initRules.js +111 -0
- package/build/analyze/helpers/initRules.js.map +1 -0
- package/build/analyze/helpers/outputHelper.js +14 -0
- package/build/analyze/helpers/outputHelper.js.map +1 -0
- package/build/analyze/helpers/schemas.js +57 -0
- package/build/analyze/helpers/schemas.js.map +1 -0
- package/build/analyze/helpers/validate.js +89 -0
- package/build/analyze/helpers/validate.js.map +1 -0
- package/build/analyze/index.js +150 -0
- package/build/analyze/index.js.map +1 -0
- package/build/analyze/types/index.js +2 -0
- package/build/analyze/types/index.js.map +1 -0
- package/build/api_gateway/checkFeasibility.js +41 -0
- package/build/api_gateway/checkFeasibility.js.map +1 -0
- package/build/api_gateway/checkFireWallBlocking.js +33 -0
- package/build/api_gateway/checkFireWallBlocking.js.map +1 -0
- package/build/api_gateway/genReq.js +205 -0
- package/build/api_gateway/genReq.js.map +1 -0
- package/build/api_gateway/index.js +291 -0
- package/build/api_gateway/index.js.map +1 -0
- package/build/endpoints/gen_report/gen_json.js +30 -0
- package/build/endpoints/gen_report/gen_json.js.map +1 -0
- package/build/endpoints/gen_report/utility/iterate_n_store.js +64 -0
- package/build/endpoints/gen_report/utility/iterate_n_store.js.map +1 -0
- package/build/endpoints/index.js +101 -0
- package/build/endpoints/index.js.map +1 -0
- package/build/endpoints/next_js/client_jsFilesHref.js +100 -0
- package/build/endpoints/next_js/client_jsFilesHref.js.map +1 -0
- package/build/endpoints/next_js/client_jsonParse.js +89 -0
- package/build/endpoints/next_js/client_jsonParse.js.map +1 -0
- package/build/endpoints/next_js/client_mappedJsonFile.js +103 -0
- package/build/endpoints/next_js/client_mappedJsonFile.js.map +1 -0
- package/build/endpoints/next_js/client_subsequentRequests.js +211 -0
- package/build/endpoints/next_js/client_subsequentRequests.js.map +1 -0
- package/build/fingerprint/index.js +123 -0
- package/build/fingerprint/index.js.map +1 -0
- package/build/globalConfig.js +16 -0
- package/build/globalConfig.js.map +1 -0
- package/build/index.js +332 -0
- package/build/index.js.map +1 -0
- package/build/lazyLoad/angular/angular_getFromMainJs.js +55 -0
- package/build/lazyLoad/angular/angular_getFromMainJs.js.map +1 -0
- package/build/lazyLoad/angular/angular_getFromPageSource.js +43 -0
- package/build/lazyLoad/angular/angular_getFromPageSource.js.map +1 -0
- package/build/lazyLoad/downloadFilesUtil.js +127 -0
- package/build/lazyLoad/downloadFilesUtil.js.map +1 -0
- package/build/lazyLoad/downloadLoadedJsUtil.js +44 -0
- package/build/lazyLoad/downloadLoadedJsUtil.js.map +1 -0
- package/build/lazyLoad/downloadQueue.js +191 -0
- package/build/lazyLoad/downloadQueue.js.map +1 -0
- package/build/lazyLoad/globals.js +107 -0
- package/build/lazyLoad/globals.js.map +1 -0
- package/build/lazyLoad/index.js +377 -0
- package/build/lazyLoad/index.js.map +1 -0
- package/build/lazyLoad/next_js/NextJsCrawler.js +332 -0
- package/build/lazyLoad/next_js/NextJsCrawler.js.map +1 -0
- package/build/lazyLoad/next_js/next_GetJSScript.js +126 -0
- package/build/lazyLoad/next_js/next_GetJSScript.js.map +1 -0
- package/build/lazyLoad/next_js/next_GetLazyResourcesBuildManifestJs.js +83 -0
- package/build/lazyLoad/next_js/next_GetLazyResourcesBuildManifestJs.js.map +1 -0
- package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js +222 -0
- package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js.map +1 -0
- package/build/lazyLoad/next_js/next_SubsequentRequests.js +208 -0
- package/build/lazyLoad/next_js/next_SubsequentRequests.js.map +1 -0
- package/build/lazyLoad/next_js/next_bruteForceJsFiles.js +37 -0
- package/build/lazyLoad/next_js/next_bruteForceJsFiles.js.map +1 -0
- package/build/lazyLoad/next_js/next_buildId.js +55 -0
- package/build/lazyLoad/next_js/next_buildId.js.map +1 -0
- 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_globals.js +8 -0
- package/build/lazyLoad/next_js/next_globals.js.map +1 -0
- package/build/lazyLoad/next_js/next_parseLayoutJs.js +116 -0
- package/build/lazyLoad/next_js/next_parseLayoutJs.js.map +1 -0
- package/build/lazyLoad/next_js/next_promiseResolve.js +85 -0
- package/build/lazyLoad/next_js/next_promiseResolve.js.map +1 -0
- package/build/lazyLoad/next_js/next_scriptTagsSubsequentRequests.js +51 -0
- package/build/lazyLoad/next_js/next_scriptTagsSubsequentRequests.js.map +1 -0
- package/build/lazyLoad/nuxt_js/nuxt_astParse.js +202 -0
- package/build/lazyLoad/nuxt_js/nuxt_astParse.js.map +1 -0
- package/build/lazyLoad/nuxt_js/nuxt_getFromPageSource.js +82 -0
- package/build/lazyLoad/nuxt_js/nuxt_getFromPageSource.js.map +1 -0
- package/build/lazyLoad/nuxt_js/nuxt_stringAnalysisJSFiles.js +108 -0
- package/build/lazyLoad/nuxt_js/nuxt_stringAnalysisJSFiles.js.map +1 -0
- package/build/lazyLoad/react/react_followImports.js +105 -0
- package/build/lazyLoad/react/react_followImports.js.map +1 -0
- package/build/lazyLoad/react/react_getScriptTags.js +52 -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/sourcemap.js +188 -0
- package/build/lazyLoad/sourcemap.js.map +1 -0
- package/build/lazyLoad/svelte/svelte_discoverPagesFromJs.js +162 -0
- package/build/lazyLoad/svelte/svelte_discoverPagesFromJs.js.map +1 -0
- package/build/lazyLoad/svelte/svelte_getFromPageSource.js +91 -0
- package/build/lazyLoad/svelte/svelte_getFromPageSource.js.map +1 -0
- package/build/lazyLoad/svelte/svelte_recursivePageCrawl.js +180 -0
- package/build/lazyLoad/svelte/svelte_recursivePageCrawl.js.map +1 -0
- package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js +123 -0
- package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.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 +86 -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 +161 -0
- package/build/lazyLoad/techDetect/index.js.map +1 -0
- package/build/lazyLoad/vue/vue_RuntimeJs.js +169 -0
- package/build/lazyLoad/vue/vue_RuntimeJs.js.map +1 -0
- package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js +102 -0
- package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js.map +1 -0
- 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 +155 -0
- package/build/lazyLoad/vue/vue_getClientSidePaths.js.map +1 -0
- package/build/lazyLoad/vue/vue_jsImports.js +76 -0
- package/build/lazyLoad/vue/vue_jsImports.js.map +1 -0
- 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 +64 -0
- package/build/lazyLoad/vue/vue_reconstructSourceMaps.js.map +1 -0
- package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js +142 -0
- package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js.map +1 -0
- package/build/lazyLoad/vue/vue_severalJsFilesHome.js +57 -0
- package/build/lazyLoad/vue/vue_severalJsFilesHome.js.map +1 -0
- package/build/lazyLoad/vue/vue_sourcemapExtract.js +166 -0
- package/build/lazyLoad/vue/vue_sourcemapExtract.js.map +1 -0
- package/build/lazyLoad/vue/vue_stringJsFiles.js +148 -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/load/index.js +316 -0
- package/build/load/index.js.map +1 -0
- package/build/map/graphql/resolveGraphql.js +296 -0
- package/build/map/graphql/resolveGraphql.js.map +1 -0
- package/build/map/index.js +261 -0
- package/build/map/index.js.map +1 -0
- package/build/map/next_js/getAxiosInstances.js +64 -0
- package/build/map/next_js/getAxiosInstances.js.map +1 -0
- package/build/map/next_js/getExports.js +101 -0
- package/build/map/next_js/getExports.js.map +1 -0
- package/build/map/next_js/getFetchInstances.js +139 -0
- package/build/map/next_js/getFetchInstances.js.map +1 -0
- 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 +235 -0
- package/build/map/next_js/getWebpackConnections.js.map +1 -0
- package/build/map/next_js/interactive.js +69 -0
- package/build/map/next_js/interactive.js.map +1 -0
- package/build/map/next_js/interactive_helpers/commandHandler.js +310 -0
- package/build/map/next_js/interactive_helpers/commandHandler.js.map +1 -0
- package/build/map/next_js/interactive_helpers/commandHelpers.js +245 -0
- package/build/map/next_js/interactive_helpers/commandHelpers.js.map +1 -0
- package/build/map/next_js/interactive_helpers/esqueryGen.js +370 -0
- package/build/map/next_js/interactive_helpers/esqueryGen.js.map +1 -0
- package/build/map/next_js/interactive_helpers/helpMenu.js +12 -0
- package/build/map/next_js/interactive_helpers/helpMenu.js.map +1 -0
- package/build/map/next_js/interactive_helpers/inputPatch.js +207 -0
- package/build/map/next_js/interactive_helpers/inputPatch.js.map +1 -0
- package/build/map/next_js/interactive_helpers/keybindings.js +90 -0
- package/build/map/next_js/interactive_helpers/keybindings.js.map +1 -0
- package/build/map/next_js/interactive_helpers/printer.js +23 -0
- package/build/map/next_js/interactive_helpers/printer.js.map +1 -0
- package/build/map/next_js/interactive_helpers/ui.js +88 -0
- package/build/map/next_js/interactive_helpers/ui.js.map +1 -0
- package/build/map/next_js/resolveAxios.js +152 -0
- package/build/map/next_js/resolveAxios.js.map +1 -0
- package/build/map/next_js/resolveAxiosHelpers/astNodeToJsonString.js +64 -0
- package/build/map/next_js/resolveAxiosHelpers/astNodeToJsonString.js.map +1 -0
- package/build/map/next_js/resolveAxiosHelpers/directCallsWithoutAssignment.js +48 -0
- package/build/map/next_js/resolveAxiosHelpers/directCallsWithoutAssignment.js.map +1 -0
- package/build/map/next_js/resolveAxiosHelpers/findAxiosClients.js +34 -0
- package/build/map/next_js/resolveAxiosHelpers/findAxiosClients.js.map +1 -0
- package/build/map/next_js/resolveAxiosHelpers/findAxiosInstance.js +39 -0
- package/build/map/next_js/resolveAxiosHelpers/findAxiosInstance.js.map +1 -0
- package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js +312 -0
- package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js.map +1 -0
- package/build/map/next_js/resolveAxiosHelpers/handleAxiosCreate.js +173 -0
- package/build/map/next_js/resolveAxiosHelpers/handleAxiosCreate.js.map +1 -0
- package/build/map/next_js/resolveAxiosHelpers/handleZDotCreate.js +261 -0
- package/build/map/next_js/resolveAxiosHelpers/handleZDotCreate.js.map +1 -0
- 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 +168 -0
- package/build/map/next_js/resolveAxiosHelpers/processAxiosCall.js.map +1 -0
- package/build/map/next_js/resolveAxiosHelpers/processDirectAxiosCall.js +121 -0
- package/build/map/next_js/resolveAxiosHelpers/processDirectAxiosCall.js.map +1 -0
- package/build/map/next_js/resolveAxiosHelpers/processExportedEndpoints.js +274 -0
- package/build/map/next_js/resolveAxiosHelpers/processExportedEndpoints.js.map +1 -0
- package/build/map/next_js/resolveAxiosHelpers/traceAxiosInstanceExports.js +518 -0
- package/build/map/next_js/resolveAxiosHelpers/traceAxiosInstanceExports.js.map +1 -0
- 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 +533 -0
- package/build/map/next_js/resolveFetch.js.map +1 -0
- package/build/map/next_js/resolveNewRequest.js +749 -0
- package/build/map/next_js/resolveNewRequest.js.map +1 -0
- package/build/map/next_js/resolveServerActions.js +449 -0
- package/build/map/next_js/resolveServerActions.js.map +1 -0
- package/build/map/next_js/utils.js +1600 -0
- package/build/map/next_js/utils.js.map +1 -0
- package/build/map/react_js/getReactConnections.js +303 -0
- package/build/map/react_js/getReactConnections.js.map +1 -0
- package/build/map/react_js/interactive.js +4 -0
- package/build/map/react_js/interactive.js.map +1 -0
- package/build/map/react_js/react_resolveFetch.js +6 -0
- package/build/map/react_js/react_resolveFetch.js.map +1 -0
- package/build/map/svelte_js/interactive.js +58 -0
- package/build/map/svelte_js/interactive.js.map +1 -0
- package/build/map/svelte_js/interactive_helpers/commandHandler.js +4 -0
- package/build/map/svelte_js/interactive_helpers/commandHandler.js.map +1 -0
- package/build/map/vue_js/bodyResolver.js +477 -0
- package/build/map/vue_js/bodyResolver.js.map +1 -0
- package/build/map/vue_js/crossFileResolver.js +438 -0
- package/build/map/vue_js/crossFileResolver.js.map +1 -0
- package/build/map/vue_js/getViteConnections.js +343 -0
- package/build/map/vue_js/getViteConnections.js.map +1 -0
- package/build/map/vue_js/interactive.js +67 -0
- package/build/map/vue_js/interactive.js.map +1 -0
- package/build/map/vue_js/interactive_helpers/commandHandler.js +307 -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 +12 -0
- package/build/map/vue_js/interactive_helpers/helpMenu.js.map +1 -0
- package/build/map/vue_js/taint_utils.js +621 -0
- package/build/map/vue_js/taint_utils.js.map +1 -0
- package/build/map/vue_js/vue_resolveFetch.js +416 -0
- package/build/map/vue_js/vue_resolveFetch.js.map +1 -0
- package/build/map/vue_js/vue_resolveHttpClient.js +738 -0
- package/build/map/vue_js/vue_resolveHttpClient.js.map +1 -0
- package/build/map/vue_js/vue_resolveXhr.js +282 -0
- package/build/map/vue_js/vue_resolveXhr.js.map +1 -0
- package/build/mcp/chatOneShot.js +101 -0
- package/build/mcp/chatOneShot.js.map +1 -0
- package/build/mcp/claudeCodeCreds.js +150 -0
- package/build/mcp/claudeCodeCreds.js.map +1 -0
- package/build/mcp/cli.js +372 -0
- package/build/mcp/cli.js.map +1 -0
- package/build/mcp/commands.js +227 -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 +50 -0
- package/build/mcp/index.js.map +1 -0
- package/build/mcp/intent.js +204 -0
- package/build/mcp/intent.js.map +1 -0
- package/build/mcp/jobs.js +199 -0
- package/build/mcp/jobs.js.map +1 -0
- package/build/mcp/mcpServer.js +241 -0
- package/build/mcp/mcpServer.js.map +1 -0
- package/build/mcp/providers.js +170 -0
- package/build/mcp/providers.js.map +1 -0
- package/build/mcp/skills.js +115 -0
- package/build/mcp/skills.js.map +1 -0
- package/build/mcp/tools.js +185 -0
- package/build/mcp/tools.js.map +1 -0
- package/build/refactor/index.js +85 -0
- package/build/refactor/index.js.map +1 -0
- package/build/refactor/next/index.js +109 -0
- package/build/refactor/next/index.js.map +1 -0
- package/build/refactor/react/index.js +636 -0
- package/build/refactor/react/index.js.map +1 -0
- package/build/report/index.js +68 -0
- package/build/report/index.js.map +1 -0
- package/build/report/utility/dataTables/genDataTablesPage.js +158 -0
- package/build/report/utility/dataTables/genDataTablesPage.js.map +1 -0
- package/build/report/utility/genHtml.js +516 -0
- package/build/report/utility/genHtml.js.map +1 -0
- package/build/report/utility/initReportDb.js +96 -0
- package/build/report/utility/initReportDb.js.map +1 -0
- package/build/report/utility/markdownGen/addAnalyze.js +53 -0
- package/build/report/utility/markdownGen/addAnalyze.js.map +1 -0
- package/build/report/utility/markdownGen/addMappedJson.js +33 -0
- package/build/report/utility/markdownGen/addMappedJson.js.map +1 -0
- package/build/report/utility/populateDb/populateAnalysisFindings.js +31 -0
- package/build/report/utility/populateDb/populateAnalysisFindings.js.map +1 -0
- package/build/report/utility/populateDb/populateEndpoints.js +50 -0
- package/build/report/utility/populateDb/populateEndpoints.js.map +1 -0
- package/build/report/utility/populateDb/populateMappedJson.js +31 -0
- package/build/report/utility/populateDb/populateMappedJson.js.map +1 -0
- package/build/report/utility/populateDb/populateMappedOpenapi.js +49 -0
- package/build/report/utility/populateDb/populateMappedOpenapi.js.map +1 -0
- package/build/run/index.js +446 -0
- package/build/run/index.js.map +1 -0
- package/build/run/interruptHandler.js +93 -0
- package/build/run/interruptHandler.js.map +1 -0
- package/build/strings/index.js +239 -0
- package/build/strings/index.js.map +1 -0
- package/build/strings/openapi.js +63 -0
- package/build/strings/openapi.js.map +1 -0
- package/build/strings/permutate.js +62 -0
- package/build/strings/permutate.js.map +1 -0
- package/build/strings/secrets.js +102 -0
- package/build/strings/secrets.js.map +1 -0
- package/build/utility/ai.js +97 -0
- package/build/utility/ai.js.map +1 -0
- package/build/utility/configureSandbox.js +14 -0
- package/build/utility/configureSandbox.js.map +1 -0
- package/build/utility/globals.js +322 -0
- package/build/utility/globals.js.map +1 -0
- package/build/utility/interfaces.js +2 -0
- package/build/utility/interfaces.js.map +1 -0
- package/build/utility/makeReq.js +448 -0
- package/build/utility/makeReq.js.map +1 -0
- package/build/utility/openapiGenerator.js +254 -0
- package/build/utility/openapiGenerator.js.map +1 -0
- package/build/utility/postmanGenerator.js +216 -0
- package/build/utility/postmanGenerator.js.map +1 -0
- package/build/utility/progressLog.js +50 -0
- package/build/utility/progressLog.js.map +1 -0
- package/build/utility/puppeteerInstance.js +5 -0
- package/build/utility/puppeteerInstance.js.map +1 -0
- package/build/utility/replaceUrlPlaceholders.js +48 -0
- package/build/utility/replaceUrlPlaceholders.js.map +1 -0
- package/build/utility/resolvePath.js +44 -0
- package/build/utility/resolvePath.js.map +1 -0
- package/build/utility/runSandboxed.js +42 -0
- package/build/utility/runSandboxed.js.map +1 -0
- package/build/utility/urlUtils.js +21 -0
- package/build/utility/urlUtils.js.map +1 -0
- package/contributing/nextjs.md +410 -0
- package/package.json +75 -0
|
@@ -0,0 +1,161 @@
|
|
|
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 * as cheerio from "cheerio";
|
|
12
|
+
import makeRequest from "../../utility/makeReq.js";
|
|
13
|
+
import puppeteer from "../../utility/puppeteerInstance.js";
|
|
14
|
+
import * as globalsUtil from "../../utility/globals.js";
|
|
15
|
+
import { checkNextJS } from "./checkNextJS.js";
|
|
16
|
+
import { checkNuxtJS } from "./checkNuxtJS.js";
|
|
17
|
+
import { checkSvelte } from "./checkSvelte.js";
|
|
18
|
+
import { checkVueJS } from "./checkVueJS.js";
|
|
19
|
+
import { checkAngularJS } from "./checkAngularJS.js";
|
|
20
|
+
import { checkReact } from "./checkReact.js";
|
|
21
|
+
/**
|
|
22
|
+
* Detects the front-end framework used in a webpage.
|
|
23
|
+
* It does this by iterating through all HTML tags and checking if any attribute name starts with "data-v-".
|
|
24
|
+
* It also checks for Nuxt.js by checking for "/_nuxt" paths in src or href attributes.
|
|
25
|
+
* It also checks for SvelteKit-specific attributes
|
|
26
|
+
* @param {string} url - The URL of the webpage to fetch and parse.
|
|
27
|
+
* @returns {Promise<{name: string, evidence: string}>} - A promise that resolves to an object with two properties:
|
|
28
|
+
* - name: The name of the detected front-end framework.
|
|
29
|
+
* - evidence: A string with the evidence of the detection, or an empty string if no front-end framework was detected.
|
|
30
|
+
*/
|
|
31
|
+
const frameworkDetect = (url) => __awaiter(void 0, void 0, void 0, function* () {
|
|
32
|
+
const log = (...args) => {
|
|
33
|
+
if (!globalsUtil.getQuiet())
|
|
34
|
+
console.log(...args);
|
|
35
|
+
};
|
|
36
|
+
log(chalk.cyan("[i] Detecting front-end framework"));
|
|
37
|
+
// get the page source. Drain the body immediately into a string — if we
|
|
38
|
+
// wait until after the puppeteer + downstream check* calls, the Response
|
|
39
|
+
// body gets invalidated (undici flips bodyUsed=true mid-flight when the
|
|
40
|
+
// response is held idle alongside other in-flight fetches).
|
|
41
|
+
const res = yield makeRequest(url, {});
|
|
42
|
+
let resBody = null;
|
|
43
|
+
if (res !== null) {
|
|
44
|
+
try {
|
|
45
|
+
resBody = yield res.text();
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
log(chalk.yellow(`[!] Could not read fetch response body for ${url} (${(err === null || err === void 0 ? void 0 : err.message) || err}); using browser-rendered source only.`));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// get the page source in the browser (skipped in cache-only mode — no network allowed)
|
|
52
|
+
let pageSource = "";
|
|
53
|
+
const interceptedUrls = [];
|
|
54
|
+
if (!globalsUtil.getCacheOnly()) {
|
|
55
|
+
const browser = yield puppeteer.launch({
|
|
56
|
+
args: globalsUtil.getDisableSandbox() ? ["--no-sandbox", "--disable-setuid-sandbox"] : [],
|
|
57
|
+
});
|
|
58
|
+
const page = yield browser.newPage();
|
|
59
|
+
page.setDefaultNavigationTimeout(30000);
|
|
60
|
+
// Intercept all requests so framework-specific URL patterns (e.g. /_nuxt/, /_next/)
|
|
61
|
+
// can be used as a detection signal even when they don't appear in parsed HTML.
|
|
62
|
+
yield page.setRequestInterception(true);
|
|
63
|
+
page.on("request", (req) => {
|
|
64
|
+
interceptedUrls.push(req.url());
|
|
65
|
+
req.continue().catch(() => { });
|
|
66
|
+
});
|
|
67
|
+
try {
|
|
68
|
+
yield page.goto(url, {
|
|
69
|
+
waitUntil: "domcontentloaded",
|
|
70
|
+
timeout: 30000,
|
|
71
|
+
});
|
|
72
|
+
// Give client-side frameworks a brief window to render
|
|
73
|
+
yield page.waitForSelector("html", { timeout: 10000 }).catch(() => { });
|
|
74
|
+
yield new Promise((resolve) => setTimeout(resolve, 2000));
|
|
75
|
+
pageSource = yield page.content();
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
log(chalk.yellow("[!] Page navigation/content failed, falling back to fetch response if available"));
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
yield browser.close().catch(() => { });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// if (res === null || res === undefined) {
|
|
85
|
+
// return;
|
|
86
|
+
// }
|
|
87
|
+
// const pageSource = await res.text();
|
|
88
|
+
// cheerio to parse the page source
|
|
89
|
+
const $ = cheerio.load(pageSource);
|
|
90
|
+
// there are two checks
|
|
91
|
+
// one is directly on the response the tool gets by making request with fetch ($)
|
|
92
|
+
// and the second one is by opening the page in browser, loading content, and then analyzing the page content ($res)
|
|
93
|
+
// check all technologies one by one
|
|
94
|
+
const result_checkNextJS = yield checkNextJS($);
|
|
95
|
+
const result_checkVueJS = yield checkVueJS($, url);
|
|
96
|
+
const result_checkSvelte = yield checkSvelte($);
|
|
97
|
+
const result_checkAngular = yield checkAngularJS($, url);
|
|
98
|
+
const result_checkReact = yield checkReact($, url);
|
|
99
|
+
// now, also check with the res response
|
|
100
|
+
let result_checkNextJS_res = { detected: false, evidence: "" };
|
|
101
|
+
let result_checkVueJS_res = { detected: false, evidence: "" };
|
|
102
|
+
let result_checkSvelte_res = { detected: false, evidence: "" };
|
|
103
|
+
let result_checkAngularJS_res = { detected: false, evidence: "" };
|
|
104
|
+
let result_checkReact_res = { detected: false, evidence: "" };
|
|
105
|
+
let $res;
|
|
106
|
+
// if network error was caused, then return
|
|
107
|
+
if (res === null) {
|
|
108
|
+
log(chalk.red("[!] Fetch request failed after retries"));
|
|
109
|
+
}
|
|
110
|
+
else if (resBody !== null) {
|
|
111
|
+
$res = cheerio.load(resBody);
|
|
112
|
+
result_checkNextJS_res = yield checkNextJS($res);
|
|
113
|
+
result_checkVueJS_res = yield checkVueJS($res, url);
|
|
114
|
+
result_checkSvelte_res = yield checkSvelte($res);
|
|
115
|
+
result_checkAngularJS_res = yield checkAngularJS($res, url);
|
|
116
|
+
result_checkReact_res = yield checkReact($res, url);
|
|
117
|
+
}
|
|
118
|
+
if (result_checkNextJS.detected === true || result_checkNextJS_res.detected === true) {
|
|
119
|
+
const evidence = result_checkNextJS.evidence !== "" ? result_checkNextJS.evidence : result_checkNextJS_res.evidence;
|
|
120
|
+
return { name: "next", evidence };
|
|
121
|
+
}
|
|
122
|
+
else if (result_checkVueJS.detected === true || result_checkVueJS_res.detected === true) {
|
|
123
|
+
log(chalk.green("[✓] Vue.js detected"));
|
|
124
|
+
log(chalk.cyan(`[i] Checking Nuxt.JS`), chalk.dim("(Nuxt.JS is built on Vue.js)"));
|
|
125
|
+
const result_checkNuxtJS = yield checkNuxtJS($);
|
|
126
|
+
const result_checkNuxtJS_res = $res ? yield checkNuxtJS($res) : { detected: false, evidence: "" };
|
|
127
|
+
if (result_checkNuxtJS.detected === true || result_checkNuxtJS_res.detected === true) {
|
|
128
|
+
const evidence = result_checkNuxtJS.evidence !== "" ? result_checkNuxtJS.evidence : result_checkNuxtJS_res.evidence;
|
|
129
|
+
return { name: "nuxt", evidence };
|
|
130
|
+
}
|
|
131
|
+
const evidence = result_checkVueJS.evidence !== "" ? result_checkVueJS.evidence : result_checkVueJS_res.evidence;
|
|
132
|
+
return { name: "vue", evidence };
|
|
133
|
+
}
|
|
134
|
+
else if (result_checkSvelte.detected === true || result_checkSvelte_res.detected === true) {
|
|
135
|
+
const evidence = result_checkSvelte.evidence !== "" ? result_checkSvelte.evidence : result_checkSvelte_res.evidence;
|
|
136
|
+
return { name: "svelte", evidence };
|
|
137
|
+
}
|
|
138
|
+
else if (result_checkAngular.detected === true || result_checkAngularJS_res.detected === true) {
|
|
139
|
+
const evidence = result_checkAngular.evidence !== "" ? result_checkAngular.evidence : result_checkAngularJS_res.evidence;
|
|
140
|
+
return { name: "angular", evidence };
|
|
141
|
+
}
|
|
142
|
+
else if (result_checkReact.detected === true || result_checkReact_res.detected === true) {
|
|
143
|
+
const evidence = result_checkReact.evidence !== "" ? result_checkReact.evidence : result_checkReact_res.evidence;
|
|
144
|
+
return { name: "react", evidence };
|
|
145
|
+
}
|
|
146
|
+
// Fallback: check URLs intercepted by Puppeteer during page load.
|
|
147
|
+
// Some sites load framework chunks dynamically via JavaScript rather than referencing
|
|
148
|
+
// them in static HTML attributes — those won't be caught by the HTML-based checks above.
|
|
149
|
+
// Matching on well-known path prefixes gives us a reliable signal without fetching extra files.
|
|
150
|
+
for (const interceptedUrl of interceptedUrls) {
|
|
151
|
+
if (interceptedUrl.includes("/_nuxt/")) {
|
|
152
|
+
return { name: "nuxt", evidence: `intercepted request: ${interceptedUrl}` };
|
|
153
|
+
}
|
|
154
|
+
if (interceptedUrl.includes("/_next/")) {
|
|
155
|
+
return { name: "next", evidence: `intercepted request: ${interceptedUrl}` };
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return null;
|
|
159
|
+
});
|
|
160
|
+
export default frameworkDetect;
|
|
161
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lazyLoad/techDetect/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,169 @@
|
|
|
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 makeRequest from "../../utility/makeReq.js";
|
|
12
|
+
import * as cheerio from "cheerio";
|
|
13
|
+
import * as parser from "@babel/parser";
|
|
14
|
+
import _traverse from "@babel/traverse";
|
|
15
|
+
const traverse = _traverse.default;
|
|
16
|
+
import inquirer from "inquirer";
|
|
17
|
+
import CONFIG from "../../globalConfig.js";
|
|
18
|
+
import execFunc from "../../utility/runSandboxed.js";
|
|
19
|
+
import * as globals from "../../utility/globals.js";
|
|
20
|
+
const vue_runtimeJs = (url) => __awaiter(void 0, void 0, void 0, function* () {
|
|
21
|
+
const rootHtmlRes = yield makeRequest(url);
|
|
22
|
+
if (!rootHtmlRes) {
|
|
23
|
+
console.error(chalk.red(`[!] Failed to fetch ${url}`));
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
const rootHtml = yield rootHtmlRes.text();
|
|
27
|
+
let runtimeJsUrl;
|
|
28
|
+
const $ = cheerio.load(rootHtml);
|
|
29
|
+
$("script").each((_, el) => {
|
|
30
|
+
const attribs = el.attribs;
|
|
31
|
+
if (attribs) {
|
|
32
|
+
for (const [attrName, attrValue] of Object.entries(attribs)) {
|
|
33
|
+
// Match webpack runtime filename specifically: /runtime.<hex>.js
|
|
34
|
+
// Exclude things like /vue.runtime.2.7.20.min.js
|
|
35
|
+
if (attrName === "src" && attrValue.match(/\/runtime\.[a-f0-9]+\.js(?:$|\?)/)) {
|
|
36
|
+
runtimeJsUrl = attrValue;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
if (!runtimeJsUrl) {
|
|
42
|
+
console.error(chalk.red("[!] No runtime JS file found in page source"));
|
|
43
|
+
console.log(chalk.magenta(CONFIG.notFoundMessage));
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
if (!runtimeJsUrl.startsWith("http")) {
|
|
47
|
+
runtimeJsUrl = new URL(runtimeJsUrl, url).href;
|
|
48
|
+
}
|
|
49
|
+
const runtimeJsRes = yield makeRequest(runtimeJsUrl);
|
|
50
|
+
if (!runtimeJsRes) {
|
|
51
|
+
console.error(chalk.red(`[!] Failed to fetch ${runtimeJsUrl}`));
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
const runtimeJsContent = yield runtimeJsRes.text();
|
|
55
|
+
const ast = parser.parse(runtimeJsContent, {
|
|
56
|
+
sourceType: "unambiguous",
|
|
57
|
+
plugins: ["jsx", "typescript"],
|
|
58
|
+
errorRecovery: true,
|
|
59
|
+
});
|
|
60
|
+
let scriptSrcFuncSource;
|
|
61
|
+
let publicPathObj;
|
|
62
|
+
let publicPathProp;
|
|
63
|
+
traverse(ast, {
|
|
64
|
+
AssignmentExpression(path) {
|
|
65
|
+
var _a, _b;
|
|
66
|
+
const { left, right } = path.node;
|
|
67
|
+
// Anchor on the always-present pattern: script.src = function(e){...}(e)
|
|
68
|
+
if (left.type === "MemberExpression" &&
|
|
69
|
+
left.object.type === "Identifier" &&
|
|
70
|
+
left.object.name === "script" &&
|
|
71
|
+
left.property.type === "Identifier" &&
|
|
72
|
+
left.property.name === "src" &&
|
|
73
|
+
right.type === "CallExpression" &&
|
|
74
|
+
right.callee.type === "FunctionExpression") {
|
|
75
|
+
const funcExpr = right.callee;
|
|
76
|
+
if (funcExpr.start !== null && funcExpr.end !== null) {
|
|
77
|
+
scriptSrcFuncSource = runtimeJsContent.slice(funcExpr.start, funcExpr.end);
|
|
78
|
+
}
|
|
79
|
+
// The public-path variable is whatever sits leftmost in the
|
|
80
|
+
// concatenation chain of the return statement. The webpack
|
|
81
|
+
// template emits any short <obj>.<prop> identifier here, not
|
|
82
|
+
// necessarily `c.p`.
|
|
83
|
+
const returnStmt = (_b = (_a = funcExpr.body) === null || _a === void 0 ? void 0 : _a.body) === null || _b === void 0 ? void 0 : _b.find((s) => s.type === "ReturnStatement");
|
|
84
|
+
if (returnStmt && returnStmt.argument) {
|
|
85
|
+
let cursor = returnStmt.argument;
|
|
86
|
+
while (cursor && cursor.type === "BinaryExpression") {
|
|
87
|
+
cursor = cursor.left;
|
|
88
|
+
}
|
|
89
|
+
if (cursor &&
|
|
90
|
+
cursor.type === "MemberExpression" &&
|
|
91
|
+
!cursor.computed &&
|
|
92
|
+
cursor.object.type === "Identifier" &&
|
|
93
|
+
cursor.property.type === "Identifier") {
|
|
94
|
+
publicPathObj = cursor.object.name;
|
|
95
|
+
publicPathProp = cursor.property.name;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
if (!scriptSrcFuncSource) {
|
|
102
|
+
console.error(chalk.red("[!] Could not find chunk URL builder function in runtime JS"));
|
|
103
|
+
console.log(chalk.magenta(CONFIG.notFoundMessage));
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
console.log(chalk.green("[✓] Found chunk URL builder function"));
|
|
107
|
+
console.log(chalk.yellow(scriptSrcFuncSource));
|
|
108
|
+
if (publicPathObj && publicPathProp) {
|
|
109
|
+
console.log(chalk.green(`[✓] Public-path variable detected: ${publicPathObj}.${publicPathProp}`));
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
console.error(chalk.yellow("[!] Could not detect public-path variable; will resolve chunk paths against runtime.js directory regardless"));
|
|
113
|
+
}
|
|
114
|
+
if (!globals.getYes()) {
|
|
115
|
+
const { confirmed } = yield inquirer.prompt([
|
|
116
|
+
{
|
|
117
|
+
type: "confirm",
|
|
118
|
+
name: "confirmed",
|
|
119
|
+
message: "Is this the correct function?",
|
|
120
|
+
default: true,
|
|
121
|
+
},
|
|
122
|
+
]);
|
|
123
|
+
if (!confirmed) {
|
|
124
|
+
console.error(chalk.red("[!] Not executing function."));
|
|
125
|
+
return [];
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
console.log(chalk.cyan("[i] Proceeding with the selected function to fetch files"));
|
|
129
|
+
// Stub the public-path variable with empty string so the function returns
|
|
130
|
+
// just the relative chunk path (e.g. "pages/index.<hash>.js"). The real
|
|
131
|
+
// public path value isn't needed -- chunks live alongside runtime.js, so
|
|
132
|
+
// resolving the relative path against the runtime.js directory gives the
|
|
133
|
+
// correct absolute URL.
|
|
134
|
+
const stubDecl = publicPathObj && publicPathProp ? `var ${publicPathObj} = { ${publicPathProp}: "" };` : "";
|
|
135
|
+
const urlBuilderFunc = `(() => { ${stubDecl} return (${scriptSrcFuncSource}); })()`;
|
|
136
|
+
const js_paths = [];
|
|
137
|
+
try {
|
|
138
|
+
const integers = scriptSrcFuncSource.match(/\d+/g);
|
|
139
|
+
if (integers) {
|
|
140
|
+
for (const i of integers) {
|
|
141
|
+
const output = execFunc(urlBuilderFunc, parseInt(i));
|
|
142
|
+
if (output !== null && output !== undefined && !String(output).includes("undefined")) {
|
|
143
|
+
js_paths.push(String(output));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
console.error(chalk.red("Unsafe or invalid code:", err instanceof Error ? err.message : String(err)));
|
|
150
|
+
return [];
|
|
151
|
+
}
|
|
152
|
+
const unique_paths = [...new Set(js_paths)];
|
|
153
|
+
if (unique_paths.length > 0) {
|
|
154
|
+
console.log(chalk.green(`[✓] Found ${unique_paths.length} JS chunks`));
|
|
155
|
+
}
|
|
156
|
+
const runtimeDir = runtimeJsUrl.split("/").slice(0, -1).join("/") + "/";
|
|
157
|
+
const discovered_urls = [];
|
|
158
|
+
for (const js_path of unique_paths) {
|
|
159
|
+
if (js_path.startsWith("http")) {
|
|
160
|
+
discovered_urls.push(js_path);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
discovered_urls.push(new URL(js_path, runtimeDir).href);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return discovered_urls;
|
|
167
|
+
});
|
|
168
|
+
export default vue_runtimeJs;
|
|
169
|
+
//# sourceMappingURL=vue_RuntimeJs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vue_RuntimeJs.js","sourceRoot":"","sources":["../../../src/lazyLoad/vue/vue_RuntimeJs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
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
|
+
import parser from "@babel/parser";
|
|
12
|
+
import _traverse from "@babel/traverse";
|
|
13
|
+
import * as cheerio from "cheerio";
|
|
14
|
+
import chalk from "chalk";
|
|
15
|
+
const traverse = _traverse.default;
|
|
16
|
+
const vue_singleJsFileOnHome = (url) => __awaiter(void 0, void 0, void 0, function* () {
|
|
17
|
+
let jsFilesFound = [];
|
|
18
|
+
// first, get the home page content
|
|
19
|
+
const req = yield makeRequest(url, {});
|
|
20
|
+
if (req == null) {
|
|
21
|
+
console.error(chalk.red(`Failed to fetch ${url}`));
|
|
22
|
+
return jsFilesFound;
|
|
23
|
+
}
|
|
24
|
+
const homePageContent = yield req.text();
|
|
25
|
+
// load the home page content into cheerio
|
|
26
|
+
const $ = cheerio.load(homePageContent);
|
|
27
|
+
// go through the home page HTML, and find the
|
|
28
|
+
// count of <script> tags that loads external JS
|
|
29
|
+
let externalScriptTagCount = 0;
|
|
30
|
+
let jsUrl = "";
|
|
31
|
+
$("script").each((_, el) => {
|
|
32
|
+
if ($(el).attr("src")) {
|
|
33
|
+
externalScriptTagCount++;
|
|
34
|
+
jsUrl = $(el).attr("src");
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
// if the count is 1, then it's a single JS file
|
|
38
|
+
if (externalScriptTagCount !== 1) {
|
|
39
|
+
return jsFilesFound;
|
|
40
|
+
}
|
|
41
|
+
// if the count is 1, then it's a single JS file
|
|
42
|
+
console.log(chalk.green("[✓] Single JS file detected"));
|
|
43
|
+
// add that JS file to the list
|
|
44
|
+
jsFilesFound.push(new URL(jsUrl, url).href);
|
|
45
|
+
// print the warning
|
|
46
|
+
console.error(chalk.yellow("[!] This method is MEMORY INTENSIVE. Underpowered devices may freeze"));
|
|
47
|
+
// resolve the URL
|
|
48
|
+
if (jsUrl.startsWith("/") || jsUrl.startsWith("./") || jsUrl.startsWith("../")) {
|
|
49
|
+
jsUrl = new URL(jsUrl, url).href;
|
|
50
|
+
}
|
|
51
|
+
// get the contents of that JS file
|
|
52
|
+
const jsReq = yield makeRequest(jsUrl);
|
|
53
|
+
const jsContent = yield jsReq.text();
|
|
54
|
+
// parse the JS file
|
|
55
|
+
const ast = parser.parse(jsContent, {
|
|
56
|
+
sourceType: "unambiguous",
|
|
57
|
+
plugins: ["jsx", "typescript"],
|
|
58
|
+
errorRecovery: true,
|
|
59
|
+
});
|
|
60
|
+
// traverse the AST
|
|
61
|
+
let initialFoundJsPaths = [];
|
|
62
|
+
traverse(ast, {
|
|
63
|
+
ArrayExpression(path) {
|
|
64
|
+
const elements = path.node.elements;
|
|
65
|
+
if (!elements)
|
|
66
|
+
return;
|
|
67
|
+
const currentJsFiles = [];
|
|
68
|
+
let hasJs = false;
|
|
69
|
+
let isPureJsCssList = true;
|
|
70
|
+
for (const element of elements) {
|
|
71
|
+
// element can be null in sparse arrays
|
|
72
|
+
if (!element || element.type !== "StringLiteral") {
|
|
73
|
+
isPureJsCssList = false;
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
const value = element.value;
|
|
77
|
+
if (value.endsWith(".js")) {
|
|
78
|
+
hasJs = true;
|
|
79
|
+
currentJsFiles.push(value);
|
|
80
|
+
}
|
|
81
|
+
else if (!value.endsWith(".css")) {
|
|
82
|
+
// If it's not .js and not .css, it's not the list we're looking for
|
|
83
|
+
isPureJsCssList = false;
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (isPureJsCssList && hasJs) {
|
|
88
|
+
initialFoundJsPaths.push(...currentJsFiles);
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
// now that paths are found, iterate through those, and construct the full URLs
|
|
93
|
+
for (const path of initialFoundJsPaths) {
|
|
94
|
+
if (!path.endsWith(".js"))
|
|
95
|
+
continue;
|
|
96
|
+
const fullUrl = new URL(path, url).href;
|
|
97
|
+
jsFilesFound.push(fullUrl);
|
|
98
|
+
}
|
|
99
|
+
return jsFilesFound;
|
|
100
|
+
});
|
|
101
|
+
export default vue_singleJsFileOnHome;
|
|
102
|
+
//# sourceMappingURL=vue_SingleJsFileOnHome.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vue_SingleJsFileOnHome.js","sourceRoot":"","sources":["../../../src/lazyLoad/vue/vue_SingleJsFileOnHome.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
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 vue_pageSrc from "./vue_pageSrc.js";
|
|
12
|
+
import vue_runtimeJs from "./vue_RuntimeJs.js";
|
|
13
|
+
import vue_singleJsFileOnHome from "./vue_SingleJsFileOnHome.js";
|
|
14
|
+
import vue_severalJsFilesHome from "./vue_severalJsFilesHome.js";
|
|
15
|
+
import vue_jsImports from "./vue_jsImports.js";
|
|
16
|
+
import vue_reconstructSourceMaps from "./vue_reconstructSourceMaps.js";
|
|
17
|
+
import vue_getClientSidePaths from "./vue_getClientSidePaths.js";
|
|
18
|
+
import vue_viteMapDeps from "./vue_viteMapDeps.js";
|
|
19
|
+
import vue_stringJsFiles from "./vue_stringJsFiles.js";
|
|
20
|
+
/**
|
|
21
|
+
* Runs the full Vue.js JS-file discovery pipeline against a single URL.
|
|
22
|
+
*
|
|
23
|
+
* Combines all the per-URL discovery techniques (page source script tags,
|
|
24
|
+
* runtime.js chunks, single/several JS files on home, import statements,
|
|
25
|
+
* source-map reconstruction) into one reusable flow, and also surfaces the
|
|
26
|
+
* client-side paths found in the discovered files so callers can recurse.
|
|
27
|
+
*
|
|
28
|
+
* @param onFilesDiscovered Called with each batch of newly found URLs so the
|
|
29
|
+
* caller can start downloading them immediately rather than waiting for the
|
|
30
|
+
* full pipeline to finish.
|
|
31
|
+
*/
|
|
32
|
+
const vue_discoverJsFiles = (url_1, ...args_1) => __awaiter(void 0, [url_1, ...args_1], void 0, function* (url, maxJsSizeMb = 2, onFilesDiscovered) {
|
|
33
|
+
let jsFiles = [];
|
|
34
|
+
const emit = (files) => {
|
|
35
|
+
jsFiles.push(...files);
|
|
36
|
+
if (files.length > 0 && onFilesDiscovered) {
|
|
37
|
+
onFilesDiscovered(files.map((f) => (f.startsWith("//") ? "https:" + f : f)));
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
// first, get all the JS files from the page source
|
|
41
|
+
emit(yield vue_pageSrc(url));
|
|
42
|
+
// method 1: through runtime.<hash>.js
|
|
43
|
+
emit(yield vue_runtimeJs(url));
|
|
44
|
+
// single JS file on the page (typically dev-mode)
|
|
45
|
+
const fromSingleJs = yield vue_singleJsFileOnHome(url);
|
|
46
|
+
emit(fromSingleJs);
|
|
47
|
+
if (fromSingleJs.length > 0) {
|
|
48
|
+
console.log(chalk.green(`[✓] Found ${fromSingleJs.length} files from the single JS file on home`));
|
|
49
|
+
}
|
|
50
|
+
// several JS files referenced directly on the page
|
|
51
|
+
emit(yield vue_severalJsFilesHome(url));
|
|
52
|
+
// scan page-loaded JS files for Vite's __vite__mapDeps chunk manifest
|
|
53
|
+
const fromViteMapDeps = yield vue_viteMapDeps(jsFiles, maxJsSizeMb);
|
|
54
|
+
emit(fromViteMapDeps);
|
|
55
|
+
if (fromViteMapDeps.length > 0) {
|
|
56
|
+
console.log(chalk.green(`[✓] Found ${fromViteMapDeps.length} files from __vite__mapDeps`));
|
|
57
|
+
}
|
|
58
|
+
// walk the import graph of everything found so far
|
|
59
|
+
const fromImports = yield vue_jsImports(url, jsFiles, maxJsSizeMb);
|
|
60
|
+
emit(fromImports);
|
|
61
|
+
if (fromImports.length > 0) {
|
|
62
|
+
console.log(chalk.green(`[✓] Found ${fromImports.length} files from import statements`));
|
|
63
|
+
}
|
|
64
|
+
// scan string literals inside known JS files for .js references
|
|
65
|
+
const fromStringRefs = yield vue_stringJsFiles(jsFiles, maxJsSizeMb);
|
|
66
|
+
emit(fromStringRefs);
|
|
67
|
+
if (fromStringRefs.length > 0) {
|
|
68
|
+
console.log(chalk.green(`[✓] Found ${fromStringRefs.length} files from string literal JS references`));
|
|
69
|
+
}
|
|
70
|
+
// reconstruct sourceMappingURL references
|
|
71
|
+
const fromSourceMaps = yield vue_reconstructSourceMaps(url, jsFiles);
|
|
72
|
+
emit(fromSourceMaps);
|
|
73
|
+
if (fromSourceMaps.length > 0) {
|
|
74
|
+
console.log(chalk.green(`[✓] Found ${fromSourceMaps.length} files from reconstructing source maps`));
|
|
75
|
+
}
|
|
76
|
+
jsFiles = [...new Set(jsFiles)].map((f) => (f.startsWith("//") ? "https:" + f : f));
|
|
77
|
+
// surface client-side paths so the caller can recurse into them
|
|
78
|
+
const clientSidePaths = yield vue_getClientSidePaths(url, jsFiles, maxJsSizeMb);
|
|
79
|
+
return { jsFiles, clientSidePaths: [...new Set(clientSidePaths)] };
|
|
80
|
+
});
|
|
81
|
+
export default vue_discoverJsFiles;
|
|
82
|
+
//# sourceMappingURL=vue_discoverJsFiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vue_discoverJsFiles.js","sourceRoot":"","sources":["../../../src/lazyLoad/vue/vue_discoverJsFiles.ts"],"names":[],"mappings":"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"}
|