@cdxgen/cdxgen 0.0.1 → 13.0.0
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 +2324 -0
- package/bin/convert.js +213 -0
- package/bin/evinse.js +353 -0
- package/bin/hbom.js +495 -0
- package/bin/repl.js +2224 -0
- package/bin/sign.js +195 -0
- package/bin/tracebom.js +295 -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 +1833 -0
- package/lib/cli/cliOptions.js +513 -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 +142 -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 +876 -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 +575 -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 +1789 -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 +277 -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 +263 -0
- package/lib/inventory/traceRunner.js +439 -0
- package/lib/inventory/unicodeScan.js +147 -0
- package/lib/managers/binary.js +3307 -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 +315 -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 +28 -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 +120 -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 +19 -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 +76 -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,618 @@
|
|
|
1
|
+
const IREG_NAME_CHAR_REGEX =
|
|
2
|
+
/^([a-zA-Z0-9\-._~!$&'()*+,;=\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|%[a-fA-F0-9]{2})*$/u;
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Represents the parsed components of an IRI.
|
|
6
|
+
* @typedef {Object} IRIComponents
|
|
7
|
+
* @property {string} scheme
|
|
8
|
+
* @property {string} [userinfo]
|
|
9
|
+
* @property {string} [host]
|
|
10
|
+
* @property {string} [port]
|
|
11
|
+
* @property {string} path
|
|
12
|
+
* @property {string} [query]
|
|
13
|
+
* @property {string} [fragment]
|
|
14
|
+
* @property {boolean} valid
|
|
15
|
+
* @property {string} [error]
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Parses an IRI string according to RFC 3987.
|
|
20
|
+
* @param {string} iri The IRI string to parse.
|
|
21
|
+
* @returns {IRIComponents} An object containing the parsed components and validity status.
|
|
22
|
+
*/
|
|
23
|
+
export function parseIRI(iri) {
|
|
24
|
+
// Initialize result object
|
|
25
|
+
const result = {
|
|
26
|
+
scheme: "",
|
|
27
|
+
path: "",
|
|
28
|
+
valid: false,
|
|
29
|
+
hasAuthority: false,
|
|
30
|
+
error: "Parsing not started",
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
if (typeof iri !== "string") {
|
|
34
|
+
result.error = "Input must be a string";
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (iri.length === 0) {
|
|
39
|
+
result.error = "Input IRI is empty";
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (iri.trim() !== iri) {
|
|
44
|
+
result.error = "Input IRI is not trimmed";
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
let index = 0;
|
|
49
|
+
const len = iri.length;
|
|
50
|
+
|
|
51
|
+
// --- 1. Parse Scheme ---
|
|
52
|
+
// scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
|
|
53
|
+
const schemeStart = index;
|
|
54
|
+
if (index >= len || !isAlpha(iri.codePointAt(index))) {
|
|
55
|
+
result.error = "IRI must start with a scheme";
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
index++; // Consume the first ALPHA
|
|
59
|
+
while (index < len) {
|
|
60
|
+
const code = iri.codePointAt(index);
|
|
61
|
+
if (
|
|
62
|
+
isAlpha(code) ||
|
|
63
|
+
isDigit(code) ||
|
|
64
|
+
code === 0x2b ||
|
|
65
|
+
code === 0x2d ||
|
|
66
|
+
code === 0x2e
|
|
67
|
+
) {
|
|
68
|
+
// + - .
|
|
69
|
+
// Move index by the character's UTF-16 code unit length
|
|
70
|
+
index += code >= 0x10000 ? 2 : 1;
|
|
71
|
+
} else {
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (index === schemeStart) {
|
|
76
|
+
result.error = "Scheme parsing failed";
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
result.scheme = iri.substring(schemeStart, index);
|
|
80
|
+
|
|
81
|
+
// Expect ':'
|
|
82
|
+
if (index >= len || iri.codePointAt(index) !== 0x3a) {
|
|
83
|
+
// ':'
|
|
84
|
+
result.error = "Scheme must be followed by a colon";
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
87
|
+
index++; // Consume ':'
|
|
88
|
+
|
|
89
|
+
// --- 2. Parse Hierarchical Part (ihier-part) ---
|
|
90
|
+
// ihier-part = "//" iauthority ipath-abempty / ipath-absolute / ipath-rootless / ipath-empty
|
|
91
|
+
// Check for "//" indicating authority is present
|
|
92
|
+
let hasAuthority = false;
|
|
93
|
+
let authorityEnd;
|
|
94
|
+
if (
|
|
95
|
+
index + 1 < len &&
|
|
96
|
+
iri.codePointAt(index) === 0x2f &&
|
|
97
|
+
iri.codePointAt(index + 1) === 0x2f
|
|
98
|
+
) {
|
|
99
|
+
// "//"
|
|
100
|
+
hasAuthority = true;
|
|
101
|
+
index += 2; // Consume "//"
|
|
102
|
+
|
|
103
|
+
// --- 2a. Parse Authority (iauthority) ---
|
|
104
|
+
// iauthority = [ iuserinfo "@" ] ihost [ ":" port ]
|
|
105
|
+
const authorityStart = index;
|
|
106
|
+
authorityEnd = index;
|
|
107
|
+
// Find the end of the authority component
|
|
108
|
+
// It ends at the first '/', '?', or '#' or at the end of the string
|
|
109
|
+
while (authorityEnd < len) {
|
|
110
|
+
const code = iri.codePointAt(authorityEnd);
|
|
111
|
+
if (code === 0x2f || code === 0x3f || code === 0x23) {
|
|
112
|
+
// '/', '?', '#'
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
authorityEnd += code >= 0x10000 ? 2 : 1;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (authorityStart < authorityEnd) {
|
|
119
|
+
const authority = iri.substring(authorityStart, authorityEnd);
|
|
120
|
+
const userInfoEndIdx = findUserInfoEnd(authority);
|
|
121
|
+
|
|
122
|
+
let host_part;
|
|
123
|
+
let port_part;
|
|
124
|
+
|
|
125
|
+
if (userInfoEndIdx !== -1) {
|
|
126
|
+
result.userinfo = authority.substring(0, userInfoEndIdx);
|
|
127
|
+
const hostPortStr = authority.substring(userInfoEndIdx + 1);
|
|
128
|
+
[host_part, port_part] = parseHostPort(hostPortStr);
|
|
129
|
+
} else {
|
|
130
|
+
[host_part, port_part] = parseHostPort(authority);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// --- Validation: Check if host_part is a valid ireg-name ---
|
|
134
|
+
// Only validate if it's not an IP-literal (doesn't start with '[')
|
|
135
|
+
// parseHostPort should handle IPv4 structural checks.
|
|
136
|
+
if (host_part && !host_part.startsWith("[")) {
|
|
137
|
+
// Trim potential trailing colon from empty port (e.g., "host:")
|
|
138
|
+
// This can happen if the authority ends with ':'
|
|
139
|
+
const trimmedHost = host_part.endsWith(":")
|
|
140
|
+
? host_part.slice(0, -1)
|
|
141
|
+
: host_part;
|
|
142
|
+
if (!IREG_NAME_CHAR_REGEX.test(trimmedHost)) {
|
|
143
|
+
// Find a specific character that failed? Not strictly necessary for boolean check,
|
|
144
|
+
// but helpful for error message. Let's keep it simple for now.
|
|
145
|
+
result.error = `Invalid character in host (ireg-name) '${trimmedHost}' for IRI '${iri}'`;
|
|
146
|
+
return result; // valid remains false
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// --- End Validation ---
|
|
150
|
+
|
|
151
|
+
result.host = host_part;
|
|
152
|
+
result.port = port_part;
|
|
153
|
+
}
|
|
154
|
+
index = authorityEnd;
|
|
155
|
+
} // else hasAuthority remains false, index is right after ':'
|
|
156
|
+
|
|
157
|
+
// --- 3. Parse Path (one of ipath-abempty, ipath-absolute, ipath-rootless)
|
|
158
|
+
const pathStart = hasAuthority ? authorityEnd : index;
|
|
159
|
+
// Path ends at the first '?' or '#' or at the end of the string
|
|
160
|
+
while (index < len) {
|
|
161
|
+
const code = iri.codePointAt(index);
|
|
162
|
+
if (code === 0x3f || code === 0x23) {
|
|
163
|
+
// '?' '#'
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
index += code >= 0x10000 ? 2 : 1;
|
|
167
|
+
}
|
|
168
|
+
result.path = iri.substring(pathStart, index);
|
|
169
|
+
|
|
170
|
+
// --- 4. Parse Query (?)
|
|
171
|
+
if (index < len && iri.codePointAt(index) === 0x3f) {
|
|
172
|
+
// '?'
|
|
173
|
+
index++; // Consume '?'
|
|
174
|
+
const queryStart = index;
|
|
175
|
+
// Query ends at the first '#' or at the end of the string
|
|
176
|
+
while (index < len && iri.codePointAt(index) !== 0x23) {
|
|
177
|
+
// '#'
|
|
178
|
+
const code = iri.codePointAt(index);
|
|
179
|
+
index += code >= 0x10000 ? 2 : 1;
|
|
180
|
+
}
|
|
181
|
+
result.query = iri.substring(queryStart, index);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// --- 5. Parse Fragment (#)
|
|
185
|
+
if (index < len && iri.codePointAt(index) === 0x23) {
|
|
186
|
+
// '#'
|
|
187
|
+
index++; // Consume '#'
|
|
188
|
+
const fragmentStart = index;
|
|
189
|
+
// Fragment ends at the end of the string
|
|
190
|
+
index = len;
|
|
191
|
+
result.fragment = iri.substring(fragmentStart, index);
|
|
192
|
+
}
|
|
193
|
+
result.hasAuthority = hasAuthority;
|
|
194
|
+
// --- Final Validation ---
|
|
195
|
+
result.valid = true;
|
|
196
|
+
delete result.error;
|
|
197
|
+
return result;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// --- Helper Functions ---
|
|
201
|
+
|
|
202
|
+
function isAlpha(code) {
|
|
203
|
+
return (code >= 0x41 && code <= 0x5a) || (code >= 0x61 && code <= 0x7a); // A-Z or a-z
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function isDigit(code) {
|
|
207
|
+
return code >= 0x30 && code <= 0x39; // 0-9
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Finds the index of the last '@' character that is not inside an IPv6 literal [ ... ].
|
|
212
|
+
* Returns -1 if no such '@' is found.
|
|
213
|
+
*/
|
|
214
|
+
function findUserInfoEnd(authority) {
|
|
215
|
+
let inIPv6Literal = false;
|
|
216
|
+
let userInfoEndIndex = -1;
|
|
217
|
+
|
|
218
|
+
for (let i = 0; i < authority.length; ) {
|
|
219
|
+
const code = authority.codePointAt(i);
|
|
220
|
+
const charLength = code >= 0x10000 ? 2 : 1;
|
|
221
|
+
|
|
222
|
+
if (code === 0x5b) {
|
|
223
|
+
// '['
|
|
224
|
+
inIPv6Literal = true;
|
|
225
|
+
} else if (code === 0x5d) {
|
|
226
|
+
// ']'
|
|
227
|
+
inIPv6Literal = false;
|
|
228
|
+
} else if (code === 0x40 && !inIPv6Literal) {
|
|
229
|
+
// '@'
|
|
230
|
+
userInfoEndIndex = i; // Keep track of the last one outside brackets
|
|
231
|
+
}
|
|
232
|
+
i += charLength; // Move by the actual character length
|
|
233
|
+
}
|
|
234
|
+
return userInfoEndIndex;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Parses the host and port from a string like "example.com:8080" or "[::1]:3000".
|
|
239
|
+
* Returns an array [host, port], where port can be undefined.
|
|
240
|
+
*/
|
|
241
|
+
function parseHostPort(hostPortStr) {
|
|
242
|
+
if (hostPortStr.length === 0) {
|
|
243
|
+
return ["", undefined];
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// Check for IPv6 literal [ ... ]
|
|
247
|
+
if (hostPortStr.codePointAt(0) === 0x5b) {
|
|
248
|
+
// '['
|
|
249
|
+
const endBracketIdx = hostPortStr.indexOf("]");
|
|
250
|
+
if (endBracketIdx === -1) {
|
|
251
|
+
// Malformed IPv6 literal - no closing bracket
|
|
252
|
+
return [hostPortStr, undefined];
|
|
253
|
+
}
|
|
254
|
+
const host = hostPortStr.substring(0, endBracketIdx + 1); // Include ']'
|
|
255
|
+
|
|
256
|
+
// Check if there's anything after the closing bracket
|
|
257
|
+
const afterBracket = hostPortStr.substring(endBracketIdx + 1);
|
|
258
|
+
|
|
259
|
+
// If there's content after the bracket, it must start with a colon (for port)
|
|
260
|
+
if (afterBracket.length > 0 && afterBracket[0] !== ":") {
|
|
261
|
+
// Invalid character after closing bracket - return the whole string as host
|
|
262
|
+
// This will cause validation to fail later
|
|
263
|
+
return [hostPortStr, undefined];
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
if (afterBracket.length > 0) {
|
|
267
|
+
// It starts with a colon, parse the port
|
|
268
|
+
const port = afterBracket.substring(1); // Everything after the colon
|
|
269
|
+
return [host, port || undefined];
|
|
270
|
+
}
|
|
271
|
+
return [host, undefined]; // No port
|
|
272
|
+
}
|
|
273
|
+
// Not an IPv6 literal, look for the last ':' not %-encoded
|
|
274
|
+
let portSepIdx = -1;
|
|
275
|
+
for (let i = hostPortStr.length - 1; i >= 0; i--) {
|
|
276
|
+
if (hostPortStr.codePointAt(i) === 0x3a) {
|
|
277
|
+
// ':'
|
|
278
|
+
// Check if it's percent-encoded (e.g., %3A)
|
|
279
|
+
// Ensure we have at least 3 chars before ':'
|
|
280
|
+
if (
|
|
281
|
+
i >= 3 &&
|
|
282
|
+
hostPortStr.codePointAt(i - 1) === 0x25 && // '%'
|
|
283
|
+
isHexDigit(hostPortStr.codePointAt(i - 2)) &&
|
|
284
|
+
isHexDigit(hostPortStr.codePointAt(i - 3))
|
|
285
|
+
) {
|
|
286
|
+
// ignore
|
|
287
|
+
} else {
|
|
288
|
+
// This is the separator we are looking for
|
|
289
|
+
portSepIdx = i;
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
// Adjust index for potential surrogate pairs when moving backwards
|
|
294
|
+
// This simple backward loop is okay for ASCII ':' check,
|
|
295
|
+
// but full Unicode backward iteration is complex.
|
|
296
|
+
// For ':' (U+003A), simple `i--` works.
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
if (portSepIdx !== -1) {
|
|
300
|
+
const host = hostPortStr.substring(0, portSepIdx);
|
|
301
|
+
const port = hostPortStr.substring(portSepIdx + 1);
|
|
302
|
+
return [host, port || undefined]; // Handle case like "host:" (port is empty)
|
|
303
|
+
}
|
|
304
|
+
return [hostPortStr, undefined]; // No port separator found
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
function isHexDigit(code) {
|
|
308
|
+
return (
|
|
309
|
+
(code >= 0x30 && code <= 0x39) || // 0-9
|
|
310
|
+
(code >= 0x41 && code <= 0x46) || // A-F
|
|
311
|
+
(code >= 0x61 && code <= 0x66)
|
|
312
|
+
); // a-f
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// --- Helper functions for detailed RFC 3987 validation ---
|
|
316
|
+
// RFC 3987 unreserved characters (including Unicode)
|
|
317
|
+
const UNRESERVED_CHARS =
|
|
318
|
+
"a-zA-Z0-9\\-._~\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF\\u0400-\\u04FF\\u0590-\\u05FF\\u0600-\\u06FF\\u0900-\\u097F\\u4E00-\\u9FFF\\uAC00-\\uD7AF";
|
|
319
|
+
|
|
320
|
+
// RFC 3987 sub-delims
|
|
321
|
+
const SUB_DELIMS_CHARS = "!$&'()*+,;=";
|
|
322
|
+
|
|
323
|
+
// Percent-encoded pattern
|
|
324
|
+
const PCT_ENCODED_PATTERN = "%[a-fA-F0-9]{2}";
|
|
325
|
+
|
|
326
|
+
// ipchar = iunreserved / pct-encoded / sub-delims / ":" / "@"
|
|
327
|
+
const IPCHAR_PATTERN = `(?:[${UNRESERVED_CHARS}${SUB_DELIMS_CHARS}:@]|${PCT_ENCODED_PATTERN})`;
|
|
328
|
+
|
|
329
|
+
// ireg-name = *( iunreserved / pct-encoded / sub-delims )
|
|
330
|
+
const IREG_NAME_PATTERN = `(?:[${UNRESERVED_CHARS}${SUB_DELIMS_CHARS}]|${PCT_ENCODED_PATTERN})*`;
|
|
331
|
+
|
|
332
|
+
// Compile regexes
|
|
333
|
+
const IPCHAR_REGEX = new RegExp(`^${IPCHAR_PATTERN}*$`, "u");
|
|
334
|
+
const IREG_NAME_REGEX = new RegExp(`^${IREG_NAME_PATTERN}$`, "u");
|
|
335
|
+
|
|
336
|
+
function isValidIpCharSequence(str) {
|
|
337
|
+
if (str === null || str === undefined) {
|
|
338
|
+
return true;
|
|
339
|
+
}
|
|
340
|
+
return IPCHAR_REGEX.test(str);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
function isValidIPv6(ipv6Address) {
|
|
344
|
+
// Simplified regex for IPv6 address validation
|
|
345
|
+
const IPV6_REGEX =
|
|
346
|
+
/^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$|^::$|^(?:[0-9a-fA-F]{1,4}:){1,7}:$|^::(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}$|^(?:[0-9a-fA-F]{1,4}:){1,6}::[0-9a-fA-F]{1,4}$|^(?:[0-9a-fA-F]{1,4}:){1,5}(?::[0-9a-fA-F]{1,4}){1,2}$|^(?:[0-9a-fA-F]{1,4}:){1,4}(?::[0-9a-fA-F]{1,4}){1,3}$|^(?:[0-9a-fA-F]{1,4}:){1,3}(?::[0-9a-fA-F]{1,4}){1,4}$|^(?:[0-9a-fA-F]{1,4}:){1,2}(?::[0-9a-fA-F]{1,4}){1,5}$|^[0-9a-fA-F]{1,4}:(?::[0-9a-fA-F]{1,4}){1,6}$|^:(?::[0-9a-fA-F]{1,4}){1,7}$/;
|
|
347
|
+
return IPV6_REGEX.test(ipv6Address);
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
function isValidIregName(hostStr) {
|
|
351
|
+
if (hostStr === null || hostStr === undefined || hostStr === "") {
|
|
352
|
+
return true;
|
|
353
|
+
}
|
|
354
|
+
// Check if it's an IPv6 literal
|
|
355
|
+
if (hostStr.startsWith("[") && hostStr.endsWith("]")) {
|
|
356
|
+
// Extract the IPv6 address without the brackets
|
|
357
|
+
const ipv6Address = hostStr.slice(1, -1);
|
|
358
|
+
// Validate the IPv6 address
|
|
359
|
+
return isValidIPv6(ipv6Address);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// Check if it's an IPv4 address
|
|
363
|
+
if (/^(\d{1,3}\.){3}\d{1,3}$/.test(hostStr)) {
|
|
364
|
+
return true;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
// For internationalized domain names, we need to be more permissive
|
|
368
|
+
// Allow Unicode characters in domain names
|
|
369
|
+
return IREG_NAME_REGEX.test(hostStr);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
function validateParsedComponents(components) {
|
|
373
|
+
if (!components.valid) {
|
|
374
|
+
return components;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// 1. Validate Authority (host part)
|
|
378
|
+
if (
|
|
379
|
+
components.host !== undefined &&
|
|
380
|
+
components.host !== null &&
|
|
381
|
+
components.host !== ""
|
|
382
|
+
) {
|
|
383
|
+
if (!isValidIregName(components.host)) {
|
|
384
|
+
return {
|
|
385
|
+
...components,
|
|
386
|
+
valid: false,
|
|
387
|
+
error: `Invalid character in ireg-name host: '${components.host}'`,
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// 2. Validate Path segments
|
|
393
|
+
if (components.path !== undefined && components.path !== null) {
|
|
394
|
+
const segments = components.path.split("/");
|
|
395
|
+
const isValidPath = segments.every((segment) =>
|
|
396
|
+
isValidIpCharSequence(segment),
|
|
397
|
+
);
|
|
398
|
+
if (!isValidPath) {
|
|
399
|
+
const failingSegment = segments.find((s) => !isValidIpCharSequence(s));
|
|
400
|
+
return {
|
|
401
|
+
...components,
|
|
402
|
+
valid: false,
|
|
403
|
+
error: `Invalid character in path segment: '${failingSegment}' (Path: '${components.path}')`,
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
// 3. Validate Query
|
|
409
|
+
if (components.query !== undefined && components.query !== null) {
|
|
410
|
+
// iquery allows ipchar, /, ?
|
|
411
|
+
const IQUERY_PATTERN = `(?:${IPCHAR_PATTERN}|[/?])*`;
|
|
412
|
+
const IQUERY_REGEX = new RegExp(`^${IQUERY_PATTERN}$`, "u");
|
|
413
|
+
if (!IQUERY_REGEX.test(components.query)) {
|
|
414
|
+
return {
|
|
415
|
+
...components,
|
|
416
|
+
valid: false,
|
|
417
|
+
error: `Invalid character in query: '${components.query}'`,
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// 4. Validate Fragment
|
|
423
|
+
if (components.fragment !== undefined && components.fragment !== null) {
|
|
424
|
+
// ifragment allows ipchar, /, ?
|
|
425
|
+
const IFRAGMENT_PATTERN = `(?:${IPCHAR_PATTERN}|[/?])*`;
|
|
426
|
+
const IFRAGMENT_REGEX = new RegExp(`^${IFRAGMENT_PATTERN}$`, "u");
|
|
427
|
+
if (!IFRAGMENT_REGEX.test(components.fragment)) {
|
|
428
|
+
return {
|
|
429
|
+
...components,
|
|
430
|
+
valid: false,
|
|
431
|
+
error: `Invalid character in fragment: '${components.fragment}'`,
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
// Special handling for IPv6 literals
|
|
437
|
+
if (
|
|
438
|
+
components.scheme &&
|
|
439
|
+
components.host?.startsWith("[") &&
|
|
440
|
+
components.host.endsWith("]")
|
|
441
|
+
) {
|
|
442
|
+
return components;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
if (
|
|
446
|
+
components.scheme &&
|
|
447
|
+
!components.host &&
|
|
448
|
+
!components.path &&
|
|
449
|
+
!components.query
|
|
450
|
+
) {
|
|
451
|
+
return {
|
|
452
|
+
...components,
|
|
453
|
+
valid: false,
|
|
454
|
+
error: "No hostname",
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
return components;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
/**
|
|
461
|
+
* Possible ways of validating an IRI.
|
|
462
|
+
*/
|
|
463
|
+
export const IriValidationStrategy = Object.freeze({
|
|
464
|
+
/**
|
|
465
|
+
* Validates the IRI according to RFC 3987 using a custom parser.
|
|
466
|
+
*/
|
|
467
|
+
Parse: "parse",
|
|
468
|
+
|
|
469
|
+
/**
|
|
470
|
+
* Validates that the IRI has a valid scheme and does not contain any character forbidden by the Turtle specification.
|
|
471
|
+
*/
|
|
472
|
+
Pragmatic: "pragmatic",
|
|
473
|
+
|
|
474
|
+
/**
|
|
475
|
+
* Does not validate the IRI at all.
|
|
476
|
+
*/
|
|
477
|
+
None: "none",
|
|
478
|
+
});
|
|
479
|
+
|
|
480
|
+
// biome-ignore-start lint/suspicious/noControlCharactersInRegex: parser
|
|
481
|
+
// Using the regex from the original code
|
|
482
|
+
const PRAGMATIC_IRI_REGEX =
|
|
483
|
+
/^[A-Za-z][\d+-.A-Za-z]*:[^\u0000-\u0020"<>\\^`{|}]*$/u;
|
|
484
|
+
// biome-ignore-end lint/suspicious/noControlCharactersInRegex: parser
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* Validate a given IRI according to the given strategy.
|
|
488
|
+
*
|
|
489
|
+
* @param {string} iri a string that may be an IRI.
|
|
490
|
+
* @param {IriValidationStrategy} strategy IRI validation strategy.
|
|
491
|
+
* @return {Error | undefined} An error if the IRI is invalid, or undefined if it is valid.
|
|
492
|
+
*/
|
|
493
|
+
export function validateIri(iri, strategy = IriValidationStrategy.Parse) {
|
|
494
|
+
switch (strategy) {
|
|
495
|
+
case IriValidationStrategy.Parse: {
|
|
496
|
+
// console.log(`DEBUG: Validating IRI: '${iri}' with Parse strategy`);
|
|
497
|
+
let parseResult = parseIRI(iri);
|
|
498
|
+
// console.log(
|
|
499
|
+
// "DEBUG: parseIRI result:",
|
|
500
|
+
// JSON.stringify(parseResult, null, 2),
|
|
501
|
+
// ); // Log full result
|
|
502
|
+
|
|
503
|
+
if (parseResult.valid) {
|
|
504
|
+
// console.log(
|
|
505
|
+
// "DEBUG: IRI is structurally valid, performing detailed checks...",
|
|
506
|
+
// );
|
|
507
|
+
parseResult = validateParsedComponents(parseResult);
|
|
508
|
+
// console.log(
|
|
509
|
+
// "DEBUG: validateParsedComponents result:",
|
|
510
|
+
// JSON.stringify(parseResult, null, 2),
|
|
511
|
+
// ); // Log full result after detailed checks
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
if (parseResult.valid) {
|
|
515
|
+
// console.log(`DEBUG: Final result for '${iri}': VALID`);
|
|
516
|
+
return undefined;
|
|
517
|
+
}
|
|
518
|
+
const errorMessage =
|
|
519
|
+
parseResult.error ||
|
|
520
|
+
`IRI failed detailed RFC 3987 validation: '${iri}'`;
|
|
521
|
+
// console.log(
|
|
522
|
+
// `DEBUG: Final result for '${iri}': INVALID - ${errorMessage}`,
|
|
523
|
+
// );
|
|
524
|
+
return new Error(
|
|
525
|
+
`Invalid IRI according to RFC 3987 parsing: ${errorMessage}`,
|
|
526
|
+
);
|
|
527
|
+
}
|
|
528
|
+
case IriValidationStrategy.Pragmatic:
|
|
529
|
+
return PRAGMATIC_IRI_REGEX.test(iri)
|
|
530
|
+
? undefined
|
|
531
|
+
: new Error(`Invalid IRI: '${iri}'`);
|
|
532
|
+
case IriValidationStrategy.None:
|
|
533
|
+
return undefined;
|
|
534
|
+
default:
|
|
535
|
+
return new Error(`Not supported validation strategy "${strategy}"`);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
const isAsciiHexCode = (code) => {
|
|
540
|
+
return (
|
|
541
|
+
(code >= 0x30 && code <= 0x39) ||
|
|
542
|
+
(code >= 0x41 && code <= 0x46) ||
|
|
543
|
+
(code >= 0x61 && code <= 0x66)
|
|
544
|
+
);
|
|
545
|
+
};
|
|
546
|
+
|
|
547
|
+
const hasValidPercentEncoding = (value) => {
|
|
548
|
+
for (let index = 0; index < value.length; index++) {
|
|
549
|
+
if (value.charCodeAt(index) !== 0x25) {
|
|
550
|
+
continue;
|
|
551
|
+
}
|
|
552
|
+
const firstHex = value.charCodeAt(index + 1);
|
|
553
|
+
const secondHex = value.charCodeAt(index + 2);
|
|
554
|
+
if (!isAsciiHexCode(firstHex) || !isAsciiHexCode(secondHex)) {
|
|
555
|
+
return false;
|
|
556
|
+
}
|
|
557
|
+
index += 2;
|
|
558
|
+
}
|
|
559
|
+
return true;
|
|
560
|
+
};
|
|
561
|
+
|
|
562
|
+
/**
|
|
563
|
+
* Function to validate an externalReference URL for conforming to the JSON schema or bomLink
|
|
564
|
+
* https://github.com/CycloneDX/cyclonedx-core-java/blob/75575318b268dda9e2a290761d7db11b4f414255/src/main/resources/bom-1.5.schema.json#L1140
|
|
565
|
+
* https://datatracker.ietf.org/doc/html/rfc3987#section-2.2
|
|
566
|
+
* https://cyclonedx.org/capabilities/bomlink/
|
|
567
|
+
*
|
|
568
|
+
* @param {String} iri IRI to validate
|
|
569
|
+
*
|
|
570
|
+
* @returns {Boolean} Flag indicating whether the supplied URL is valid or not
|
|
571
|
+
*
|
|
572
|
+
*/
|
|
573
|
+
export function isValidIriReference(iri) {
|
|
574
|
+
if (typeof iri !== "string") {
|
|
575
|
+
return false;
|
|
576
|
+
}
|
|
577
|
+
const trimmedIri = iri.trim();
|
|
578
|
+
if (iri === "" || iri !== trimmedIri) {
|
|
579
|
+
return false;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
if (/[${}]/.test(iri)) {
|
|
583
|
+
return false;
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
// Validate percent-encoding with a linear scan to avoid regex backtracking
|
|
587
|
+
// issues on very long attacker-controlled inputs.
|
|
588
|
+
if (!hasValidPercentEncoding(iri)) {
|
|
589
|
+
return false;
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
// Use the dedicated IRI validator for strict RFC 3987 compliance check
|
|
593
|
+
const validateIriResult = validateIri(iri, IriValidationStrategy.Strict);
|
|
594
|
+
|
|
595
|
+
// If the IRI validator reports an error, it's invalid.
|
|
596
|
+
if (validateIriResult instanceof Error) {
|
|
597
|
+
return false;
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
// Optional: Additional check for common URI schemes (like http/https)
|
|
601
|
+
// using the built-in URL constructor for stricter URI syntax conformance.
|
|
602
|
+
// This might catch cases where an IRI is valid per RFC 3987 but not
|
|
603
|
+
// strictly a valid URI as parsed by the URL constructor (e.g., missing host for http).
|
|
604
|
+
// Only apply this if the IRI looks like it starts with a scheme like http.
|
|
605
|
+
if (/^https?:/i.test(iri)) {
|
|
606
|
+
// Case-insensitive check for http/https
|
|
607
|
+
try {
|
|
608
|
+
// Attempt to construct a URL object. If it fails, it's likely not a valid URI structure.
|
|
609
|
+
new URL(iri); // Use iri here
|
|
610
|
+
} catch (_error) {
|
|
611
|
+
// If URL construction fails, consider the IRI reference invalid for http-like schemes.
|
|
612
|
+
return false;
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
// 8. If all checks pass, the IRI reference is considered valid.
|
|
617
|
+
return true;
|
|
618
|
+
}
|