@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,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Source Map Decoder
|
|
3
|
+
*
|
|
4
|
+
* Extracts original source code from minified JavaScript using source maps.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Extract original source files from a source map.
|
|
8
|
+
*
|
|
9
|
+
* @param sourceMap - The source map object or JSON string
|
|
10
|
+
* @param options - Optional configuration
|
|
11
|
+
* @returns Object containing extracted files and count of missing sources
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* import { extractSources } from './sourcemap';
|
|
16
|
+
*
|
|
17
|
+
* const sourceMap = {
|
|
18
|
+
* version: 3,
|
|
19
|
+
* sources: ['src/app.ts', 'src/utils.ts'],
|
|
20
|
+
* sourcesContent: ['const x = 1;', 'export const y = 2;'],
|
|
21
|
+
* mappings: '...',
|
|
22
|
+
* };
|
|
23
|
+
*
|
|
24
|
+
* const result = extractSources(sourceMap);
|
|
25
|
+
* for (const file of result.files) {
|
|
26
|
+
* console.log(`${file.path}:\n${file.content}`);
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export function extractSources(sourceMap, options = {}) {
|
|
31
|
+
var _a;
|
|
32
|
+
const { cleanPaths = true, normalizePaths = true } = options;
|
|
33
|
+
// Parse JSON string if needed
|
|
34
|
+
const map = typeof sourceMap === "string" ? JSON.parse(sourceMap) : sourceMap;
|
|
35
|
+
// Validate source map
|
|
36
|
+
if (!map.sources || !Array.isArray(map.sources)) {
|
|
37
|
+
throw new Error('Invalid source map: missing "sources" array');
|
|
38
|
+
}
|
|
39
|
+
const files = [];
|
|
40
|
+
let missingCount = 0;
|
|
41
|
+
for (let i = 0; i < map.sources.length; i++) {
|
|
42
|
+
let path = map.sources[i];
|
|
43
|
+
const content = (_a = map.sourcesContent) === null || _a === void 0 ? void 0 : _a[i];
|
|
44
|
+
// Skip if no content
|
|
45
|
+
if (content === null || content === undefined) {
|
|
46
|
+
missingCount++;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
// Clean up path
|
|
50
|
+
if (cleanPaths) {
|
|
51
|
+
path = cleanPath(path);
|
|
52
|
+
}
|
|
53
|
+
if (normalizePaths) {
|
|
54
|
+
path = normalizePath(path);
|
|
55
|
+
}
|
|
56
|
+
// Apply sourceRoot if present
|
|
57
|
+
if (map.sourceRoot && !path.startsWith("/")) {
|
|
58
|
+
const root = cleanPaths ? cleanPath(map.sourceRoot) : map.sourceRoot;
|
|
59
|
+
path = joinPaths(root, path);
|
|
60
|
+
}
|
|
61
|
+
files.push({ path, content });
|
|
62
|
+
}
|
|
63
|
+
return { files, missingCount };
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Extract a single source file by index or path.
|
|
67
|
+
*
|
|
68
|
+
* @param sourceMap - The source map object or JSON string
|
|
69
|
+
* @param indexOrPath - Index into sources array or file path to find
|
|
70
|
+
* @returns The source file or null if not found
|
|
71
|
+
*/
|
|
72
|
+
export function extractSource(sourceMap, indexOrPath) {
|
|
73
|
+
var _a, _b;
|
|
74
|
+
const map = typeof sourceMap === "string" ? JSON.parse(sourceMap) : sourceMap;
|
|
75
|
+
if (typeof indexOrPath === "number") {
|
|
76
|
+
const index = indexOrPath;
|
|
77
|
+
if (index < 0 || index >= map.sources.length) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
const content = (_a = map.sourcesContent) === null || _a === void 0 ? void 0 : _a[index];
|
|
81
|
+
if (content === null || content === undefined) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
return { path: map.sources[index], content };
|
|
85
|
+
}
|
|
86
|
+
// Search by path
|
|
87
|
+
const searchPath = indexOrPath;
|
|
88
|
+
const index = map.sources.findIndex((s) => s === searchPath ||
|
|
89
|
+
s.endsWith(searchPath) ||
|
|
90
|
+
cleanPath(s) === searchPath ||
|
|
91
|
+
cleanPath(s).endsWith(searchPath));
|
|
92
|
+
if (index === -1) {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
const content = (_b = map.sourcesContent) === null || _b === void 0 ? void 0 : _b[index];
|
|
96
|
+
if (content === null || content === undefined) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
return { path: map.sources[index], content };
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get list of source file paths without extracting content.
|
|
103
|
+
*
|
|
104
|
+
* @param sourceMap - The source map object or JSON string
|
|
105
|
+
* @returns Array of source file paths
|
|
106
|
+
*/
|
|
107
|
+
export function listSources(sourceMap) {
|
|
108
|
+
const map = typeof sourceMap === "string" ? JSON.parse(sourceMap) : sourceMap;
|
|
109
|
+
return map.sources || [];
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Check if a source map has embedded source content.
|
|
113
|
+
*
|
|
114
|
+
* @param sourceMap - The source map object or JSON string
|
|
115
|
+
* @returns true if sourcesContent is present and has at least one non-null entry
|
|
116
|
+
*/
|
|
117
|
+
export function hasSourceContent(sourceMap) {
|
|
118
|
+
const map = typeof sourceMap === "string" ? JSON.parse(sourceMap) : sourceMap;
|
|
119
|
+
return Array.isArray(map.sourcesContent) && map.sourcesContent.some((c) => c !== null && c !== undefined);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Remove protocol prefixes like webpack://, file://, etc.
|
|
123
|
+
*/
|
|
124
|
+
function cleanPath(path) {
|
|
125
|
+
return path
|
|
126
|
+
.replace(/^webpack:\/\/[^/]*\//, "") // webpack://package-name/
|
|
127
|
+
.replace(/^webpack:\/\//, "") // webpack://
|
|
128
|
+
.replace(/^file:\/\//, "") // file://
|
|
129
|
+
.replace(/^\.\//, ""); // ./
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Normalize path by resolving ../ sequences.
|
|
133
|
+
* SECURITY: Removes all leading ../ to prevent directory traversal attacks.
|
|
134
|
+
* Files will always stay within the intended output directory.
|
|
135
|
+
*/
|
|
136
|
+
function normalizePath(path) {
|
|
137
|
+
const parts = path.split("/");
|
|
138
|
+
const result = [];
|
|
139
|
+
for (const part of parts) {
|
|
140
|
+
if (part === "..") {
|
|
141
|
+
// Only allow going back within the path we've built
|
|
142
|
+
// Never allow escaping (result would go negative)
|
|
143
|
+
if (result.length > 0) {
|
|
144
|
+
result.pop();
|
|
145
|
+
}
|
|
146
|
+
// If result is empty, just skip the '..' entirely (prevents traversal)
|
|
147
|
+
}
|
|
148
|
+
else if (part !== "." && part !== "") {
|
|
149
|
+
result.push(part);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return result.join("/") || ".";
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Sanitize a path to ensure it cannot escape the output directory.
|
|
156
|
+
* This is a safety check that should be used before writing files.
|
|
157
|
+
*
|
|
158
|
+
* @param basePath - The base output directory (absolute path)
|
|
159
|
+
* @param filePath - The file path to sanitize
|
|
160
|
+
* @returns Safe path that is guaranteed to be under basePath
|
|
161
|
+
*/
|
|
162
|
+
export function safePath(basePath, filePath) {
|
|
163
|
+
// Clean and normalize the file path
|
|
164
|
+
let cleaned = cleanPath(filePath);
|
|
165
|
+
cleaned = normalizePath(cleaned);
|
|
166
|
+
// Remove any remaining ../ sequences (belt and suspenders)
|
|
167
|
+
cleaned = cleaned.replace(/\.\.\//g, "").replace(/^\.\.$/, "");
|
|
168
|
+
// Remove leading slashes to prevent absolute path injection
|
|
169
|
+
cleaned = cleaned.replace(/^\/+/, "");
|
|
170
|
+
// Join with base path
|
|
171
|
+
const joined = basePath.endsWith("/") ? basePath + cleaned : basePath + "/" + cleaned;
|
|
172
|
+
return joined;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Join two path segments
|
|
176
|
+
*/
|
|
177
|
+
function joinPaths(base, path) {
|
|
178
|
+
if (!base)
|
|
179
|
+
return path;
|
|
180
|
+
if (!path)
|
|
181
|
+
return base;
|
|
182
|
+
const baseClean = base.endsWith("/") ? base.slice(0, -1) : base;
|
|
183
|
+
const pathClean = path.startsWith("/") ? path.slice(1) : path;
|
|
184
|
+
return `${baseClean}/${pathClean}`;
|
|
185
|
+
}
|
|
186
|
+
// Default export for convenience
|
|
187
|
+
export default { extractSources, extractSource, listSources, hasSourceContent };
|
|
188
|
+
//# sourceMappingURL=sourcemap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourcemap.js","sourceRoot":"","sources":["../../src/lazyLoad/sourcemap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,162 @@
|
|
|
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 resolvePath from "../../utility/resolvePath.js";
|
|
14
|
+
import { getJsUrls, pushToJsUrls } from "../globals.js";
|
|
15
|
+
import { URL } from "url";
|
|
16
|
+
const ASSET_EXTENSIONS = [".js", ".css", ".json", ".png", ".svg", ".woff", ".woff2", ".ico", ".jpg", ".gif"];
|
|
17
|
+
const SKIP_PREFIXES = ["/_astro/", "/_next/", "/__"];
|
|
18
|
+
/**
|
|
19
|
+
* Extracts path-like strings from a JS file's raw text content that look like
|
|
20
|
+
* same-origin page routes (start with "/" and don't end with ".js"/".css"/etc).
|
|
21
|
+
* Also detects template literal path prefixes like `/post/${...}` → `/post/1`
|
|
22
|
+
* by substituting a test ID ("1") for the first dynamic segment.
|
|
23
|
+
*/
|
|
24
|
+
const extractPagePaths = (content) => {
|
|
25
|
+
const paths = new Set();
|
|
26
|
+
// Static string literals: "/admin", '/debug', etc.
|
|
27
|
+
const STATIC_RE = /["'](\/[a-zA-Z0-9_\-/]+)["']/g;
|
|
28
|
+
let m;
|
|
29
|
+
while ((m = STATIC_RE.exec(content)) !== null) {
|
|
30
|
+
const p = m[1];
|
|
31
|
+
if (ASSET_EXTENSIONS.some((e) => p.endsWith(e)))
|
|
32
|
+
continue;
|
|
33
|
+
if (SKIP_PREFIXES.some((pre) => p.startsWith(pre)))
|
|
34
|
+
continue;
|
|
35
|
+
if (p.split("/").length > 5)
|
|
36
|
+
continue;
|
|
37
|
+
paths.add(p);
|
|
38
|
+
}
|
|
39
|
+
// Template literal path prefixes: `/post/${...}` → try `/post/1`
|
|
40
|
+
// Matches backtick template literals starting with "/" that have at least one ${} segment
|
|
41
|
+
const TEMPLATE_RE = /`(\/[a-zA-Z0-9_\-/]+)\$\{[^`}]+\}(?:\/[a-zA-Z0-9_\-]*)*`/g;
|
|
42
|
+
while ((m = TEMPLATE_RE.exec(content)) !== null) {
|
|
43
|
+
const prefix = m[1]; // e.g. "/post/"
|
|
44
|
+
if (SKIP_PREFIXES.some((pre) => prefix.startsWith(pre)))
|
|
45
|
+
continue;
|
|
46
|
+
// Strip trailing slash before appending test ID
|
|
47
|
+
const base = prefix.endsWith("/") ? prefix.slice(0, -1) : prefix;
|
|
48
|
+
const testUrl = `${base}/1`;
|
|
49
|
+
if (testUrl.split("/").length <= 5)
|
|
50
|
+
paths.add(testUrl);
|
|
51
|
+
}
|
|
52
|
+
return [...paths];
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Extracts JS file references from an HTML page's Astro island elements,
|
|
56
|
+
* <script src>, and <link rel="modulepreload"> tags.
|
|
57
|
+
*/
|
|
58
|
+
const extractJsFromHtml = (pageUrl, html) => __awaiter(void 0, void 0, void 0, function* () {
|
|
59
|
+
const $ = cheerio.load(html);
|
|
60
|
+
const jsFiles = [];
|
|
61
|
+
for (const el of $("link").toArray()) {
|
|
62
|
+
const rel = $(el).attr("rel");
|
|
63
|
+
if (rel === "modulepreload") {
|
|
64
|
+
const href = $(el).attr("href");
|
|
65
|
+
if (href)
|
|
66
|
+
jsFiles.push(href.startsWith("http") ? href : yield resolvePath(pageUrl, href));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
for (const el of $("script").toArray()) {
|
|
70
|
+
const src = $(el).attr("src");
|
|
71
|
+
if (src)
|
|
72
|
+
jsFiles.push(src.startsWith("http") ? src : yield resolvePath(pageUrl, src));
|
|
73
|
+
}
|
|
74
|
+
for (const el of $("astro-island").toArray()) {
|
|
75
|
+
for (const attr of ["component-url", "renderer-url"]) {
|
|
76
|
+
const value = $(el).attr(attr);
|
|
77
|
+
if (value)
|
|
78
|
+
jsFiles.push(value.startsWith("http") ? value : yield resolvePath(pageUrl, value));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return jsFiles;
|
|
82
|
+
});
|
|
83
|
+
const MAX_ROUNDS = 5;
|
|
84
|
+
/**
|
|
85
|
+
* Iteratively scans all JS URLs in the global registry for embedded page path
|
|
86
|
+
* strings, visits each discovered page to extract Astro island component-url /
|
|
87
|
+
* script-src / modulepreload references, and repeats until no new URLs are found.
|
|
88
|
+
*
|
|
89
|
+
* This fills the gap left by Svelte/Astro client-side routers that don't emit
|
|
90
|
+
* <a href> links in server-rendered HTML — instead route paths live as string
|
|
91
|
+
* literals inside the compiled JS bundles.
|
|
92
|
+
*
|
|
93
|
+
* @param entryUrl - The target's base URL (used to build absolute page URLs)
|
|
94
|
+
* @returns Array of all newly discovered JS file URLs across all rounds
|
|
95
|
+
*/
|
|
96
|
+
const svelte_discoverPagesFromJs = (entryUrl) => __awaiter(void 0, void 0, void 0, function* () {
|
|
97
|
+
var _a;
|
|
98
|
+
const origin = new URL(entryUrl).origin;
|
|
99
|
+
const allDiscovered = [];
|
|
100
|
+
const visitedPaths = new Set();
|
|
101
|
+
const scannedJsUrls = new Set();
|
|
102
|
+
for (let round = 0; round < MAX_ROUNDS; round++) {
|
|
103
|
+
const currentJsUrls = getJsUrls().filter((u) => !scannedJsUrls.has(u));
|
|
104
|
+
if (currentJsUrls.length === 0)
|
|
105
|
+
break;
|
|
106
|
+
// Collect candidate page paths from all unscanned JS URLs
|
|
107
|
+
const candidatePaths = new Set();
|
|
108
|
+
for (const jsUrl of currentJsUrls) {
|
|
109
|
+
scannedJsUrls.add(jsUrl);
|
|
110
|
+
try {
|
|
111
|
+
const res = yield makeRequest(jsUrl, {});
|
|
112
|
+
if (!res)
|
|
113
|
+
continue;
|
|
114
|
+
const content = yield res.text();
|
|
115
|
+
for (const p of extractPagePaths(content)) {
|
|
116
|
+
candidatePaths.add(p);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch (_b) {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Filter to only unvisited paths
|
|
124
|
+
const newPaths = [...candidatePaths].filter((p) => !visitedPaths.has(p));
|
|
125
|
+
if (newPaths.length === 0)
|
|
126
|
+
break;
|
|
127
|
+
console.log(chalk.cyan(`[i] Found ${newPaths.length} candidate page path(s) in JS — visiting to discover more chunks`));
|
|
128
|
+
let foundThisRound = 0;
|
|
129
|
+
for (const pagePath of newPaths) {
|
|
130
|
+
visitedPaths.add(pagePath);
|
|
131
|
+
const pageUrl = `${origin}${pagePath}`;
|
|
132
|
+
try {
|
|
133
|
+
const res = yield makeRequest(pageUrl, {});
|
|
134
|
+
if (!res)
|
|
135
|
+
continue;
|
|
136
|
+
const contentType = (_a = res.headers.get("content-type")) !== null && _a !== void 0 ? _a : "";
|
|
137
|
+
if (!contentType.includes("text/html"))
|
|
138
|
+
continue;
|
|
139
|
+
const html = yield res.text();
|
|
140
|
+
const jsFromPage = yield extractJsFromHtml(pageUrl, html);
|
|
141
|
+
for (const jsUrl of jsFromPage) {
|
|
142
|
+
if (!getJsUrls().includes(jsUrl)) {
|
|
143
|
+
pushToJsUrls(jsUrl);
|
|
144
|
+
allDiscovered.push(jsUrl);
|
|
145
|
+
foundThisRound++;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (jsFromPage.length > 0) {
|
|
149
|
+
console.log(chalk.green(`[✓] ${pageUrl}: found ${jsFromPage.length} JS file(s)`));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch (_c) {
|
|
153
|
+
// page not found or network error — skip
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (foundThisRound === 0)
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
return allDiscovered;
|
|
160
|
+
});
|
|
161
|
+
export default svelte_discoverPagesFromJs;
|
|
162
|
+
//# sourceMappingURL=svelte_discoverPagesFromJs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svelte_discoverPagesFromJs.js","sourceRoot":"","sources":["../../../src/lazyLoad/svelte/svelte_discoverPagesFromJs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
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 * as cheerio from "cheerio";
|
|
12
|
+
import resolvePath from "../../utility/resolvePath.js";
|
|
13
|
+
import chalk from "chalk";
|
|
14
|
+
import { getJsUrls, pushToJsUrls } from "../globals.js";
|
|
15
|
+
/**
|
|
16
|
+
* Finds all the lazy loaded JavaScript files from a webpage by parsing the page source.
|
|
17
|
+
* It looks for all `<link>` tags with `rel="modulepreload"` attribute and `<script>` tags with `src` attribute.
|
|
18
|
+
* It then resolves the relative URLs to absolute URLs and returns an array of all the JS files found.
|
|
19
|
+
*
|
|
20
|
+
* @param {string} url - The URL of the webpage to fetch and parse.
|
|
21
|
+
* @returns {Promise<string[]>} - A promise that resolves to an array of absolute URLs pointing to JavaScript files found in the page.
|
|
22
|
+
*/
|
|
23
|
+
const svelte_getFromPageSource = (url) => __awaiter(void 0, void 0, void 0, function* () {
|
|
24
|
+
console.log(chalk.cyan("[i] Analyzing page source"));
|
|
25
|
+
let foundUrls = [];
|
|
26
|
+
const pageSource = yield makeRequest(url, {});
|
|
27
|
+
const body = yield pageSource.text();
|
|
28
|
+
// cheerio to parse the page source
|
|
29
|
+
const $ = cheerio.load(body);
|
|
30
|
+
// find all link tags
|
|
31
|
+
const linkTags = $("link");
|
|
32
|
+
for (const linkTag of linkTags) {
|
|
33
|
+
const relAttr = $(linkTag).attr("rel");
|
|
34
|
+
if (relAttr === "modulepreload") {
|
|
35
|
+
const hrefAttr = $(linkTag).attr("href");
|
|
36
|
+
if (hrefAttr) {
|
|
37
|
+
if (hrefAttr.startsWith("http")) {
|
|
38
|
+
foundUrls.push(hrefAttr);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
foundUrls.push(yield resolvePath(url, hrefAttr));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// also, parse the script tags
|
|
47
|
+
const scriptTags = $("script");
|
|
48
|
+
for (const scriptTag of scriptTags) {
|
|
49
|
+
const srcAttr = $(scriptTag).attr("src");
|
|
50
|
+
if (srcAttr) {
|
|
51
|
+
if (srcAttr.startsWith("http")) {
|
|
52
|
+
foundUrls.push(srcAttr);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
foundUrls.push(yield resolvePath(url, srcAttr));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// parse astro-island component-url and renderer-url attributes (Astro island hydration)
|
|
60
|
+
const astroIslands = $("astro-island");
|
|
61
|
+
for (const island of astroIslands) {
|
|
62
|
+
for (const attr of ["component-url", "renderer-url"]) {
|
|
63
|
+
const value = $(island).attr(attr);
|
|
64
|
+
if (value) {
|
|
65
|
+
if (value.startsWith("http")) {
|
|
66
|
+
foundUrls.push(value);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
foundUrls.push(yield resolvePath(url, value));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (foundUrls.length === 0) {
|
|
75
|
+
console.error(chalk.red("[!] No JS files found from the page source"));
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
console.log(chalk.green(`[✓] Found ${foundUrls.length} JS files from the page source`));
|
|
80
|
+
}
|
|
81
|
+
// iterate through the foundUrls and resolve the paths
|
|
82
|
+
for (const foundUrl of foundUrls) {
|
|
83
|
+
if (getJsUrls().includes(foundUrl)) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
pushToJsUrls(foundUrl);
|
|
87
|
+
}
|
|
88
|
+
return foundUrls;
|
|
89
|
+
});
|
|
90
|
+
export default svelte_getFromPageSource;
|
|
91
|
+
//# sourceMappingURL=svelte_getFromPageSource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svelte_getFromPageSource.js","sourceRoot":"","sources":["../../../src/lazyLoad/svelte/svelte_getFromPageSource.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,180 @@
|
|
|
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 resolvePath from "../../utility/resolvePath.js";
|
|
14
|
+
import { URL } from "url";
|
|
15
|
+
import { pushToJsUrls } from "../globals.js";
|
|
16
|
+
import react_followImports from "../react/react_followImports.js";
|
|
17
|
+
const STAGNATION_LIMIT = 3;
|
|
18
|
+
/**
|
|
19
|
+
* Extracts same-origin page URLs from <a href> and <link href> tags.
|
|
20
|
+
* Hash fragments are stripped; only URLs matching the entry origin are returned.
|
|
21
|
+
*/
|
|
22
|
+
const extractPageLinks = (pageUrl, html) => {
|
|
23
|
+
const $ = cheerio.load(html);
|
|
24
|
+
const origin = new URL(pageUrl).origin;
|
|
25
|
+
const links = new Set();
|
|
26
|
+
$("a[href], link[href]").each((_, el) => {
|
|
27
|
+
const href = $(el).attr("href");
|
|
28
|
+
if (!href)
|
|
29
|
+
return;
|
|
30
|
+
try {
|
|
31
|
+
const resolved = new URL(href, pageUrl);
|
|
32
|
+
if (resolved.origin !== origin)
|
|
33
|
+
return;
|
|
34
|
+
resolved.hash = "";
|
|
35
|
+
links.add(resolved.href);
|
|
36
|
+
}
|
|
37
|
+
catch (_a) {
|
|
38
|
+
// unparseable href — skip
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
return [...links];
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Extracts JS file URLs from pre-fetched HTML: <link rel="modulepreload">,
|
|
45
|
+
* <script src>, and Astro island component-url attributes.
|
|
46
|
+
*/
|
|
47
|
+
const extractJsFromHtml = (pageUrl, html) => __awaiter(void 0, void 0, void 0, function* () {
|
|
48
|
+
const $ = cheerio.load(html);
|
|
49
|
+
const jsFiles = [];
|
|
50
|
+
for (const el of $("link").toArray()) {
|
|
51
|
+
const rel = $(el).attr("rel");
|
|
52
|
+
if (rel === "modulepreload") {
|
|
53
|
+
const href = $(el).attr("href");
|
|
54
|
+
if (href)
|
|
55
|
+
jsFiles.push(href.startsWith("http") ? href : yield resolvePath(pageUrl, href));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
for (const el of $("script").toArray()) {
|
|
59
|
+
const src = $(el).attr("src");
|
|
60
|
+
if (src)
|
|
61
|
+
jsFiles.push(src.startsWith("http") ? src : yield resolvePath(pageUrl, src));
|
|
62
|
+
}
|
|
63
|
+
for (const el of $("astro-island").toArray()) {
|
|
64
|
+
for (const attr of ["component-url", "renderer-url"]) {
|
|
65
|
+
const value = $(el).attr(attr);
|
|
66
|
+
if (value)
|
|
67
|
+
jsFiles.push(value.startsWith("http") ? value : yield resolvePath(pageUrl, value));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return jsFiles;
|
|
71
|
+
});
|
|
72
|
+
/**
|
|
73
|
+
* Recursively crawls same-origin HTML pages discovered via <a href> and
|
|
74
|
+
* <link href> links. For every page that responds with text/html, it runs
|
|
75
|
+
* the full JS-discovery pipeline (HTML extraction + ESM import following)
|
|
76
|
+
* and queues any new page links for further recursion.
|
|
77
|
+
*
|
|
78
|
+
* Termination:
|
|
79
|
+
* - pending queue is exhausted, or
|
|
80
|
+
* - STAGNATION_LIMIT consecutive rounds produce no new JS files.
|
|
81
|
+
*
|
|
82
|
+
* Already-visited pages are never re-processed; ESM import traversal
|
|
83
|
+
* reuses a single visited Set across all pages so no JS file is fetched
|
|
84
|
+
* twice.
|
|
85
|
+
*/
|
|
86
|
+
const svelte_recursivePageCrawl = (entryUrl_1, ...args_1) => __awaiter(void 0, [entryUrl_1, ...args_1], void 0, function* (entryUrl, maxJsSizeMb = 2, onFilesDiscovered) {
|
|
87
|
+
var _a;
|
|
88
|
+
const allJsFiles = new Set();
|
|
89
|
+
const visitedPages = new Set([entryUrl]);
|
|
90
|
+
const knownPages = new Set([entryUrl]);
|
|
91
|
+
const importVisited = new Set();
|
|
92
|
+
// Seed from entry page
|
|
93
|
+
const entryRes = yield makeRequest(entryUrl, {});
|
|
94
|
+
if (!entryRes)
|
|
95
|
+
return [];
|
|
96
|
+
const entryHtml = yield entryRes.text();
|
|
97
|
+
const initialLinks = extractPageLinks(entryUrl, entryHtml);
|
|
98
|
+
const pendingPages = [];
|
|
99
|
+
for (const link of initialLinks) {
|
|
100
|
+
if (!knownPages.has(link)) {
|
|
101
|
+
knownPages.add(link);
|
|
102
|
+
pendingPages.push(link);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (pendingPages.length === 0)
|
|
106
|
+
return [];
|
|
107
|
+
console.log(chalk.cyan(`[i] Found ${pendingPages.length} candidate page link(s) for recursive JS discovery`));
|
|
108
|
+
let stagnantRounds = 0;
|
|
109
|
+
while (pendingPages.length > 0) {
|
|
110
|
+
const batch = pendingPages.splice(0);
|
|
111
|
+
const sizeBeforeRound = allJsFiles.size;
|
|
112
|
+
for (const pageUrl of batch) {
|
|
113
|
+
if (visitedPages.has(pageUrl))
|
|
114
|
+
continue;
|
|
115
|
+
visitedPages.add(pageUrl);
|
|
116
|
+
try {
|
|
117
|
+
const res = yield makeRequest(pageUrl, {});
|
|
118
|
+
if (!res)
|
|
119
|
+
continue;
|
|
120
|
+
const contentType = (_a = res.headers.get("content-type")) !== null && _a !== void 0 ? _a : "";
|
|
121
|
+
if (!contentType.includes("text/html"))
|
|
122
|
+
continue;
|
|
123
|
+
const html = yield res.text();
|
|
124
|
+
// Extract JS files from this page's HTML
|
|
125
|
+
const jsFromPage = yield extractJsFromHtml(pageUrl, html);
|
|
126
|
+
if (jsFromPage.length > 0) {
|
|
127
|
+
for (const f of jsFromPage) {
|
|
128
|
+
pushToJsUrls(f);
|
|
129
|
+
allJsFiles.add(f);
|
|
130
|
+
}
|
|
131
|
+
if (onFilesDiscovered)
|
|
132
|
+
onFilesDiscovered(jsFromPage);
|
|
133
|
+
console.log(chalk.green(`[✓] ${pageUrl}: extracted ${jsFromPage.length} JS file(s)`));
|
|
134
|
+
}
|
|
135
|
+
// Follow ESM imports from the newly found JS files
|
|
136
|
+
let toFollow = jsFromPage.filter((f) => !importVisited.has(f));
|
|
137
|
+
while (toFollow.length > 0) {
|
|
138
|
+
const newFiles = yield react_followImports(toFollow, maxJsSizeMb, pageUrl, importVisited);
|
|
139
|
+
if (newFiles.length === 0)
|
|
140
|
+
break;
|
|
141
|
+
for (const f of newFiles) {
|
|
142
|
+
pushToJsUrls(f);
|
|
143
|
+
allJsFiles.add(f);
|
|
144
|
+
}
|
|
145
|
+
if (onFilesDiscovered)
|
|
146
|
+
onFilesDiscovered(newFiles);
|
|
147
|
+
toFollow = newFiles;
|
|
148
|
+
}
|
|
149
|
+
// Queue newly discovered same-origin page links
|
|
150
|
+
const newLinks = extractPageLinks(pageUrl, html);
|
|
151
|
+
for (const link of newLinks) {
|
|
152
|
+
if (!knownPages.has(link)) {
|
|
153
|
+
knownPages.add(link);
|
|
154
|
+
pendingPages.push(link);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
console.error(chalk.yellow(`[!] Failed to crawl ${pageUrl}: ${err instanceof Error ? err.message : String(err)}`));
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
const newFilesThisRound = allJsFiles.size - sizeBeforeRound;
|
|
163
|
+
if (newFilesThisRound === 0) {
|
|
164
|
+
stagnantRounds++;
|
|
165
|
+
if (stagnantRounds >= STAGNATION_LIMIT) {
|
|
166
|
+
console.error(chalk.yellow(`[!] Stopping page crawl: ${STAGNATION_LIMIT} consecutive rounds without new JS files`));
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
stagnantRounds = 0;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
if (allJsFiles.size > 0) {
|
|
175
|
+
console.log(chalk.green(`[✓] Recursive page crawl found ${allJsFiles.size} JS file(s) across ${visitedPages.size - 1} page(s)`));
|
|
176
|
+
}
|
|
177
|
+
return [...allJsFiles];
|
|
178
|
+
});
|
|
179
|
+
export default svelte_recursivePageCrawl;
|
|
180
|
+
//# sourceMappingURL=svelte_recursivePageCrawl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svelte_recursivePageCrawl.js","sourceRoot":"","sources":["../../../src/lazyLoad/svelte/svelte_recursivePageCrawl.ts"],"names":[],"mappings":"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"}
|