@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,861 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
|
|
3
|
+
import { tryBuildPurl } from "../inventory/purl.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Zig `build.zig.zon` parser.
|
|
7
|
+
*
|
|
8
|
+
* `build.zig.zon` is ZON — Zig Object Notation — and it is not JSON. It uses
|
|
9
|
+
* unquoted `.field = value` syntax, `.{}` anonymous struct literals, tuples
|
|
10
|
+
* (positional struct fields), multiline string literals, character literals,
|
|
11
|
+
* hex/underscore-separated numbers, and enum literals (`.foo`). A naive
|
|
12
|
+
* `JSON.parse` with fixups cannot read it, so this module ships a real
|
|
13
|
+
* tokenizer and recursive-descent parser.
|
|
14
|
+
*
|
|
15
|
+
* The grammar implemented here is the subset that appears in `build.zig.zon`:
|
|
16
|
+
* anonymous struct literals, tuples, string literals (with the full Zig escape
|
|
17
|
+
* set), multiline string literals, numbers, character literals, booleans,
|
|
18
|
+
* `null`, enum literals, and `//` line comments — ZON is Zig syntax, and the
|
|
19
|
+
* manifest `zig init` generates is largely comments.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Parse a Zig `build.zig.zon` file and return a package list and parent
|
|
24
|
+
* component describing the project and its dependencies.
|
|
25
|
+
*
|
|
26
|
+
* Zig dependencies are content-addressed rather than versioned by tag, so a
|
|
27
|
+
* fetched dependency's identity comes from its `.hash`. Two encodings are in
|
|
28
|
+
* use: the pre-0.14 hex multihash, where a `1220` prefix denotes SHA-2-256
|
|
29
|
+
* (codec `0x12`, 32-byte length `0x20`), and the 0.14+ form
|
|
30
|
+
* `<name>-<version>-<base64 digest>`, which carries the dependency's declared
|
|
31
|
+
* version. The multihash digest is emitted as a CycloneDX `hashes[]` entry
|
|
32
|
+
* when the codec is recognised; the raw hash string is always kept as a
|
|
33
|
+
* property so nothing is lost for encodings that cannot be decoded.
|
|
34
|
+
*
|
|
35
|
+
* `zig` is not a registered purl type, so dependencies use `pkg:generic/...`
|
|
36
|
+
* with a `cdx:purl:proposedType=zig` property and a `download_url` qualifier
|
|
37
|
+
* built from the `url`.
|
|
38
|
+
*
|
|
39
|
+
* @param {string} zonFile Path to `build.zig.zon`
|
|
40
|
+
* @returns {{ pkgList: object[], parentComponent: object }} parsed packages
|
|
41
|
+
*/
|
|
42
|
+
export function parseBuildZigZon(zonFile) {
|
|
43
|
+
let content;
|
|
44
|
+
try {
|
|
45
|
+
content = readFileSync(zonFile, "utf-8");
|
|
46
|
+
} catch (error) {
|
|
47
|
+
console.warn(`Failed to read ${zonFile}: ${error.message}`);
|
|
48
|
+
return { pkgList: [], parentComponent: {} };
|
|
49
|
+
}
|
|
50
|
+
return parseBuildZigZonContent(content, zonFile);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Parse ZON content (already read from a file or extracted from an archive)
|
|
55
|
+
* into a package list and parent component.
|
|
56
|
+
*
|
|
57
|
+
* The content-based entry point lets the resolver parse manifests read from
|
|
58
|
+
* `.tar.gz` cache archives without writing them to a temp file.
|
|
59
|
+
*
|
|
60
|
+
* @param {string} content Raw ZON source
|
|
61
|
+
* @param {string} [sourceLabel] Path or label used in `internal:SrcFile`
|
|
62
|
+
* evidence. When omitted, `"<zon-content>"` is used.
|
|
63
|
+
* @returns {{ pkgList: object[], parentComponent: object }} parsed packages
|
|
64
|
+
*/
|
|
65
|
+
export function parseBuildZigZonContent(
|
|
66
|
+
content,
|
|
67
|
+
sourceLabel = "<zon-content>",
|
|
68
|
+
) {
|
|
69
|
+
const pkgList = [];
|
|
70
|
+
let parentComponent = {};
|
|
71
|
+
|
|
72
|
+
let root;
|
|
73
|
+
try {
|
|
74
|
+
root = parseZon(content);
|
|
75
|
+
} catch (error) {
|
|
76
|
+
console.warn(`Failed to parse ZON content: ${error.message}`);
|
|
77
|
+
return { pkgList, parentComponent };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (!root || typeof root !== "object") {
|
|
81
|
+
return { pkgList, parentComponent };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const name = typeof root.name === "string" ? root.name : undefined;
|
|
85
|
+
const version = typeof root.version === "string" ? root.version : undefined;
|
|
86
|
+
if (name) {
|
|
87
|
+
parentComponent = {
|
|
88
|
+
type: "application",
|
|
89
|
+
name,
|
|
90
|
+
...(version ? { version } : {}),
|
|
91
|
+
description: `Zig project: ${name}`,
|
|
92
|
+
properties: [
|
|
93
|
+
{ name: "internal:SrcFile", value: sourceLabel },
|
|
94
|
+
...(version ? [{ name: "cdx:zig:version", value: version }] : []),
|
|
95
|
+
],
|
|
96
|
+
};
|
|
97
|
+
if (root.minimum_zig_version) {
|
|
98
|
+
parentComponent.properties.push({
|
|
99
|
+
name: "cdx:zig:minimum_zig_version",
|
|
100
|
+
value: `${root.minimum_zig_version}`,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
if (root.fingerprint) {
|
|
104
|
+
parentComponent.properties.push({
|
|
105
|
+
name: "cdx:zig:fingerprint",
|
|
106
|
+
value: `${root.fingerprint}`,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const dependencies = root.dependencies;
|
|
112
|
+
if (
|
|
113
|
+
dependencies &&
|
|
114
|
+
typeof dependencies === "object" &&
|
|
115
|
+
!Array.isArray(dependencies)
|
|
116
|
+
) {
|
|
117
|
+
for (const [depName, depData] of Object.entries(dependencies)) {
|
|
118
|
+
// Skip the parser's internal positional-tuple bucket.
|
|
119
|
+
if (depName === "_positional") continue;
|
|
120
|
+
if (!depData || typeof depData !== "object") continue;
|
|
121
|
+
const pkg = buildZigPackage(depName, depData, sourceLabel);
|
|
122
|
+
if (pkg) {
|
|
123
|
+
pkgList.push(pkg);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return { pkgList, parentComponent };
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Build a component-like package record for a single Zig dependency.
|
|
133
|
+
*
|
|
134
|
+
* A dependency is either fetched (carries `.url` and `.hash`) or local
|
|
135
|
+
* (carries `.path`). Both are scoped `required` — a path dependency is a build
|
|
136
|
+
* input the package cannot be built without. Its local nature is recorded in
|
|
137
|
+
* `cdx:zig:local` and `cdx:zig:path` instead, and it carries no `download_url`
|
|
138
|
+
* because there is nothing to fetch.
|
|
139
|
+
*
|
|
140
|
+
* @param {string} depName Dependency name
|
|
141
|
+
* @param {object} depData Parsed dependency struct
|
|
142
|
+
* @param {string} zonFile Source file path for evidence
|
|
143
|
+
* @returns {object|null} Package record, or null when the entry is unusable
|
|
144
|
+
*/
|
|
145
|
+
function buildZigPackage(depName, depData, zonFile) {
|
|
146
|
+
const url = typeof depData.url === "string" ? depData.url : undefined;
|
|
147
|
+
const hash = typeof depData.hash === "string" ? depData.hash : undefined;
|
|
148
|
+
const depPath = typeof depData.path === "string" ? depData.path : undefined;
|
|
149
|
+
const isLocal = !!depPath && !url;
|
|
150
|
+
const isLazy = depData.lazy === true;
|
|
151
|
+
|
|
152
|
+
const version = zigDepVersion(url, hash);
|
|
153
|
+
const properties = [
|
|
154
|
+
{ name: "internal:SrcFile", value: zonFile },
|
|
155
|
+
{ name: "cdx:purl:proposedType", value: "zig" },
|
|
156
|
+
];
|
|
157
|
+
if (url) {
|
|
158
|
+
properties.push({ name: "cdx:zig:url", value: url });
|
|
159
|
+
}
|
|
160
|
+
if (depPath) {
|
|
161
|
+
properties.push({ name: "cdx:zig:path", value: depPath });
|
|
162
|
+
}
|
|
163
|
+
if (hash) {
|
|
164
|
+
properties.push({ name: "cdx:zig:hash", value: hash });
|
|
165
|
+
}
|
|
166
|
+
if (isLocal) {
|
|
167
|
+
properties.push({ name: "cdx:zig:local", value: "true" });
|
|
168
|
+
}
|
|
169
|
+
if (isLazy) {
|
|
170
|
+
properties.push({ name: "cdx:zig:lazy", value: "true" });
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const qualifiers = {};
|
|
174
|
+
if (url) {
|
|
175
|
+
qualifiers.download_url = url;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const purl = tryBuildPurl({
|
|
179
|
+
type: "generic",
|
|
180
|
+
name: depName,
|
|
181
|
+
version: version || undefined,
|
|
182
|
+
qualifiers: Object.keys(qualifiers).length ? qualifiers : undefined,
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
const pkg = {
|
|
186
|
+
name: depName,
|
|
187
|
+
...(version ? { version } : {}),
|
|
188
|
+
type: "library",
|
|
189
|
+
scope: isLazy ? "optional" : "required",
|
|
190
|
+
properties,
|
|
191
|
+
evidence: {
|
|
192
|
+
identity: {
|
|
193
|
+
field: "purl",
|
|
194
|
+
confidence: 1.0,
|
|
195
|
+
methods: [
|
|
196
|
+
{
|
|
197
|
+
technique: "manifest-analysis",
|
|
198
|
+
confidence: 1.0,
|
|
199
|
+
value: zonFile,
|
|
200
|
+
},
|
|
201
|
+
],
|
|
202
|
+
},
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
if (purl) {
|
|
207
|
+
pkg.purl = purl;
|
|
208
|
+
pkg["bom-ref"] = decodeURIComponent(purl);
|
|
209
|
+
} else {
|
|
210
|
+
pkg["bom-ref"] = `library:${depName}:${version || ""}`;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// A `.path` dependency is a directory, not a published artefact: it has no
|
|
214
|
+
// url and no hash, so every local dependency of a given name would otherwise
|
|
215
|
+
// share the versionless ref `pkg:generic/<name>`. Two sibling manifests each
|
|
216
|
+
// declaring a `local_lib` would then collide on bom-ref and silently merge
|
|
217
|
+
// their edges. The normalised relative path is what distinguishes them, so
|
|
218
|
+
// it keys the ref while the purl stays a plain package identity.
|
|
219
|
+
if (isLocal) {
|
|
220
|
+
pkg["bom-ref"] = `library:${depName}:${normalizeZigPath(depPath)}`;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Decode the multihash only when the codec is unambiguously SHA-2-256.
|
|
224
|
+
// A mislabelled hashes.alg is worse than an absent hash, because downstream
|
|
225
|
+
// tools verify fetched artefacts against it.
|
|
226
|
+
const decoded = decodeZigHash(hash);
|
|
227
|
+
if (decoded) {
|
|
228
|
+
pkg.hashes = [{ alg: decoded.alg, content: decoded.content }];
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
return pkg;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Normalise a `.path` dependency's relative path into a stable key.
|
|
236
|
+
*
|
|
237
|
+
* `./libs/local`, `libs/local` and `libs/local/` all name the same directory,
|
|
238
|
+
* so they collapse to one form. Backslashes fold to forward slashes so a
|
|
239
|
+
* manifest written on Windows keys the same as one written on POSIX.
|
|
240
|
+
*
|
|
241
|
+
* @param {string} depPath Raw `.path` value from the manifest
|
|
242
|
+
* @returns {string} Normalised relative path
|
|
243
|
+
*/
|
|
244
|
+
function normalizeZigPath(depPath) {
|
|
245
|
+
const segments = [];
|
|
246
|
+
for (const segment of depPath.replace(/\\/g, "/").split("/")) {
|
|
247
|
+
if (segment === "" || segment === ".") {
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
if (segment === ".." && segments.length && segments.at(-1) !== "..") {
|
|
251
|
+
segments.pop();
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
segments.push(segment);
|
|
255
|
+
}
|
|
256
|
+
return segments.join("/") || ".";
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Derive a version string for a Zig dependency from its URL or hash.
|
|
261
|
+
*
|
|
262
|
+
* Zig dependencies have no explicit version field; identity is the content
|
|
263
|
+
* hash. When the URL points at a version tag we extract it so the purl is
|
|
264
|
+
* readable; otherwise the short hash is the stable, content-addressed version.
|
|
265
|
+
*
|
|
266
|
+
* @param {string|undefined} url Fetch URL
|
|
267
|
+
* @param {string|undefined} hash Multihash string
|
|
268
|
+
* @returns {string|undefined} A version string, or undefined when neither is present
|
|
269
|
+
*/
|
|
270
|
+
function zigDepVersion(url, hash) {
|
|
271
|
+
if (url) {
|
|
272
|
+
const tagVersion = extractTagVersion(url);
|
|
273
|
+
if (tagVersion) {
|
|
274
|
+
return tagVersion;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
if (hash) {
|
|
278
|
+
const packaged = parsePackageHash(hash);
|
|
279
|
+
if (packaged?.version) {
|
|
280
|
+
return packaged.version;
|
|
281
|
+
}
|
|
282
|
+
const decoded = decodeZigHash(hash);
|
|
283
|
+
if (decoded) {
|
|
284
|
+
return decoded.content.substring(0, 12);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return undefined;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Split a Zig 0.14+ package hash into its parts.
|
|
292
|
+
*
|
|
293
|
+
* Since 0.14 the `.hash` field is `<name>-<version>-<digest>`, where the
|
|
294
|
+
* digest is base64 rather than the older `1220…` hex multihash. The version is
|
|
295
|
+
* the dependency's own declared version, which is a better identifier than any
|
|
296
|
+
* digest prefix, so it is preferred when present.
|
|
297
|
+
*
|
|
298
|
+
* @param {string|undefined} hash Hash field value
|
|
299
|
+
* @returns {{name: string, version: string, digest: string}|null} parts, or null
|
|
300
|
+
*/
|
|
301
|
+
function parsePackageHash(hash) {
|
|
302
|
+
if (typeof hash !== "string") {
|
|
303
|
+
return null;
|
|
304
|
+
}
|
|
305
|
+
const match = hash.match(
|
|
306
|
+
/^([A-Za-z_][A-Za-z0-9_]*)-(\d[^-]*)-([A-Za-z0-9_-]+)$/,
|
|
307
|
+
);
|
|
308
|
+
if (!match) {
|
|
309
|
+
return null;
|
|
310
|
+
}
|
|
311
|
+
return { name: match[1], version: match[2], digest: match[3] };
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* Extract a version-like token from a Zig fetch URL's tag segment.
|
|
316
|
+
*
|
|
317
|
+
* Recognises GitHub/GitLab archive URLs of the form
|
|
318
|
+
* `.../archive/<refs/tags/>X.Y.Z.tar.gz` and bare trailing tag archives. Only
|
|
319
|
+
* returns a value when the final segment looks like a version, so commit-hash
|
|
320
|
+
* archives are left for the hash fallback.
|
|
321
|
+
*
|
|
322
|
+
* @param {string} url Fetch URL
|
|
323
|
+
* @returns {string|undefined} Version token, or undefined
|
|
324
|
+
*/
|
|
325
|
+
function extractTagVersion(url) {
|
|
326
|
+
const cleaned = url.split("?")[0].replace(/\.tar\.gz$|\.zip$|\.tgz$/i, "");
|
|
327
|
+
const segments = cleaned.split("/");
|
|
328
|
+
const last = segments[segments.length - 1];
|
|
329
|
+
// Accept dotted version-ish tokens (0.14.0, v1.2.3, 2024.1). Reject pure
|
|
330
|
+
// hex commit hashes, which the hash fallback handles.
|
|
331
|
+
if (/^v?\d+(\.\d+)+/.test(last)) {
|
|
332
|
+
return last.startsWith("v") ? last.slice(1) : last;
|
|
333
|
+
}
|
|
334
|
+
return undefined;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* Decode a Zig multihash string into an algorithm and digest.
|
|
339
|
+
*
|
|
340
|
+
* Zig's `.hash` is a multihash: the first byte is the hash codec and the
|
|
341
|
+
* second is the digest length. Only `0x12` (SHA-2-256) with a 32-byte digest
|
|
342
|
+
* is decoded, because that is what Zig emits and it maps to a CycloneDX
|
|
343
|
+
* algorithm downstream tools can verify against.
|
|
344
|
+
*
|
|
345
|
+
* @param {string|undefined} hash Multihash hex string
|
|
346
|
+
* @returns {{alg: string, content: string}|null} decoded hash, or null
|
|
347
|
+
*/
|
|
348
|
+
function decodeZigHash(hash) {
|
|
349
|
+
if (!hash || typeof hash !== "string") {
|
|
350
|
+
return null;
|
|
351
|
+
}
|
|
352
|
+
// Hex digits only; Zig hashes sometimes include the multihash bytes verbatim.
|
|
353
|
+
const hex = hash.toLowerCase();
|
|
354
|
+
if (hex.length < 4) {
|
|
355
|
+
return null;
|
|
356
|
+
}
|
|
357
|
+
const codec = hex.substring(0, 2);
|
|
358
|
+
const lengthByte = hex.substring(2, 4);
|
|
359
|
+
if (codec === "12" && lengthByte === "20") {
|
|
360
|
+
// 0x12 = sha2-256, 0x20 = 32 bytes (64 hex chars)
|
|
361
|
+
const digest = hex.substring(4, 68);
|
|
362
|
+
if (digest.length === 64) {
|
|
363
|
+
return { alg: "SHA-256", content: digest };
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
return null;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// ---------------------------------------------------------------------------
|
|
370
|
+
// ZON tokenizer
|
|
371
|
+
// ---------------------------------------------------------------------------
|
|
372
|
+
|
|
373
|
+
const SINGLE_CHAR_TOKENS = new Set(["{", "}", "[", "]", "(", ")", ",", "="]);
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* Tokenize a ZON source string.
|
|
377
|
+
*
|
|
378
|
+
* The tokenizer is intentionally separate from the parser so each literal form
|
|
379
|
+
* (string escapes, multiline strings, hex numbers, char literals) is handled
|
|
380
|
+
* in one place and can be unit-tested in isolation.
|
|
381
|
+
*
|
|
382
|
+
* @param {string} src ZON source
|
|
383
|
+
* @returns {Array<{type: string, value: *}>} tokens
|
|
384
|
+
* @throws {Error} when the source contains a character that cannot begin a token
|
|
385
|
+
*/
|
|
386
|
+
export function tokenizeZon(src) {
|
|
387
|
+
const tokens = [];
|
|
388
|
+
let i = 0;
|
|
389
|
+
const len = src.length;
|
|
390
|
+
|
|
391
|
+
const isIdentStart = (c) => /[A-Za-z_]/.test(c);
|
|
392
|
+
const isIdentPart = (c) => /[A-Za-z0-9_]/.test(c);
|
|
393
|
+
const isDigit = (c) => c >= "0" && c <= "9";
|
|
394
|
+
|
|
395
|
+
while (i < len) {
|
|
396
|
+
const c = src[i];
|
|
397
|
+
|
|
398
|
+
// Whitespace
|
|
399
|
+
if (c === " " || c === "\t" || c === "\r" || c === "\n") {
|
|
400
|
+
i++;
|
|
401
|
+
continue;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
// Line comment. ZON is Zig syntax, so `//` runs to the end of the line.
|
|
405
|
+
// The manifest `zig init` generates is mostly comments, which makes this
|
|
406
|
+
// the common case rather than an edge case. Zig has no block comments.
|
|
407
|
+
if (c === "/" && src[i + 1] === "/") {
|
|
408
|
+
while (i < len && src[i] !== "\n") {
|
|
409
|
+
i++;
|
|
410
|
+
}
|
|
411
|
+
continue;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// Anonymous struct literal ".{"
|
|
415
|
+
if (c === "." && src[i + 1] === "{") {
|
|
416
|
+
tokens.push({ type: "STRUCT_START", value: ".{" });
|
|
417
|
+
i += 2;
|
|
418
|
+
continue;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
// Field access / enum literal ".identifier" or ".@"quoted id""
|
|
422
|
+
if (c === ".") {
|
|
423
|
+
i++;
|
|
424
|
+
if (src[i] === "@" && src[i + 1] === '"') {
|
|
425
|
+
const str = readString(src, i + 1);
|
|
426
|
+
tokens.push({ type: "DOT_IDENT", value: str.value });
|
|
427
|
+
i = str.end;
|
|
428
|
+
} else if (isIdentStart(src[i])) {
|
|
429
|
+
let name = "";
|
|
430
|
+
while (i < len && isIdentPart(src[i])) {
|
|
431
|
+
name += src[i];
|
|
432
|
+
i++;
|
|
433
|
+
}
|
|
434
|
+
tokens.push({ type: "DOT_IDENT", value: name });
|
|
435
|
+
} else {
|
|
436
|
+
throw new Error(`Unexpected "." at position ${i}`);
|
|
437
|
+
}
|
|
438
|
+
continue;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
// Single-line string literal
|
|
442
|
+
if (c === '"') {
|
|
443
|
+
const str = readString(src, i);
|
|
444
|
+
tokens.push({ type: "STRING", value: str.value });
|
|
445
|
+
i = str.end;
|
|
446
|
+
continue;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
// Multiline string literal: lines beginning with "\\"
|
|
450
|
+
if (c === "\\" && src[i + 1] === "\\") {
|
|
451
|
+
const ml = readMultilineString(src, i);
|
|
452
|
+
tokens.push({ type: "STRING", value: ml.value });
|
|
453
|
+
i = ml.end;
|
|
454
|
+
continue;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
// Character / unicode code point literal
|
|
458
|
+
if (c === "'") {
|
|
459
|
+
const ch = readCharLiteral(src, i);
|
|
460
|
+
tokens.push({ type: "STRING", value: ch.value });
|
|
461
|
+
i = ch.end;
|
|
462
|
+
continue;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
// Number literal (integer or float, decimal or hex, with underscores)
|
|
466
|
+
if (isDigit(c) || (c === "-" && isDigit(src[i + 1]))) {
|
|
467
|
+
const num = readNumber(src, i);
|
|
468
|
+
tokens.push({ type: "NUMBER", value: num.value });
|
|
469
|
+
i = num.end;
|
|
470
|
+
continue;
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
// Identifier / keyword
|
|
474
|
+
if (isIdentStart(c)) {
|
|
475
|
+
let name = "";
|
|
476
|
+
while (i < len && isIdentPart(src[i])) {
|
|
477
|
+
name += src[i];
|
|
478
|
+
i++;
|
|
479
|
+
}
|
|
480
|
+
if (name === "true") {
|
|
481
|
+
tokens.push({ type: "BOOL", value: true });
|
|
482
|
+
} else if (name === "false") {
|
|
483
|
+
tokens.push({ type: "BOOL", value: false });
|
|
484
|
+
} else if (name === "null") {
|
|
485
|
+
tokens.push({ type: "NULL", value: null });
|
|
486
|
+
} else {
|
|
487
|
+
// Other identifiers (e.g. "undefined") are passed through as plain
|
|
488
|
+
// identifier tokens; the parser treats them as opaque values.
|
|
489
|
+
tokens.push({ type: "IDENT", value: name });
|
|
490
|
+
}
|
|
491
|
+
continue;
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
// Built-in-style "@identifier" — treat the whole token as an identifier so
|
|
495
|
+
// unusual manifests do not crash the parser, even though build.zig.zon
|
|
496
|
+
// does not normally contain them.
|
|
497
|
+
if (c === "@") {
|
|
498
|
+
let name = "@";
|
|
499
|
+
i++;
|
|
500
|
+
while (i < len && isIdentPart(src[i])) {
|
|
501
|
+
name += src[i];
|
|
502
|
+
i++;
|
|
503
|
+
}
|
|
504
|
+
tokens.push({ type: "IDENT", value: name });
|
|
505
|
+
continue;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
if (SINGLE_CHAR_TOKENS.has(c)) {
|
|
509
|
+
tokens.push({ type: c, value: c });
|
|
510
|
+
i++;
|
|
511
|
+
continue;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
throw new Error(`Unexpected character "${c}" at position ${i}`);
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
return tokens;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
/**
|
|
521
|
+
* Read a double-quoted string literal starting at `start` (the opening quote),
|
|
522
|
+
* applying Zig's escape sequences.
|
|
523
|
+
*
|
|
524
|
+
* @param {string} src Source
|
|
525
|
+
* @param {number} start Index of the opening `"`
|
|
526
|
+
* @returns {{value: string, end: number}} decoded string and index after the closing quote
|
|
527
|
+
*/
|
|
528
|
+
function readString(src, start) {
|
|
529
|
+
let i = start + 1;
|
|
530
|
+
let out = "";
|
|
531
|
+
while (i < src.length) {
|
|
532
|
+
const c = src[i];
|
|
533
|
+
if (c === '"') {
|
|
534
|
+
return { value: out, end: i + 1 };
|
|
535
|
+
}
|
|
536
|
+
if (c === "\\") {
|
|
537
|
+
i++;
|
|
538
|
+
const esc = src[i];
|
|
539
|
+
if (esc === "n") {
|
|
540
|
+
out += "\n";
|
|
541
|
+
} else if (esc === "r") {
|
|
542
|
+
out += "\r";
|
|
543
|
+
} else if (esc === "t") {
|
|
544
|
+
out += "\t";
|
|
545
|
+
} else if (esc === "\\") {
|
|
546
|
+
out += "\\";
|
|
547
|
+
} else if (esc === "'") {
|
|
548
|
+
out += "'";
|
|
549
|
+
} else if (esc === '"') {
|
|
550
|
+
out += '"';
|
|
551
|
+
} else if (esc === "x") {
|
|
552
|
+
out += String.fromCharCode(
|
|
553
|
+
Number.parseInt(src.substring(i + 1, i + 3), 16),
|
|
554
|
+
);
|
|
555
|
+
i += 2;
|
|
556
|
+
} else if (esc === "u") {
|
|
557
|
+
if (src[i + 1] !== "{") {
|
|
558
|
+
throw new Error("Expected '{' after \\u");
|
|
559
|
+
}
|
|
560
|
+
const close = src.indexOf("}", i + 2);
|
|
561
|
+
if (close === -1) {
|
|
562
|
+
throw new Error("Unterminated \\u{...} escape");
|
|
563
|
+
}
|
|
564
|
+
const codePoint = Number.parseInt(src.substring(i + 2, close), 16);
|
|
565
|
+
out += String.fromCodePoint(codePoint);
|
|
566
|
+
i = close;
|
|
567
|
+
} else {
|
|
568
|
+
out += esc;
|
|
569
|
+
}
|
|
570
|
+
i++;
|
|
571
|
+
} else {
|
|
572
|
+
out += c;
|
|
573
|
+
i++;
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
throw new Error("Unterminated string literal");
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
/**
|
|
580
|
+
* Read a Zig multiline string literal. Each line beginning with `\\`
|
|
581
|
+
* contributes its remainder; a newline separates consecutive `\\` lines.
|
|
582
|
+
*
|
|
583
|
+
* @param {string} src Source
|
|
584
|
+
* @param {number} start Index of the first backslash
|
|
585
|
+
* @returns {{value: string, end: number}} concatenated string and index past the last line
|
|
586
|
+
*/
|
|
587
|
+
function readMultilineString(src, start) {
|
|
588
|
+
let i = start;
|
|
589
|
+
const lines = [];
|
|
590
|
+
while (i < src.length && src[i] === "\\" && src[i + 1] === "\\") {
|
|
591
|
+
// Move past the two backslashes.
|
|
592
|
+
i += 2;
|
|
593
|
+
// Read to end of line.
|
|
594
|
+
let lineEnd = src.indexOf("\n", i);
|
|
595
|
+
if (lineEnd === -1) {
|
|
596
|
+
lineEnd = src.length;
|
|
597
|
+
}
|
|
598
|
+
let line = src.substring(i, lineEnd);
|
|
599
|
+
// Trim a trailing CR so CRLF files behave like LF ones.
|
|
600
|
+
if (line.endsWith("\r")) {
|
|
601
|
+
line = line.slice(0, -1);
|
|
602
|
+
}
|
|
603
|
+
lines.push(line);
|
|
604
|
+
// Advance past the newline.
|
|
605
|
+
i = lineEnd + 1 === src.length ? src.length : lineEnd + 1;
|
|
606
|
+
// Skip blank lines between continuation markers? Zig requires the next
|
|
607
|
+
// line to also begin with `\\` to continue; intervening whitespace-only
|
|
608
|
+
// lines terminate the literal, so we do not skip here.
|
|
609
|
+
}
|
|
610
|
+
return { value: lines.join("\n"), end: i };
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
/**
|
|
614
|
+
* Read a character literal `'…'`, returning its string value with escapes
|
|
615
|
+
* applied. A char literal may encode a single byte or a unicode code point.
|
|
616
|
+
*
|
|
617
|
+
* @param {string} src Source
|
|
618
|
+
* @param {number} start Index of the opening `'`
|
|
619
|
+
* @returns {{value: string, end: number}} decoded character and index after the closing quote
|
|
620
|
+
*/
|
|
621
|
+
function readCharLiteral(src, start) {
|
|
622
|
+
let i = start + 1;
|
|
623
|
+
let value = "";
|
|
624
|
+
while (i < src.length) {
|
|
625
|
+
const c = src[i];
|
|
626
|
+
if (c === "'") {
|
|
627
|
+
return { value, end: i + 1 };
|
|
628
|
+
}
|
|
629
|
+
if (c === "\\") {
|
|
630
|
+
i++;
|
|
631
|
+
const esc = src[i];
|
|
632
|
+
if (esc === "n") {
|
|
633
|
+
value += "\n";
|
|
634
|
+
} else if (esc === "r") {
|
|
635
|
+
value += "\r";
|
|
636
|
+
} else if (esc === "t") {
|
|
637
|
+
value += "\t";
|
|
638
|
+
} else if (esc === "\\") {
|
|
639
|
+
value += "\\";
|
|
640
|
+
} else if (esc === "'") {
|
|
641
|
+
value += "'";
|
|
642
|
+
} else if (esc === '"') {
|
|
643
|
+
value += '"';
|
|
644
|
+
} else if (esc === "x") {
|
|
645
|
+
value += String.fromCharCode(
|
|
646
|
+
Number.parseInt(src.substring(i + 1, i + 3), 16),
|
|
647
|
+
);
|
|
648
|
+
i += 2;
|
|
649
|
+
} else if (esc === "u") {
|
|
650
|
+
const close = src.indexOf("}", i + 2);
|
|
651
|
+
const codePoint = Number.parseInt(src.substring(i + 2, close), 16);
|
|
652
|
+
value += String.fromCodePoint(codePoint);
|
|
653
|
+
i = close;
|
|
654
|
+
} else {
|
|
655
|
+
value += esc;
|
|
656
|
+
}
|
|
657
|
+
i++;
|
|
658
|
+
} else {
|
|
659
|
+
value += c;
|
|
660
|
+
i++;
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
throw new Error("Unterminated character literal");
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
/**
|
|
667
|
+
* Read a numeric literal: decimal integer, hex integer (`0x…`), or float, all
|
|
668
|
+
* optionally containing `_` separators and a leading sign. The raw digits are
|
|
669
|
+
* returned as a string so callers decide whether to treat them as a number.
|
|
670
|
+
*
|
|
671
|
+
* @param {string} src Source
|
|
672
|
+
* @param {number} start Index of the first digit (or sign)
|
|
673
|
+
* @returns {{value: string, end: number}} normalised number string and end index
|
|
674
|
+
*/
|
|
675
|
+
function readNumber(src, start) {
|
|
676
|
+
let i = start;
|
|
677
|
+
if (src[i] === "-") {
|
|
678
|
+
i++;
|
|
679
|
+
}
|
|
680
|
+
if (src[i] === "0" && (src[i + 1] === "x" || src[i + 1] === "X")) {
|
|
681
|
+
i += 2;
|
|
682
|
+
let digits = "";
|
|
683
|
+
while (i < src.length && /[0-9a-fA-F_]/.test(src[i])) {
|
|
684
|
+
digits += src[i];
|
|
685
|
+
i++;
|
|
686
|
+
}
|
|
687
|
+
return {
|
|
688
|
+
value: `${src[start] === "-" ? "-" : ""}0x${digits.replace(/_/g, "")}`,
|
|
689
|
+
end: i,
|
|
690
|
+
};
|
|
691
|
+
}
|
|
692
|
+
let digits = "";
|
|
693
|
+
while (i < src.length && /[0-9_]/.test(src[i])) {
|
|
694
|
+
digits += src[i];
|
|
695
|
+
i++;
|
|
696
|
+
}
|
|
697
|
+
if (src[i] === "." && /[0-9]/.test(src[i + 1])) {
|
|
698
|
+
digits += ".";
|
|
699
|
+
i++;
|
|
700
|
+
while (i < src.length && /[0-9_]/.test(src[i])) {
|
|
701
|
+
digits += src[i];
|
|
702
|
+
i++;
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
// Exponent (e.g. 1e10).
|
|
706
|
+
if (src[i] === "e" || src[i] === "E") {
|
|
707
|
+
digits += src[i];
|
|
708
|
+
i++;
|
|
709
|
+
if (src[i] === "+" || src[i] === "-") {
|
|
710
|
+
digits += src[i];
|
|
711
|
+
i++;
|
|
712
|
+
}
|
|
713
|
+
while (i < src.length && /[0-9_]/.test(src[i])) {
|
|
714
|
+
digits += src[i];
|
|
715
|
+
i++;
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
return {
|
|
719
|
+
value: `${src[start] === "-" ? "-" : ""}${digits.replace(/_/g, "")}`,
|
|
720
|
+
end: i,
|
|
721
|
+
};
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
// ---------------------------------------------------------------------------
|
|
725
|
+
// ZON recursive-descent parser
|
|
726
|
+
// ---------------------------------------------------------------------------
|
|
727
|
+
|
|
728
|
+
/**
|
|
729
|
+
* Parse a ZON source string into a JavaScript value.
|
|
730
|
+
*
|
|
731
|
+
* Structs become plain objects keyed by field name; tuple (positional) values
|
|
732
|
+
* are collected under a `_positional` array. Enum literals (`.foo`) become the
|
|
733
|
+
* bare identifier string.
|
|
734
|
+
*
|
|
735
|
+
* @param {string} src ZON source
|
|
736
|
+
* @returns {*} parsed value
|
|
737
|
+
*/
|
|
738
|
+
export function parseZon(src) {
|
|
739
|
+
const tokens = tokenizeZon(src);
|
|
740
|
+
const parser = new ZonParser(tokens);
|
|
741
|
+
const result = parser.parseValue();
|
|
742
|
+
parser.expectEnd();
|
|
743
|
+
return result;
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
/**
|
|
747
|
+
* Recursive-descent parser over a token stream. Kept as a class so the parse
|
|
748
|
+
* position is shared across the mutually recursive value/array/struct rules.
|
|
749
|
+
*/
|
|
750
|
+
class ZonParser {
|
|
751
|
+
constructor(tokens) {
|
|
752
|
+
this.tokens = tokens;
|
|
753
|
+
this.pos = 0;
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
peek() {
|
|
757
|
+
return this.tokens[this.pos];
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
next() {
|
|
761
|
+
return this.tokens[this.pos++];
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
expect(type) {
|
|
765
|
+
const tok = this.next();
|
|
766
|
+
if (!tok || tok.type !== type) {
|
|
767
|
+
throw new Error(
|
|
768
|
+
`Expected ${type} but got ${tok ? tok.type : "end of input"}`,
|
|
769
|
+
);
|
|
770
|
+
}
|
|
771
|
+
return tok;
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
expectEnd() {
|
|
775
|
+
if (this.pos < this.tokens.length) {
|
|
776
|
+
const tok = this.peek();
|
|
777
|
+
throw new Error(`Unexpected trailing token ${tok.type}`);
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
parseValue() {
|
|
782
|
+
const tok = this.peek();
|
|
783
|
+
if (!tok) {
|
|
784
|
+
throw new Error("Unexpected end of input");
|
|
785
|
+
}
|
|
786
|
+
switch (tok.type) {
|
|
787
|
+
case "STRUCT_START":
|
|
788
|
+
return this.parseStruct();
|
|
789
|
+
case "[":
|
|
790
|
+
return this.parseArray();
|
|
791
|
+
case "(": {
|
|
792
|
+
// Parenthesised expression: unwrap to the inner value.
|
|
793
|
+
this.next();
|
|
794
|
+
const inner = this.parseValue();
|
|
795
|
+
this.expect(")");
|
|
796
|
+
return inner;
|
|
797
|
+
}
|
|
798
|
+
case "STRING":
|
|
799
|
+
this.next();
|
|
800
|
+
return tok.value;
|
|
801
|
+
case "NUMBER":
|
|
802
|
+
this.next();
|
|
803
|
+
return tok.value;
|
|
804
|
+
case "BOOL":
|
|
805
|
+
this.next();
|
|
806
|
+
return tok.value;
|
|
807
|
+
case "NULL":
|
|
808
|
+
this.next();
|
|
809
|
+
return null;
|
|
810
|
+
case "IDENT":
|
|
811
|
+
// "undefined" and other bare identifiers pass through as strings.
|
|
812
|
+
this.next();
|
|
813
|
+
return tok.value;
|
|
814
|
+
case "DOT_IDENT":
|
|
815
|
+
// Enum literal `.foo` → bare identifier string.
|
|
816
|
+
this.next();
|
|
817
|
+
return tok.value;
|
|
818
|
+
default:
|
|
819
|
+
throw new Error(`Unexpected token ${tok.type}`);
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
parseArray() {
|
|
824
|
+
this.expect("[");
|
|
825
|
+
const items = [];
|
|
826
|
+
while (this.peek() && this.peek().type !== "]") {
|
|
827
|
+
items.push(this.parseValue());
|
|
828
|
+
if (this.peek() && this.peek().type === ",") {
|
|
829
|
+
this.next();
|
|
830
|
+
} else {
|
|
831
|
+
break;
|
|
832
|
+
}
|
|
833
|
+
}
|
|
834
|
+
this.expect("]");
|
|
835
|
+
return items;
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
parseStruct() {
|
|
839
|
+
this.expect("STRUCT_START");
|
|
840
|
+
const result = { _positional: [] };
|
|
841
|
+
while (this.peek() && this.peek().type !== "}") {
|
|
842
|
+
const tok = this.peek();
|
|
843
|
+
if (tok.type === "DOT_IDENT") {
|
|
844
|
+
// Named field: .name = value
|
|
845
|
+
this.next();
|
|
846
|
+
this.expect("=");
|
|
847
|
+
result[tok.value] = this.parseValue();
|
|
848
|
+
} else {
|
|
849
|
+
// Positional (tuple) element.
|
|
850
|
+
result._positional.push(this.parseValue());
|
|
851
|
+
}
|
|
852
|
+
if (this.peek() && this.peek().type === ",") {
|
|
853
|
+
this.next();
|
|
854
|
+
} else {
|
|
855
|
+
break;
|
|
856
|
+
}
|
|
857
|
+
}
|
|
858
|
+
this.expect("}");
|
|
859
|
+
return result;
|
|
860
|
+
}
|
|
861
|
+
}
|