@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,254 @@
|
|
|
1
|
+
import * as globalsUtil from "./globals.js";
|
|
2
|
+
import replacePlaceholders from "./replaceUrlPlaceholders.js";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
/**
|
|
5
|
+
* Returns the OpenAPI type string corresponding to the given value.
|
|
6
|
+
*
|
|
7
|
+
* If the value is null, returns "string" as OpenAPI 3.0 doesn't have a 'null' type.
|
|
8
|
+
* If the value is an array, returns "array".
|
|
9
|
+
* If the value is a primitive type (string, number, boolean), returns the corresponding OpenAPI type.
|
|
10
|
+
* If the value is an object, returns "object".
|
|
11
|
+
* For other types, returns "string" as a fallback.
|
|
12
|
+
* @param value - The value to determine the OpenAPI type for
|
|
13
|
+
* @returns The OpenAPI type string corresponding to the given value
|
|
14
|
+
*/
|
|
15
|
+
// Zod-style placeholder strings emitted by traceBody (e.g. "<number>", "<date>",
|
|
16
|
+
// "<array>") carry the field's real type even though they're stringified. Map
|
|
17
|
+
// them back to an OpenAPI type so the spec doesn't collapse every body field
|
|
18
|
+
// to `type: "string"`.
|
|
19
|
+
const ZOD_PLACEHOLDER_TYPE_MAP = {
|
|
20
|
+
string: "string",
|
|
21
|
+
number: "number",
|
|
22
|
+
integer: "integer",
|
|
23
|
+
bigint: "integer",
|
|
24
|
+
boolean: "boolean",
|
|
25
|
+
date: "string",
|
|
26
|
+
array: "array",
|
|
27
|
+
object: "object",
|
|
28
|
+
enum: "string",
|
|
29
|
+
literal: "string",
|
|
30
|
+
unknown: "string",
|
|
31
|
+
coerce: "string",
|
|
32
|
+
};
|
|
33
|
+
export const getZodPlaceholderType = (value) => {
|
|
34
|
+
var _a;
|
|
35
|
+
if (typeof value !== "string")
|
|
36
|
+
return null;
|
|
37
|
+
const match = /^<([a-zA-Z]+)>$/.exec(value);
|
|
38
|
+
if (!match)
|
|
39
|
+
return null;
|
|
40
|
+
return (_a = ZOD_PLACEHOLDER_TYPE_MAP[match[1]]) !== null && _a !== void 0 ? _a : null;
|
|
41
|
+
};
|
|
42
|
+
export const getOpenApiType = (value) => {
|
|
43
|
+
if (value === null) {
|
|
44
|
+
return "string"; // OpenAPI 3.0 doesn't have a 'null' type, use nullable
|
|
45
|
+
}
|
|
46
|
+
if (Array.isArray(value)) {
|
|
47
|
+
return "array";
|
|
48
|
+
}
|
|
49
|
+
const placeholderType = getZodPlaceholderType(value);
|
|
50
|
+
if (placeholderType)
|
|
51
|
+
return placeholderType;
|
|
52
|
+
const jsType = typeof value;
|
|
53
|
+
if (["string", "number", "boolean", "object"].includes(jsType)) {
|
|
54
|
+
return jsType;
|
|
55
|
+
}
|
|
56
|
+
return "string"; // Fallback for other types
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Generates an OpenAPI v3 spec based on the given OpenAPI output items.
|
|
60
|
+
*
|
|
61
|
+
* @param items - The OpenAPI output items to generate the spec from
|
|
62
|
+
* @param chunks - The chunks of API endpoints that the items belong to
|
|
63
|
+
* @returns The generated OpenAPI v3 spec
|
|
64
|
+
*/
|
|
65
|
+
export const generateOpenapiV3Spec = (items, _chunks) => {
|
|
66
|
+
var _a;
|
|
67
|
+
const spec = {
|
|
68
|
+
openapi: "3.0.0",
|
|
69
|
+
info: {
|
|
70
|
+
title: "API Collection",
|
|
71
|
+
description: "A collection of API endpoints discovered by js-recon.",
|
|
72
|
+
version: "1.0.0",
|
|
73
|
+
},
|
|
74
|
+
servers: [
|
|
75
|
+
{
|
|
76
|
+
url: "{{baseUrl}}",
|
|
77
|
+
description: "Base URL for the API",
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
paths: {},
|
|
81
|
+
};
|
|
82
|
+
// Tracks how many times we've already seen the same (path, method) so a
|
|
83
|
+
// second callsite gets a disambiguating fragment on its path key rather than
|
|
84
|
+
// being silently dropped. OpenAPI paths are opaque strings so a `#N` suffix
|
|
85
|
+
// is preserved by tools that key on it.
|
|
86
|
+
const callsiteCounts = new Map();
|
|
87
|
+
for (const item of items) {
|
|
88
|
+
let rawItemPath = typeof item.path === "string" ? replacePlaceholders(item.path) : "";
|
|
89
|
+
try {
|
|
90
|
+
if (rawItemPath.startsWith("http://") || rawItemPath.startsWith("https://")) {
|
|
91
|
+
rawItemPath = new URL(rawItemPath).pathname;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (_b) { }
|
|
95
|
+
const pathKeyBeforeQuery = rawItemPath.split("?")[0];
|
|
96
|
+
const basePathKey = replacePlaceholders(pathKeyBeforeQuery.startsWith("/") ? pathKeyBeforeQuery : `/${pathKeyBeforeQuery}`);
|
|
97
|
+
const VALID_METHODS = new Set(["get", "post", "put", "patch", "delete", "head", "options", "trace"]);
|
|
98
|
+
const rawMethod = typeof item.method === "string" ? item.method.toLowerCase() : "";
|
|
99
|
+
const methodIsValid = VALID_METHODS.has(rawMethod);
|
|
100
|
+
const method = methodIsValid ? rawMethod : "get";
|
|
101
|
+
const dedupeKey = `${method} ${basePathKey}`;
|
|
102
|
+
const seenBefore = (_a = callsiteCounts.get(dedupeKey)) !== null && _a !== void 0 ? _a : 0;
|
|
103
|
+
const pathKey = seenBefore === 0 ? basePathKey : `${basePathKey}#${seenBefore + 1}`;
|
|
104
|
+
callsiteCounts.set(dedupeKey, seenBefore + 1);
|
|
105
|
+
if (!spec.paths[pathKey]) {
|
|
106
|
+
spec.paths[pathKey] = {};
|
|
107
|
+
}
|
|
108
|
+
// Avoid overwriting if the same path & method already processed (only
|
|
109
|
+
// possible now when two identical items collide on the disambiguated
|
|
110
|
+
// path — guard kept for safety).
|
|
111
|
+
if (spec.paths[pathKey][method]) {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
const parameters = Object.entries(item.headers || {}).map(([name, value]) => {
|
|
115
|
+
const schema = {
|
|
116
|
+
type: getOpenApiType(value),
|
|
117
|
+
example: value,
|
|
118
|
+
};
|
|
119
|
+
if (value === null) {
|
|
120
|
+
schema.nullable = true;
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
name,
|
|
124
|
+
in: "header",
|
|
125
|
+
required: true, // Assuming headers found are required for the call to succeed as intended
|
|
126
|
+
schema,
|
|
127
|
+
};
|
|
128
|
+
});
|
|
129
|
+
// Extract path parameters. The negative lookbehind/lookahead avoids
|
|
130
|
+
// matching the inner braces of a `{{var}}` collection-level placeholder
|
|
131
|
+
// (e.g. `{{graphqlEndpoint}}`) as a path parameter.
|
|
132
|
+
const pathParams = pathKey.match(/(?<!\{)\{([^{}]+)\}(?!\})/g);
|
|
133
|
+
if (pathParams) {
|
|
134
|
+
for (const p of pathParams) {
|
|
135
|
+
const paramName = p.slice(1, -1);
|
|
136
|
+
parameters.push({
|
|
137
|
+
name: paramName,
|
|
138
|
+
in: "path",
|
|
139
|
+
required: true,
|
|
140
|
+
schema: { type: "string", example: "any" },
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Extract query parameters
|
|
145
|
+
try {
|
|
146
|
+
const url = new URL(replacePlaceholders(item.path), "http://dummybase");
|
|
147
|
+
const queryParams = url.searchParams;
|
|
148
|
+
queryParams.forEach((value, name) => {
|
|
149
|
+
parameters.push({
|
|
150
|
+
name: name,
|
|
151
|
+
in: "query",
|
|
152
|
+
required: false, // Or determine based on logic
|
|
153
|
+
schema: { type: "string", example: value },
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
catch (_e) {
|
|
158
|
+
// unparseable placeholder URLs
|
|
159
|
+
console.error(chalk.red(`[!] Failed to parse: ${item.path} as URL for query parameter extraction, skipping query params.`));
|
|
160
|
+
}
|
|
161
|
+
// Build a location description for server action entries.
|
|
162
|
+
let locationDescription;
|
|
163
|
+
if (item.serverActionCallFile || item.functionFile) {
|
|
164
|
+
const defLoc = `chunk ${item.chunkId} at ${item.functionFile}:${item.functionFileLine}`;
|
|
165
|
+
const callLoc = item.serverActionCallFile
|
|
166
|
+
? `chunk ${item.serverActionCallChunkId} at ${item.serverActionCallFile}:${item.serverActionCallLine}`
|
|
167
|
+
: undefined;
|
|
168
|
+
locationDescription = `Defined in ${defLoc}`;
|
|
169
|
+
if (callLoc && callLoc !== `chunk ${item.chunkId} at ${item.functionFile}:${item.functionFileLine}`) {
|
|
170
|
+
locationDescription += `\nArguments from ${callLoc}`;
|
|
171
|
+
}
|
|
172
|
+
else if (callLoc) {
|
|
173
|
+
locationDescription += `\nArguments from ${callLoc}`;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
const operationObject = Object.assign(Object.assign({ summary: item.summary || `${pathKey}` }, (locationDescription ? { description: locationDescription } : {})), { responses: {
|
|
177
|
+
"200": {
|
|
178
|
+
description: "Successful response. The actual response will vary.",
|
|
179
|
+
},
|
|
180
|
+
}, tags: item.collectionFolder
|
|
181
|
+
? [item.collectionFolder]
|
|
182
|
+
: globalsUtil.getOpenapiChunkTag()
|
|
183
|
+
? [item.chunkId]
|
|
184
|
+
: [] });
|
|
185
|
+
if (!methodIsValid) {
|
|
186
|
+
operationObject.description =
|
|
187
|
+
`Note: original HTTP method ${JSON.stringify(item.method)} could not be determined; defaulted to GET — verify before use.`;
|
|
188
|
+
}
|
|
189
|
+
if (parameters.length > 0) {
|
|
190
|
+
operationObject.parameters = parameters;
|
|
191
|
+
}
|
|
192
|
+
if (item.body) {
|
|
193
|
+
let requestBody;
|
|
194
|
+
try {
|
|
195
|
+
const body = JSON.parse(item.body);
|
|
196
|
+
if (Array.isArray(body)) {
|
|
197
|
+
// JSON-array body (e.g. Next.js Server Action arguments sent as
|
|
198
|
+
// text/plain). Represent as a raw string with the parsed array
|
|
199
|
+
// as the example so tools show the actual expected shape.
|
|
200
|
+
requestBody = {
|
|
201
|
+
content: {
|
|
202
|
+
"text/plain": {
|
|
203
|
+
schema: { type: "string" },
|
|
204
|
+
example: item.body,
|
|
205
|
+
},
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
else if (typeof body === "object" && body !== null) {
|
|
210
|
+
const properties = {};
|
|
211
|
+
for (const key in body) {
|
|
212
|
+
const value = body[key];
|
|
213
|
+
const type = getOpenApiType(value);
|
|
214
|
+
properties[key] = {
|
|
215
|
+
type: type,
|
|
216
|
+
example: value,
|
|
217
|
+
};
|
|
218
|
+
if (value === null) {
|
|
219
|
+
properties[key].nullable = true;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
requestBody = {
|
|
223
|
+
content: {
|
|
224
|
+
"application/json": {
|
|
225
|
+
schema: {
|
|
226
|
+
type: "object",
|
|
227
|
+
properties: properties,
|
|
228
|
+
},
|
|
229
|
+
},
|
|
230
|
+
},
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
throw new Error("Body is not a JSON object.");
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
// Fallback for non-JSON bodies
|
|
239
|
+
requestBody = {
|
|
240
|
+
content: {
|
|
241
|
+
"application/json": {
|
|
242
|
+
schema: { type: "string" },
|
|
243
|
+
example: item.body,
|
|
244
|
+
},
|
|
245
|
+
},
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
operationObject.requestBody = requestBody;
|
|
249
|
+
}
|
|
250
|
+
spec.paths[pathKey][method] = operationObject;
|
|
251
|
+
}
|
|
252
|
+
return spec;
|
|
253
|
+
};
|
|
254
|
+
//# sourceMappingURL=openapiGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapiGenerator.js","sourceRoot":"","sources":["../../src/utility/openapiGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import replacePlaceholders from "./replaceUrlPlaceholders.js";
|
|
2
|
+
const buildBodyExample = (rawBody) => {
|
|
3
|
+
if (!rawBody)
|
|
4
|
+
return undefined;
|
|
5
|
+
// The body strings we produce in traceBody.ts are JSON-ish but use
|
|
6
|
+
// angle-bracketed placeholders for types (e.g. `"<string>"`). They are valid
|
|
7
|
+
// JSON, so just pretty-print whatever parses.
|
|
8
|
+
try {
|
|
9
|
+
return JSON.stringify(JSON.parse(rawBody), null, 2);
|
|
10
|
+
}
|
|
11
|
+
catch (_a) {
|
|
12
|
+
return rawBody;
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
const splitPath = (rawPath) => {
|
|
16
|
+
const [withoutQuery, queryString] = rawPath.split("?", 2);
|
|
17
|
+
const segments = withoutQuery.split("/").filter(Boolean);
|
|
18
|
+
const query = [];
|
|
19
|
+
if (queryString) {
|
|
20
|
+
for (const part of queryString.split("&")) {
|
|
21
|
+
const [k, v = ""] = part.split("=", 2);
|
|
22
|
+
if (k)
|
|
23
|
+
query.push({ key: decodeURIComponent(k), value: decodeURIComponent(v) });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return { segments, query };
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Generates a Postman Collection v2.1 from the discovered endpoints, organising
|
|
30
|
+
* them into nested folders that mirror the URL path. The first matching folder
|
|
31
|
+
* is reused for sibling endpoints so importers don't end up with one folder per
|
|
32
|
+
* request.
|
|
33
|
+
*
|
|
34
|
+
* Path parameters (`{id}`) are not used as folder names — they belong to a
|
|
35
|
+
* specific endpoint, not the wider category — so when a segment is a path
|
|
36
|
+
* variable we attach the operation directly to its parent folder and let the
|
|
37
|
+
* request's full URL carry the variable.
|
|
38
|
+
*/
|
|
39
|
+
export const generatePostmanCollection = (items) => {
|
|
40
|
+
var _a, _b, _c, _d;
|
|
41
|
+
const collection = {
|
|
42
|
+
info: {
|
|
43
|
+
name: "API Collection",
|
|
44
|
+
description: "Endpoints discovered by js-recon, grouped by URL path.",
|
|
45
|
+
schema: "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
|
|
46
|
+
},
|
|
47
|
+
item: [],
|
|
48
|
+
variable: [
|
|
49
|
+
{ key: "baseUrl", value: "https://example.com" },
|
|
50
|
+
{ key: "graphqlEndpoint", value: "graphql" },
|
|
51
|
+
],
|
|
52
|
+
};
|
|
53
|
+
// Tracks (folder-path) → existing PMItem so the second endpoint under the same folder and reuses it
|
|
54
|
+
const folderIndex = new Map();
|
|
55
|
+
folderIndex.set("", { name: "", item: collection.item });
|
|
56
|
+
const ensureFolder = (folderSegments) => {
|
|
57
|
+
let runningKey = "";
|
|
58
|
+
let parent = folderIndex.get("");
|
|
59
|
+
for (const segment of folderSegments) {
|
|
60
|
+
runningKey = runningKey ? `${runningKey}/${segment}` : segment;
|
|
61
|
+
let folder = folderIndex.get(runningKey);
|
|
62
|
+
if (!folder) {
|
|
63
|
+
folder = { name: segment, item: [] };
|
|
64
|
+
parent.item.push(folder);
|
|
65
|
+
folderIndex.set(runningKey, folder);
|
|
66
|
+
}
|
|
67
|
+
parent = folder;
|
|
68
|
+
}
|
|
69
|
+
return parent;
|
|
70
|
+
};
|
|
71
|
+
// Track repeat (path, method) occurrences so duplicate callsites get a
|
|
72
|
+
// disambiguating suffix on their request name. We intentionally do NOT
|
|
73
|
+
// skip duplicates here — each distinct callsite is preserved so a reviewer
|
|
74
|
+
// can compare the headers/body shapes for the same endpoint.
|
|
75
|
+
const callsiteCounts = new Map();
|
|
76
|
+
for (const item of items) {
|
|
77
|
+
let rawPath = typeof item.path === "string" ? item.path : "";
|
|
78
|
+
// If path is an absolute URL, extract just the pathname so we don't
|
|
79
|
+
// prepend {{baseUrl}} to an already-complete URL.
|
|
80
|
+
try {
|
|
81
|
+
if (rawPath.startsWith("http://") || rawPath.startsWith("https://")) {
|
|
82
|
+
const u = new URL(rawPath);
|
|
83
|
+
rawPath = u.pathname + (u.search || "");
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch (_e) {
|
|
87
|
+
// leave rawPath as-is if URL parsing fails
|
|
88
|
+
}
|
|
89
|
+
const normalized = replacePlaceholders(rawPath.startsWith("/") ? rawPath : `/${rawPath}`);
|
|
90
|
+
const method = typeof item.method === "string" ? item.method.toUpperCase() : "GET";
|
|
91
|
+
const dedupeKey = `${method} ${normalized}`;
|
|
92
|
+
const occurrenceIndex = (_a = callsiteCounts.get(dedupeKey)) !== null && _a !== void 0 ? _a : 0;
|
|
93
|
+
callsiteCounts.set(dedupeKey, occurrenceIndex + 1);
|
|
94
|
+
const { segments, query } = splitPath(normalized);
|
|
95
|
+
// Items with an explicit `collectionFolder` skip path-segment-derived
|
|
96
|
+
// folder hierarchy and are placed flat under a single named folder.
|
|
97
|
+
if (item.collectionFolder) {
|
|
98
|
+
const folder = ensureFolder([item.collectionFolder]);
|
|
99
|
+
const headers = Object.entries(item.headers || {}).map(([key, value]) => ({
|
|
100
|
+
key,
|
|
101
|
+
value: String(value),
|
|
102
|
+
type: "text",
|
|
103
|
+
}));
|
|
104
|
+
// Convert OpenAPI-style `{name}` path params to Postman `:name`,
|
|
105
|
+
// but leave `{{var}}` collection-variable placeholders untouched
|
|
106
|
+
// (Postman substitutes those at request time).
|
|
107
|
+
const pmUrlPath = segments.map((s) => s.startsWith("{{") && s.endsWith("}}")
|
|
108
|
+
? s
|
|
109
|
+
: s.startsWith("{") && s.endsWith("}")
|
|
110
|
+
? `:${s.slice(1, -1)}`
|
|
111
|
+
: s);
|
|
112
|
+
const request = {
|
|
113
|
+
method,
|
|
114
|
+
header: headers,
|
|
115
|
+
url: Object.assign({ raw: `{{baseUrl}}/${pmUrlPath.join("/")}${query.length > 0 ? "?" + query.map((q) => `${q.key}=${q.value}`).join("&") : ""}`, host: ["{{baseUrl}}"], path: pmUrlPath }, (query.length > 0 ? { query } : {})),
|
|
116
|
+
};
|
|
117
|
+
if (item.body) {
|
|
118
|
+
const bodyRaw = (_b = buildBodyExample(item.body)) !== null && _b !== void 0 ? _b : item.body;
|
|
119
|
+
request.body = {
|
|
120
|
+
mode: "raw",
|
|
121
|
+
raw: bodyRaw,
|
|
122
|
+
options: { raw: { language: "json" } },
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
request.body = { mode: "none" };
|
|
127
|
+
}
|
|
128
|
+
const descParts = [];
|
|
129
|
+
if (item.functionFile) {
|
|
130
|
+
descParts.push(`Found in ${item.functionFile}:${item.functionFileLine}`);
|
|
131
|
+
}
|
|
132
|
+
folder.item.push(Object.assign(Object.assign({ name: item.summary || `${method} request` }, (descParts.length > 0 ? { description: descParts.join("\n") } : {})), { request }));
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
// Folder segments = all path segments except path-parameter segments.
|
|
136
|
+
// A trailing `{id}` segment doesn't earn its own folder; we mount the
|
|
137
|
+
// request on the parent.
|
|
138
|
+
const folderSegments = [];
|
|
139
|
+
const pathVars = [];
|
|
140
|
+
for (const seg of segments) {
|
|
141
|
+
const isVar = seg.startsWith("{") && seg.endsWith("}");
|
|
142
|
+
if (isVar) {
|
|
143
|
+
pathVars.push({ key: seg.slice(1, -1), value: "" });
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
folderSegments.push(seg);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// The leaf segment is the endpoint's own name; remove it from the
|
|
150
|
+
// folder hierarchy so the request lands directly in its parent folder.
|
|
151
|
+
const leaf = (_c = folderSegments.pop()) !== null && _c !== void 0 ? _c : "";
|
|
152
|
+
const folder = ensureFolder(folderSegments);
|
|
153
|
+
const headers = Object.entries(item.headers || {}).map(([key, value]) => ({
|
|
154
|
+
key,
|
|
155
|
+
value: String(value),
|
|
156
|
+
type: "text",
|
|
157
|
+
}));
|
|
158
|
+
const requestName = `${method} /${segments.join("/")}`;
|
|
159
|
+
const pmUrlPath = segments.map((s) => (s.startsWith("{") && s.endsWith("}") ? `:${s.slice(1, -1)}` : s));
|
|
160
|
+
const request = {
|
|
161
|
+
method,
|
|
162
|
+
header: headers,
|
|
163
|
+
url: Object.assign(Object.assign({ raw: `{{baseUrl}}/${pmUrlPath.join("/")}${query.length > 0 ? "?" + query.map((q) => `${q.key}=${q.value}`).join("&") : ""}`, host: ["{{baseUrl}}"], path: pmUrlPath }, (query.length > 0 ? { query } : {})), (pathVars.length > 0 ? { variable: pathVars } : {})),
|
|
164
|
+
};
|
|
165
|
+
if (item.body && ["POST", "PUT", "PATCH", "DELETE"].includes(method)) {
|
|
166
|
+
const bodyRaw = (_d = buildBodyExample(item.body)) !== null && _d !== void 0 ? _d : item.body;
|
|
167
|
+
// Skip bodies that are empty objects — they only contain unresolvable spread artifacts.
|
|
168
|
+
let isEmptyObject = false;
|
|
169
|
+
try {
|
|
170
|
+
const parsed = JSON.parse(bodyRaw);
|
|
171
|
+
isEmptyObject =
|
|
172
|
+
typeof parsed === "object" &&
|
|
173
|
+
parsed !== null &&
|
|
174
|
+
!Array.isArray(parsed) &&
|
|
175
|
+
Object.keys(parsed).length === 0;
|
|
176
|
+
}
|
|
177
|
+
catch (_f) { }
|
|
178
|
+
if (!isEmptyObject) {
|
|
179
|
+
request.body = {
|
|
180
|
+
mode: "raw",
|
|
181
|
+
raw: bodyRaw,
|
|
182
|
+
options: { raw: { language: "json" } },
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
request.body = { mode: "none" };
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
request.body = { mode: "none" };
|
|
191
|
+
}
|
|
192
|
+
// Friendly request label — keep the leaf in the name to disambiguate
|
|
193
|
+
// siblings under the same parent (e.g. invoices vs invoices/latest).
|
|
194
|
+
// When an action name is available (e.g. Next.js Server Actions) it is
|
|
195
|
+
// appended in parentheses and used as the primary disambiguator so
|
|
196
|
+
// each entry is immediately identifiable without a bare counter.
|
|
197
|
+
// For plain endpoints that share a path/method, a #N counter is kept.
|
|
198
|
+
const leafName = leaf || segments[segments.length - 1] || "/";
|
|
199
|
+
const disambig = item.summary ? ` (${item.summary})` : occurrenceIndex > 0 ? ` #${occurrenceIndex + 1}` : "";
|
|
200
|
+
const descParts = [];
|
|
201
|
+
if (item.functionFile) {
|
|
202
|
+
descParts.push(`Defined in chunk ${item.chunkId} at ${item.functionFile}:${item.functionFileLine}`);
|
|
203
|
+
}
|
|
204
|
+
if (item.serverActionCallFile) {
|
|
205
|
+
descParts.push(`Arguments from chunk ${item.serverActionCallChunkId} at ${item.serverActionCallFile}:${item.serverActionCallLine}`);
|
|
206
|
+
}
|
|
207
|
+
const itemEntry = Object.assign(Object.assign({ name: `${method} ${leafName}${disambig}` }, (descParts.length > 0 ? { description: descParts.join("\n") } : {})), { request });
|
|
208
|
+
// If this URL has no folder segments at all (e.g. `/version`), put it
|
|
209
|
+
// at the top level so it isn't lost.
|
|
210
|
+
folder.item.push(itemEntry);
|
|
211
|
+
// Suppress unused requestName lint warning — kept for future use.
|
|
212
|
+
void requestName;
|
|
213
|
+
}
|
|
214
|
+
return collection;
|
|
215
|
+
};
|
|
216
|
+
//# sourceMappingURL=postmanGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postmanGenerator.js","sourceRoot":"","sources":["../../src/utility/postmanGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Computes a progress bar width that fits within the current terminal.
|
|
3
|
+
* @param formatOverhead Total visible characters in the format string excluding the bar itself
|
|
4
|
+
* (label before `[{bar}]` + stats after `[{bar}]` + surrounding brackets).
|
|
5
|
+
*/
|
|
6
|
+
export const computeBarSize = (formatOverhead) => {
|
|
7
|
+
const cols = process.stdout.columns || 80;
|
|
8
|
+
return Math.max(10, cols - formatOverhead);
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Registers a SIGWINCH listener that keeps `bar.options.barsize` in sync with
|
|
12
|
+
* the terminal width for the lifetime of the bar. Call the returned cleanup
|
|
13
|
+
* function when the bar stops.
|
|
14
|
+
*/
|
|
15
|
+
export const watchBarResize = (bar, overhead) => {
|
|
16
|
+
const handler = () => {
|
|
17
|
+
bar.options.barsize = computeBarSize(overhead);
|
|
18
|
+
};
|
|
19
|
+
process.on("SIGWINCH", handler);
|
|
20
|
+
return () => process.off("SIGWINCH", handler);
|
|
21
|
+
};
|
|
22
|
+
let activeBarLogger = null;
|
|
23
|
+
export const setActiveBarLogger = (logger) => {
|
|
24
|
+
activeBarLogger = logger;
|
|
25
|
+
};
|
|
26
|
+
export const progressLog = (message) => {
|
|
27
|
+
if (activeBarLogger) {
|
|
28
|
+
activeBarLogger.log(message + "\n");
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
console.log(message);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
export const progressError = (message) => {
|
|
35
|
+
if (activeBarLogger) {
|
|
36
|
+
activeBarLogger.log(message + "\n");
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
console.error(message);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
export const progressWarn = (message) => {
|
|
43
|
+
if (activeBarLogger) {
|
|
44
|
+
activeBarLogger.log(message + "\n");
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
console.warn(message);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=progressLog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progressLog.js","sourceRoot":"","sources":["../../src/utility/progressLog.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,cAAsB,EAAU,EAAE;IAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IAC1C,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,GAAG,cAAc,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAQ,EAAE,QAAgB,EAAgB,EAAE;IACvE,MAAM,OAAO,GAAG,GAAG,EAAE;QACjB,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAClD,CAAC,CAAC;AAEF,IAAI,eAAe,GAAqB,IAAI,CAAC;AAE7C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAwB,EAAQ,EAAE;IACjE,eAAe,GAAG,MAAM,CAAC;AAC7B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAe,EAAQ,EAAE;IACjD,IAAI,eAAe,EAAE,CAAC;QAClB,eAAe,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAe,EAAQ,EAAE;IACnD,IAAI,eAAe,EAAE,CAAC;QAClB,eAAe,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAe,EAAQ,EAAE;IAClD,IAAI,eAAe,EAAE,CAAC;QAClB,eAAe,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"puppeteerInstance.js","sourceRoot":"","sources":["../../src/utility/puppeteerInstance.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,iBAAiB,CAAC;AAC7C,OAAO,aAAa,MAAM,gCAAgC,CAAC;AAG1D,cAAsB,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC;AAE7C,eAAe,cAA0C,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Replaces all placeholders in a URL with their corresponding OpenAPI placeholder.
|
|
3
|
+
*
|
|
4
|
+
* Currently, supports the following placeholders:
|
|
5
|
+
* - `[MemberExpression -> <member_expression>]`
|
|
6
|
+
* - `[var <variable_name>]`
|
|
7
|
+
* - `[unresolved member expression]`
|
|
8
|
+
* - `[unresolved: <variable_name>]`
|
|
9
|
+
*
|
|
10
|
+
* The placeholders are replaced with the following OpenAPI placeholders:
|
|
11
|
+
* - `{<member_expression>}`
|
|
12
|
+
* - `{<variable_name>}`
|
|
13
|
+
* - `{unres_mem_exp_<appearance_count_like_1_and_2_in_case_found_multiple_times>}`
|
|
14
|
+
* - `{<variable_name>}`
|
|
15
|
+
*/
|
|
16
|
+
const replacePlaceholders = (url) => {
|
|
17
|
+
// match it against multiple regexes and replace with the right placeholder as per the openapi spec
|
|
18
|
+
// first for member expression
|
|
19
|
+
const memberExpressionRegex = /\[MemberExpression -> (.*?)\]/g;
|
|
20
|
+
const memberExpressionMatches = url.matchAll(memberExpressionRegex);
|
|
21
|
+
for (const match of memberExpressionMatches) {
|
|
22
|
+
url = url.replace(match[0], "{" + match[1] + "}");
|
|
23
|
+
}
|
|
24
|
+
// second goes `[var a]`
|
|
25
|
+
const varRegex = /\[var (.*?)\]/g;
|
|
26
|
+
const varMatches = url.matchAll(varRegex);
|
|
27
|
+
for (const match of varMatches) {
|
|
28
|
+
url = url.replace(match[0], "{" + match[1] + "}");
|
|
29
|
+
}
|
|
30
|
+
// `[unresolved member expression]` is a bit tricky, so
|
|
31
|
+
// will replace with `{unres_mem_exp_<appearance_count_like_1_and_2_in_case_found_multiple_times>}`
|
|
32
|
+
const unresolvedMemberExpressionRegex = /\[unresolved member expression\]/g;
|
|
33
|
+
const unresolvedMemberExpressionMatches = url.matchAll(unresolvedMemberExpressionRegex);
|
|
34
|
+
let appearanceCount = 1;
|
|
35
|
+
for (const match of unresolvedMemberExpressionMatches) {
|
|
36
|
+
url = url.replace(match[0], "{unres_mem_exp_" + appearanceCount + "}");
|
|
37
|
+
appearanceCount++;
|
|
38
|
+
}
|
|
39
|
+
// `[unresolved: a]` can't escape as well
|
|
40
|
+
const unresolvedRegex = /\[unresolved: (.*?)\]/g;
|
|
41
|
+
const unresolvedMatches = url.matchAll(unresolvedRegex);
|
|
42
|
+
for (const match of unresolvedMatches) {
|
|
43
|
+
url = url.replace(match[0], "{" + match[1] + "}");
|
|
44
|
+
}
|
|
45
|
+
return url;
|
|
46
|
+
};
|
|
47
|
+
export default replacePlaceholders;
|
|
48
|
+
//# sourceMappingURL=replaceUrlPlaceholders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replaceUrlPlaceholders.js","sourceRoot":"","sources":["../../src/utility/replaceUrlPlaceholders.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,mBAAmB,GAAG,CAAC,GAAW,EAAU,EAAE;IAChD,mGAAmG;IAEnG,8BAA8B;IAC9B,MAAM,qBAAqB,GAAG,gCAAgC,CAAC;IAC/D,MAAM,uBAAuB,GAAG,GAAG,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;IACpE,KAAK,MAAM,KAAK,IAAI,uBAAuB,EAAE,CAAC;QAC1C,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IACtD,CAAC;IAED,wBAAwB;IACxB,MAAM,QAAQ,GAAG,gBAAgB,CAAC;IAClC,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC7B,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IACtD,CAAC;IAED,uDAAuD;IACvD,mGAAmG;IACnG,MAAM,+BAA+B,GAAG,mCAAmC,CAAC;IAC5E,MAAM,iCAAiC,GAAG,GAAG,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CAAC;IACxF,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,KAAK,MAAM,KAAK,IAAI,iCAAiC,EAAE,CAAC;QACpD,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,iBAAiB,GAAG,eAAe,GAAG,GAAG,CAAC,CAAC;QACvE,eAAe,EAAE,CAAC;IACtB,CAAC;IAED,yCAAyC;IACzC,MAAM,eAAe,GAAG,wBAAwB,CAAC;IACjD,MAAM,iBAAiB,GAAG,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IACxD,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE,CAAC;QACpC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,GAAG,CAAC;AACf,CAAC,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
|