@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,516 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import chalk from "chalk";
|
|
11
|
+
import fs from "fs";
|
|
12
|
+
import { marked } from "marked";
|
|
13
|
+
import hljs from "highlight.js";
|
|
14
|
+
import addAnalyze from "./markdownGen/addAnalyze.js";
|
|
15
|
+
import CONFIG from "../../globalConfig.js";
|
|
16
|
+
import addMappedJson from "./markdownGen/addMappedJson.js";
|
|
17
|
+
import genDataTablesPage from "./dataTables/genDataTablesPage.js";
|
|
18
|
+
import { createRequire } from "module";
|
|
19
|
+
/**
|
|
20
|
+
* Attempts to read local DataTables assets from node_modules (for offline/self-contained reports)
|
|
21
|
+
*
|
|
22
|
+
* @returns An object containing the DataTables JavaScript and CSS, or null if not found
|
|
23
|
+
*/
|
|
24
|
+
const getLocalDataTablesAssets = () => {
|
|
25
|
+
try {
|
|
26
|
+
const require = createRequire(import.meta.url);
|
|
27
|
+
const dtJsPath = require.resolve("datatables.net/js/dataTables.min.js");
|
|
28
|
+
const dtCssPath = require.resolve("datatables.net-dt/css/dataTables.dataTables.min.css");
|
|
29
|
+
const js = fs.readFileSync(dtJsPath, "utf8");
|
|
30
|
+
const css = fs.readFileSync(dtCssPath, "utf8");
|
|
31
|
+
return { js, css };
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
console.warn("[DataTables] Local assets not found; falling back to CDN", (e === null || e === void 0 ? void 0 : e.message) || e);
|
|
35
|
+
return { js: null, css: null };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Attempts to read local jQuery asset
|
|
40
|
+
*
|
|
41
|
+
* @returns The jQuery JavaScript, or null if not found
|
|
42
|
+
*/
|
|
43
|
+
const getLocalJqueryAsset = () => {
|
|
44
|
+
try {
|
|
45
|
+
const require = createRequire(import.meta.url);
|
|
46
|
+
const jqPath = require.resolve("jquery/dist/jquery.min.js");
|
|
47
|
+
const js = fs.readFileSync(jqPath, "utf8");
|
|
48
|
+
return js;
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
console.warn("[DataTables] Local jQuery not found; falling back to CDN", (e === null || e === void 0 ? void 0 : e.message) || e);
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Generates an HTML report based on the provided markdown and assets.
|
|
57
|
+
*
|
|
58
|
+
* @param analyzeMarkdown - The markdown for the analyze section
|
|
59
|
+
* @param mappedJsonMarkdown - The markdown for the mapped JSON section
|
|
60
|
+
* @param dataTablesHtml - The HTML for the data tables section
|
|
61
|
+
* @param dtAssets - The DataTables assets (JavaScript and CSS)
|
|
62
|
+
* @param jqueryJs - The jQuery JavaScript
|
|
63
|
+
*
|
|
64
|
+
* @returns The generated HTML report as a string
|
|
65
|
+
*/
|
|
66
|
+
const html = (analyzeMarkdown, mappedJsonMarkdown, dataTablesHtml, dtAssets, jqueryJs) => __awaiter(void 0, void 0, void 0, function* () {
|
|
67
|
+
return `<!DOCTYPE html>
|
|
68
|
+
<html>
|
|
69
|
+
<head>
|
|
70
|
+
<meta charset="UTF-8">
|
|
71
|
+
<title>JS Recon Report</title>
|
|
72
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/highlight.js@11.9.0/styles/github-dark.css">
|
|
73
|
+
${dtAssets.css
|
|
74
|
+
? `<style id="dt-inline-css">${dtAssets.css}</style>`
|
|
75
|
+
: `<link rel="stylesheet" href="https://cdn.datatables.net/2.0.8/css/dataTables.dataTables.min.css">`}
|
|
76
|
+
<style>
|
|
77
|
+
h2, h3, h4 {
|
|
78
|
+
cursor: pointer;
|
|
79
|
+
position: relative;
|
|
80
|
+
padding-left: 20px;
|
|
81
|
+
}
|
|
82
|
+
h2::before, h3::before, h4::before {
|
|
83
|
+
content: '▼';
|
|
84
|
+
position: absolute;
|
|
85
|
+
left: 0;
|
|
86
|
+
transition: transform 0.2s;
|
|
87
|
+
}
|
|
88
|
+
.collapsed::before {
|
|
89
|
+
transform: rotate(-90deg);
|
|
90
|
+
}
|
|
91
|
+
body {
|
|
92
|
+
padding-top: 80px; /* Height of the navbar */
|
|
93
|
+
}
|
|
94
|
+
.navbar {
|
|
95
|
+
position: fixed;
|
|
96
|
+
top: 0;
|
|
97
|
+
left: 0;
|
|
98
|
+
width: 100%;
|
|
99
|
+
background-color: #ffffff;
|
|
100
|
+
border-bottom: 1px solid #e0e0e0;
|
|
101
|
+
display: flex;
|
|
102
|
+
align-items: center;
|
|
103
|
+
padding: 10px 20px;
|
|
104
|
+
z-index: 1000;
|
|
105
|
+
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
|
|
106
|
+
}
|
|
107
|
+
.navbar-logo img {
|
|
108
|
+
height: 40px;
|
|
109
|
+
}
|
|
110
|
+
.navbar-links {
|
|
111
|
+
list-style: none;
|
|
112
|
+
margin: 0 0 0 20px;
|
|
113
|
+
padding: 0;
|
|
114
|
+
display: flex;
|
|
115
|
+
gap: 15px;
|
|
116
|
+
}
|
|
117
|
+
.data-table { font-size: 0.9rem; }
|
|
118
|
+
pre.code-cell { white-space: pre-wrap; word-break: break-word; max-height: 200px; overflow: auto; }
|
|
119
|
+
thead tr.filter-row th { padding: 4px 6px; }
|
|
120
|
+
thead tr.filter-row th input {
|
|
121
|
+
width: 100%;
|
|
122
|
+
padding: 4px 6px;
|
|
123
|
+
border: 1px solid #ccc;
|
|
124
|
+
border-radius: 4px;
|
|
125
|
+
font-size: 0.85rem;
|
|
126
|
+
box-sizing: border-box;
|
|
127
|
+
}
|
|
128
|
+
/* Column resize styles */
|
|
129
|
+
table.display.data-table { table-layout: fixed; }
|
|
130
|
+
table.display.data-table thead th { position: relative; }
|
|
131
|
+
.th-resizer {
|
|
132
|
+
position: absolute;
|
|
133
|
+
right: 0;
|
|
134
|
+
top: 0;
|
|
135
|
+
width: 6px;
|
|
136
|
+
height: 100%;
|
|
137
|
+
cursor: col-resize;
|
|
138
|
+
user-select: none;
|
|
139
|
+
opacity: 0;
|
|
140
|
+
transition: opacity 0.15s ease-in-out;
|
|
141
|
+
}
|
|
142
|
+
table.display.data-table thead th:hover .th-resizer { opacity: 1; }
|
|
143
|
+
</style>
|
|
144
|
+
</head>
|
|
145
|
+
<body>
|
|
146
|
+
<nav class="navbar">
|
|
147
|
+
<div class="navbar-logo">
|
|
148
|
+
<img src="https://js-recon.io/img/js-recon-logo.png" alt="JS Recon Logo">
|
|
149
|
+
</div>
|
|
150
|
+
<ul class="navbar-links" id="navbar-links">
|
|
151
|
+
<li><a href="#home">Home</a></li>
|
|
152
|
+
<li><a href="#mappedJson">Mapped JSON</a></li>
|
|
153
|
+
<li><a href="#dataTables">Data Tables</a></li>
|
|
154
|
+
<li><a href="#about">About</a></li>
|
|
155
|
+
</ul>
|
|
156
|
+
</nav>
|
|
157
|
+
<div id="content"></div>
|
|
158
|
+
<script id="page-data" type="application/json">
|
|
159
|
+
${JSON.stringify({
|
|
160
|
+
home: yield marked.parse(analyzeMarkdown),
|
|
161
|
+
mappedJson: yield marked.parse(mappedJsonMarkdown),
|
|
162
|
+
dataTables: dataTablesHtml,
|
|
163
|
+
about: `# About\n\n The documentation for this tool is available at [JS Recon Docs](https://js-recon.io/).\n\n## Version\n\nThis report is generated with JS Recon [v${CONFIG.version}](https://github.com/shriyanss/js-recon/releases/tag/v${CONFIG.version}).`,
|
|
164
|
+
}).replace(/</g, "\\u003c")}
|
|
165
|
+
</script>
|
|
166
|
+
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
|
|
167
|
+
${jqueryJs
|
|
168
|
+
? `<script id="jquery-inline-js">${jqueryJs}</script>`
|
|
169
|
+
: `<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>`}
|
|
170
|
+
${dtAssets.js
|
|
171
|
+
? `<script id="dt-inline-js">${dtAssets.js}</script>`
|
|
172
|
+
: `<script src="https://cdn.datatables.net/2.0.8/js/dataTables.min.js"></script>`}
|
|
173
|
+
<script>
|
|
174
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
175
|
+
const contentDiv = document.getElementById('content');
|
|
176
|
+
const navbarLinks = document.getElementById('navbar-links');
|
|
177
|
+
const pages = JSON.parse(document.getElementById('page-data').textContent);
|
|
178
|
+
|
|
179
|
+
const isDtAvailable = () => {
|
|
180
|
+
if (typeof window.DataTable !== 'undefined') return true; // ESM/global
|
|
181
|
+
const $ = window.jQuery || window.$;
|
|
182
|
+
return !!($ && $.fn && ($.fn.DataTable || $.fn.dataTable)); // UMD via jQuery plugin
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
const loadScriptOnce = (src, id) => new Promise((resolve, reject) => {
|
|
186
|
+
if (document.getElementById(id)) return resolve(null);
|
|
187
|
+
const s = document.createElement('script');
|
|
188
|
+
s.src = src;
|
|
189
|
+
s.id = id;
|
|
190
|
+
s.onload = () => resolve(null);
|
|
191
|
+
s.onerror = (e) => reject(e);
|
|
192
|
+
document.head.appendChild(s);
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
const loadCssOnce = (href, id) => new Promise((resolve) => {
|
|
196
|
+
if (document.getElementById(id)) return resolve(null);
|
|
197
|
+
const l = document.createElement('link');
|
|
198
|
+
l.rel = 'stylesheet';
|
|
199
|
+
l.href = href;
|
|
200
|
+
l.id = id;
|
|
201
|
+
l.onload = () => resolve(null);
|
|
202
|
+
l.onerror = () => resolve(null);
|
|
203
|
+
document.head.appendChild(l);
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
const ensureJquery = async () => {
|
|
207
|
+
if (window.jQuery) return true;
|
|
208
|
+
const jqCdn = [
|
|
209
|
+
'https://code.jquery.com/jquery-3.7.1.min.js',
|
|
210
|
+
'https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js',
|
|
211
|
+
'https://unpkg.com/jquery@3.7.1/dist/jquery.min.js'
|
|
212
|
+
];
|
|
213
|
+
for (let i = 0; i < jqCdn.length; i++) {
|
|
214
|
+
const url = jqCdn[i];
|
|
215
|
+
try {
|
|
216
|
+
await loadScriptOnce(url, 'jq-cdn-' + i);
|
|
217
|
+
} catch (e) {
|
|
218
|
+
console.error('[jQuery] Load failed', url, e);
|
|
219
|
+
}
|
|
220
|
+
if (window.jQuery) {
|
|
221
|
+
console.log('[jQuery] Loaded from', url);
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return false;
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
const tryLoadDataTables = async () => {
|
|
229
|
+
// Ensure jQuery is present for DataTables UMD build
|
|
230
|
+
if (!isDtAvailable() && !window.jQuery) {
|
|
231
|
+
const jqOk = await ensureJquery();
|
|
232
|
+
if (!jqOk) {
|
|
233
|
+
console.error('[DataTables] jQuery not available; cannot initialize DataTables.');
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
const sources = [
|
|
237
|
+
{
|
|
238
|
+
js: 'https://cdn.datatables.net/2.0.8/js/dataTables.min.js',
|
|
239
|
+
css: 'https://cdn.datatables.net/2.0.8/css/dataTables.dataTables.min.css',
|
|
240
|
+
id: 'dt-cdn'
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
js: 'https://cdn.jsdelivr.net/npm/datatables.net@2.0.8/js/dataTables.min.js',
|
|
244
|
+
css: 'https://cdn.jsdelivr.net/npm/datatables.net-dt@2.0.8/css/dataTables.dataTables.min.css',
|
|
245
|
+
id: 'dt-jsd'
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
js: 'https://unpkg.com/datatables.net@2.0.8/js/dataTables.min.js',
|
|
249
|
+
css: 'https://unpkg.com/datatables.net-dt@2.0.8/css/dataTables.dataTables.min.css',
|
|
250
|
+
id: 'dt-unp'
|
|
251
|
+
}
|
|
252
|
+
];
|
|
253
|
+
for (const src of sources) {
|
|
254
|
+
if (isDtAvailable()) return true;
|
|
255
|
+
console.warn('[DataTables] Attempting load from', src.js);
|
|
256
|
+
await loadCssOnce(src.css, src.id + '-css');
|
|
257
|
+
try {
|
|
258
|
+
await loadScriptOnce(src.js, src.id + '-js');
|
|
259
|
+
} catch (e) {
|
|
260
|
+
console.error('[DataTables] Load failed', src.js, e);
|
|
261
|
+
}
|
|
262
|
+
if (isDtAvailable()) {
|
|
263
|
+
console.log('[DataTables] Loaded from', src.js);
|
|
264
|
+
return true;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return false;
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
const updateVisibility = () => {
|
|
271
|
+
const headers = contentDiv.querySelectorAll('h2, h3, h4');
|
|
272
|
+
let parentCollapsedLevels = [];
|
|
273
|
+
headers.forEach(header => {
|
|
274
|
+
const level = parseInt(header.tagName.substring(1));
|
|
275
|
+
parentCollapsedLevels = parentCollapsedLevels.filter(l => l < level);
|
|
276
|
+
if (parentCollapsedLevels.length > 0) {
|
|
277
|
+
header.style.display = 'none';
|
|
278
|
+
} else {
|
|
279
|
+
header.style.display = '';
|
|
280
|
+
}
|
|
281
|
+
if (header.classList.contains('collapsed')) {
|
|
282
|
+
parentCollapsedLevels.push(level);
|
|
283
|
+
}
|
|
284
|
+
let nextEl = header.nextElementSibling;
|
|
285
|
+
while (nextEl && !nextEl.tagName.match(/^H[1-4]$/)) {
|
|
286
|
+
if (parentCollapsedLevels.length > 0) {
|
|
287
|
+
nextEl.style.display = 'none';
|
|
288
|
+
} else {
|
|
289
|
+
nextEl.style.display = '';
|
|
290
|
+
}
|
|
291
|
+
nextEl = nextEl.nextElementSibling;
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
const setColWidth = (tableEl, colIndex, widthPx) => {
|
|
297
|
+
const nth = colIndex + 1;
|
|
298
|
+
const w = Math.max(50, widthPx) + 'px';
|
|
299
|
+
const th = tableEl.querySelector('thead tr:first-child th:nth-child(' + nth + ')');
|
|
300
|
+
if (th) th.style.width = w;
|
|
301
|
+
const filterTh = tableEl.querySelector('thead tr.filter-row th:nth-child(' + nth + ')');
|
|
302
|
+
if (filterTh) filterTh.style.width = w;
|
|
303
|
+
const tds = tableEl.querySelectorAll('tbody tr td:nth-child(' + nth + ')');
|
|
304
|
+
tds.forEach(td => { td.style.width = w; });
|
|
305
|
+
};
|
|
306
|
+
|
|
307
|
+
const addColumnResizers = (tableEl) => {
|
|
308
|
+
if (!tableEl || tableEl.dataset.resizers === '1') return;
|
|
309
|
+
const ths = tableEl.querySelectorAll('thead tr:first-child th');
|
|
310
|
+
ths.forEach((th, idx) => {
|
|
311
|
+
if (th.querySelector('.th-resizer')) return;
|
|
312
|
+
const handle = document.createElement('div');
|
|
313
|
+
handle.className = 'th-resizer';
|
|
314
|
+
th.appendChild(handle);
|
|
315
|
+
let startX = 0;
|
|
316
|
+
let startWidth = 0;
|
|
317
|
+
const onMouseMove = (e) => {
|
|
318
|
+
const dx = e.pageX - startX;
|
|
319
|
+
setColWidth(tableEl, idx, startWidth + dx);
|
|
320
|
+
};
|
|
321
|
+
const onMouseUp = () => {
|
|
322
|
+
document.removeEventListener('mousemove', onMouseMove);
|
|
323
|
+
document.removeEventListener('mouseup', onMouseUp);
|
|
324
|
+
document.body.style.cursor = '';
|
|
325
|
+
};
|
|
326
|
+
handle.addEventListener('mousedown', (e) => {
|
|
327
|
+
e.preventDefault();
|
|
328
|
+
startX = e.pageX;
|
|
329
|
+
startWidth = th.offsetWidth;
|
|
330
|
+
document.addEventListener('mousemove', onMouseMove);
|
|
331
|
+
document.addEventListener('mouseup', onMouseUp);
|
|
332
|
+
document.body.style.cursor = 'col-resize';
|
|
333
|
+
});
|
|
334
|
+
});
|
|
335
|
+
tableEl.dataset.resizers = '1';
|
|
336
|
+
// Ensure table layout
|
|
337
|
+
tableEl.style.tableLayout = 'fixed';
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
const initializeDataTablesIfPresent = async () => {
|
|
341
|
+
try {
|
|
342
|
+
// Ensure DataTables (ESM or UMD) is present
|
|
343
|
+
if (!isDtAvailable()) {
|
|
344
|
+
const ok = await tryLoadDataTables();
|
|
345
|
+
if (!ok) {
|
|
346
|
+
console.error('[DataTables] Unable to load DataTables from any CDN. Controls disabled.');
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
const tables = contentDiv.querySelectorAll('table.data-table');
|
|
351
|
+
console.log('[DataTables] Initializing', tables.length, 'table(s)');
|
|
352
|
+
tables.forEach((table) => {
|
|
353
|
+
if (table.dataset.dtInit === '1') return;
|
|
354
|
+
const options = {
|
|
355
|
+
paging: true,
|
|
356
|
+
searching: true,
|
|
357
|
+
ordering: true,
|
|
358
|
+
orderMulti: true,
|
|
359
|
+
pageLength: 25,
|
|
360
|
+
autoWidth: false,
|
|
361
|
+
// v1 fallback
|
|
362
|
+
dom: 'lfrtip',
|
|
363
|
+
// v2 layout API
|
|
364
|
+
layout: {
|
|
365
|
+
topStart: 'search',
|
|
366
|
+
topEnd: 'pageLength',
|
|
367
|
+
bottomStart: 'info',
|
|
368
|
+
bottomEnd: 'paging'
|
|
369
|
+
}
|
|
370
|
+
};
|
|
371
|
+
|
|
372
|
+
// Per-table column options
|
|
373
|
+
if (table.id === 'findings-table') {
|
|
374
|
+
options.columnDefs = [{ targets: 8, orderable: false, searchable: false }];
|
|
375
|
+
} else if (table.id === 'mapped-table') {
|
|
376
|
+
options.columnDefs = [{ targets: [2, 3], searchable: false }];
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
let dt;
|
|
380
|
+
try {
|
|
381
|
+
if (typeof window.DataTable !== 'undefined') {
|
|
382
|
+
dt = new window.DataTable(table, options); // ESM/global style
|
|
383
|
+
} else {
|
|
384
|
+
const $ = window.jQuery || window.$;
|
|
385
|
+
if ($ && $.fn && $.fn.DataTable) {
|
|
386
|
+
dt = $(table).DataTable(options); // UMD via jQuery plugin
|
|
387
|
+
} else {
|
|
388
|
+
throw new Error('DataTables not available.');
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
} catch (e) {
|
|
392
|
+
console.error('[DataTables] Error instantiating on table#' + table.id, e);
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// Add per-column filters (second header row)
|
|
397
|
+
const thead = table.querySelector('thead');
|
|
398
|
+
if (thead && !thead.querySelector('tr.filter-row')) {
|
|
399
|
+
const headerCells = thead.querySelectorAll('tr:first-child th');
|
|
400
|
+
const filterRow = document.createElement('tr');
|
|
401
|
+
filterRow.className = 'filter-row';
|
|
402
|
+
headerCells.forEach((th, idx) => {
|
|
403
|
+
const thFilter = document.createElement('th');
|
|
404
|
+
// Skip filter for non-searchable columns if specified
|
|
405
|
+
const isSearchable = !options.columnDefs || !options.columnDefs.some(cd => {
|
|
406
|
+
if (Array.isArray(cd.targets)) return cd.targets.includes(idx) && cd.searchable === false;
|
|
407
|
+
return cd.targets === idx && cd.searchable === false;
|
|
408
|
+
});
|
|
409
|
+
if (isSearchable) {
|
|
410
|
+
const input = document.createElement('input');
|
|
411
|
+
input.type = 'text';
|
|
412
|
+
input.placeholder = 'Filter ' + (th.textContent || '').trim();
|
|
413
|
+
input.addEventListener('input', () => {
|
|
414
|
+
dt.column(idx).search(input.value).draw();
|
|
415
|
+
});
|
|
416
|
+
thFilter.appendChild(input);
|
|
417
|
+
}
|
|
418
|
+
filterRow.appendChild(thFilter);
|
|
419
|
+
});
|
|
420
|
+
thead.appendChild(filterRow);
|
|
421
|
+
}
|
|
422
|
+
table.dataset.dtInit = '1';
|
|
423
|
+
// Attach column resizers after DataTables and filters are in place
|
|
424
|
+
addColumnResizers(table);
|
|
425
|
+
// Let DataTables recalc
|
|
426
|
+
try { if (dt && dt.columns) dt.columns().adjust(); } catch (e) {}
|
|
427
|
+
});
|
|
428
|
+
} catch (e) {
|
|
429
|
+
console.error('DataTables init error', e);
|
|
430
|
+
}
|
|
431
|
+
};
|
|
432
|
+
|
|
433
|
+
const initializeCollapsibleHeaders = () => {
|
|
434
|
+
const headers = contentDiv.querySelectorAll('h2, h3, h4');
|
|
435
|
+
headers.forEach((header) => {
|
|
436
|
+
if (header.tagName.toLowerCase() === 'h3') {
|
|
437
|
+
header.classList.add('collapsed');
|
|
438
|
+
}
|
|
439
|
+
header.addEventListener('click', () => {
|
|
440
|
+
header.classList.toggle('collapsed');
|
|
441
|
+
updateVisibility();
|
|
442
|
+
});
|
|
443
|
+
});
|
|
444
|
+
updateVisibility();
|
|
445
|
+
};
|
|
446
|
+
|
|
447
|
+
const renderPage = (pageName) => {
|
|
448
|
+
const content = pages[pageName] || '<h2>Page Not Found: ' + pageName + '</h2>';
|
|
449
|
+
if (pageName === 'home' || pageName === 'dataTables' || pageName === 'mappedJson') {
|
|
450
|
+
contentDiv.innerHTML = content;
|
|
451
|
+
} else {
|
|
452
|
+
contentDiv.innerHTML = window.marked.parse(content);
|
|
453
|
+
}
|
|
454
|
+
initializeCollapsibleHeaders();
|
|
455
|
+
initializeDataTablesIfPresent();
|
|
456
|
+
};
|
|
457
|
+
|
|
458
|
+
const handleHashChange = () => {
|
|
459
|
+
const pageName = window.location.hash.substring(1) || 'home';
|
|
460
|
+
renderPage(pageName);
|
|
461
|
+
};
|
|
462
|
+
|
|
463
|
+
navbarLinks.addEventListener('click', (event) => {
|
|
464
|
+
const t = event.target;
|
|
465
|
+
const a = t && (t.closest ? t.closest('a') : null);
|
|
466
|
+
if (a && a.hash) {
|
|
467
|
+
event.preventDefault();
|
|
468
|
+
const pageName = a.hash.substring(1);
|
|
469
|
+
window.location.hash = pageName;
|
|
470
|
+
}
|
|
471
|
+
});
|
|
472
|
+
|
|
473
|
+
window.addEventListener('hashchange', handleHashChange);
|
|
474
|
+
|
|
475
|
+
// Initial page load
|
|
476
|
+
handleHashChange();
|
|
477
|
+
});
|
|
478
|
+
</script>
|
|
479
|
+
</body>
|
|
480
|
+
</html>`;
|
|
481
|
+
});
|
|
482
|
+
/**
|
|
483
|
+
* Generates an HTML report based on the provided database.
|
|
484
|
+
*
|
|
485
|
+
* @param outputReportFile - The path to the output report file
|
|
486
|
+
* @param db - The database containing the findings and mapped data
|
|
487
|
+
*
|
|
488
|
+
* @returns A promise that resolves when the HTML report is generated
|
|
489
|
+
*/
|
|
490
|
+
const genHtml = (outputReportFile, db) => __awaiter(void 0, void 0, void 0, function* () {
|
|
491
|
+
console.log(chalk.cyan("[i] Generating HTML report..."));
|
|
492
|
+
let analyzeMarkdown = `# JS Recon Report generated at ${new Date().toISOString()}\n\n`;
|
|
493
|
+
let mappedJsonMarkdown = analyzeMarkdown;
|
|
494
|
+
analyzeMarkdown = yield addAnalyze(analyzeMarkdown, db);
|
|
495
|
+
mappedJsonMarkdown = yield addMappedJson(mappedJsonMarkdown, db);
|
|
496
|
+
const dataTablesHtml = genDataTablesPage(db);
|
|
497
|
+
const renderer = new marked.Renderer();
|
|
498
|
+
renderer.code = ({ text, lang }) => {
|
|
499
|
+
const language = hljs.getLanguage(lang) ? lang : "plaintext";
|
|
500
|
+
const highlightedCode = hljs.highlight(text, { language, ignoreIllegals: true }).value;
|
|
501
|
+
return `<pre><code class="hljs ${language}">${highlightedCode}</code></pre>`;
|
|
502
|
+
};
|
|
503
|
+
marked.setOptions({
|
|
504
|
+
renderer,
|
|
505
|
+
async: true,
|
|
506
|
+
pedantic: false,
|
|
507
|
+
gfm: true,
|
|
508
|
+
});
|
|
509
|
+
const dtAssets = getLocalDataTablesAssets();
|
|
510
|
+
const jqueryJs = getLocalJqueryAsset();
|
|
511
|
+
const renderedHtml = yield html(analyzeMarkdown, mappedJsonMarkdown, dataTablesHtml, dtAssets, jqueryJs);
|
|
512
|
+
fs.writeFileSync(outputReportFile, renderedHtml);
|
|
513
|
+
console.log(chalk.green("[✓] HTML report generated successfully"));
|
|
514
|
+
});
|
|
515
|
+
export default genHtml;
|
|
516
|
+
//# sourceMappingURL=genHtml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"genHtml.js","sourceRoot":"","sources":["../../../src/report/utility/genHtml.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import Database from "better-sqlite3";
|
|
11
|
+
/**
|
|
12
|
+
* Creates the mapped table in the database.
|
|
13
|
+
*
|
|
14
|
+
* @param db - The database to create the table in
|
|
15
|
+
*/
|
|
16
|
+
const createMappedTable = (db) => {
|
|
17
|
+
db.prepare(`
|
|
18
|
+
CREATE TABLE IF NOT EXISTS mapped (
|
|
19
|
+
id TEXT PRIMARY KEY,
|
|
20
|
+
description TEXT,
|
|
21
|
+
loadedOn TEXT,
|
|
22
|
+
containsFetch BOOLEAN,
|
|
23
|
+
isAxiosClient BOOLEAN,
|
|
24
|
+
exports TEXT,
|
|
25
|
+
callStack TEXT,
|
|
26
|
+
code TEXT,
|
|
27
|
+
imports TEXT,
|
|
28
|
+
file TEXT
|
|
29
|
+
)
|
|
30
|
+
`).run();
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Creates the mapped OpenAPI table in the database.
|
|
34
|
+
*
|
|
35
|
+
* @param db - The database to create the table in
|
|
36
|
+
*/
|
|
37
|
+
const createMappedOpenapiTable = (db) => {
|
|
38
|
+
db.prepare(`
|
|
39
|
+
CREATE TABLE IF NOT EXISTS mapped_openapi (
|
|
40
|
+
path TEXT,
|
|
41
|
+
method TEXT,
|
|
42
|
+
summary TEXT,
|
|
43
|
+
parameters TEXT,
|
|
44
|
+
requestBody TEXT,
|
|
45
|
+
tags TEXT,
|
|
46
|
+
PRIMARY KEY (path, method)
|
|
47
|
+
)
|
|
48
|
+
`).run();
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Creates the endpoints table in the database.
|
|
52
|
+
*
|
|
53
|
+
* @param db - The database to create the table in
|
|
54
|
+
*/
|
|
55
|
+
const createEndpointsTable = (db) => {
|
|
56
|
+
db.prepare(`
|
|
57
|
+
CREATE TABLE IF NOT EXISTS endpoints (
|
|
58
|
+
url TEXT PRIMARY KEY
|
|
59
|
+
)
|
|
60
|
+
`).run();
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Creates the analysis findings table in the database.
|
|
64
|
+
*
|
|
65
|
+
* @param db - The database to create the table in
|
|
66
|
+
*/
|
|
67
|
+
const createAnalysisFindingsTable = (db) => {
|
|
68
|
+
db.prepare(`
|
|
69
|
+
CREATE TABLE IF NOT EXISTS analysis_findings (
|
|
70
|
+
ruleId TEXT,
|
|
71
|
+
ruleName TEXT,
|
|
72
|
+
ruleType TEXT,
|
|
73
|
+
ruleDescription TEXT,
|
|
74
|
+
ruleAuthor TEXT,
|
|
75
|
+
ruleTech TEXT,
|
|
76
|
+
severity TEXT,
|
|
77
|
+
message TEXT,
|
|
78
|
+
findingLocation TEXT
|
|
79
|
+
)
|
|
80
|
+
`).run();
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Initializes the report database.
|
|
84
|
+
*
|
|
85
|
+
* @param sqliteDbPath - The path to the SQLite database file
|
|
86
|
+
*/
|
|
87
|
+
const initReportDb = (sqliteDbPath) => __awaiter(void 0, void 0, void 0, function* () {
|
|
88
|
+
const db = new Database(sqliteDbPath);
|
|
89
|
+
createMappedTable(db);
|
|
90
|
+
createMappedOpenapiTable(db);
|
|
91
|
+
createEndpointsTable(db);
|
|
92
|
+
createAnalysisFindingsTable(db);
|
|
93
|
+
db.close();
|
|
94
|
+
});
|
|
95
|
+
export default initReportDb;
|
|
96
|
+
//# sourceMappingURL=initReportDb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initReportDb.js","sourceRoot":"","sources":["../../../src/report/utility/initReportDb.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC;;;;GAIG;AACH,MAAM,iBAAiB,GAAG,CAAC,EAAqB,EAAE,EAAE;IAChD,EAAE,CAAC,OAAO,CACN;;;;;;;;;;;;;KAaH,CACA,CAAC,GAAG,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,wBAAwB,GAAG,CAAC,EAAqB,EAAE,EAAE;IACvD,EAAE,CAAC,OAAO,CACN;;;;;;;;;;KAUH,CACA,CAAC,GAAG,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,oBAAoB,GAAG,CAAC,EAAqB,EAAE,EAAE;IACnD,EAAE,CAAC,OAAO,CACN;;;;KAIH,CACA,CAAC,GAAG,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,2BAA2B,GAAG,CAAC,EAAqB,EAAE,EAAE;IAC1D,EAAE,CAAC,OAAO,CACN;;;;;;;;;;;;KAYH,CACA,CAAC,GAAG,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,YAAY,GAAG,CAAO,YAAoB,EAAE,EAAE;IAChD,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,YAAY,CAAC,CAAC;IAEtC,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACtB,wBAAwB,CAAC,EAAE,CAAC,CAAC;IAC7B,oBAAoB,CAAC,EAAE,CAAC,CAAC;IACzB,2BAA2B,CAAC,EAAE,CAAC,CAAC;IAEhC,EAAE,CAAC,KAAK,EAAE,CAAC;AACf,CAAC,CAAA,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Adds an analyze section to the markdown.
|
|
12
|
+
*
|
|
13
|
+
* @param markdown - The markdown string to add the analyze section to
|
|
14
|
+
* @param db - The database containing the findings
|
|
15
|
+
*
|
|
16
|
+
* @returns A promise that resolves with the markdown string containing the analyze section
|
|
17
|
+
*/
|
|
18
|
+
const addAnalyze = (markdown, db) => __awaiter(void 0, void 0, void 0, function* () {
|
|
19
|
+
let toReturn = markdown;
|
|
20
|
+
toReturn += `\n## Analyze Results\n`;
|
|
21
|
+
const findings = db.prepare(`SELECT * FROM analysis_findings`).all();
|
|
22
|
+
if (findings.length > 0) {
|
|
23
|
+
const groupedFindings = {};
|
|
24
|
+
for (const finding of findings) {
|
|
25
|
+
if (!groupedFindings[finding.ruleType]) {
|
|
26
|
+
groupedFindings[finding.ruleType] = [];
|
|
27
|
+
}
|
|
28
|
+
groupedFindings[finding.ruleType].push(finding);
|
|
29
|
+
}
|
|
30
|
+
for (const ruleType in groupedFindings) {
|
|
31
|
+
toReturn += `### ${ruleType.toUpperCase()}\n`;
|
|
32
|
+
for (const finding of groupedFindings[ruleType]) {
|
|
33
|
+
toReturn += `#### ${finding.ruleName}, ${finding.ruleDescription}\n`;
|
|
34
|
+
let findingLocationBlock = "";
|
|
35
|
+
if (ruleType.toLowerCase() === "ast") {
|
|
36
|
+
findingLocationBlock = "```js\n" + finding.findingLocation + "\n```";
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
findingLocationBlock = "```\n" + finding.findingLocation + "\n```";
|
|
40
|
+
}
|
|
41
|
+
toReturn += `${findingLocationBlock}\n`;
|
|
42
|
+
toReturn += `- **Rule ID:** ${finding.ruleId}\n`;
|
|
43
|
+
toReturn += `- **Severity:** ${finding.severity}\n`;
|
|
44
|
+
toReturn += `- **Message:** ${finding.message}\n`;
|
|
45
|
+
toReturn += `- **Author:** ${finding.ruleAuthor}\n`;
|
|
46
|
+
toReturn += `- **Technology:** ${finding.ruleTech}\n\n`;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return toReturn;
|
|
51
|
+
});
|
|
52
|
+
export default addAnalyze;
|
|
53
|
+
//# sourceMappingURL=addAnalyze.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addAnalyze.js","sourceRoot":"","sources":["../../../../src/report/utility/markdownGen/addAnalyze.ts"],"names":[],"mappings":";;;;;;;;;AAcA;;;;;;;GAOG;AACH,MAAM,UAAU,GAAG,CAAO,QAAgB,EAAE,EAAqB,EAAmB,EAAE;IAClF,IAAI,QAAQ,GAAG,QAAQ,CAAC;IACxB,QAAQ,IAAI,wBAAwB,CAAC;IACrC,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC,GAAG,EAAuB,CAAC;IAC1F,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,eAAe,GAAyC,EAAE,CAAC;QACjE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACrC,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;YAC3C,CAAC;YACD,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC;QAED,KAAK,MAAM,QAAQ,IAAI,eAAe,EAAE,CAAC;YACrC,QAAQ,IAAI,OAAO,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;YAC9C,KAAK,MAAM,OAAO,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9C,QAAQ,IAAI,QAAQ,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,eAAe,IAAI,CAAC;gBACrE,IAAI,oBAAoB,GAAG,EAAE,CAAC;gBAC9B,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;oBACnC,oBAAoB,GAAG,SAAS,GAAG,OAAO,CAAC,eAAe,GAAG,OAAO,CAAC;gBACzE,CAAC;qBAAM,CAAC;oBACJ,oBAAoB,GAAG,OAAO,GAAG,OAAO,CAAC,eAAe,GAAG,OAAO,CAAC;gBACvE,CAAC;gBACD,QAAQ,IAAI,GAAG,oBAAoB,IAAI,CAAC;gBACxC,QAAQ,IAAI,kBAAkB,OAAO,CAAC,MAAM,IAAI,CAAC;gBACjD,QAAQ,IAAI,mBAAmB,OAAO,CAAC,QAAQ,IAAI,CAAC;gBACpD,QAAQ,IAAI,kBAAkB,OAAO,CAAC,OAAO,IAAI,CAAC;gBAClD,QAAQ,IAAI,iBAAiB,OAAO,CAAC,UAAU,IAAI,CAAC;gBACpD,QAAQ,IAAI,qBAAqB,OAAO,CAAC,QAAQ,MAAM,CAAC;YAC5D,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAA,CAAC;AAEF,eAAe,UAAU,CAAC"}
|