@cdxgen/cdxgen 0.0.1 → 13.0.1
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/README.md +921 -87
- package/bin/audit.js +239 -0
- package/bin/cdxgen.js +2335 -0
- package/bin/convert.js +220 -0
- package/bin/evinse.js +353 -0
- package/bin/hbom.js +504 -0
- package/bin/repl.js +2224 -0
- package/bin/sign.js +195 -0
- package/bin/tracebom.js +303 -0
- package/bin/validate.js +268 -0
- package/bin/verify.js +189 -0
- package/data/README.md +307 -0
- package/data/bom-1.4.schema.json +1605 -0
- package/data/bom-1.5.schema.json +3660 -0
- package/data/bom-1.6.schema.json +5511 -0
- package/data/bom-1.7.schema.json +6700 -0
- package/data/cbomosdb-queries.json +68 -0
- package/data/component-tags.json +339 -0
- package/data/container-knowledge-index.json +125 -0
- package/data/cosdb-queries.json +17 -0
- package/data/crypto-oid.json +1998 -0
- package/data/cryptography-defs.json +3793 -0
- package/data/cryptography-defs.schema.json +576 -0
- package/data/cyclonedx-2.0-bundled.schema.json +7182 -0
- package/data/frameworks-list.json +219 -0
- package/data/glibc-stdlib.json +117 -0
- package/data/gtfobins-index.json +6296 -0
- package/data/helpers/init.gradle +71 -0
- package/data/jsf-0.82.schema.json +211 -0
- package/data/known-licenses.json +82 -0
- package/data/lic-mapping.json +338 -0
- package/data/license-aliases.json +6624 -0
- package/data/license-db.json +39059 -0
- package/data/license-deprecations.json +302 -0
- package/data/lolbas-index.json +150 -0
- package/data/predictive-audit-allowlist.json +11 -0
- package/data/pypi-pkg-aliases.json +1199 -0
- package/data/python-stdlib.json +308 -0
- package/data/queries-darwin.json +193 -0
- package/data/queries-win.json +257 -0
- package/data/queries.json +268 -0
- package/data/ruby-known-modules.json +281 -0
- package/data/rules/ai-agent-governance.yaml +323 -0
- package/data/rules/ai-bom.yaml +268 -0
- package/data/rules/ai-oversight.yaml +186 -0
- package/data/rules/ai-provenance.yaml +92 -0
- package/data/rules/asar-archives.yaml +150 -0
- package/data/rules/cbom-security.yaml +165 -0
- package/data/rules/chrome-extensions.yaml +248 -0
- package/data/rules/ci-permissions.yaml +802 -0
- package/data/rules/container-risk.yaml +353 -0
- package/data/rules/dependency-sources.yaml +236 -0
- package/data/rules/golem-go.yaml +229 -0
- package/data/rules/hbom-compliance.yaml +325 -0
- package/data/rules/hbom-performance.yaml +307 -0
- package/data/rules/hbom-security.yaml +248 -0
- package/data/rules/host-topology.yaml +165 -0
- package/data/rules/mcp-servers.yaml +388 -0
- package/data/rules/obom-runtime.yaml +1776 -0
- package/data/rules/package-integrity.yaml +364 -0
- package/data/rules/rootfs-hardening.yaml +179 -0
- package/data/rules/vscode-extensions.yaml +237 -0
- package/data/spdx-export.schema.json +6794 -0
- package/data/spdx-license-list.json +7449 -0
- package/data/spdx-licenses.json +759 -0
- package/data/spdx.schema.json +819 -0
- package/data/templates/README.md +3 -0
- package/data/templates/asvs-4.0.3.cdx.json +2943 -0
- package/data/templates/asvs-5.0.cdx.json +3046 -0
- package/data/templates/bsimm-v13.cdx.json +1008 -0
- package/data/templates/masvs-2.0.0.cdx.json +225 -0
- package/data/templates/nist-ssdf-1.1.cdx.json +828 -0
- package/data/templates/pcissc-secure-slc-1.1.cdx.json +1027 -0
- package/data/templates/scvs-1.0.0.cdx.json +813 -0
- package/data/templates/ssaf-DRAFT-2023-11.cdx.json +127 -0
- package/data/vendor-alias.json +41967 -0
- package/data/wrapdb-releases.json +4227 -0
- package/index.cjs +15 -0
- package/lib/audit/index.js +2800 -0
- package/lib/audit/progress.js +114 -0
- package/lib/audit/reporters.js +937 -0
- package/lib/audit/scoring.js +560 -0
- package/lib/audit/targets.js +798 -0
- package/lib/cli/bomAssembly.js +1882 -0
- package/lib/cli/cliOptions.js +543 -0
- package/lib/cli/index.js +2759 -0
- package/lib/cli/jsBom.js +2087 -0
- package/lib/cli/jvmBom.js +1858 -0
- package/lib/cli/managedBom.js +2083 -0
- package/lib/cli/nativeBom.js +2125 -0
- package/lib/core/activity.js +1087 -0
- package/lib/core/env.js +719 -0
- package/lib/core/fs.js +1058 -0
- package/lib/core/httpClient.js +730 -0
- package/lib/core/logger.js +280 -0
- package/lib/core/parallel.js +323 -0
- package/lib/core/paths.js +70 -0
- package/lib/core/projectConfig.js +122 -0
- package/lib/core/propertySanitizer.js +174 -0
- package/lib/core/spdx.js +5 -0
- package/lib/core/state.js +59 -0
- package/lib/core/text.js +207 -0
- package/lib/core/ui.js +920 -0
- package/lib/core/urls.js +84 -0
- package/lib/ecosystems/asarutils.js +1636 -0
- package/lib/ecosystems/bunutils.js +402 -0
- package/lib/ecosystems/caxa.js +77 -0
- package/lib/ecosystems/chromextutils.js +1174 -0
- package/lib/ecosystems/cmakeResolver.js +587 -0
- package/lib/ecosystems/cppEvidence.js +305 -0
- package/lib/ecosystems/denoutils.js +1094 -0
- package/lib/ecosystems/dotnetutils.js +132 -0
- package/lib/ecosystems/ecosystems.js +2772 -0
- package/lib/ecosystems/golem.js +1807 -0
- package/lib/ecosystems/gradleutils.js +1048 -0
- package/lib/ecosystems/jsEvidence.js +317 -0
- package/lib/ecosystems/npmutils.js +586 -0
- package/lib/ecosystems/parsers-bazel.js +875 -0
- package/lib/ecosystems/parsers-dotnet.js +1430 -0
- package/lib/ecosystems/parsers-gleam.js +302 -0
- package/lib/ecosystems/parsers-go.js +818 -0
- package/lib/ecosystems/parsers-js.js +4222 -0
- package/lib/ecosystems/parsers-jvm.js +948 -0
- package/lib/ecosystems/parsers-misc.js +3191 -0
- package/lib/ecosystems/parsers-python.js +2070 -0
- package/lib/ecosystems/parsers-rust.js +1294 -0
- package/lib/ecosystems/parsers-zig.js +861 -0
- package/lib/ecosystems/pep770.js +341 -0
- package/lib/ecosystems/pylockutils.js +427 -0
- package/lib/ecosystems/pythonutils.js +1281 -0
- package/lib/ecosystems/registryProvenance.js +1003 -0
- package/lib/ecosystems/remote/huggingface.js +1343 -0
- package/lib/ecosystems/rubyutils.js +1629 -0
- package/lib/ecosystems/rusi.js +820 -0
- package/lib/ecosystems/sbtutils.js +972 -0
- package/lib/ecosystems/tea.js +607 -0
- package/lib/ecosystems/utils.js +583 -0
- package/lib/ecosystems/zigResolver.js +410 -0
- package/lib/evinser/db.js +145 -0
- package/lib/evinser/evinser.js +2362 -0
- package/lib/evinser/scalasem.js +65 -0
- package/lib/evinser/swiftsem.js +767 -0
- package/lib/helpers/annotationFormatter.js +84 -0
- package/lib/helpers/bomSigner.js +312 -0
- package/lib/helpers/exportUtils.js +160 -0
- package/lib/helpers/remote/dependency-track.js +117 -0
- package/lib/helpers/versutils.js +202 -0
- package/lib/helpers/vsixutils.js +1069 -0
- package/lib/inventory/agentFormulationParser.js +322 -0
- package/lib/inventory/aiCollector.js +2140 -0
- package/lib/inventory/aiInventory.js +414 -0
- package/lib/inventory/aiModelVariants.js +121 -0
- package/lib/inventory/aiOversightCollector.js +661 -0
- package/lib/inventory/aiProvenanceCollector.js +822 -0
- package/lib/inventory/analyzer.js +6089 -0
- package/lib/inventory/analyzerScope.js +807 -0
- package/lib/inventory/astWorker.js +20 -0
- package/lib/inventory/atomUtils.js +1092 -0
- package/lib/inventory/auditCategories.js +192 -0
- package/lib/inventory/bomUtils.js +369 -0
- package/lib/inventory/cacheCommands.js +182 -0
- package/lib/inventory/cacheDir.js +104 -0
- package/lib/inventory/cbomutils.js +590 -0
- package/lib/inventory/cdxrs.js +434 -0
- package/lib/inventory/ciParsers/azurePipelines.js +295 -0
- package/lib/inventory/ciParsers/circleCi.js +286 -0
- package/lib/inventory/ciParsers/common.js +24 -0
- package/lib/inventory/ciParsers/githubActions.js +2434 -0
- package/lib/inventory/ciParsers/gitlabCi.js +213 -0
- package/lib/inventory/ciParsers/jenkins.js +180 -0
- package/lib/inventory/citations.js +234 -0
- package/lib/inventory/communityAiConfigParser.js +756 -0
- package/lib/inventory/containerRisk.js +204 -0
- package/lib/inventory/cryptoAlgorithmFamily.js +258 -0
- package/lib/inventory/deps.js +807 -0
- package/lib/inventory/depsUtils.js +588 -0
- package/lib/inventory/display.js +2128 -0
- package/lib/inventory/dosai.js +601 -0
- package/lib/inventory/dosaiParsers.js +154 -0
- package/lib/inventory/dynamic.js +145 -0
- package/lib/inventory/envcontext.js +1793 -0
- package/lib/inventory/evidenceUtils.js +774 -0
- package/lib/inventory/fetchBatch.js +779 -0
- package/lib/inventory/fetchRate.js +255 -0
- package/lib/inventory/forgeEnricher.js +300 -0
- package/lib/inventory/formulationParsers.js +422 -0
- package/lib/inventory/gtfobins.js +339 -0
- package/lib/inventory/hbom.js +719 -0
- package/lib/inventory/hbomAnalysis.js +310 -0
- package/lib/inventory/hbomLoader.js +35 -0
- package/lib/inventory/hostTopology.js +835 -0
- package/lib/inventory/inventoryStats.js +100 -0
- package/lib/inventory/jsonLike.js +121 -0
- package/lib/inventory/licenseEnhancer.js +918 -0
- package/lib/inventory/lolbas.js +285 -0
- package/lib/inventory/mcp.js +253 -0
- package/lib/inventory/mcpConfigParser.js +683 -0
- package/lib/inventory/mcpDiscovery.js +112 -0
- package/lib/inventory/mcpPinning.js +209 -0
- package/lib/inventory/osPackageResolver.js +493 -0
- package/lib/inventory/osinfo.js +383 -0
- package/lib/inventory/osqueryTransform.js +274 -0
- package/lib/inventory/plugins.js +466 -0
- package/lib/inventory/protobom.js +231 -0
- package/lib/inventory/protobomLoader.js +43 -0
- package/lib/inventory/provenanceUtils.js +224 -0
- package/lib/inventory/purl.js +749 -0
- package/lib/inventory/rustFormulationParser.js +339 -0
- package/lib/inventory/sbomDocument.js +340 -0
- package/lib/inventory/source.js +1488 -0
- package/lib/inventory/spdx.js +361 -0
- package/lib/inventory/spdxExpression.js +512 -0
- package/lib/inventory/spdxUtils.js +107 -0
- package/lib/inventory/table.js +267 -0
- package/lib/inventory/traceRunner.js +439 -0
- package/lib/inventory/unicodeScan.js +147 -0
- package/lib/managers/binary.js +3459 -0
- package/lib/managers/containerutils.js +125 -0
- package/lib/managers/docker.js +2145 -0
- package/lib/managers/dockerConnection.js +162 -0
- package/lib/managers/oci.js +704 -0
- package/lib/managers/piptree.js +267 -0
- package/lib/parsers/cmakeCache.js +199 -0
- package/lib/parsers/gguf.js +492 -0
- package/lib/parsers/gitAiNotes.js +233 -0
- package/lib/parsers/gitmodules.js +239 -0
- package/lib/parsers/htmlExtract.js +610 -0
- package/lib/parsers/huggingfaceManifest.js +551 -0
- package/lib/parsers/huggingfaceUtils.js +506 -0
- package/lib/parsers/iri.js +618 -0
- package/lib/parsers/npmrc.js +99 -0
- package/lib/parsers/ollama.js +101 -0
- package/lib/parsers/xml.js +841 -0
- package/lib/server/openapi.yaml +433 -0
- package/lib/server/server.js +616 -0
- package/lib/stages/postgen/annotator.js +977 -0
- package/lib/stages/postgen/auditBom.js +468 -0
- package/lib/stages/postgen/postgen.js +1239 -0
- package/lib/stages/postgen/ruleEngine.js +731 -0
- package/lib/stages/postgen/sortBom.js +195 -0
- package/lib/stages/postgen/spdxConverter.js +796 -0
- package/lib/stages/postgen/specVersionCompat.js +703 -0
- package/lib/stages/pregen/envAudit.js +388 -0
- package/lib/stages/pregen/pregen.js +637 -0
- package/lib/third-party/README.md +9 -0
- package/lib/third-party/arborist/CHANGELOG.md +1109 -0
- package/lib/third-party/arborist/LICENSE.md +20 -0
- package/lib/third-party/arborist/README.md +315 -0
- package/lib/third-party/arborist/lib/arborist/index.js +258 -0
- package/lib/third-party/arborist/lib/arborist/load-actual.js +605 -0
- package/lib/third-party/arborist/lib/arborist/load-virtual.js +300 -0
- package/lib/third-party/arborist/lib/bin-links.js +120 -0
- package/lib/third-party/arborist/lib/calc-dep-flags.js +130 -0
- package/lib/third-party/arborist/lib/case-insensitive-map.js +51 -0
- package/lib/third-party/arborist/lib/consistent-resolve.js +42 -0
- package/lib/third-party/arborist/lib/debug.js +50 -0
- package/lib/third-party/arborist/lib/dep-valid.js +190 -0
- package/lib/third-party/arborist/lib/edge.js +417 -0
- package/lib/third-party/arborist/lib/from-path.js +36 -0
- package/lib/third-party/arborist/lib/gather-dep-set.js +43 -0
- package/lib/third-party/arborist/lib/index.js +22 -0
- package/lib/third-party/arborist/lib/inventory.js +138 -0
- package/lib/third-party/arborist/lib/link.js +169 -0
- package/lib/third-party/arborist/lib/node.js +1673 -0
- package/lib/third-party/arborist/lib/npm-extension.js +45 -0
- package/lib/third-party/arborist/lib/override-resolves.js +11 -0
- package/lib/third-party/arborist/lib/override-set.js +319 -0
- package/lib/third-party/arborist/lib/package-extensions.js +289 -0
- package/lib/third-party/arborist/lib/printable.js +210 -0
- package/lib/third-party/arborist/lib/proc-log.js +30 -0
- package/lib/third-party/arborist/lib/realpath.js +100 -0
- package/lib/third-party/arborist/lib/relpath.js +4 -0
- package/lib/third-party/arborist/lib/shrinkwrap.js +1291 -0
- package/lib/third-party/arborist/lib/spec-from-lock.js +34 -0
- package/lib/third-party/arborist/lib/tree-check.js +165 -0
- package/lib/third-party/arborist/lib/validate-npm-package-name.js +107 -0
- package/lib/third-party/arborist/lib/version-from-tgz.js +51 -0
- package/lib/third-party/arborist/lib/yarn-lock.js +397 -0
- package/lib/validator/bomValidator.js +985 -0
- package/lib/validator/complianceEngine.js +241 -0
- package/lib/validator/complianceRules.js +1680 -0
- package/lib/validator/generated/runtime.mjs +17 -0
- package/lib/validator/generated/validate-1.6.mjs +21258 -0
- package/lib/validator/generated/validate-1.7.mjs +24803 -0
- package/lib/validator/generated/validate-2.0.mjs +22931 -0
- package/lib/validator/index.js +246 -0
- package/lib/validator/reporters/annotations.js +142 -0
- package/lib/validator/reporters/console.js +160 -0
- package/lib/validator/reporters/index.js +41 -0
- package/lib/validator/reporters/json.js +37 -0
- package/lib/validator/reporters/sarif.js +184 -0
- package/package.json +209 -26
- package/types/bin/audit.d.ts +3 -0
- package/types/bin/audit.d.ts.map +1 -0
- package/types/bin/cdxgen.d.ts +3 -0
- package/types/bin/cdxgen.d.ts.map +1 -0
- package/types/bin/convert.d.ts +3 -0
- package/types/bin/convert.d.ts.map +1 -0
- package/types/bin/evinse.d.ts +3 -0
- package/types/bin/evinse.d.ts.map +1 -0
- package/types/bin/hbom.d.ts +3 -0
- package/types/bin/hbom.d.ts.map +1 -0
- package/types/bin/repl.d.ts +3 -0
- package/types/bin/repl.d.ts.map +1 -0
- package/types/bin/sign.d.ts +3 -0
- package/types/bin/sign.d.ts.map +1 -0
- package/types/bin/tracebom.d.ts +3 -0
- package/types/bin/tracebom.d.ts.map +1 -0
- package/types/bin/validate.d.ts +14 -0
- package/types/bin/validate.d.ts.map +1 -0
- package/types/bin/verify.d.ts +3 -0
- package/types/bin/verify.d.ts.map +1 -0
- package/types/lib/audit/index.d.ts +153 -0
- package/types/lib/audit/index.d.ts.map +1 -0
- package/types/lib/audit/progress.d.ts +31 -0
- package/types/lib/audit/progress.d.ts.map +1 -0
- package/types/lib/audit/reporters.d.ts +62 -0
- package/types/lib/audit/reporters.d.ts.map +1 -0
- package/types/lib/audit/scoring.d.ts +36 -0
- package/types/lib/audit/scoring.d.ts.map +1 -0
- package/types/lib/audit/targets.d.ts +77 -0
- package/types/lib/audit/targets.d.ts.map +1 -0
- package/types/lib/cli/bomAssembly.d.ts +329 -0
- package/types/lib/cli/bomAssembly.d.ts.map +1 -0
- package/types/lib/cli/cliOptions.d.ts +156 -0
- package/types/lib/cli/cliOptions.d.ts.map +1 -0
- package/types/lib/cli/index.d.ts +107 -0
- package/types/lib/cli/index.d.ts.map +1 -0
- package/types/lib/cli/jsBom.d.ts +94 -0
- package/types/lib/cli/jsBom.d.ts.map +1 -0
- package/types/lib/cli/jvmBom.d.ts +54 -0
- package/types/lib/cli/jvmBom.d.ts.map +1 -0
- package/types/lib/cli/managedBom.d.ts +105 -0
- package/types/lib/cli/managedBom.d.ts.map +1 -0
- package/types/lib/cli/nativeBom.d.ts +143 -0
- package/types/lib/cli/nativeBom.d.ts.map +1 -0
- package/types/lib/core/activity.d.ts +178 -0
- package/types/lib/core/activity.d.ts.map +1 -0
- package/types/lib/core/env.d.ts +192 -0
- package/types/lib/core/env.d.ts.map +1 -0
- package/types/lib/core/fs.d.ts +158 -0
- package/types/lib/core/fs.d.ts.map +1 -0
- package/types/lib/core/httpClient.d.ts +149 -0
- package/types/lib/core/httpClient.d.ts.map +1 -0
- package/types/lib/core/logger.d.ts +50 -0
- package/types/lib/core/logger.d.ts.map +1 -0
- package/types/lib/core/parallel.d.ts +95 -0
- package/types/lib/core/parallel.d.ts.map +1 -0
- package/types/lib/core/paths.d.ts +36 -0
- package/types/lib/core/paths.d.ts.map +1 -0
- package/types/lib/core/projectConfig.d.ts +23 -0
- package/types/lib/core/projectConfig.d.ts.map +1 -0
- package/types/lib/core/propertySanitizer.d.ts +23 -0
- package/types/lib/core/propertySanitizer.d.ts.map +1 -0
- package/types/lib/core/spdx.d.ts +5 -0
- package/types/lib/core/spdx.d.ts.map +1 -0
- package/types/lib/core/state.d.ts +20 -0
- package/types/lib/core/state.d.ts.map +1 -0
- package/types/lib/core/text.d.ts +78 -0
- package/types/lib/core/text.d.ts.map +1 -0
- package/types/lib/core/ui.d.ts +87 -0
- package/types/lib/core/ui.d.ts.map +1 -0
- package/types/lib/core/urls.d.ts +43 -0
- package/types/lib/core/urls.d.ts.map +1 -0
- package/types/lib/ecosystems/asarutils.d.ts +71 -0
- package/types/lib/ecosystems/asarutils.d.ts.map +1 -0
- package/types/lib/ecosystems/bunutils.d.ts +38 -0
- package/types/lib/ecosystems/bunutils.d.ts.map +1 -0
- package/types/lib/ecosystems/caxa.d.ts +8 -0
- package/types/lib/ecosystems/caxa.d.ts.map +1 -0
- package/types/lib/ecosystems/chromextutils.d.ts +97 -0
- package/types/lib/ecosystems/chromextutils.d.ts.map +1 -0
- package/types/lib/ecosystems/cmakeResolver.d.ts +176 -0
- package/types/lib/ecosystems/cmakeResolver.d.ts.map +1 -0
- package/types/lib/ecosystems/cppEvidence.d.ts +35 -0
- package/types/lib/ecosystems/cppEvidence.d.ts.map +1 -0
- package/types/lib/ecosystems/denoutils.d.ts +76 -0
- package/types/lib/ecosystems/denoutils.d.ts.map +1 -0
- package/types/lib/ecosystems/dotnetutils.d.ts +45 -0
- package/types/lib/ecosystems/dotnetutils.d.ts.map +1 -0
- package/types/lib/ecosystems/ecosystems.d.ts +279 -0
- package/types/lib/ecosystems/ecosystems.d.ts.map +1 -0
- package/types/lib/ecosystems/golem.d.ts +60 -0
- package/types/lib/ecosystems/golem.d.ts.map +1 -0
- package/types/lib/ecosystems/gradleutils.d.ts +139 -0
- package/types/lib/ecosystems/gradleutils.d.ts.map +1 -0
- package/types/lib/ecosystems/jsEvidence.d.ts +17 -0
- package/types/lib/ecosystems/jsEvidence.d.ts.map +1 -0
- package/types/lib/ecosystems/npmutils.d.ts +183 -0
- package/types/lib/ecosystems/npmutils.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-bazel.d.ts +36 -0
- package/types/lib/ecosystems/parsers-bazel.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-dotnet.d.ts +116 -0
- package/types/lib/ecosystems/parsers-dotnet.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-gleam.d.ts +33 -0
- package/types/lib/ecosystems/parsers-gleam.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-go.d.ts +92 -0
- package/types/lib/ecosystems/parsers-go.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-js.d.ts +242 -0
- package/types/lib/ecosystems/parsers-js.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-jvm.d.ts +100 -0
- package/types/lib/ecosystems/parsers-jvm.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-misc.d.ts +450 -0
- package/types/lib/ecosystems/parsers-misc.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-python.d.ts +145 -0
- package/types/lib/ecosystems/parsers-python.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-rust.d.ts +56 -0
- package/types/lib/ecosystems/parsers-rust.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-zig.d.ts +83 -0
- package/types/lib/ecosystems/parsers-zig.d.ts.map +1 -0
- package/types/lib/ecosystems/pep770.d.ts +38 -0
- package/types/lib/ecosystems/pep770.d.ts.map +1 -0
- package/types/lib/ecosystems/pylockutils.d.ts +68 -0
- package/types/lib/ecosystems/pylockutils.d.ts.map +1 -0
- package/types/lib/ecosystems/pythonutils.d.ts +70 -0
- package/types/lib/ecosystems/pythonutils.d.ts.map +1 -0
- package/types/lib/ecosystems/registryProvenance.d.ts +26 -0
- package/types/lib/ecosystems/registryProvenance.d.ts.map +1 -0
- package/types/lib/ecosystems/remote/huggingface.d.ts +31 -0
- package/types/lib/ecosystems/remote/huggingface.d.ts.map +1 -0
- package/types/lib/ecosystems/rubyutils.d.ts +182 -0
- package/types/lib/ecosystems/rubyutils.d.ts.map +1 -0
- package/types/lib/ecosystems/rusi.d.ts +40 -0
- package/types/lib/ecosystems/rusi.d.ts.map +1 -0
- package/types/lib/ecosystems/sbtutils.d.ts +179 -0
- package/types/lib/ecosystems/sbtutils.d.ts.map +1 -0
- package/types/lib/ecosystems/tea.d.ts +180 -0
- package/types/lib/ecosystems/tea.d.ts.map +1 -0
- package/types/lib/ecosystems/utils.d.ts +41 -0
- package/types/lib/ecosystems/utils.d.ts.map +1 -0
- package/types/lib/ecosystems/zigResolver.d.ts +70 -0
- package/types/lib/ecosystems/zigResolver.d.ts.map +1 -0
- package/types/lib/evinser/db.d.ts +17 -0
- package/types/lib/evinser/db.d.ts.map +1 -0
- package/types/lib/evinser/evinser.d.ts +354 -0
- package/types/lib/evinser/evinser.d.ts.map +1 -0
- package/types/lib/evinser/scalasem.d.ts +15 -0
- package/types/lib/evinser/scalasem.d.ts.map +1 -0
- package/types/lib/evinser/swiftsem.d.ts +103 -0
- package/types/lib/evinser/swiftsem.d.ts.map +1 -0
- package/types/lib/helpers/annotationFormatter.d.ts +23 -0
- package/types/lib/helpers/annotationFormatter.d.ts.map +1 -0
- package/types/lib/helpers/bomSigner.d.ts +28 -0
- package/types/lib/helpers/bomSigner.d.ts.map +1 -0
- package/types/lib/helpers/exportUtils.d.ts +52 -0
- package/types/lib/helpers/exportUtils.d.ts.map +1 -0
- package/types/lib/helpers/remote/dependency-track.d.ts +23 -0
- package/types/lib/helpers/remote/dependency-track.d.ts.map +1 -0
- package/types/lib/helpers/versutils.d.ts +8 -0
- package/types/lib/helpers/versutils.d.ts.map +1 -0
- package/types/lib/helpers/vsixutils.d.ts +130 -0
- package/types/lib/helpers/vsixutils.d.ts.map +1 -0
- package/types/lib/inventory/agentFormulationParser.d.ts +21 -0
- package/types/lib/inventory/agentFormulationParser.d.ts.map +1 -0
- package/types/lib/inventory/aiCollector.d.ts +61 -0
- package/types/lib/inventory/aiCollector.d.ts.map +1 -0
- package/types/lib/inventory/aiInventory.d.ts +103 -0
- package/types/lib/inventory/aiInventory.d.ts.map +1 -0
- package/types/lib/inventory/aiModelVariants.d.ts +31 -0
- package/types/lib/inventory/aiModelVariants.d.ts.map +1 -0
- package/types/lib/inventory/aiOversightCollector.d.ts +28 -0
- package/types/lib/inventory/aiOversightCollector.d.ts.map +1 -0
- package/types/lib/inventory/aiProvenanceCollector.d.ts +13 -0
- package/types/lib/inventory/aiProvenanceCollector.d.ts.map +1 -0
- package/types/lib/inventory/analyzer.d.ts +157 -0
- package/types/lib/inventory/analyzer.d.ts.map +1 -0
- package/types/lib/inventory/analyzerScope.d.ts +106 -0
- package/types/lib/inventory/analyzerScope.d.ts.map +1 -0
- package/types/lib/inventory/astWorker.d.ts +9 -0
- package/types/lib/inventory/astWorker.d.ts.map +1 -0
- package/types/lib/inventory/atomUtils.d.ts +159 -0
- package/types/lib/inventory/atomUtils.d.ts.map +1 -0
- package/types/lib/inventory/auditCategories.d.ts +80 -0
- package/types/lib/inventory/auditCategories.d.ts.map +1 -0
- package/types/lib/inventory/bomUtils.d.ts +145 -0
- package/types/lib/inventory/bomUtils.d.ts.map +1 -0
- package/types/lib/inventory/cacheCommands.d.ts +28 -0
- package/types/lib/inventory/cacheCommands.d.ts.map +1 -0
- package/types/lib/inventory/cacheDir.d.ts +55 -0
- package/types/lib/inventory/cacheDir.d.ts.map +1 -0
- package/types/lib/inventory/cbomutils.d.ts +37 -0
- package/types/lib/inventory/cbomutils.d.ts.map +1 -0
- package/types/lib/inventory/cdxrs.d.ts +90 -0
- package/types/lib/inventory/cdxrs.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/azurePipelines.d.ts +27 -0
- package/types/lib/inventory/ciParsers/azurePipelines.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/circleCi.d.ts +27 -0
- package/types/lib/inventory/ciParsers/circleCi.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/common.d.ts +11 -0
- package/types/lib/inventory/ciParsers/common.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/githubActions.d.ts +38 -0
- package/types/lib/inventory/ciParsers/githubActions.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/gitlabCi.d.ts +26 -0
- package/types/lib/inventory/ciParsers/gitlabCi.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/jenkins.d.ts +26 -0
- package/types/lib/inventory/ciParsers/jenkins.d.ts.map +1 -0
- package/types/lib/inventory/citations.d.ts +90 -0
- package/types/lib/inventory/citations.d.ts.map +1 -0
- package/types/lib/inventory/communityAiConfigParser.d.ts +14 -0
- package/types/lib/inventory/communityAiConfigParser.d.ts.map +1 -0
- package/types/lib/inventory/containerRisk.d.ts +20 -0
- package/types/lib/inventory/containerRisk.d.ts.map +1 -0
- package/types/lib/inventory/cryptoAlgorithmFamily.d.ts +37 -0
- package/types/lib/inventory/cryptoAlgorithmFamily.d.ts.map +1 -0
- package/types/lib/inventory/deps.d.ts +140 -0
- package/types/lib/inventory/deps.d.ts.map +1 -0
- package/types/lib/inventory/depsUtils.d.ts +74 -0
- package/types/lib/inventory/depsUtils.d.ts.map +1 -0
- package/types/lib/inventory/display.d.ts +227 -0
- package/types/lib/inventory/display.d.ts.map +1 -0
- package/types/lib/inventory/dosai.d.ts +130 -0
- package/types/lib/inventory/dosai.d.ts.map +1 -0
- package/types/lib/inventory/dosaiParsers.d.ts +59 -0
- package/types/lib/inventory/dosaiParsers.d.ts.map +1 -0
- package/types/lib/inventory/dynamic.d.ts +25 -0
- package/types/lib/inventory/dynamic.d.ts.map +1 -0
- package/types/lib/inventory/envcontext.d.ts +377 -0
- package/types/lib/inventory/envcontext.d.ts.map +1 -0
- package/types/lib/inventory/evidenceUtils.d.ts +74 -0
- package/types/lib/inventory/evidenceUtils.d.ts.map +1 -0
- package/types/lib/inventory/fetchBatch.d.ts +127 -0
- package/types/lib/inventory/fetchBatch.d.ts.map +1 -0
- package/types/lib/inventory/fetchRate.d.ts +118 -0
- package/types/lib/inventory/fetchRate.d.ts.map +1 -0
- package/types/lib/inventory/forgeEnricher.d.ts +31 -0
- package/types/lib/inventory/forgeEnricher.d.ts.map +1 -0
- package/types/lib/inventory/formulationParsers.d.ts +50 -0
- package/types/lib/inventory/formulationParsers.d.ts.map +1 -0
- package/types/lib/inventory/gtfobins.d.ts +27 -0
- package/types/lib/inventory/gtfobins.d.ts.map +1 -0
- package/types/lib/inventory/hbom.d.ts +58 -0
- package/types/lib/inventory/hbom.d.ts.map +1 -0
- package/types/lib/inventory/hbomAnalysis.d.ts +56 -0
- package/types/lib/inventory/hbomAnalysis.d.ts.map +1 -0
- package/types/lib/inventory/hbomLoader.d.ts +7 -0
- package/types/lib/inventory/hbomLoader.d.ts.map +1 -0
- package/types/lib/inventory/hostTopology.d.ts +47 -0
- package/types/lib/inventory/hostTopology.d.ts.map +1 -0
- package/types/lib/inventory/inventoryStats.d.ts +42 -0
- package/types/lib/inventory/inventoryStats.d.ts.map +1 -0
- package/types/lib/inventory/jsonLike.d.ts +23 -0
- package/types/lib/inventory/jsonLike.d.ts.map +1 -0
- package/types/lib/inventory/licenseEnhancer.d.ts +70 -0
- package/types/lib/inventory/licenseEnhancer.d.ts.map +1 -0
- package/types/lib/inventory/lolbas.d.ts +16 -0
- package/types/lib/inventory/lolbas.d.ts.map +1 -0
- package/types/lib/inventory/mcp.d.ts +29 -0
- package/types/lib/inventory/mcp.d.ts.map +1 -0
- package/types/lib/inventory/mcpConfigParser.d.ts +20 -0
- package/types/lib/inventory/mcpConfigParser.d.ts.map +1 -0
- package/types/lib/inventory/mcpDiscovery.d.ts +33 -0
- package/types/lib/inventory/mcpDiscovery.d.ts.map +1 -0
- package/types/lib/inventory/mcpPinning.d.ts +11 -0
- package/types/lib/inventory/mcpPinning.d.ts.map +1 -0
- package/types/lib/inventory/osPackageResolver.d.ts +49 -0
- package/types/lib/inventory/osPackageResolver.d.ts.map +1 -0
- package/types/lib/inventory/osinfo.d.ts +201 -0
- package/types/lib/inventory/osinfo.d.ts.map +1 -0
- package/types/lib/inventory/osqueryTransform.d.ts +84 -0
- package/types/lib/inventory/osqueryTransform.d.ts.map +1 -0
- package/types/lib/inventory/plugins.d.ts +58 -0
- package/types/lib/inventory/plugins.d.ts.map +1 -0
- package/types/lib/inventory/protobom.d.ts +71 -0
- package/types/lib/inventory/protobom.d.ts.map +1 -0
- package/types/lib/inventory/protobomLoader.d.ts +17 -0
- package/types/lib/inventory/protobomLoader.d.ts.map +1 -0
- package/types/lib/inventory/provenanceUtils.d.ts +98 -0
- package/types/lib/inventory/provenanceUtils.d.ts.map +1 -0
- package/types/lib/inventory/purl.d.ts +313 -0
- package/types/lib/inventory/purl.d.ts.map +1 -0
- package/types/lib/inventory/rustFormulationParser.d.ts +17 -0
- package/types/lib/inventory/rustFormulationParser.d.ts.map +1 -0
- package/types/lib/inventory/sbomDocument.d.ts +59 -0
- package/types/lib/inventory/sbomDocument.d.ts.map +1 -0
- package/types/lib/inventory/source.d.ts +163 -0
- package/types/lib/inventory/source.d.ts.map +1 -0
- package/types/lib/inventory/spdx.d.ts +66 -0
- package/types/lib/inventory/spdx.d.ts.map +1 -0
- package/types/lib/inventory/spdxExpression.d.ts +58 -0
- package/types/lib/inventory/spdxExpression.d.ts.map +1 -0
- package/types/lib/inventory/spdxUtils.d.ts +12 -0
- package/types/lib/inventory/spdxUtils.d.ts.map +1 -0
- package/types/lib/inventory/table.d.ts +22 -0
- package/types/lib/inventory/table.d.ts.map +1 -0
- package/types/lib/inventory/traceRunner.d.ts +80 -0
- package/types/lib/inventory/traceRunner.d.ts.map +1 -0
- package/types/lib/inventory/unicodeScan.d.ts +46 -0
- package/types/lib/inventory/unicodeScan.d.ts.map +1 -0
- package/types/lib/managers/binary.d.ts +147 -0
- package/types/lib/managers/binary.d.ts.map +1 -0
- package/types/lib/managers/containerutils.d.ts +30 -0
- package/types/lib/managers/containerutils.d.ts.map +1 -0
- package/types/lib/managers/docker.d.ts +157 -0
- package/types/lib/managers/docker.d.ts.map +1 -0
- package/types/lib/managers/dockerConnection.d.ts +42 -0
- package/types/lib/managers/dockerConnection.d.ts.map +1 -0
- package/types/lib/managers/oci.d.ts +21 -0
- package/types/lib/managers/oci.d.ts.map +1 -0
- package/types/lib/managers/piptree.d.ts +13 -0
- package/types/lib/managers/piptree.d.ts.map +1 -0
- package/types/lib/parsers/cmakeCache.d.ts +70 -0
- package/types/lib/parsers/cmakeCache.d.ts.map +1 -0
- package/types/lib/parsers/gguf.d.ts +39 -0
- package/types/lib/parsers/gguf.d.ts.map +1 -0
- package/types/lib/parsers/gitAiNotes.d.ts +15 -0
- package/types/lib/parsers/gitAiNotes.d.ts.map +1 -0
- package/types/lib/parsers/gitmodules.d.ts +88 -0
- package/types/lib/parsers/gitmodules.d.ts.map +1 -0
- package/types/lib/parsers/htmlExtract.d.ts +34 -0
- package/types/lib/parsers/htmlExtract.d.ts.map +1 -0
- package/types/lib/parsers/huggingfaceManifest.d.ts +153 -0
- package/types/lib/parsers/huggingfaceManifest.d.ts.map +1 -0
- package/types/lib/parsers/huggingfaceUtils.d.ts +155 -0
- package/types/lib/parsers/huggingfaceUtils.d.ts.map +1 -0
- package/types/lib/parsers/iri.d.ts +68 -0
- package/types/lib/parsers/iri.d.ts.map +1 -0
- package/types/lib/parsers/npmrc.d.ts +33 -0
- package/types/lib/parsers/npmrc.d.ts.map +1 -0
- package/types/lib/parsers/ollama.d.ts +22 -0
- package/types/lib/parsers/ollama.d.ts.map +1 -0
- package/types/lib/parsers/xml.d.ts +47 -0
- package/types/lib/parsers/xml.d.ts.map +1 -0
- package/types/lib/server/server.d.ts +51 -0
- package/types/lib/server/server.d.ts.map +1 -0
- package/types/lib/stages/postgen/annotator.d.ts +36 -0
- package/types/lib/stages/postgen/annotator.d.ts.map +1 -0
- package/types/lib/stages/postgen/auditBom.d.ts +92 -0
- package/types/lib/stages/postgen/auditBom.d.ts.map +1 -0
- package/types/lib/stages/postgen/postgen.d.ts +59 -0
- package/types/lib/stages/postgen/postgen.d.ts.map +1 -0
- package/types/lib/stages/postgen/ruleEngine.d.ts +18 -0
- package/types/lib/stages/postgen/ruleEngine.d.ts.map +1 -0
- package/types/lib/stages/postgen/sortBom.d.ts +34 -0
- package/types/lib/stages/postgen/sortBom.d.ts.map +1 -0
- package/types/lib/stages/postgen/spdxConverter.d.ts +11 -0
- package/types/lib/stages/postgen/spdxConverter.d.ts.map +1 -0
- package/types/lib/stages/postgen/specVersionCompat.d.ts +71 -0
- package/types/lib/stages/postgen/specVersionCompat.d.ts.map +1 -0
- package/types/lib/stages/pregen/envAudit.d.ts +14 -0
- package/types/lib/stages/pregen/envAudit.d.ts.map +1 -0
- package/types/lib/stages/pregen/pregen.d.ts +59 -0
- package/types/lib/stages/pregen/pregen.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/arborist/index.d.ts +47 -0
- package/types/lib/third-party/arborist/lib/arborist/index.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/arborist/load-actual.d.ts +4 -0
- package/types/lib/third-party/arborist/lib/arborist/load-actual.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/arborist/load-virtual.d.ts +4 -0
- package/types/lib/third-party/arborist/lib/arborist/load-virtual.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/bin-links.d.ts +18 -0
- package/types/lib/third-party/arborist/lib/bin-links.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/calc-dep-flags.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/calc-dep-flags.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/case-insensitive-map.d.ts +9 -0
- package/types/lib/third-party/arborist/lib/case-insensitive-map.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/consistent-resolve.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/consistent-resolve.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/debug.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/debug.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/dep-valid.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/dep-valid.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/edge.d.ts +46 -0
- package/types/lib/third-party/arborist/lib/edge.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/from-path.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/from-path.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/gather-dep-set.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/gather-dep-set.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/index.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/index.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/inventory.d.ts +14 -0
- package/types/lib/third-party/arborist/lib/inventory.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/link.d.ts +18 -0
- package/types/lib/third-party/arborist/lib/link.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/node.d.ts +112 -0
- package/types/lib/third-party/arborist/lib/node.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/npm-extension.d.ts +18 -0
- package/types/lib/third-party/arborist/lib/npm-extension.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/override-resolves.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/override-resolves.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/override-set.d.ts +27 -0
- package/types/lib/third-party/arborist/lib/override-set.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/package-extensions.d.ts +36 -0
- package/types/lib/third-party/arborist/lib/package-extensions.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/printable.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/printable.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/proc-log.d.ts +20 -0
- package/types/lib/third-party/arborist/lib/proc-log.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/realpath.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/realpath.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/relpath.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/relpath.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/shrinkwrap.d.ts +54 -0
- package/types/lib/third-party/arborist/lib/shrinkwrap.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/spec-from-lock.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/spec-from-lock.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/tree-check.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/tree-check.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/validate-npm-package-name.d.ts +13 -0
- package/types/lib/third-party/arborist/lib/validate-npm-package-name.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/version-from-tgz.d.ts +6 -0
- package/types/lib/third-party/arborist/lib/version-from-tgz.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/yarn-lock.d.ts +35 -0
- package/types/lib/third-party/arborist/lib/yarn-lock.d.ts.map +1 -0
- package/types/lib/validator/bomValidator.d.ts +40 -0
- package/types/lib/validator/bomValidator.d.ts.map +1 -0
- package/types/lib/validator/complianceEngine.d.ts +72 -0
- package/types/lib/validator/complianceEngine.d.ts.map +1 -0
- package/types/lib/validator/complianceRules.d.ts +61 -0
- package/types/lib/validator/complianceRules.d.ts.map +1 -0
- package/types/lib/validator/index.d.ts +101 -0
- package/types/lib/validator/index.d.ts.map +1 -0
- package/types/lib/validator/reporters/annotations.d.ts +37 -0
- package/types/lib/validator/reporters/annotations.d.ts.map +1 -0
- package/types/lib/validator/reporters/console.d.ts +34 -0
- package/types/lib/validator/reporters/console.d.ts.map +1 -0
- package/types/lib/validator/reporters/index.d.ts +30 -0
- package/types/lib/validator/reporters/index.d.ts.map +1 -0
- package/types/lib/validator/reporters/json.d.ts +11 -0
- package/types/lib/validator/reporters/json.d.ts.map +1 -0
- package/types/lib/validator/reporters/sarif.d.ts +22 -0
- package/types/lib/validator/reporters/sarif.d.ts.map +1 -0
- package/mod.d.ts +0 -7
- package/mod.js +0 -22
|
@@ -0,0 +1,1092 @@
|
|
|
1
|
+
import { lstatSync, readFileSync } from "node:fs";
|
|
2
|
+
import { tmpdir, totalmem } from "node:os";
|
|
3
|
+
import { delimiter as _delimiter, dirname, join, resolve } from "node:path";
|
|
4
|
+
import process from "node:process";
|
|
5
|
+
|
|
6
|
+
import { DEBUG_MODE, readEnvironmentVariable } from "../core/activity.js";
|
|
7
|
+
import {
|
|
8
|
+
safeExistsSync,
|
|
9
|
+
safeMkdtempSync,
|
|
10
|
+
safeRmSync,
|
|
11
|
+
safeSpawnSync,
|
|
12
|
+
} from "../core/fs.js";
|
|
13
|
+
import { TRACE_MODE } from "../core/logger.js";
|
|
14
|
+
import { dirNameStr, isWin } from "../core/paths.js";
|
|
15
|
+
|
|
16
|
+
const ASTGEN_DEFAULT_IGNORE_DIRS = [
|
|
17
|
+
"venv",
|
|
18
|
+
"docs",
|
|
19
|
+
"e2e",
|
|
20
|
+
"e2e-beta",
|
|
21
|
+
"examples",
|
|
22
|
+
"cypress",
|
|
23
|
+
"jest-cache",
|
|
24
|
+
"eslint-rules",
|
|
25
|
+
"codemods",
|
|
26
|
+
"flow-typed",
|
|
27
|
+
"i18n",
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
const ATOM_JS_LANGUAGES = new Set([
|
|
31
|
+
"javascript",
|
|
32
|
+
"js",
|
|
33
|
+
"jsx",
|
|
34
|
+
"node",
|
|
35
|
+
"nodejs",
|
|
36
|
+
"typescript",
|
|
37
|
+
"ts",
|
|
38
|
+
"tsx",
|
|
39
|
+
]);
|
|
40
|
+
|
|
41
|
+
// atom 3 ships per-platform sub-packages. The native sub-packages embed a
|
|
42
|
+
// GraalVM native image (`bin/atom`) and need no JDK; the jar sub-packages
|
|
43
|
+
// carry `plugins/` (jars + launchers) and require Java 23+. This set must stay
|
|
44
|
+
// in lockstep with `NATIVE_PACKAGES` in @appthreat/atom/resolve.js; the
|
|
45
|
+
// `atomProviderKind` parity test in atomUtils.poku.js guards the drift.
|
|
46
|
+
/**
|
|
47
|
+
* Platform-specific @appthreat/atom-* native package names that carry the
|
|
48
|
+
* bundled native `atom` binary.
|
|
49
|
+
*/
|
|
50
|
+
export const ATOM_NATIVE_PACKAGES = new Set([
|
|
51
|
+
"@appthreat/atom-linux-amd64",
|
|
52
|
+
"@appthreat/atom-linux-arm64",
|
|
53
|
+
"@appthreat/atom-darwin-arm64",
|
|
54
|
+
"@appthreat/atom-linux-amd64-musl",
|
|
55
|
+
"@appthreat/atom-windows-amd64",
|
|
56
|
+
]);
|
|
57
|
+
|
|
58
|
+
const ATOM_PHP_LANGUAGES = new Set(["php"]);
|
|
59
|
+
|
|
60
|
+
// Absolute ceiling on atom's heap. Past this point a larger heap buys a
|
|
61
|
+
// collector that runs less often rather than an analysis that succeeds where it
|
|
62
|
+
// otherwise would not, while the reservation itself is what pushes a build
|
|
63
|
+
// agent into swap or an OOM kill.
|
|
64
|
+
const ATOM_MAX_HEAP_CAP_BYTES = 8 * 1024 ** 3;
|
|
65
|
+
|
|
66
|
+
// A heap this small still completes the repository fixtures, so it is the floor
|
|
67
|
+
// applied on memory-constrained containers rather than a target.
|
|
68
|
+
const ATOM_MIN_HEAP_FLOOR_BYTES = 2 * 1024 ** 3;
|
|
69
|
+
|
|
70
|
+
// Below this, slicing a large project is slow before it is fatal, so the run is
|
|
71
|
+
// worth a warning even though it is allowed to proceed.
|
|
72
|
+
const ATOM_COMFORTABLE_HEAP_BYTES = 7 * 1024 ** 3;
|
|
73
|
+
|
|
74
|
+
// atom is spawned once per language and the ceiling is identical every time, so
|
|
75
|
+
// the warning belongs to the ceiling rather than to each spawn.
|
|
76
|
+
let warnedAtomHeapCeiling;
|
|
77
|
+
|
|
78
|
+
function escapeScalaRegexLiteral(value) {
|
|
79
|
+
return value.replace(/[\\^$*+?.()|[\]{}]/g, "\\$&");
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function normalizeGlobPattern(pattern) {
|
|
83
|
+
pattern = `${pattern}`;
|
|
84
|
+
let normalizedPattern = "";
|
|
85
|
+
for (let i = 0; i < pattern.length; i++) {
|
|
86
|
+
const char = pattern[i];
|
|
87
|
+
if (char !== "\\") {
|
|
88
|
+
normalizedPattern += char;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const nextChar = pattern[i + 1];
|
|
92
|
+
if (nextChar && "*?[]{}()!+@,".includes(nextChar)) {
|
|
93
|
+
normalizedPattern += char;
|
|
94
|
+
normalizedPattern += nextChar;
|
|
95
|
+
i++;
|
|
96
|
+
} else {
|
|
97
|
+
normalizedPattern += "/";
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return normalizedPattern.replace(/^\.\//, "");
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function splitGlobAlternates(value, separator = ",") {
|
|
104
|
+
const alternates = [];
|
|
105
|
+
let current = "";
|
|
106
|
+
let braceDepth = 0;
|
|
107
|
+
let bracketDepth = 0;
|
|
108
|
+
let parenDepth = 0;
|
|
109
|
+
for (let i = 0; i < value.length; i++) {
|
|
110
|
+
const char = value[i];
|
|
111
|
+
if (char === "\\") {
|
|
112
|
+
current += char;
|
|
113
|
+
if (i + 1 < value.length) {
|
|
114
|
+
current += value[++i];
|
|
115
|
+
}
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (char === "[" && bracketDepth === 0) {
|
|
119
|
+
bracketDepth++;
|
|
120
|
+
} else if (char === "]" && bracketDepth > 0) {
|
|
121
|
+
bracketDepth--;
|
|
122
|
+
} else if (!bracketDepth) {
|
|
123
|
+
if (char === "{") {
|
|
124
|
+
braceDepth++;
|
|
125
|
+
} else if (char === "}" && braceDepth > 0) {
|
|
126
|
+
braceDepth--;
|
|
127
|
+
} else if (char === "(") {
|
|
128
|
+
parenDepth++;
|
|
129
|
+
} else if (char === ")" && parenDepth > 0) {
|
|
130
|
+
parenDepth--;
|
|
131
|
+
} else if (char === separator && braceDepth === 0 && parenDepth === 0) {
|
|
132
|
+
alternates.push(current);
|
|
133
|
+
current = "";
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
current += char;
|
|
138
|
+
}
|
|
139
|
+
alternates.push(current);
|
|
140
|
+
return alternates;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function findClosingGlobToken(value, startIndex, openChar, closeChar) {
|
|
144
|
+
if (openChar === "[") {
|
|
145
|
+
for (let i = startIndex + 1; i < value.length; i++) {
|
|
146
|
+
if (value[i] === "\\") {
|
|
147
|
+
i++;
|
|
148
|
+
} else if (value[i] === closeChar) {
|
|
149
|
+
return i;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return -1;
|
|
153
|
+
}
|
|
154
|
+
let depth = 0;
|
|
155
|
+
let inBracket = false;
|
|
156
|
+
for (let i = startIndex; i < value.length; i++) {
|
|
157
|
+
const char = value[i];
|
|
158
|
+
if (char === "\\") {
|
|
159
|
+
i++;
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
if (char === "[" && !inBracket) {
|
|
163
|
+
inBracket = true;
|
|
164
|
+
} else if (char === "]" && inBracket) {
|
|
165
|
+
inBracket = false;
|
|
166
|
+
} else if (!inBracket) {
|
|
167
|
+
if (char === openChar) {
|
|
168
|
+
depth++;
|
|
169
|
+
} else if (char === closeChar) {
|
|
170
|
+
depth--;
|
|
171
|
+
if (depth === 0) {
|
|
172
|
+
return i;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return -1;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function globCharClassToRegex(value) {
|
|
181
|
+
if (!value.length) {
|
|
182
|
+
return "\\[";
|
|
183
|
+
}
|
|
184
|
+
let classValue = value;
|
|
185
|
+
let prefix = "";
|
|
186
|
+
if (classValue[0] === "!" || classValue[0] === "^") {
|
|
187
|
+
prefix = "^";
|
|
188
|
+
classValue = classValue.slice(1);
|
|
189
|
+
}
|
|
190
|
+
if (!classValue.length) {
|
|
191
|
+
return "\\[";
|
|
192
|
+
}
|
|
193
|
+
classValue = classValue.replace(/\\/g, "\\\\").replace(/]/g, "\\]");
|
|
194
|
+
return `[${prefix}${classValue}]`;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function globSegmentToScalaRegex(segment) {
|
|
198
|
+
let regex = "";
|
|
199
|
+
for (let i = 0; i < segment.length; i++) {
|
|
200
|
+
const char = segment[i];
|
|
201
|
+
const nextChar = segment[i + 1];
|
|
202
|
+
if (char === "\\") {
|
|
203
|
+
if (i + 1 < segment.length) {
|
|
204
|
+
regex += escapeScalaRegexLiteral(segment[++i]);
|
|
205
|
+
} else {
|
|
206
|
+
regex += "\\\\";
|
|
207
|
+
}
|
|
208
|
+
} else if (char === "*" && nextChar !== "(") {
|
|
209
|
+
regex += "[^/\\\\]*";
|
|
210
|
+
} else if (char === "?" && nextChar !== "(") {
|
|
211
|
+
regex += "[^/\\\\]";
|
|
212
|
+
} else if (char === "[") {
|
|
213
|
+
const bracketEnd = findClosingGlobToken(segment, i, "[", "]");
|
|
214
|
+
if (bracketEnd === -1) {
|
|
215
|
+
regex += "\\[";
|
|
216
|
+
} else {
|
|
217
|
+
regex += globCharClassToRegex(segment.slice(i + 1, bracketEnd));
|
|
218
|
+
i = bracketEnd;
|
|
219
|
+
}
|
|
220
|
+
} else if (char === "{") {
|
|
221
|
+
const braceEnd = findClosingGlobToken(segment, i, "{", "}");
|
|
222
|
+
if (braceEnd === -1) {
|
|
223
|
+
regex += "\\{";
|
|
224
|
+
} else {
|
|
225
|
+
const alternates = splitGlobAlternates(
|
|
226
|
+
segment.slice(i + 1, braceEnd),
|
|
227
|
+
).map((alternate) => globSegmentToScalaRegex(alternate));
|
|
228
|
+
regex += `(?:${alternates.join("|")})`;
|
|
229
|
+
i = braceEnd;
|
|
230
|
+
}
|
|
231
|
+
} else if (["@", "?", "+", "*", "!"].includes(char) && nextChar === "(") {
|
|
232
|
+
const parenEnd = findClosingGlobToken(segment, i + 1, "(", ")");
|
|
233
|
+
if (parenEnd === -1) {
|
|
234
|
+
regex += escapeScalaRegexLiteral(char);
|
|
235
|
+
} else {
|
|
236
|
+
const alternates = splitGlobAlternates(
|
|
237
|
+
segment.slice(i + 2, parenEnd),
|
|
238
|
+
"|",
|
|
239
|
+
).map((alternate) => globSegmentToScalaRegex(alternate));
|
|
240
|
+
const alternateRegex = `(?:${alternates.join("|")})`;
|
|
241
|
+
if (char === "@") {
|
|
242
|
+
regex += alternateRegex;
|
|
243
|
+
} else if (char === "?") {
|
|
244
|
+
regex += `${alternateRegex}?`;
|
|
245
|
+
} else if (char === "+") {
|
|
246
|
+
regex += `${alternateRegex}+`;
|
|
247
|
+
} else if (char === "*") {
|
|
248
|
+
regex += `${alternateRegex}*`;
|
|
249
|
+
} else {
|
|
250
|
+
regex += `(?!(?:${alternates.join("|")})$)[^/\\\\]*`;
|
|
251
|
+
}
|
|
252
|
+
i = parenEnd;
|
|
253
|
+
}
|
|
254
|
+
} else {
|
|
255
|
+
regex += escapeScalaRegexLiteral(char);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return regex;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
function getExcludePatterns(options = {}) {
|
|
262
|
+
if (!Array.isArray(options.exclude)) {
|
|
263
|
+
return [];
|
|
264
|
+
}
|
|
265
|
+
return options.exclude
|
|
266
|
+
.flatMap((pattern) => {
|
|
267
|
+
pattern = `${pattern}`;
|
|
268
|
+
return pattern.includes(",") && !pattern.includes("{")
|
|
269
|
+
? pattern.split(",")
|
|
270
|
+
: [pattern];
|
|
271
|
+
})
|
|
272
|
+
.map((pattern) => pattern.trim())
|
|
273
|
+
.filter(Boolean)
|
|
274
|
+
.filter((pattern) => !pattern.startsWith("!"));
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
function extractIgnoreDirsFromExcludePatterns(
|
|
278
|
+
patterns,
|
|
279
|
+
includeExactPathFragments = false,
|
|
280
|
+
) {
|
|
281
|
+
const ignoreDirs = new Set();
|
|
282
|
+
for (const pattern of patterns) {
|
|
283
|
+
const normalizedPattern = normalizeGlobPattern(pattern);
|
|
284
|
+
const isExactPath = !/[!*?{}[\]]/.test(normalizedPattern);
|
|
285
|
+
const segments = normalizedPattern.split("/").filter(Boolean);
|
|
286
|
+
const literalSegments = segments.filter(
|
|
287
|
+
(segment) =>
|
|
288
|
+
!/[!*?{}[\]]/.test(segment) && segment !== "." && segment !== "..",
|
|
289
|
+
);
|
|
290
|
+
if (!literalSegments.length) {
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
const dirName = literalSegments.at(-1);
|
|
294
|
+
if (
|
|
295
|
+
dirName &&
|
|
296
|
+
((includeExactPathFragments && isExactPath) ||
|
|
297
|
+
!dirName.includes(".") ||
|
|
298
|
+
segments.at(-1) !== dirName)
|
|
299
|
+
) {
|
|
300
|
+
ignoreDirs.add(dirName);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return Array.from(ignoreDirs);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
function globToScalaRegexFragment(pattern) {
|
|
307
|
+
pattern = normalizeGlobPattern(pattern);
|
|
308
|
+
const isAbsolute = pattern.startsWith("/");
|
|
309
|
+
const segments = pattern.split("/").filter(Boolean);
|
|
310
|
+
if (!segments.length) {
|
|
311
|
+
return "$^";
|
|
312
|
+
}
|
|
313
|
+
if (segments.length === 1 && segments[0] === "**") {
|
|
314
|
+
return ".*";
|
|
315
|
+
}
|
|
316
|
+
let regex = isAbsolute ? "^[/\\\\]" : "(?:^|.*[/\\\\])";
|
|
317
|
+
for (let i = 0; i < segments.length; i++) {
|
|
318
|
+
const segment = segments[i];
|
|
319
|
+
const isLast = i === segments.length - 1;
|
|
320
|
+
const nextSegment = segments[i + 1];
|
|
321
|
+
if (segment === "**") {
|
|
322
|
+
if (i === 0) {
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
if (isLast) {
|
|
326
|
+
regex += "(?:[/\\\\].*)?";
|
|
327
|
+
} else {
|
|
328
|
+
regex += "(?:[/\\\\][^/\\\\]+)*[/\\\\]";
|
|
329
|
+
}
|
|
330
|
+
continue;
|
|
331
|
+
}
|
|
332
|
+
regex += globSegmentToScalaRegex(segment);
|
|
333
|
+
if (!isLast && nextSegment !== "**") {
|
|
334
|
+
regex += "[/\\\\]";
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
return `${regex}$`;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Convert cdxgen's glob-style exclude patterns to a Scala/Java regex string.
|
|
342
|
+
*
|
|
343
|
+
* @param {string[]} patterns Glob patterns from cdxgen's `--exclude` option
|
|
344
|
+
* @returns {string|undefined} Scala-compatible regex or undefined when empty
|
|
345
|
+
*/
|
|
346
|
+
export function globPatternsToAtomIgnoreRegex(patterns = []) {
|
|
347
|
+
const fragments = getExcludePatterns({ exclude: patterns }).map((pattern) =>
|
|
348
|
+
globToScalaRegexFragment(pattern),
|
|
349
|
+
);
|
|
350
|
+
if (!fragments.length) {
|
|
351
|
+
return undefined;
|
|
352
|
+
}
|
|
353
|
+
return `(?:${fragments.join("|")})`;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* Determine whether a file path is excluded by the given atom-style glob
|
|
358
|
+
* exclude patterns.
|
|
359
|
+
*
|
|
360
|
+
* @param {string} filePath File path to test.
|
|
361
|
+
* @param {string[]} [patterns=[]] Glob exclude patterns.
|
|
362
|
+
* @returns {boolean} True when the path matches an exclude pattern.
|
|
363
|
+
*/
|
|
364
|
+
export function isPathExcludedByGlobPatterns(filePath, patterns = []) {
|
|
365
|
+
const atomIgnoreRegex = globPatternsToAtomIgnoreRegex(patterns);
|
|
366
|
+
if (!atomIgnoreRegex) {
|
|
367
|
+
return false;
|
|
368
|
+
}
|
|
369
|
+
const normalizedPath = `${filePath}`.replace(/\\/g, "/").replace(/^\.\//, "");
|
|
370
|
+
let regex;
|
|
371
|
+
try {
|
|
372
|
+
// The pattern is compiled from globs by globToScalaRegexFragment, which
|
|
373
|
+
// escapes every literal it emits, so a pattern the engine rejects means the
|
|
374
|
+
// glob itself was malformed and nothing should be excluded on its account.
|
|
375
|
+
regex = new RegExp(atomIgnoreRegex);
|
|
376
|
+
} catch (_e) {
|
|
377
|
+
return false;
|
|
378
|
+
}
|
|
379
|
+
return regex.test(normalizedPath) || regex.test(`./${normalizedPath}`);
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* Remove atom-slice entries whose source file matches the given glob exclude
|
|
384
|
+
* patterns, preserving the original slice structure otherwise.
|
|
385
|
+
*
|
|
386
|
+
* Filters `objectSlices`, `userDefinedTypes`, `reachables`, and reachable
|
|
387
|
+
* `paths`/`graph` nodes/edges that reference excluded files.
|
|
388
|
+
*
|
|
389
|
+
* @param {object|Array} sliceData Atom slice data object or array.
|
|
390
|
+
* @param {string[]} [patterns=[]] Glob exclude patterns.
|
|
391
|
+
* @returns {object|Array} Filtered slice data (shallow copy when an object).
|
|
392
|
+
*/
|
|
393
|
+
export function filterAtomSlicesByExcludePatterns(sliceData, patterns = []) {
|
|
394
|
+
if (!sliceData || !getExcludePatterns({ exclude: patterns }).length) {
|
|
395
|
+
return sliceData;
|
|
396
|
+
}
|
|
397
|
+
const shouldKeepFile = (fileName) =>
|
|
398
|
+
!fileName || !isPathExcludedByGlobPatterns(fileName, patterns);
|
|
399
|
+
if (Array.isArray(sliceData)) {
|
|
400
|
+
return sliceData.filter((slice) => shouldKeepFile(slice.fileName));
|
|
401
|
+
}
|
|
402
|
+
const filteredSliceData = { ...sliceData };
|
|
403
|
+
if (Array.isArray(filteredSliceData.objectSlices)) {
|
|
404
|
+
filteredSliceData.objectSlices = filteredSliceData.objectSlices.filter(
|
|
405
|
+
(slice) => shouldKeepFile(slice.fileName),
|
|
406
|
+
);
|
|
407
|
+
}
|
|
408
|
+
if (Array.isArray(filteredSliceData.userDefinedTypes)) {
|
|
409
|
+
filteredSliceData.userDefinedTypes =
|
|
410
|
+
filteredSliceData.userDefinedTypes.filter((slice) =>
|
|
411
|
+
shouldKeepFile(slice.fileName),
|
|
412
|
+
);
|
|
413
|
+
}
|
|
414
|
+
if (Array.isArray(filteredSliceData.reachables)) {
|
|
415
|
+
filteredSliceData.reachables = filteredSliceData.reachables.filter(
|
|
416
|
+
(reachable) =>
|
|
417
|
+
(reachable.flows || []).every((flow) =>
|
|
418
|
+
shouldKeepFile(flow.parentFileName || flow.fileName),
|
|
419
|
+
),
|
|
420
|
+
);
|
|
421
|
+
}
|
|
422
|
+
if (
|
|
423
|
+
filteredSliceData.graph?.nodes &&
|
|
424
|
+
Array.isArray(filteredSliceData.paths)
|
|
425
|
+
) {
|
|
426
|
+
const excludedNodeIds = new Set(
|
|
427
|
+
filteredSliceData.graph.nodes
|
|
428
|
+
.filter((node) => !shouldKeepFile(node.parentFileName || node.fileName))
|
|
429
|
+
.map((node) => node.id),
|
|
430
|
+
);
|
|
431
|
+
filteredSliceData.paths = filteredSliceData.paths.filter((path) =>
|
|
432
|
+
path.every((nodeId) => !excludedNodeIds.has(nodeId)),
|
|
433
|
+
);
|
|
434
|
+
const retainedNodeIds = new Set(filteredSliceData.paths.flat());
|
|
435
|
+
filteredSliceData.graph = {
|
|
436
|
+
...filteredSliceData.graph,
|
|
437
|
+
nodes: filteredSliceData.graph.nodes.filter(
|
|
438
|
+
(node) => retainedNodeIds.has(node.id) || !excludedNodeIds.has(node.id),
|
|
439
|
+
),
|
|
440
|
+
edges: (filteredSliceData.graph.edges || []).filter((edge) => {
|
|
441
|
+
const source = edge.src ?? edge.source;
|
|
442
|
+
const destination = edge.dst ?? edge.destination;
|
|
443
|
+
return (
|
|
444
|
+
!excludedNodeIds.has(source) && !excludedNodeIds.has(destination)
|
|
445
|
+
);
|
|
446
|
+
}),
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
return filteredSliceData;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
function mergeCsvValues(...valueLists) {
|
|
453
|
+
const values = new Set();
|
|
454
|
+
for (const valueList of valueLists) {
|
|
455
|
+
if (Array.isArray(valueList)) {
|
|
456
|
+
valueList.forEach((value) => {
|
|
457
|
+
values.add(`${value}`.trim());
|
|
458
|
+
});
|
|
459
|
+
} else if (typeof valueList === "string" && valueList.length) {
|
|
460
|
+
valueList.split(",").forEach((value) => {
|
|
461
|
+
values.add(value.trim());
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
return Array.from(values).filter(Boolean).join(",");
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
function mergeRegexValues(...regexValues) {
|
|
469
|
+
const values = regexValues
|
|
470
|
+
.map((regexValue) => `${regexValue || ""}`.trim())
|
|
471
|
+
.filter(Boolean);
|
|
472
|
+
if (!values.length) {
|
|
473
|
+
return undefined;
|
|
474
|
+
}
|
|
475
|
+
return values.map((regexValue) => `(?:${regexValue})`).join("|");
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
/**
|
|
479
|
+
* Build additional environment variables for Atom from cdxgen CLI options.
|
|
480
|
+
*
|
|
481
|
+
* @param {Object} options CLI options
|
|
482
|
+
* @param {string} language Atom language name
|
|
483
|
+
* @returns {Object} Environment variables to pass to Atom
|
|
484
|
+
*/
|
|
485
|
+
export function buildAtomCommandEnv(options = {}, language = "") {
|
|
486
|
+
const excludePatterns = getExcludePatterns(options);
|
|
487
|
+
const normalizedLanguage = `${language}`.toLowerCase();
|
|
488
|
+
// PHP frontend: the atom 3 dispatcher clobbers PHP_PARSER_BIN with a path
|
|
489
|
+
// that does not exist on native platforms, and atom 3.0.x crashes parsing
|
|
490
|
+
// that bogus value. Forward the resolved php-parse location through the env
|
|
491
|
+
// so executeAtom can bypass the dispatcher for PHP (see
|
|
492
|
+
// resolveDirectAtomBinaryPath). Computed independently of exclude patterns.
|
|
493
|
+
const phpParseBin = ATOM_PHP_LANGUAGES.has(normalizedLanguage)
|
|
494
|
+
? resolvePhpParseBin()
|
|
495
|
+
: undefined;
|
|
496
|
+
if (!excludePatterns.length) {
|
|
497
|
+
return phpParseBin ? { PHP_PARSER_BIN: phpParseBin } : {};
|
|
498
|
+
}
|
|
499
|
+
const chenIgnoreDirs = mergeCsvValues(
|
|
500
|
+
readEnvironmentVariable("CHEN_IGNORE_DIRS"),
|
|
501
|
+
extractIgnoreDirsFromExcludePatterns(excludePatterns, true),
|
|
502
|
+
);
|
|
503
|
+
const env = {};
|
|
504
|
+
if (chenIgnoreDirs) {
|
|
505
|
+
env.CHEN_IGNORE_DIRS = chenIgnoreDirs;
|
|
506
|
+
}
|
|
507
|
+
const atomIgnoreRegex = globPatternsToAtomIgnoreRegex(excludePatterns);
|
|
508
|
+
if (ATOM_JS_LANGUAGES.has(normalizedLanguage)) {
|
|
509
|
+
const astgenBaseIgnoreDirs =
|
|
510
|
+
readEnvironmentVariable("ASTGEN_IGNORE_DIRS") === undefined
|
|
511
|
+
? ASTGEN_DEFAULT_IGNORE_DIRS
|
|
512
|
+
: readEnvironmentVariable("ASTGEN_IGNORE_DIRS");
|
|
513
|
+
const astgenIgnoreDirs = mergeCsvValues(
|
|
514
|
+
astgenBaseIgnoreDirs,
|
|
515
|
+
"node_modules",
|
|
516
|
+
extractIgnoreDirsFromExcludePatterns(excludePatterns),
|
|
517
|
+
);
|
|
518
|
+
if (astgenIgnoreDirs) {
|
|
519
|
+
env.ASTGEN_IGNORE_DIRS = astgenIgnoreDirs;
|
|
520
|
+
}
|
|
521
|
+
const astgenIgnoreFilePattern = mergeRegexValues(
|
|
522
|
+
readEnvironmentVariable("ASTGEN_IGNORE_FILE_PATTERN"),
|
|
523
|
+
atomIgnoreRegex,
|
|
524
|
+
);
|
|
525
|
+
if (astgenIgnoreFilePattern) {
|
|
526
|
+
env.ASTGEN_IGNORE_FILE_PATTERN = astgenIgnoreFilePattern;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
if (phpParseBin) {
|
|
530
|
+
env.PHP_PARSER_BIN = phpParseBin;
|
|
531
|
+
}
|
|
532
|
+
return env;
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
/**
|
|
536
|
+
* Detect the libc flavour on Linux without shelling out. Mirrors the cheap
|
|
537
|
+
* branches of atom's `getLinuxLibc` (Alpine release file first, then glibc
|
|
538
|
+
* default). atom additionally consults `process.report` and `ldd --version`;
|
|
539
|
+
* those are only needed to disambiguate exotic setups and are intentionally not
|
|
540
|
+
* reproduced here to keep this call subprocess-free.
|
|
541
|
+
*/
|
|
542
|
+
function detectLinuxLibc() {
|
|
543
|
+
if (safeExistsSync("/etc/alpine-release")) {
|
|
544
|
+
return "musl";
|
|
545
|
+
}
|
|
546
|
+
return "glibc";
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
/**
|
|
550
|
+
* Resolve the atom platform sub-package name and provider kind for the current
|
|
551
|
+
* (or supplied) runtime. This is a cdxgen-side reimplementation of atom's own
|
|
552
|
+
* `resolveAtomProvider`, kept here rather than imported from
|
|
553
|
+
* `@appthreat/atom/resolve.js` so it is safe under every cdxgen runtime
|
|
554
|
+
* (node, bun, deno, caxa) and inside the extracted caxa tree where the
|
|
555
|
+
* dispatcher's own resolver may not find a sibling sub-package.
|
|
556
|
+
*
|
|
557
|
+
* The returned `preferredPkg`/`kind` pair must agree with atom's
|
|
558
|
+
* `resolveAtomProvider` and `NATIVE_PACKAGES`; the parity test in
|
|
559
|
+
* atomUtils.poku.js asserts the agreement for all eight published triples.
|
|
560
|
+
*
|
|
561
|
+
* @param {Object} [opts] Optional overrides for testability
|
|
562
|
+
* @param {string} [opts.platform] Defaults to `process.platform`
|
|
563
|
+
* @param {string} [opts.arch] Defaults to `process.arch`
|
|
564
|
+
* @param {string} [opts.libc] Defaults to detected libc on linux
|
|
565
|
+
* @returns {{preferredPkg: string, kind: "native"|"jar", platform: string, arch: string, libc?: string}}
|
|
566
|
+
*/
|
|
567
|
+
export function resolveAtomProvider(opts = {}) {
|
|
568
|
+
const platform = opts.platform || process.platform;
|
|
569
|
+
const arch = opts.arch || process.arch;
|
|
570
|
+
let libc = opts.libc;
|
|
571
|
+
if (platform === "linux" && !libc) {
|
|
572
|
+
libc = detectLinuxLibc();
|
|
573
|
+
}
|
|
574
|
+
let preferredPkg = "@appthreat/atom-jar";
|
|
575
|
+
let kind = "jar";
|
|
576
|
+
if (platform === "win32") {
|
|
577
|
+
if (arch === "x64") {
|
|
578
|
+
preferredPkg = "@appthreat/atom-windows-amd64";
|
|
579
|
+
kind = "native";
|
|
580
|
+
} else if (arch === "arm64") {
|
|
581
|
+
preferredPkg = "@appthreat/atom-windows-arm64";
|
|
582
|
+
kind = "jar";
|
|
583
|
+
}
|
|
584
|
+
} else if (platform === "darwin") {
|
|
585
|
+
if (arch === "arm64") {
|
|
586
|
+
preferredPkg = "@appthreat/atom-darwin-arm64";
|
|
587
|
+
kind = "native";
|
|
588
|
+
} else if (arch === "x64") {
|
|
589
|
+
preferredPkg = "@appthreat/atom-darwin-amd64";
|
|
590
|
+
kind = "jar";
|
|
591
|
+
}
|
|
592
|
+
} else if (platform === "linux") {
|
|
593
|
+
if (arch === "x64") {
|
|
594
|
+
preferredPkg =
|
|
595
|
+
libc === "musl"
|
|
596
|
+
? "@appthreat/atom-linux-amd64-musl"
|
|
597
|
+
: "@appthreat/atom-linux-amd64";
|
|
598
|
+
kind = "native";
|
|
599
|
+
} else if (arch === "arm64") {
|
|
600
|
+
if (libc === "musl") {
|
|
601
|
+
preferredPkg = "@appthreat/atom-linux-arm64-musl";
|
|
602
|
+
kind = "jar";
|
|
603
|
+
} else {
|
|
604
|
+
preferredPkg = "@appthreat/atom-linux-arm64";
|
|
605
|
+
kind = "native";
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
return { preferredPkg, kind, platform, arch, libc };
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
/**
|
|
613
|
+
* Returns `"native"` or `"jar"` for the currently resolved atom provider.
|
|
614
|
+
* Used to gate Java/JDK advice so users on the five native platforms are not
|
|
615
|
+
* told to install a JDK for a failure that has nothing to do with Java.
|
|
616
|
+
*/
|
|
617
|
+
export function atomProviderKind() {
|
|
618
|
+
return resolveAtomProvider().kind;
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
/**
|
|
622
|
+
* Locate the `php-parse` binary that the PHP frontend needs.
|
|
623
|
+
*
|
|
624
|
+
* atom 3's dispatcher unconditionally sets `PHP_PARSER_BIN=<ATOM_HOME>/bin/php-parse`,
|
|
625
|
+
* which for a native sub-package does not exist and also clobbers a caller-set
|
|
626
|
+
* value. cdxgen therefore resolves the real location and forwards it through
|
|
627
|
+
* the child env (see `buildAtomCommandEnv`); `executeAtom` then spawns the
|
|
628
|
+
* native binary directly for PHP so the dispatcher cannot clobber it (see
|
|
629
|
+
* `resolveDirectAtomBinaryPath`). Resolution order:
|
|
630
|
+
* 1. explicit `PHP_PARSER_BIN` env var (operators / container images)
|
|
631
|
+
* 2. `@appthreat/atom-parsetools/plugins/bin/php-parse` under cdxgen's own
|
|
632
|
+
* node_modules, then under `GLOBAL_NODE_MODULES_PATH` for global installs
|
|
633
|
+
*
|
|
634
|
+
* Returns `undefined` when neither is found, in which case PHP analysis runs
|
|
635
|
+
* through the dispatcher unchanged (and fails on native platforms until atom
|
|
636
|
+
* fixes the clobber).
|
|
637
|
+
*
|
|
638
|
+
* @returns {string|undefined}
|
|
639
|
+
*/
|
|
640
|
+
export function resolvePhpParseBin() {
|
|
641
|
+
if (readEnvironmentVariable("PHP_PARSER_BIN")) {
|
|
642
|
+
return readEnvironmentVariable("PHP_PARSER_BIN");
|
|
643
|
+
}
|
|
644
|
+
const roots = [dirNameStr];
|
|
645
|
+
if (readEnvironmentVariable("GLOBAL_NODE_MODULES_PATH")) {
|
|
646
|
+
roots.push(dirname(readEnvironmentVariable("GLOBAL_NODE_MODULES_PATH")));
|
|
647
|
+
}
|
|
648
|
+
for (const root of roots) {
|
|
649
|
+
const candidate = join(
|
|
650
|
+
root,
|
|
651
|
+
"node_modules",
|
|
652
|
+
"@appthreat",
|
|
653
|
+
"atom-parsetools",
|
|
654
|
+
"plugins",
|
|
655
|
+
"bin",
|
|
656
|
+
"php-parse",
|
|
657
|
+
);
|
|
658
|
+
if (safeExistsSync(candidate)) {
|
|
659
|
+
return candidate;
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
return undefined;
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
/**
|
|
666
|
+
* Resolve the atom native binary path directly, bypassing the dispatcher.
|
|
667
|
+
*
|
|
668
|
+
* This is required for the PHP frontend: the dispatcher clobbers
|
|
669
|
+
* `PHP_PARSER_BIN` with a path that does not exist on native platforms, and
|
|
670
|
+
* atom 3.0.x crashes in `defaultPhpParserBin` parsing that bogus value before
|
|
671
|
+
* any `--frontend-args php-parser-bin=` override is consulted. Spawning the
|
|
672
|
+
* native binary directly lets cdxgen control the child env, so the correct
|
|
673
|
+
* `PHP_PARSER_BIN` reaches atom. Returns `undefined` when the provider is the
|
|
674
|
+
* jar kind or the native binary cannot be located (in which case the dispatcher
|
|
675
|
+
* is used as-is).
|
|
676
|
+
*
|
|
677
|
+
* @returns {string|undefined}
|
|
678
|
+
*/
|
|
679
|
+
export function resolveDirectAtomBinaryPath() {
|
|
680
|
+
const { preferredPkg, kind } = resolveAtomProvider();
|
|
681
|
+
if (kind !== "native") {
|
|
682
|
+
return undefined;
|
|
683
|
+
}
|
|
684
|
+
const folder = preferredPkg.split("/")[1];
|
|
685
|
+
const exeName = isWin ? "atom.exe" : "atom";
|
|
686
|
+
const version = readAtomVersion();
|
|
687
|
+
const roots = [join(dirNameStr, "node_modules")];
|
|
688
|
+
if (readEnvironmentVariable("GLOBAL_NODE_MODULES_PATH")) {
|
|
689
|
+
roots.push(readEnvironmentVariable("GLOBAL_NODE_MODULES_PATH"));
|
|
690
|
+
}
|
|
691
|
+
const candidates = [];
|
|
692
|
+
for (const root of roots) {
|
|
693
|
+
candidates.push(join(root, "@appthreat", folder, "bin", exeName));
|
|
694
|
+
candidates.push(
|
|
695
|
+
join(
|
|
696
|
+
root,
|
|
697
|
+
"@appthreat",
|
|
698
|
+
"atom",
|
|
699
|
+
"node_modules",
|
|
700
|
+
"@appthreat",
|
|
701
|
+
folder,
|
|
702
|
+
"bin",
|
|
703
|
+
exeName,
|
|
704
|
+
),
|
|
705
|
+
);
|
|
706
|
+
if (version) {
|
|
707
|
+
candidates.push(
|
|
708
|
+
join(
|
|
709
|
+
root,
|
|
710
|
+
".pnpm",
|
|
711
|
+
`@appthreat+${folder}@${version}`,
|
|
712
|
+
"node_modules",
|
|
713
|
+
"@appthreat",
|
|
714
|
+
folder,
|
|
715
|
+
"bin",
|
|
716
|
+
exeName,
|
|
717
|
+
),
|
|
718
|
+
);
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
for (const candidate of candidates) {
|
|
722
|
+
if (safeExistsSync(candidate)) {
|
|
723
|
+
return candidate;
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
return undefined;
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
function readAtomVersion() {
|
|
730
|
+
const roots = [join(dirNameStr, "node_modules")];
|
|
731
|
+
if (readEnvironmentVariable("GLOBAL_NODE_MODULES_PATH")) {
|
|
732
|
+
roots.push(readEnvironmentVariable("GLOBAL_NODE_MODULES_PATH"));
|
|
733
|
+
}
|
|
734
|
+
for (const root of roots) {
|
|
735
|
+
try {
|
|
736
|
+
const pj = JSON.parse(
|
|
737
|
+
readFileSync(join(root, "@appthreat", "atom", "package.json"), "utf8"),
|
|
738
|
+
);
|
|
739
|
+
if (pj.version) {
|
|
740
|
+
return pj.version;
|
|
741
|
+
}
|
|
742
|
+
} catch {
|
|
743
|
+
// try the next root
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
return undefined;
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
/**
|
|
750
|
+
* Retrieves the atom command by referring to various environment variables
|
|
751
|
+
*/
|
|
752
|
+
export function getAtomCommand() {
|
|
753
|
+
if (readEnvironmentVariable("ATOM_CMD")) {
|
|
754
|
+
return readEnvironmentVariable("ATOM_CMD");
|
|
755
|
+
}
|
|
756
|
+
if (readEnvironmentVariable("ATOM_HOME")) {
|
|
757
|
+
// For atom 3 native installs, ATOM_HOME points at the platform sub-package
|
|
758
|
+
// directory (the dispatcher sets it to `dirname(dirname(binPath))`), which
|
|
759
|
+
// contains `bin/atom`. For jar installs it points at `plugins/`, where
|
|
760
|
+
// `bin/atom` is the launcher. Either way `join(ATOM_HOME, "bin", "atom")`
|
|
761
|
+
// is the correct path, so this branch needs no change for atom 3.
|
|
762
|
+
return join(readEnvironmentVariable("ATOM_HOME"), "bin", "atom");
|
|
763
|
+
}
|
|
764
|
+
const NODE_CMD = readEnvironmentVariable("NODE_CMD") || "node";
|
|
765
|
+
const localAtom = join(
|
|
766
|
+
dirNameStr,
|
|
767
|
+
"node_modules",
|
|
768
|
+
"@appthreat",
|
|
769
|
+
"atom",
|
|
770
|
+
"index.js",
|
|
771
|
+
);
|
|
772
|
+
if (safeExistsSync(localAtom)) {
|
|
773
|
+
return `${NODE_CMD} ${localAtom}`;
|
|
774
|
+
}
|
|
775
|
+
return "atom";
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
/**
|
|
779
|
+
* Compute the maximum heap atom may grow to, in bytes.
|
|
780
|
+
*
|
|
781
|
+
* Neither of atom's two runtimes bounds itself to anything a machine can
|
|
782
|
+
* comfortably back: a GraalVM native image defaults to
|
|
783
|
+
* `MaximumHeapSizePercent=80` of physical memory, and HotSpot to a quarter of
|
|
784
|
+
* it. Both use a collector that grows the heap in preference to collecting, so
|
|
785
|
+
* on a large host atom reserves tens of gigabytes and the machine, not atom,
|
|
786
|
+
* is what runs out of memory.
|
|
787
|
+
*
|
|
788
|
+
* The ceiling is therefore the smaller of half of physical memory and
|
|
789
|
+
* `ATOM_MAX_HEAP_CAP_BYTES`, with a floor so that a small container still gets
|
|
790
|
+
* a workable heap. `ATOM_MAX_HEAP` overrides the whole calculation and accepts
|
|
791
|
+
* a plain byte count or a `k`/`m`/`g` suffix.
|
|
792
|
+
*
|
|
793
|
+
* @returns {number|undefined} Heap ceiling in bytes, or `undefined` to leave the runtime default in place
|
|
794
|
+
*/
|
|
795
|
+
export function atomMaxHeapBytes() {
|
|
796
|
+
const configured = readEnvironmentVariable("ATOM_MAX_HEAP");
|
|
797
|
+
if (configured) {
|
|
798
|
+
const match = /^(\d+)([kmg]?)b?$/i.exec(configured.trim());
|
|
799
|
+
if (!match) {
|
|
800
|
+
console.warn(
|
|
801
|
+
`WARN: Ignoring ATOM_MAX_HEAP='${configured}'. Expected a byte count, optionally suffixed with k, m, or g.`,
|
|
802
|
+
);
|
|
803
|
+
} else {
|
|
804
|
+
const scale = { "": 1, k: 1024, m: 1024 ** 2, g: 1024 ** 3 };
|
|
805
|
+
const bytes = Number(match[1]) * scale[match[2].toLowerCase()];
|
|
806
|
+
// Zero is the runtime's own "unset" value, so it is the way to ask for
|
|
807
|
+
// the unbounded default back.
|
|
808
|
+
return bytes > 0 ? bytes : undefined;
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
const total = totalmem();
|
|
812
|
+
if (!total) {
|
|
813
|
+
return undefined;
|
|
814
|
+
}
|
|
815
|
+
return Math.max(
|
|
816
|
+
ATOM_MIN_HEAP_FLOOR_BYTES,
|
|
817
|
+
Math.min(Math.floor(total / 2), ATOM_MAX_HEAP_CAP_BYTES),
|
|
818
|
+
);
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
/**
|
|
822
|
+
* Warn when atom is about to run with a heap that slicing may not fit in.
|
|
823
|
+
*
|
|
824
|
+
* Below the comfortable threshold the failure is not a clean error: the
|
|
825
|
+
* collector spends progressively longer reclaiming an almost-full heap, so the
|
|
826
|
+
* run first becomes very slow and only then dies. Saying so up front turns an
|
|
827
|
+
* apparent hang into an actionable message. It is said once per ceiling, so the
|
|
828
|
+
* per-language spawns of a single run share one warning.
|
|
829
|
+
*
|
|
830
|
+
* @param {number} maxHeap Heap ceiling in bytes that atom will run with
|
|
831
|
+
*/
|
|
832
|
+
function warnOnTightAtomHeap(maxHeap) {
|
|
833
|
+
if (
|
|
834
|
+
maxHeap === warnedAtomHeapCeiling ||
|
|
835
|
+
maxHeap >= ATOM_COMFORTABLE_HEAP_BYTES
|
|
836
|
+
) {
|
|
837
|
+
return;
|
|
838
|
+
}
|
|
839
|
+
warnedAtomHeapCeiling = maxHeap;
|
|
840
|
+
const asGib = (bytes) => Math.round((bytes / 1024 ** 3) * 10) / 10;
|
|
841
|
+
console.warn(
|
|
842
|
+
`WARN: atom is limited to a ${asGib(maxHeap)} GiB heap, below the ${asGib(
|
|
843
|
+
ATOM_COMFORTABLE_HEAP_BYTES,
|
|
844
|
+
)} GiB that slice computation is comfortable with. Slicing large projects may take a long time or run out of memory. Raise it with ATOM_MAX_HEAP (for example ATOM_MAX_HEAP=8g) on a host with more memory.`,
|
|
845
|
+
);
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
/**
|
|
849
|
+
* Build the runtime arguments and environment that bound atom's heap.
|
|
850
|
+
*
|
|
851
|
+
* A native image takes its heap ceiling as a `-XX:` argument, which its runtime
|
|
852
|
+
* consumes before the command line reaches atom's own parser. A jar install is
|
|
853
|
+
* launched through a script that owns the `java` command line, so the only way
|
|
854
|
+
* in is `JAVA_TOOL_OPTIONS`, and an existing value is left alone rather than
|
|
855
|
+
* overridden.
|
|
856
|
+
*
|
|
857
|
+
* @param {string[]} args Arguments destined for atom, mutated in place
|
|
858
|
+
* @param {Object} env Environment for the atom process, mutated in place
|
|
859
|
+
*/
|
|
860
|
+
function applyAtomHeapLimit(args, env) {
|
|
861
|
+
const maxHeap = atomMaxHeapBytes();
|
|
862
|
+
if (!maxHeap) {
|
|
863
|
+
return;
|
|
864
|
+
}
|
|
865
|
+
warnOnTightAtomHeap(maxHeap);
|
|
866
|
+
if (atomProviderKind() === "jar") {
|
|
867
|
+
if (!env.JAVA_TOOL_OPTIONS) {
|
|
868
|
+
env.JAVA_TOOL_OPTIONS = `-Xmx${Math.floor(maxHeap / 1024 ** 2)}m`;
|
|
869
|
+
}
|
|
870
|
+
return;
|
|
871
|
+
}
|
|
872
|
+
if (!args.some((arg) => String(arg).startsWith("-XX:MaxHeapSize="))) {
|
|
873
|
+
args.unshift(`-XX:MaxHeapSize=${maxHeap}`);
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
/**
|
|
878
|
+
* Execute the atom tool against a source directory or file with the given arguments.
|
|
879
|
+
*
|
|
880
|
+
* Resolves the atom binary via `getAtomCommand`, sets up the required environment
|
|
881
|
+
* (including `JAVA_HOME` from `ATOM_JAVA_HOME` if set), and spawns the process.
|
|
882
|
+
* Logs diagnostic messages for common failure modes such as unsupported Java versions,
|
|
883
|
+
* missing `astgen`, and JVM crashes.
|
|
884
|
+
*
|
|
885
|
+
* @param {string} src Path to the source directory or file to analyse
|
|
886
|
+
* @param {string[]} args Arguments to pass to the atom command
|
|
887
|
+
* @param {Object} extra_env Additional environment variables to merge into the process environment
|
|
888
|
+
* @returns {boolean} `true` if atom executed successfully and the language is supported; `false` otherwise
|
|
889
|
+
*/
|
|
890
|
+
export function executeAtom(src, args, extra_env = {}) {
|
|
891
|
+
const cwd =
|
|
892
|
+
safeExistsSync(src) && lstatSync(src).isDirectory() ? src : dirname(src);
|
|
893
|
+
let ATOM_BIN = getAtomCommand();
|
|
894
|
+
// PHP on a native platform: the atom 3 dispatcher clobbers PHP_PARSER_BIN
|
|
895
|
+
// with a non-existent path and atom 3.0.x crashes parsing it before any
|
|
896
|
+
// --frontend-args override is honoured. When the caller forwards a resolved
|
|
897
|
+
// PHP_PARSER_BIN (see buildAtomCommandEnv) and the resolved command is the
|
|
898
|
+
// dispatcher, spawn the native binary directly so our env reaches atom. This
|
|
899
|
+
// must happen before the space-split below prepends index.js to argv.
|
|
900
|
+
let bypassAtomHome;
|
|
901
|
+
if (extra_env.PHP_PARSER_BIN && ATOM_BIN.includes("index.js")) {
|
|
902
|
+
const directBinary = resolveDirectAtomBinaryPath();
|
|
903
|
+
if (directBinary) {
|
|
904
|
+
ATOM_BIN = directBinary;
|
|
905
|
+
// The dispatcher exports ATOM_HOME=<sub-package dir> for the child. Set
|
|
906
|
+
// the same value here so bypassing it does not change anything else atom
|
|
907
|
+
// derives from that variable.
|
|
908
|
+
bypassAtomHome = dirname(dirname(directBinary));
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
let isSupported = true;
|
|
912
|
+
const env = {
|
|
913
|
+
...process.env,
|
|
914
|
+
...extra_env,
|
|
915
|
+
};
|
|
916
|
+
// Bound the heap while argv still starts at atom's own arguments: the
|
|
917
|
+
// space-split below prepends the launcher script, which has to stay first.
|
|
918
|
+
applyAtomHeapLimit(args, env);
|
|
919
|
+
if (ATOM_BIN.includes(" ")) {
|
|
920
|
+
const tmpA = ATOM_BIN.split(" ");
|
|
921
|
+
if (tmpA && tmpA.length > 1) {
|
|
922
|
+
ATOM_BIN = tmpA[0];
|
|
923
|
+
args.unshift(tmpA[1]);
|
|
924
|
+
}
|
|
925
|
+
}
|
|
926
|
+
if (DEBUG_MODE) {
|
|
927
|
+
console.log("Executing", ATOM_BIN);
|
|
928
|
+
}
|
|
929
|
+
if (bypassAtomHome) {
|
|
930
|
+
env.ATOM_HOME = bypassAtomHome;
|
|
931
|
+
}
|
|
932
|
+
// Surface atom 3's resolver diagnostics under verbose debug. The dispatcher
|
|
933
|
+
// traces every candidate path it inspects, which is the cheapest way to
|
|
934
|
+
// diagnose a payload-less install.
|
|
935
|
+
if (TRACE_MODE && env.ATOM_DEBUG === undefined) {
|
|
936
|
+
env.ATOM_DEBUG = "1";
|
|
937
|
+
}
|
|
938
|
+
// Atom requires Java >= 23 (jar-kind platforms only)
|
|
939
|
+
if (readEnvironmentVariable("ATOM_JAVA_HOME")) {
|
|
940
|
+
env.JAVA_HOME = readEnvironmentVariable("ATOM_JAVA_HOME");
|
|
941
|
+
}
|
|
942
|
+
if (isWin) {
|
|
943
|
+
env.PATH = `${env.PATH || env.Path}${_delimiter}${join(
|
|
944
|
+
dirNameStr,
|
|
945
|
+
"node_modules",
|
|
946
|
+
".bin",
|
|
947
|
+
)}`;
|
|
948
|
+
} else {
|
|
949
|
+
env.PATH = `${env.PATH}${_delimiter}${join(
|
|
950
|
+
dirNameStr,
|
|
951
|
+
"node_modules",
|
|
952
|
+
".bin",
|
|
953
|
+
)}`;
|
|
954
|
+
}
|
|
955
|
+
const result = safeSpawnSync(ATOM_BIN, args, {
|
|
956
|
+
cwd,
|
|
957
|
+
shell: isWin,
|
|
958
|
+
killSignal: "SIGKILL",
|
|
959
|
+
env,
|
|
960
|
+
});
|
|
961
|
+
const isJarKind = atomProviderKind() === "jar";
|
|
962
|
+
if (result.stderr) {
|
|
963
|
+
if (
|
|
964
|
+
isJarKind &&
|
|
965
|
+
(result.stderr?.includes(
|
|
966
|
+
"has been compiled by a more recent version of the Java Runtime",
|
|
967
|
+
) ||
|
|
968
|
+
result.stderr?.includes(
|
|
969
|
+
"Error: Could not create the Java Virtual Machine",
|
|
970
|
+
))
|
|
971
|
+
) {
|
|
972
|
+
console.log(
|
|
973
|
+
"Atom requires Java 23 or above. To improve the SBOM accuracy, please install a suitable version, set the JAVA_HOME environment variable, and re-run cdxgen.\nAlternatively, use the cdxgen container image.",
|
|
974
|
+
);
|
|
975
|
+
console.log(
|
|
976
|
+
env["JAVA_HOME"]
|
|
977
|
+
? "JAVA_HOME is currently set. Check that it points to a supported JDK."
|
|
978
|
+
: "JAVA_HOME is not set.",
|
|
979
|
+
);
|
|
980
|
+
} else if (result.stderr?.includes("astgen")) {
|
|
981
|
+
console.warn(
|
|
982
|
+
"WARN: Unable to locate astgen command. Install atom globally using sudo npm install -g @appthreat/atom-parsetools to resolve this issue.",
|
|
983
|
+
);
|
|
984
|
+
} else if (
|
|
985
|
+
result.stderr?.includes(
|
|
986
|
+
"The crash happened outside the Java Virtual Machine in native code",
|
|
987
|
+
)
|
|
988
|
+
) {
|
|
989
|
+
console.warn(
|
|
990
|
+
"WARN: The binary plugin used by atom has crashed. Please try an alternative container image and file an issue with steps to reproduce at: https://github.com/AppThreat/atom/issues",
|
|
991
|
+
);
|
|
992
|
+
} else if (
|
|
993
|
+
result.stderr?.includes("Could not parse command line options")
|
|
994
|
+
) {
|
|
995
|
+
console.warn(
|
|
996
|
+
"Invalid command-line options passed to atom. Please file a bug in the cdxgen repository.",
|
|
997
|
+
);
|
|
998
|
+
}
|
|
999
|
+
}
|
|
1000
|
+
if (result.stdout) {
|
|
1001
|
+
if (result.stdout.includes("No language frontend supported for language")) {
|
|
1002
|
+
console.log("This language is not yet supported by atom.");
|
|
1003
|
+
isSupported = false;
|
|
1004
|
+
} else if (
|
|
1005
|
+
isJarKind &&
|
|
1006
|
+
(result.stdout.includes(
|
|
1007
|
+
"The crash happened outside the Java Virtual Machine in native code",
|
|
1008
|
+
) ||
|
|
1009
|
+
result.stdout.includes(
|
|
1010
|
+
"A fatal error has been detected by the Java Runtime Environment",
|
|
1011
|
+
))
|
|
1012
|
+
) {
|
|
1013
|
+
console.warn(
|
|
1014
|
+
"WARN: The binary plugin used by atom has crashed. Please try an alternative container image and file an issue with steps to reproduce at: https://github.com/AppThreat/atom/issues",
|
|
1015
|
+
);
|
|
1016
|
+
}
|
|
1017
|
+
}
|
|
1018
|
+
if (DEBUG_MODE) {
|
|
1019
|
+
if (result.stdout) {
|
|
1020
|
+
console.log(result.stdout);
|
|
1021
|
+
}
|
|
1022
|
+
if (result.stderr) {
|
|
1023
|
+
console.log(result.stderr);
|
|
1024
|
+
}
|
|
1025
|
+
}
|
|
1026
|
+
// atom 3's dispatcher propagates the child exit status, so a non-zero exit is
|
|
1027
|
+
// finally observable. Report it rather than treating a failed analysis as a
|
|
1028
|
+
// success (the spawn `error` field is only set when the process could not be
|
|
1029
|
+
// launched at all). A null status (signal/timeout) is treated as failure.
|
|
1030
|
+
if (result.status !== null && result.status !== 0) {
|
|
1031
|
+
console.warn(
|
|
1032
|
+
`WARN: atom exited with status ${result.status}; the analysis may be incomplete.`,
|
|
1033
|
+
);
|
|
1034
|
+
return false;
|
|
1035
|
+
}
|
|
1036
|
+
return isSupported && !result.error && result.status === 0;
|
|
1037
|
+
}
|
|
1038
|
+
|
|
1039
|
+
/**
|
|
1040
|
+
* Find the imported modules in the application with atom parsedeps command
|
|
1041
|
+
*
|
|
1042
|
+
* @param {string} src
|
|
1043
|
+
* @param {string} language
|
|
1044
|
+
* @param {string} methodology
|
|
1045
|
+
* @param {string} slicesFile
|
|
1046
|
+
* @param {Object} options CLI options
|
|
1047
|
+
* @returns List of imported modules
|
|
1048
|
+
*/
|
|
1049
|
+
export function findAppModules(
|
|
1050
|
+
src,
|
|
1051
|
+
language,
|
|
1052
|
+
methodology = "usages",
|
|
1053
|
+
slicesFile = undefined,
|
|
1054
|
+
options = {},
|
|
1055
|
+
) {
|
|
1056
|
+
const tempDir = safeMkdtempSync(join(tmpdir(), "atom-deps-"));
|
|
1057
|
+
const atomFile = join(tempDir, `${language}-app.atom`);
|
|
1058
|
+
if (!slicesFile) {
|
|
1059
|
+
slicesFile = join(tempDir, "slices.json");
|
|
1060
|
+
}
|
|
1061
|
+
let retList = [];
|
|
1062
|
+
const args = [
|
|
1063
|
+
methodology,
|
|
1064
|
+
"-l",
|
|
1065
|
+
language,
|
|
1066
|
+
"-o",
|
|
1067
|
+
resolve(atomFile),
|
|
1068
|
+
"--slice-outfile",
|
|
1069
|
+
resolve(slicesFile),
|
|
1070
|
+
];
|
|
1071
|
+
args.push(resolve(src));
|
|
1072
|
+
executeAtom(src, args, buildAtomCommandEnv(options, language));
|
|
1073
|
+
if (safeExistsSync(slicesFile)) {
|
|
1074
|
+
const slicesData = JSON.parse(readFileSync(slicesFile, "utf-8"), {
|
|
1075
|
+
encoding: "utf-8",
|
|
1076
|
+
});
|
|
1077
|
+
if (slicesData && Object.keys(slicesData) && slicesData.modules) {
|
|
1078
|
+
retList = slicesData.modules;
|
|
1079
|
+
} else {
|
|
1080
|
+
retList = slicesData;
|
|
1081
|
+
}
|
|
1082
|
+
} else {
|
|
1083
|
+
console.log(
|
|
1084
|
+
"Slicing was not successful. For large projects (> 1 million lines of code), try running atom cli externally in Java mode. Please refer to the instructions in https://github.com/cdxgen/cdxgen/blob/master/ADVANCED.md.",
|
|
1085
|
+
);
|
|
1086
|
+
}
|
|
1087
|
+
// Clean up
|
|
1088
|
+
if (tempDir?.startsWith(tmpdir())) {
|
|
1089
|
+
safeRmSync(tempDir, { recursive: true, force: true });
|
|
1090
|
+
}
|
|
1091
|
+
return retList;
|
|
1092
|
+
}
|