kirograph 0.19.0 → 0.20.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 +10 -8
- package/dist/architecture/layers/dart.d.ts +10 -0
- package/dist/architecture/layers/dart.d.ts.map +1 -0
- package/dist/architecture/layers/elixir.d.ts +6 -0
- package/dist/architecture/layers/elixir.d.ts.map +1 -0
- package/dist/architecture/layers/index.d.ts.map +1 -1
- package/dist/architecture/layers/ocaml.d.ts +6 -0
- package/dist/architecture/layers/ocaml.d.ts.map +1 -0
- package/dist/architecture/layers/scala.d.ts +6 -0
- package/dist/architecture/layers/scala.d.ts.map +1 -0
- package/dist/architecture/layers/solidity.d.ts +6 -0
- package/dist/architecture/layers/solidity.d.ts.map +1 -0
- package/dist/architecture/layers/vue.d.ts +6 -0
- package/dist/architecture/layers/vue.d.ts.map +1 -0
- package/dist/architecture/manifest/elm.d.ts +3 -0
- package/dist/architecture/manifest/elm.d.ts.map +1 -0
- package/dist/architecture/manifest/index.d.ts.map +1 -1
- package/dist/architecture/manifest/ocaml.d.ts +3 -0
- package/dist/architecture/manifest/ocaml.d.ts.map +1 -0
- package/dist/architecture/manifest/scala.d.ts +3 -0
- package/dist/architecture/manifest/scala.d.ts.map +1 -0
- package/dist/bin/banner.d.ts.map +1 -1
- package/dist/bin/commands/affected.d.ts.map +1 -1
- package/dist/bin/commands/attack-surface.d.ts +3 -0
- package/dist/bin/commands/attack-surface.d.ts.map +1 -0
- package/dist/bin/commands/attack-surface.js +7 -0
- package/dist/bin/commands/attack-surface.js.map +2 -2
- package/dist/bin/commands/benchmark.d.ts +9 -0
- package/dist/bin/commands/benchmark.d.ts.map +1 -0
- package/dist/bin/commands/budget.d.ts +6 -0
- package/dist/bin/commands/budget.d.ts.map +1 -0
- package/dist/bin/commands/caveman.d.ts +7 -0
- package/dist/bin/commands/caveman.d.ts.map +1 -0
- package/dist/bin/commands/communities.d.ts +3 -0
- package/dist/bin/commands/communities.d.ts.map +1 -0
- package/dist/bin/commands/compression.d.ts +7 -0
- package/dist/bin/commands/compression.d.ts.map +1 -0
- package/dist/bin/commands/context.d.ts.map +1 -1
- package/dist/bin/commands/data.d.ts +3 -0
- package/dist/bin/commands/data.d.ts.map +1 -0
- package/dist/bin/commands/dead-code.d.ts +3 -0
- package/dist/bin/commands/dead-code.d.ts.map +1 -0
- package/dist/bin/commands/dep-confusion.d.ts +3 -0
- package/dist/bin/commands/dep-confusion.d.ts.map +1 -0
- package/dist/bin/commands/docs.d.ts +3 -0
- package/dist/bin/commands/docs.d.ts.map +1 -0
- package/dist/bin/commands/exec.d.ts +11 -0
- package/dist/bin/commands/exec.d.ts.map +1 -0
- package/dist/bin/commands/export.d.ts +3 -0
- package/dist/bin/commands/export.d.ts.map +1 -0
- package/dist/bin/commands/flows.d.ts +3 -0
- package/dist/bin/commands/flows.d.ts.map +1 -0
- package/dist/bin/commands/gain.d.ts +6 -0
- package/dist/bin/commands/gain.d.ts.map +1 -0
- package/dist/bin/commands/help.d.ts +7 -0
- package/dist/bin/commands/help.d.ts.map +1 -1
- package/dist/bin/commands/help.js +20 -3
- package/dist/bin/commands/help.js.map +2 -2
- package/dist/bin/commands/hotspots.d.ts +3 -0
- package/dist/bin/commands/hotspots.d.ts.map +1 -0
- package/dist/bin/commands/hotspots.js +94 -1
- package/dist/bin/commands/hotspots.js.map +3 -3
- package/dist/bin/commands/install.d.ts.map +1 -1
- package/dist/bin/commands/install.js +3 -3
- package/dist/bin/commands/install.js.map +2 -2
- package/dist/bin/commands/licenses.d.ts +3 -0
- package/dist/bin/commands/licenses.d.ts.map +1 -0
- package/dist/bin/commands/memory.d.ts +16 -0
- package/dist/bin/commands/memory.d.ts.map +1 -0
- package/dist/bin/commands/memory.js +151 -4
- package/dist/bin/commands/memory.js.map +2 -2
- package/dist/bin/commands/path.d.ts +3 -0
- package/dist/bin/commands/path.d.ts.map +1 -0
- package/dist/bin/commands/pattern.d.ts +3 -0
- package/dist/bin/commands/pattern.d.ts.map +1 -0
- package/dist/bin/commands/pattern.js +592 -0
- package/dist/bin/commands/pattern.js.map +7 -0
- package/dist/bin/commands/query.d.ts.map +1 -1
- package/dist/bin/commands/reachability.d.ts +3 -0
- package/dist/bin/commands/reachability.d.ts.map +1 -0
- package/dist/bin/commands/read.d.ts +6 -0
- package/dist/bin/commands/read.d.ts.map +1 -0
- package/dist/bin/commands/refactor.d.ts +3 -0
- package/dist/bin/commands/refactor.d.ts.map +1 -0
- package/dist/bin/commands/remediation.d.ts +3 -0
- package/dist/bin/commands/remediation.d.ts.map +1 -0
- package/dist/bin/commands/sbom.d.ts +3 -0
- package/dist/bin/commands/sbom.d.ts.map +1 -0
- package/dist/bin/commands/security-ci-report.d.ts +9 -0
- package/dist/bin/commands/security-ci-report.d.ts.map +1 -0
- package/dist/bin/commands/security-export.d.ts +2 -0
- package/dist/bin/commands/security-export.d.ts.map +1 -0
- package/dist/bin/commands/security-flows.d.ts +3 -0
- package/dist/bin/commands/security-flows.d.ts.map +1 -0
- package/dist/bin/commands/security-secrets.d.ts +3 -0
- package/dist/bin/commands/security-secrets.d.ts.map +1 -0
- package/dist/bin/commands/security.d.ts +3 -0
- package/dist/bin/commands/security.d.ts.map +1 -0
- package/dist/bin/commands/security.js +15 -0
- package/dist/bin/commands/security.js.map +2 -2
- package/dist/bin/commands/snapshot.d.ts +3 -0
- package/dist/bin/commands/snapshot.d.ts.map +1 -0
- package/dist/bin/commands/staleness.d.ts +3 -0
- package/dist/bin/commands/staleness.d.ts.map +1 -0
- package/dist/bin/commands/status.d.ts.map +1 -1
- package/dist/bin/commands/status.js +27 -0
- package/dist/bin/commands/status.js.map +2 -2
- package/dist/bin/commands/supply-chain.d.ts +3 -0
- package/dist/bin/commands/supply-chain.d.ts.map +1 -0
- package/dist/bin/commands/surprising.d.ts +3 -0
- package/dist/bin/commands/surprising.d.ts.map +1 -0
- package/dist/bin/commands/sync.d.ts.map +1 -1
- package/dist/bin/commands/uninit.d.ts.map +1 -1
- package/dist/bin/commands/utils.d.ts +5 -0
- package/dist/bin/commands/utils.d.ts.map +1 -1
- package/dist/bin/commands/vex.d.ts +3 -0
- package/dist/bin/commands/vex.d.ts.map +1 -0
- package/dist/bin/commands/vuln-suppress.d.ts +3 -0
- package/dist/bin/commands/vuln-suppress.d.ts.map +1 -0
- package/dist/bin/commands/vulns.d.ts +3 -0
- package/dist/bin/commands/vulns.d.ts.map +1 -0
- package/dist/bin/installer/archive.d.ts +47 -0
- package/dist/bin/installer/archive.d.ts.map +1 -0
- package/dist/bin/installer/auto-detect.d.ts +16 -0
- package/dist/bin/installer/auto-detect.d.ts.map +1 -0
- package/dist/bin/installer/caveman.d.ts +12 -0
- package/dist/bin/installer/caveman.d.ts.map +1 -0
- package/dist/bin/installer/cli-agent.d.ts +7 -2
- package/dist/bin/installer/cli-agent.d.ts.map +1 -1
- package/dist/bin/installer/cli-agent.js +6 -2
- package/dist/bin/installer/cli-agent.js.map +2 -2
- package/dist/bin/installer/common.d.ts +36 -0
- package/dist/bin/installer/common.d.ts.map +1 -0
- package/dist/bin/installer/common.js +2 -1
- package/dist/bin/installer/common.js.map +2 -2
- package/dist/bin/installer/config-prompt.d.ts +1 -1
- package/dist/bin/installer/config-prompt.d.ts.map +1 -1
- package/dist/bin/installer/config-prompt.js +74 -2
- package/dist/bin/installer/config-prompt.js.map +2 -2
- package/dist/bin/installer/dashboard.d.ts.map +1 -1
- package/dist/bin/installer/detect.d.ts +30 -0
- package/dist/bin/installer/detect.d.ts.map +1 -0
- package/dist/bin/installer/hooks.d.ts +4 -1
- package/dist/bin/installer/hooks.d.ts.map +1 -1
- package/dist/bin/installer/hooks.js +34 -0
- package/dist/bin/installer/hooks.js.map +2 -2
- package/dist/bin/installer/index.d.ts +5 -4
- package/dist/bin/installer/index.d.ts.map +1 -1
- package/dist/bin/installer/index.js +67 -8
- package/dist/bin/installer/index.js.map +2 -2
- package/dist/bin/installer/instructions.d.ts +14 -0
- package/dist/bin/installer/instructions.d.ts.map +1 -0
- package/dist/bin/installer/instructions.js +15 -1
- package/dist/bin/installer/instructions.js.map +2 -2
- package/dist/bin/installer/mcp.d.ts.map +1 -1
- package/dist/bin/installer/prompts.d.ts +17 -0
- package/dist/bin/installer/prompts.d.ts.map +1 -1
- package/dist/bin/installer/qdrant-dashboard.d.ts.map +1 -1
- package/dist/bin/installer/steering.d.ts +14 -2
- package/dist/bin/installer/steering.d.ts.map +1 -1
- package/dist/bin/installer/steering.js +81 -0
- package/dist/bin/installer/steering.js.map +2 -2
- package/dist/bin/installer/targets/aider.d.ts +6 -0
- package/dist/bin/installer/targets/aider.d.ts.map +1 -0
- package/dist/bin/installer/targets/aider.js +3 -3
- package/dist/bin/installer/targets/aider.js.map +2 -2
- package/dist/bin/installer/targets/amp.d.ts +6 -0
- package/dist/bin/installer/targets/amp.d.ts.map +1 -0
- package/dist/bin/installer/targets/amp.js +3 -3
- package/dist/bin/installer/targets/amp.js.map +2 -2
- package/dist/bin/installer/targets/antigravity.d.ts +13 -0
- package/dist/bin/installer/targets/antigravity.d.ts.map +1 -0
- package/dist/bin/installer/targets/antigravity.js +2 -2
- package/dist/bin/installer/targets/antigravity.js.map +2 -2
- package/dist/bin/installer/targets/augment.d.ts +6 -0
- package/dist/bin/installer/targets/augment.d.ts.map +1 -0
- package/dist/bin/installer/targets/augment.js +3 -3
- package/dist/bin/installer/targets/augment.js.map +2 -2
- package/dist/bin/installer/targets/claude.d.ts +6 -0
- package/dist/bin/installer/targets/claude.d.ts.map +1 -0
- package/dist/bin/installer/targets/claude.js +2 -2
- package/dist/bin/installer/targets/claude.js.map +2 -2
- package/dist/bin/installer/targets/cline.d.ts +13 -0
- package/dist/bin/installer/targets/cline.d.ts.map +1 -0
- package/dist/bin/installer/targets/cline.js +2 -2
- package/dist/bin/installer/targets/cline.js.map +2 -2
- package/dist/bin/installer/targets/codex.d.ts +6 -0
- package/dist/bin/installer/targets/codex.d.ts.map +1 -0
- package/dist/bin/installer/targets/codex.js +2 -2
- package/dist/bin/installer/targets/codex.js.map +2 -2
- package/dist/bin/installer/targets/continue.d.ts +12 -0
- package/dist/bin/installer/targets/continue.d.ts.map +1 -0
- package/dist/bin/installer/targets/continue.js +2 -2
- package/dist/bin/installer/targets/continue.js.map +2 -2
- package/dist/bin/installer/targets/copilot-cli.d.ts +12 -0
- package/dist/bin/installer/targets/copilot-cli.d.ts.map +1 -0
- package/dist/bin/installer/targets/copilot-cli.js +2 -2
- package/dist/bin/installer/targets/copilot-cli.js.map +2 -2
- package/dist/bin/installer/targets/copilot.d.ts +6 -0
- package/dist/bin/installer/targets/copilot.d.ts.map +1 -0
- package/dist/bin/installer/targets/copilot.js +2 -2
- package/dist/bin/installer/targets/copilot.js.map +2 -2
- package/dist/bin/installer/targets/cursor.d.ts +6 -0
- package/dist/bin/installer/targets/cursor.d.ts.map +1 -0
- package/dist/bin/installer/targets/cursor.js +2 -2
- package/dist/bin/installer/targets/cursor.js.map +2 -2
- package/dist/bin/installer/targets/devin.d.ts +13 -0
- package/dist/bin/installer/targets/devin.d.ts.map +1 -0
- package/dist/bin/installer/targets/devin.js +2 -2
- package/dist/bin/installer/targets/devin.js.map +2 -2
- package/dist/bin/installer/targets/gemini-cli.d.ts +16 -0
- package/dist/bin/installer/targets/gemini-cli.d.ts.map +1 -0
- package/dist/bin/installer/targets/gemini-cli.js +2 -2
- package/dist/bin/installer/targets/gemini-cli.js.map +2 -2
- package/dist/bin/installer/targets/generic.d.ts +59 -0
- package/dist/bin/installer/targets/generic.d.ts.map +1 -0
- package/dist/bin/installer/targets/generic.js +2 -2
- package/dist/bin/installer/targets/generic.js.map +2 -2
- package/dist/bin/installer/targets/goose.d.ts +6 -0
- package/dist/bin/installer/targets/goose.d.ts.map +1 -0
- package/dist/bin/installer/targets/goose.js +3 -3
- package/dist/bin/installer/targets/goose.js.map +2 -2
- package/dist/bin/installer/targets/index.d.ts +11 -0
- package/dist/bin/installer/targets/index.d.ts.map +1 -0
- package/dist/bin/installer/targets/index.js.map +1 -1
- package/dist/bin/installer/targets/junie.d.ts +13 -0
- package/dist/bin/installer/targets/junie.d.ts.map +1 -0
- package/dist/bin/installer/targets/junie.js +2 -2
- package/dist/bin/installer/targets/junie.js.map +2 -2
- package/dist/bin/installer/targets/kilo.d.ts +12 -0
- package/dist/bin/installer/targets/kilo.d.ts.map +1 -0
- package/dist/bin/installer/targets/kilo.js +2 -2
- package/dist/bin/installer/targets/kilo.js.map +2 -2
- package/dist/bin/installer/targets/kiro.d.ts +5 -0
- package/dist/bin/installer/targets/kiro.d.ts.map +1 -0
- package/dist/bin/installer/targets/kiro.js +4 -4
- package/dist/bin/installer/targets/kiro.js.map +2 -2
- package/dist/bin/installer/targets/opencode.d.ts +13 -0
- package/dist/bin/installer/targets/opencode.d.ts.map +1 -0
- package/dist/bin/installer/targets/opencode.js +2 -2
- package/dist/bin/installer/targets/opencode.js.map +2 -2
- package/dist/bin/installer/targets/openhands.d.ts +6 -0
- package/dist/bin/installer/targets/openhands.d.ts.map +1 -0
- package/dist/bin/installer/targets/openhands.js +3 -3
- package/dist/bin/installer/targets/openhands.js.map +2 -2
- package/dist/bin/installer/targets/qoder.d.ts +12 -0
- package/dist/bin/installer/targets/qoder.d.ts.map +1 -0
- package/dist/bin/installer/targets/qoder.js +2 -2
- package/dist/bin/installer/targets/qoder.js.map +2 -2
- package/dist/bin/installer/targets/qwen.d.ts +12 -0
- package/dist/bin/installer/targets/qwen.d.ts.map +1 -0
- package/dist/bin/installer/targets/qwen.js +2 -2
- package/dist/bin/installer/targets/qwen.js.map +2 -2
- package/dist/bin/installer/targets/replit.d.ts +6 -0
- package/dist/bin/installer/targets/replit.d.ts.map +1 -0
- package/dist/bin/installer/targets/replit.js +3 -3
- package/dist/bin/installer/targets/replit.js.map +2 -2
- package/dist/bin/installer/targets/roo.d.ts +13 -0
- package/dist/bin/installer/targets/roo.d.ts.map +1 -0
- package/dist/bin/installer/targets/roo.js +2 -2
- package/dist/bin/installer/targets/roo.js.map +2 -2
- package/dist/bin/installer/targets/tabnine.d.ts +6 -0
- package/dist/bin/installer/targets/tabnine.d.ts.map +1 -0
- package/dist/bin/installer/targets/tabnine.js +3 -3
- package/dist/bin/installer/targets/tabnine.js.map +2 -2
- package/dist/bin/installer/targets/trae.d.ts +6 -0
- package/dist/bin/installer/targets/trae.d.ts.map +1 -0
- package/dist/bin/installer/targets/trae.js +3 -3
- package/dist/bin/installer/targets/trae.js.map +2 -2
- package/dist/bin/installer/targets/warp.d.ts +12 -0
- package/dist/bin/installer/targets/warp.d.ts.map +1 -0
- package/dist/bin/installer/targets/warp.js +2 -2
- package/dist/bin/installer/targets/warp.js.map +2 -2
- package/dist/bin/installer/targets/windsurf.d.ts +13 -0
- package/dist/bin/installer/targets/windsurf.d.ts.map +1 -0
- package/dist/bin/installer/targets/windsurf.js +2 -2
- package/dist/bin/installer/targets/windsurf.js.map +2 -2
- package/dist/bin/kirograph.js +3 -1
- package/dist/bin/kirograph.js.map +3 -3
- package/dist/bin/progress.d.ts +16 -1
- package/dist/bin/progress.d.ts.map +1 -1
- package/dist/compression/filters/aws.d.ts +9 -0
- package/dist/compression/filters/aws.d.ts.map +1 -0
- package/dist/compression/filters/docker.d.ts +6 -0
- package/dist/compression/filters/docker.d.ts.map +1 -0
- package/dist/compression/filters/files.d.ts +6 -0
- package/dist/compression/filters/files.d.ts.map +1 -0
- package/dist/compression/filters/generic.d.ts +7 -0
- package/dist/compression/filters/generic.d.ts.map +1 -0
- package/dist/compression/filters/git.d.ts +6 -0
- package/dist/compression/filters/git.d.ts.map +1 -0
- package/dist/compression/filters/github.d.ts +6 -0
- package/dist/compression/filters/github.d.ts.map +1 -0
- package/dist/compression/filters/lint.d.ts +6 -0
- package/dist/compression/filters/lint.d.ts.map +1 -0
- package/dist/compression/filters/misc.d.ts +6 -0
- package/dist/compression/filters/misc.d.ts.map +1 -0
- package/dist/compression/filters/package.d.ts +6 -0
- package/dist/compression/filters/package.d.ts.map +1 -0
- package/dist/compression/filters/test.d.ts +6 -0
- package/dist/compression/filters/test.d.ts.map +1 -0
- package/dist/compression/index.d.ts +29 -0
- package/dist/compression/index.d.ts.map +1 -0
- package/dist/compression/naive-cost.d.ts +26 -0
- package/dist/compression/naive-cost.d.ts.map +1 -0
- package/dist/compression/tracker.d.ts +155 -0
- package/dist/compression/tracker.d.ts.map +1 -0
- package/dist/compression/types.d.ts +49 -0
- package/dist/compression/types.d.ts.map +1 -0
- package/dist/config.d.ts +90 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +55 -1
- package/dist/config.js.map +2 -2
- package/dist/core/lock-manager.d.ts +2 -0
- package/dist/core/lock-manager.d.ts.map +1 -1
- package/dist/core/pipeline.d.ts +4 -1
- package/dist/core/pipeline.d.ts.map +1 -1
- package/dist/core/pipeline.js +42 -0
- package/dist/core/pipeline.js.map +2 -2
- package/dist/core/snapshot.d.ts +58 -0
- package/dist/core/snapshot.d.ts.map +1 -0
- package/dist/data/filters.d.ts +23 -0
- package/dist/data/filters.d.ts.map +1 -0
- package/dist/data/indexer.d.ts +25 -0
- package/dist/data/indexer.d.ts.map +1 -0
- package/dist/data/linker.d.ts +37 -0
- package/dist/data/linker.d.ts.map +1 -0
- package/dist/data/lint.d.ts +27 -0
- package/dist/data/lint.d.ts.map +1 -0
- package/dist/data/parsers/csv.d.ts +11 -0
- package/dist/data/parsers/csv.d.ts.map +1 -0
- package/dist/data/parsers/excel.d.ts +10 -0
- package/dist/data/parsers/excel.d.ts.map +1 -0
- package/dist/data/parsers/index.d.ts +28 -0
- package/dist/data/parsers/index.d.ts.map +1 -0
- package/dist/data/parsers/json-array.d.ts +9 -0
- package/dist/data/parsers/json-array.d.ts.map +1 -0
- package/dist/data/parsers/jsonl.d.ts +9 -0
- package/dist/data/parsers/jsonl.d.ts.map +1 -0
- package/dist/data/parsers/parquet.d.ts +10 -0
- package/dist/data/parsers/parquet.d.ts.map +1 -0
- package/dist/data/profiler.d.ts +29 -0
- package/dist/data/profiler.d.ts.map +1 -0
- package/dist/data/queries.d.ts +95 -0
- package/dist/data/queries.d.ts.map +1 -0
- package/dist/data/types.d.ts +103 -0
- package/dist/data/types.d.ts.map +1 -0
- package/dist/db/database.d.ts +57 -0
- package/dist/db/database.d.ts.map +1 -1
- package/dist/db/database.js +19 -0
- package/dist/db/database.js.map +2 -2
- package/dist/db/patterns-schema.sql +23 -0
- package/dist/docs/formats/asciidoc.d.ts +9 -0
- package/dist/docs/formats/asciidoc.d.ts.map +1 -0
- package/dist/docs/formats/html.d.ts +10 -0
- package/dist/docs/formats/html.d.ts.map +1 -0
- package/dist/docs/formats/index.d.ts +31 -0
- package/dist/docs/formats/index.d.ts.map +1 -0
- package/dist/docs/formats/markdown.d.ts +11 -0
- package/dist/docs/formats/markdown.d.ts.map +1 -0
- package/dist/docs/formats/openapi.d.ts +17 -0
- package/dist/docs/formats/openapi.d.ts.map +1 -0
- package/dist/docs/formats/org.d.ts +9 -0
- package/dist/docs/formats/org.d.ts.map +1 -0
- package/dist/docs/formats/plaintext.d.ts +11 -0
- package/dist/docs/formats/plaintext.d.ts.map +1 -0
- package/dist/docs/formats/rdoc.d.ts +10 -0
- package/dist/docs/formats/rdoc.d.ts.map +1 -0
- package/dist/docs/formats/rst.d.ts +11 -0
- package/dist/docs/formats/rst.d.ts.map +1 -0
- package/dist/docs/indexer.d.ts +49 -0
- package/dist/docs/indexer.d.ts.map +1 -0
- package/dist/docs/linker.d.ts +30 -0
- package/dist/docs/linker.d.ts.map +1 -0
- package/dist/docs/lint.d.ts +27 -0
- package/dist/docs/lint.d.ts.map +1 -0
- package/dist/docs/queries.d.ts +78 -0
- package/dist/docs/queries.d.ts.map +1 -0
- package/dist/docs/section-id.d.ts +48 -0
- package/dist/docs/section-id.d.ts.map +1 -0
- package/dist/docs/summarizer.d.ts +13 -0
- package/dist/docs/summarizer.d.ts.map +1 -0
- package/dist/docs/types.d.ts +71 -0
- package/dist/docs/types.d.ts.map +1 -0
- package/dist/docs/vectors.d.ts +54 -0
- package/dist/docs/vectors.d.ts.map +1 -0
- package/dist/extraction/extractor.d.ts +1 -1
- package/dist/extraction/extractor.d.ts.map +1 -1
- package/dist/extraction/extractor.js +26 -3
- package/dist/extraction/extractor.js.map +2 -2
- package/dist/extraction/grammars.d.ts +6 -0
- package/dist/extraction/grammars.d.ts.map +1 -1
- package/dist/extraction/grammars.js +1 -0
- package/dist/extraction/grammars.js.map +2 -2
- package/dist/extraction/languages.d.ts.map +1 -1
- package/dist/extraction/languages.js +5 -1
- package/dist/extraction/languages.js.map +2 -2
- package/dist/extraction/notebook.d.ts +14 -0
- package/dist/extraction/notebook.d.ts.map +1 -0
- package/dist/frameworks/amplify.d.ts +9 -0
- package/dist/frameworks/amplify.d.ts.map +1 -0
- package/dist/frameworks/angular.d.ts +9 -0
- package/dist/frameworks/angular.d.ts.map +1 -0
- package/dist/frameworks/ansible.d.ts +8 -0
- package/dist/frameworks/ansible.d.ts.map +1 -0
- package/dist/frameworks/cloudformation.d.ts +9 -0
- package/dist/frameworks/cloudformation.d.ts.map +1 -0
- package/dist/frameworks/docker.d.ts +9 -0
- package/dist/frameworks/docker.d.ts.map +1 -0
- package/dist/frameworks/elixir.d.ts +6 -0
- package/dist/frameworks/elixir.d.ts.map +1 -0
- package/dist/frameworks/flutter.d.ts +12 -0
- package/dist/frameworks/flutter.d.ts.map +1 -0
- package/dist/frameworks/iac.d.ts +10 -0
- package/dist/frameworks/iac.d.ts.map +1 -0
- package/dist/frameworks/index.d.ts +14 -0
- package/dist/frameworks/index.d.ts.map +1 -1
- package/dist/frameworks/kubernetes.d.ts +9 -0
- package/dist/frameworks/kubernetes.d.ts.map +1 -0
- package/dist/frameworks/pulumi.d.ts +9 -0
- package/dist/frameworks/pulumi.d.ts.map +1 -0
- package/dist/frameworks/scala.d.ts +6 -0
- package/dist/frameworks/scala.d.ts.map +1 -0
- package/dist/frameworks/solidity.d.ts +6 -0
- package/dist/frameworks/solidity.d.ts.map +1 -0
- package/dist/frameworks/terraform.d.ts +14 -0
- package/dist/frameworks/terraform.d.ts.map +1 -0
- package/dist/frameworks/vue.d.ts +7 -0
- package/dist/frameworks/vue.d.ts.map +1 -0
- package/dist/graph/communities.d.ts +43 -0
- package/dist/graph/communities.d.ts.map +1 -0
- package/dist/graph/flows.d.ts +55 -0
- package/dist/graph/flows.d.ts.map +1 -0
- package/dist/graph/refactor.d.ts +43 -0
- package/dist/graph/refactor.d.ts.map +1 -0
- package/dist/index.d.ts +36 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/mcp/cache.d.ts +69 -0
- package/dist/mcp/cache.d.ts.map +1 -0
- package/dist/mcp/read-modes.d.ts +31 -0
- package/dist/mcp/read-modes.d.ts.map +1 -0
- package/dist/mcp/server.d.ts +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +15 -2
- package/dist/mcp/server.js.map +2 -2
- package/dist/mcp/tool-names.d.ts +2 -0
- package/dist/mcp/tool-names.d.ts.map +1 -0
- package/dist/mcp/tool-names.js +4 -1
- package/dist/mcp/tool-names.js.map +2 -2
- package/dist/mcp/tools.d.ts +12 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +397 -0
- package/dist/mcp/tools.js.map +2 -2
- package/dist/memory/compress.d.ts +19 -0
- package/dist/memory/compress.d.ts.map +1 -0
- package/dist/memory/database.d.ts +92 -0
- package/dist/memory/database.d.ts.map +1 -0
- package/dist/memory/database.js +38 -0
- package/dist/memory/database.js.map +2 -2
- package/dist/memory/index.d.ts +71 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +12 -2
- package/dist/memory/index.js.map +2 -2
- package/dist/memory/symbols.d.ts +21 -0
- package/dist/memory/symbols.d.ts.map +1 -0
- package/dist/memory/types.d.ts +78 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js.map +1 -1
- package/dist/memory/vectors.d.ts +43 -0
- package/dist/memory/vectors.d.ts.map +1 -0
- package/dist/patterns/graph.d.ts +16 -0
- package/dist/patterns/graph.d.ts.map +1 -0
- package/dist/patterns/graph.js +45 -0
- package/dist/patterns/graph.js.map +7 -0
- package/dist/patterns/index.d.ts +4 -0
- package/dist/patterns/index.d.ts.map +1 -0
- package/dist/patterns/index.js +39 -0
- package/dist/patterns/index.js.map +7 -0
- package/dist/patterns/indexer.d.ts +15 -0
- package/dist/patterns/indexer.d.ts.map +1 -0
- package/dist/patterns/indexer.js +97 -0
- package/dist/patterns/indexer.js.map +7 -0
- package/dist/patterns/library/code-eval-elixir.yaml +11 -0
- package/dist/patterns/library/command-injection-c.yaml +11 -0
- package/dist/patterns/library/command-injection-go.yaml +29 -0
- package/dist/patterns/library/command-injection-kotlin.yaml +10 -0
- package/dist/patterns/library/command-injection-php.yaml +11 -0
- package/dist/patterns/library/command-injection-ruby.yaml +11 -0
- package/dist/patterns/library/command-injection-rust.yaml +11 -0
- package/dist/patterns/library/dangerous-eval-bash.yaml +11 -0
- package/dist/patterns/library/dangerous-eval-js.yaml +14 -0
- package/dist/patterns/library/dangerous-eval-php.yaml +11 -0
- package/dist/patterns/library/dangerous-eval-ruby.yaml +11 -0
- package/dist/patterns/library/dangerous-exec-py.yaml +13 -0
- package/dist/patterns/library/dangerous-reflection-java.yaml +8 -0
- package/dist/patterns/library/dynamic-load-lua.yaml +10 -0
- package/dist/patterns/library/os-cmd-elixir.yaml +16 -0
- package/dist/patterns/library/os-execute-lua.yaml +10 -0
- package/dist/patterns/library/path-traversal-go.yaml +11 -0
- package/dist/patterns/library/path-traversal-py.yaml +12 -0
- package/dist/patterns/library/path-traversal-readfile-js.yaml +14 -0
- package/dist/patterns/library/process-launch-swift.yaml +11 -0
- package/dist/patterns/library/process-run-dart.yaml +15 -0
- package/dist/patterns/library/prototype-pollution-js.yaml +12 -0
- package/dist/patterns/library/source-injection-bash.yaml +11 -0
- package/dist/patterns/library/sql-injection-concat-js.yaml +12 -0
- package/dist/patterns/library/sql-injection-dart.yaml +9 -0
- package/dist/patterns/library/sql-injection-java.yaml +13 -0
- package/dist/patterns/library/sql-injection-kotlin.yaml +11 -0
- package/dist/patterns/library/sql-injection-php.yaml +9 -0
- package/dist/patterns/library/sql-injection-py.yaml +12 -0
- package/dist/patterns/library/sql-injection-swift.yaml +11 -0
- package/dist/patterns/library/sql-injection-template-js.yaml +13 -0
- package/dist/patterns/library/subshell-injection-ruby.yaml +8 -0
- package/dist/patterns/library/unsafe-block-rust.yaml +8 -0
- package/dist/patterns/library/unsafe-string-c.yaml +11 -0
- package/dist/patterns/library/weak-crypto-md5-js.yaml +13 -0
- package/dist/patterns/library/weak-crypto-py.yaml +13 -0
- package/dist/patterns/loader.d.ts +18 -0
- package/dist/patterns/loader.d.ts.map +1 -0
- package/dist/patterns/loader.js +277 -0
- package/dist/patterns/loader.js.map +7 -0
- package/dist/patterns/runner.d.ts +42 -0
- package/dist/patterns/runner.d.ts.map +1 -0
- package/dist/patterns/runner.js +295 -0
- package/dist/patterns/runner.js.map +7 -0
- package/dist/patterns/types.d.ts +27 -0
- package/dist/patterns/types.d.ts.map +1 -0
- package/dist/patterns/types.js +34 -0
- package/dist/patterns/types.js.map +7 -0
- package/dist/resolution/bridges/android-rn.d.ts +13 -0
- package/dist/resolution/bridges/android-rn.d.ts.map +1 -0
- package/dist/resolution/bridges/expo-modules.d.ts +10 -0
- package/dist/resolution/bridges/expo-modules.d.ts.map +1 -0
- package/dist/resolution/bridges/flutter-channel.d.ts +14 -0
- package/dist/resolution/bridges/flutter-channel.d.ts.map +1 -0
- package/dist/resolution/bridges/index.d.ts +40 -0
- package/dist/resolution/bridges/index.d.ts.map +1 -0
- package/dist/resolution/bridges/native-events.d.ts +10 -0
- package/dist/resolution/bridges/native-events.d.ts.map +1 -0
- package/dist/resolution/bridges/native-views.d.ts +13 -0
- package/dist/resolution/bridges/native-views.d.ts.map +1 -0
- package/dist/resolution/bridges/react-native.d.ts +9 -0
- package/dist/resolution/bridges/react-native.d.ts.map +1 -0
- package/dist/resolution/bridges/swift-objc.d.ts +14 -0
- package/dist/resolution/bridges/swift-objc.d.ts.map +1 -0
- package/dist/resolution/bridges/turbomodules.d.ts +10 -0
- package/dist/resolution/bridges/turbomodules.d.ts.map +1 -0
- package/dist/resolution/index.d.ts +28 -3
- package/dist/resolution/index.d.ts.map +1 -1
- package/dist/security/attack-surface.d.ts +46 -0
- package/dist/security/attack-surface.d.ts.map +1 -0
- package/dist/security/attack-surface.js +43 -1
- package/dist/security/attack-surface.js.map +2 -2
- package/dist/security/context-warnings.d.ts +40 -0
- package/dist/security/context-warnings.d.ts.map +1 -0
- package/dist/security/data-flows.d.ts +33 -0
- package/dist/security/data-flows.d.ts.map +1 -0
- package/dist/security/data-flows.js +65 -7
- package/dist/security/data-flows.js.map +2 -2
- package/dist/security/dep-confusion.d.ts +23 -0
- package/dist/security/dep-confusion.d.ts.map +1 -0
- package/dist/security/errors.d.ts +16 -0
- package/dist/security/errors.d.ts.map +1 -0
- package/dist/security/export/fix-suggestions.d.ts +21 -0
- package/dist/security/export/fix-suggestions.d.ts.map +1 -0
- package/dist/security/export/sbom.d.ts +33 -0
- package/dist/security/export/sbom.d.ts.map +1 -0
- package/dist/security/export/serialization.d.ts +62 -0
- package/dist/security/export/serialization.d.ts.map +1 -0
- package/dist/security/export/vex.d.ts +58 -0
- package/dist/security/export/vex.d.ts.map +1 -0
- package/dist/security/index.d.ts +21 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/integrator.d.ts +63 -0
- package/dist/security/integrator.d.ts.map +1 -0
- package/dist/security/integrator.js +8 -8
- package/dist/security/integrator.js.map +2 -2
- package/dist/security/license.d.ts +33 -0
- package/dist/security/license.d.ts.map +1 -0
- package/dist/security/manifest/adapter.d.ts +92 -0
- package/dist/security/manifest/adapter.d.ts.map +1 -0
- package/dist/security/manifest/parser.d.ts +73 -0
- package/dist/security/manifest/parser.d.ts.map +1 -0
- package/dist/security/manifest/plugins/cargo.d.ts +11 -0
- package/dist/security/manifest/plugins/cargo.d.ts.map +1 -0
- package/dist/security/manifest/plugins/composer.d.ts +11 -0
- package/dist/security/manifest/plugins/composer.d.ts.map +1 -0
- package/dist/security/manifest/plugins/go.d.ts +12 -0
- package/dist/security/manifest/plugins/go.d.ts.map +1 -0
- package/dist/security/manifest/plugins/gradle.d.ts +12 -0
- package/dist/security/manifest/plugins/gradle.d.ts.map +1 -0
- package/dist/security/manifest/plugins/hex.d.ts +11 -0
- package/dist/security/manifest/plugins/hex.d.ts.map +1 -0
- package/dist/security/manifest/plugins/maven.d.ts +11 -0
- package/dist/security/manifest/plugins/maven.d.ts.map +1 -0
- package/dist/security/manifest/plugins/npm.d.ts +11 -0
- package/dist/security/manifest/plugins/npm.d.ts.map +1 -0
- package/dist/security/manifest/plugins/nuget.d.ts +12 -0
- package/dist/security/manifest/plugins/nuget.d.ts.map +1 -0
- package/dist/security/manifest/plugins/pip.d.ts +11 -0
- package/dist/security/manifest/plugins/pip.d.ts.map +1 -0
- package/dist/security/manifest/plugins/pubspec.d.ts +11 -0
- package/dist/security/manifest/plugins/pubspec.d.ts.map +1 -0
- package/dist/security/manifest/plugins/pyproject.d.ts +3 -0
- package/dist/security/manifest/plugins/pyproject.d.ts.map +1 -0
- package/dist/security/manifest/plugins/rubygems.d.ts +11 -0
- package/dist/security/manifest/plugins/rubygems.d.ts.map +1 -0
- package/dist/security/manifest/plugins/swift.d.ts +11 -0
- package/dist/security/manifest/plugins/swift.d.ts.map +1 -0
- package/dist/security/owasp.d.ts +16 -0
- package/dist/security/owasp.d.ts.map +1 -0
- package/dist/security/pipeline.d.ts +37 -0
- package/dist/security/pipeline.d.ts.map +1 -0
- package/dist/security/reachability.d.ts +67 -0
- package/dist/security/reachability.d.ts.map +1 -0
- package/dist/security/remediation.d.ts +51 -0
- package/dist/security/remediation.d.ts.map +1 -0
- package/dist/security/secrets.d.ts +38 -0
- package/dist/security/secrets.d.ts.map +1 -0
- package/dist/security/staleness.d.ts +43 -0
- package/dist/security/staleness.d.ts.map +1 -0
- package/dist/security/supply-chain.d.ts +34 -0
- package/dist/security/supply-chain.d.ts.map +1 -0
- package/dist/security/suppressions.d.ts +18 -0
- package/dist/security/suppressions.d.ts.map +1 -0
- package/dist/security/types.d.ts +144 -0
- package/dist/security/types.d.ts.map +1 -0
- package/dist/security/vuln/client.d.ts +90 -0
- package/dist/security/vuln/client.d.ts.map +1 -0
- package/dist/security/vuln/client.js.map +2 -2
- package/dist/security/vuln/epss-client.d.ts +26 -0
- package/dist/security/vuln/epss-client.d.ts.map +1 -0
- package/dist/security/vuln/index.d.ts +6 -0
- package/dist/security/vuln/index.d.ts.map +1 -0
- package/dist/security/vuln/osv-adapter.d.ts +58 -0
- package/dist/security/vuln/osv-adapter.d.ts.map +1 -0
- package/dist/security/vuln/types.d.ts +29 -0
- package/dist/security/vuln/types.d.ts.map +1 -0
- package/dist/sync/index.d.ts +4 -2
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/types.d.ts +10 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +2 -2
- package/dist/vectors/index.d.ts +11 -3
- package/dist/vectors/index.d.ts.map +1 -1
- package/dist/vectors/qdrant-index.d.ts +10 -3
- package/dist/vectors/qdrant-index.d.ts.map +1 -1
- package/dist/vectors/turboquant-index.js +261 -0
- package/dist/vectors/turboquant-index.js.map +7 -0
- package/dist/vectors/typesense-index.d.ts.map +1 -1
- package/dist/watchmen/index.js +83 -0
- package/dist/watchmen/index.js.map +7 -0
- package/dist/watchmen/synthesize.js +475 -0
- package/dist/watchmen/synthesize.js.map +7 -0
- package/package.json +24 -2
- package/dist/security/context-warnings.test.js +0 -300
- package/dist/security/context-warnings.test.js.map +0 -7
- package/dist/security/export/fix-suggestions.test.js +0 -74
- package/dist/security/export/fix-suggestions.test.js.map +0 -7
- package/dist/security/export/sbom.test.js +0 -288
- package/dist/security/export/sbom.test.js.map +0 -7
- package/dist/security/export/serialization.test.js +0 -310
- package/dist/security/export/serialization.test.js.map +0 -7
- package/dist/security/export/vex.test.js +0 -278
- package/dist/security/export/vex.test.js.map +0 -7
- package/dist/security/integrator-transitives.test.js +0 -359
- package/dist/security/integrator-transitives.test.js.map +0 -7
- package/dist/security/integrator.test.js +0 -237
- package/dist/security/integrator.test.js.map +0 -7
- package/dist/security/manifest/adapter.test.js +0 -272
- package/dist/security/manifest/adapter.test.js.map +0 -7
- package/dist/security/manifest/parser.test.js +0 -110
- package/dist/security/manifest/parser.test.js.map +0 -7
- package/dist/security/manifest/plugins/cargo.test.js +0 -304
- package/dist/security/manifest/plugins/cargo.test.js.map +0 -7
- package/dist/security/manifest/plugins/go.test.js +0 -341
- package/dist/security/manifest/plugins/go.test.js.map +0 -7
- package/dist/security/manifest/plugins/maven.test.js +0 -389
- package/dist/security/manifest/plugins/maven.test.js.map +0 -7
- package/dist/security/manifest/plugins/npm.test.js +0 -298
- package/dist/security/manifest/plugins/npm.test.js.map +0 -7
- package/dist/security/manifest/plugins/pip.test.js +0 -208
- package/dist/security/manifest/plugins/pip.test.js.map +0 -7
- package/dist/security/reachability.test.js +0 -394
- package/dist/security/reachability.test.js.map +0 -7
- package/dist/security/vuln/client.test.js +0 -288
- package/dist/security/vuln/client.test.js.map +0 -7
- package/dist/security/vuln/osv-adapter.test.js +0 -391
- package/dist/security/vuln/osv-adapter.test.js.map +0 -7
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/security/export/serialization.test.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Unit tests for CycloneDX serialization utilities.\n *\n * Tests serialize/deserialize for Dependency_Nodes to/from CycloneDX JSON\n * component format, including round-trip and partial failure resilience.\n */\nimport { describe, it, expect } from 'vitest';\nimport {\n serializeDependencyToComponent,\n deserializeComponentToDependency,\n serializeAll,\n deserializeAll,\n type DependencyRow,\n} from './serialization';\nimport type { CycloneDXComponent } from '../types';\n\nfunction makeDependencyRow(overrides?: Partial<DependencyRow>): DependencyRow {\n return {\n node_id: 'dep:npm:express',\n ecosystem: 'npm',\n package_name: 'express',\n declared_constraint: '^4.18.0',\n resolved_version: '4.18.2',\n scope: 'production',\n transitive_status: 'complete',\n last_vuln_check: null,\n vuln_data_stale: 0,\n vuln_data_stale_since: null,\n source_manifests: '[\"package.json\"]',\n ...overrides,\n };\n}\n\ndescribe('serializeDependencyToComponent', () => {\n it('should serialize an npm dependency to a CycloneDX component', () => {\n const dep = makeDependencyRow();\n const component = serializeDependencyToComponent(dep);\n\n expect(component.type).toBe('library');\n expect(component.name).toBe('express');\n expect(component.version).toBe('4.18.2');\n expect(component.purl).toBe('pkg:npm/express@4.18.2');\n expect(component.scope).toBe('required');\n expect(component.properties).toEqual([\n { name: 'kirograph:declaredConstraint', value: '^4.18.0' },\n ]);\n });\n\n it('should use declared_constraint as version when resolved_version is null', () => {\n const dep = makeDependencyRow({ resolved_version: null });\n const component = serializeDependencyToComponent(dep);\n\n expect(component.version).toBe('^4.18.0');\n expect(component.purl).toBe('pkg:npm/express@^4.18.0');\n });\n\n it('should map production scope to required', () => {\n const dep = makeDependencyRow({ scope: 'production' });\n const component = serializeDependencyToComponent(dep);\n expect(component.scope).toBe('required');\n });\n\n it('should map development scope to optional', () => {\n const dep = makeDependencyRow({ scope: 'development' });\n const component = serializeDependencyToComponent(dep);\n expect(component.scope).toBe('optional');\n });\n\n it('should map optional scope to optional', () => {\n const dep = makeDependencyRow({ scope: 'optional' });\n const component = serializeDependencyToComponent(dep);\n expect(component.scope).toBe('optional');\n });\n\n it('should correctly map maven ecosystem to purl type', () => {\n const dep = makeDependencyRow({\n node_id: 'dep:maven:log4j-core',\n ecosystem: 'maven',\n package_name: 'org.apache.logging.log4j/log4j-core',\n resolved_version: '2.17.0',\n });\n const component = serializeDependencyToComponent(dep);\n expect(component.purl).toBe('pkg:maven/org.apache.logging.log4j/log4j-core@2.17.0');\n });\n\n it('should correctly map go ecosystem to golang purl type', () => {\n const dep = makeDependencyRow({\n node_id: 'dep:go:github.com/gin-gonic/gin',\n ecosystem: 'go',\n package_name: 'github.com/gin-gonic/gin',\n resolved_version: '1.9.1',\n });\n const component = serializeDependencyToComponent(dep);\n expect(component.purl).toBe('pkg:golang/github.com/gin-gonic/gin@1.9.1');\n });\n\n it('should correctly map pypi ecosystem', () => {\n const dep = makeDependencyRow({\n node_id: 'dep:pypi:django',\n ecosystem: 'pypi',\n package_name: 'django',\n resolved_version: '4.2.0',\n });\n const component = serializeDependencyToComponent(dep);\n expect(component.purl).toBe('pkg:pypi/django@4.2.0');\n });\n\n it('should correctly map cargo ecosystem', () => {\n const dep = makeDependencyRow({\n node_id: 'dep:cargo:serde',\n ecosystem: 'cargo',\n package_name: 'serde',\n resolved_version: '1.0.188',\n });\n const component = serializeDependencyToComponent(dep);\n expect(component.purl).toBe('pkg:cargo/serde@1.0.188');\n });\n\n it('should throw for unsupported ecosystem', () => {\n const dep = makeDependencyRow({ ecosystem: 'unknown' });\n expect(() => serializeDependencyToComponent(dep)).toThrow('Unsupported ecosystem: unknown');\n });\n\n it('should throw when both version and constraint are empty', () => {\n const dep = makeDependencyRow({\n resolved_version: null,\n declared_constraint: '',\n });\n expect(() => serializeDependencyToComponent(dep)).toThrow(\n 'No version or constraint available',\n );\n });\n\n it('should throw when package_name is empty', () => {\n const dep = makeDependencyRow({ package_name: '' });\n expect(() => serializeDependencyToComponent(dep)).toThrow(\n 'Dependency package_name is required',\n );\n });\n});\n\ndescribe('deserializeComponentToDependency', () => {\n it('should deserialize a CycloneDX component to a dependency row', () => {\n const component: CycloneDXComponent = {\n type: 'library',\n name: 'express',\n version: '4.18.2',\n purl: 'pkg:npm/express@4.18.2',\n scope: 'required',\n properties: [{ name: 'kirograph:declaredConstraint', value: '^4.18.0' }],\n };\n\n const dep = deserializeComponentToDependency(component);\n\n expect(dep.ecosystem).toBe('npm');\n expect(dep.package_name).toBe('express');\n expect(dep.resolved_version).toBe('4.18.2');\n expect(dep.declared_constraint).toBe('^4.18.0');\n expect(dep.scope).toBe('production');\n expect(dep.node_id).toBe('dep:npm:express');\n });\n\n it('should use version as declared_constraint when property is missing', () => {\n const component: CycloneDXComponent = {\n type: 'library',\n name: 'express',\n version: '4.18.2',\n purl: 'pkg:npm/express@4.18.2',\n };\n\n const dep = deserializeComponentToDependency(component);\n expect(dep.declared_constraint).toBe('4.18.2');\n });\n\n it('should map optional scope back to optional', () => {\n const component: CycloneDXComponent = {\n type: 'library',\n name: 'jest',\n version: '29.0.0',\n purl: 'pkg:npm/jest@29.0.0',\n scope: 'optional',\n };\n\n const dep = deserializeComponentToDependency(component);\n expect(dep.scope).toBe('optional');\n });\n\n it('should map required scope back to production', () => {\n const component: CycloneDXComponent = {\n type: 'library',\n name: 'express',\n version: '4.18.2',\n purl: 'pkg:npm/express@4.18.2',\n scope: 'required',\n };\n\n const dep = deserializeComponentToDependency(component);\n expect(dep.scope).toBe('production');\n });\n\n it('should map golang purl type back to go ecosystem', () => {\n const component: CycloneDXComponent = {\n type: 'library',\n name: 'github.com/gin-gonic/gin',\n version: '1.9.1',\n purl: 'pkg:golang/github.com/gin-gonic/gin@1.9.1',\n };\n\n const dep = deserializeComponentToDependency(component);\n expect(dep.ecosystem).toBe('go');\n expect(dep.package_name).toBe('github.com/gin-gonic/gin');\n });\n\n it('should throw for missing purl', () => {\n const component = {\n type: 'library',\n name: 'express',\n version: '4.18.2',\n purl: '',\n } as CycloneDXComponent;\n\n expect(() => deserializeComponentToDependency(component)).toThrow('missing purl');\n });\n\n it('should throw for invalid purl format', () => {\n const component: CycloneDXComponent = {\n type: 'library',\n name: 'express',\n version: '4.18.2',\n purl: 'invalid-purl',\n };\n\n expect(() => deserializeComponentToDependency(component)).toThrow('Invalid purl format');\n });\n\n it('should throw for unsupported purl type', () => {\n const component: CycloneDXComponent = {\n type: 'library',\n name: 'something',\n version: '1.0.0',\n purl: 'pkg:nuget/something@1.0.0',\n };\n\n expect(() => deserializeComponentToDependency(component)).toThrow('Unsupported purl type');\n });\n\n it('should set default values for non-serialized fields', () => {\n const component: CycloneDXComponent = {\n type: 'library',\n name: 'express',\n version: '4.18.2',\n purl: 'pkg:npm/express@4.18.2',\n };\n\n const dep = deserializeComponentToDependency(component);\n expect(dep.transitive_status).toBe('complete');\n expect(dep.last_vuln_check).toBeNull();\n expect(dep.vuln_data_stale).toBe(0);\n expect(dep.vuln_data_stale_since).toBeNull();\n expect(dep.source_manifests).toBe('[]');\n });\n});\n\ndescribe('serializeDependencyToComponent \u2192 deserializeComponentToDependency round-trip', () => {\n it('should preserve key fields through round-trip', () => {\n const original = makeDependencyRow();\n const component = serializeDependencyToComponent(original);\n const restored = deserializeComponentToDependency(component);\n\n expect(restored.package_name).toBe(original.package_name);\n expect(restored.resolved_version).toBe(original.resolved_version);\n expect(restored.ecosystem).toBe(original.ecosystem);\n expect(restored.scope).toBe(original.scope);\n expect(restored.declared_constraint).toBe(original.declared_constraint);\n });\n\n it('should preserve constraint when resolved_version is null', () => {\n const original = makeDependencyRow({ resolved_version: null });\n const component = serializeDependencyToComponent(original);\n const restored = deserializeComponentToDependency(component);\n\n expect(restored.declared_constraint).toBe(original.declared_constraint);\n // When no resolved version, the version in purl is the constraint\n expect(restored.resolved_version).toBe(original.declared_constraint);\n });\n});\n\ndescribe('serializeAll', () => {\n it('should serialize all valid dependencies', () => {\n const deps = [\n makeDependencyRow({ package_name: 'express', node_id: 'dep:npm:express' }),\n makeDependencyRow({ package_name: 'lodash', node_id: 'dep:npm:lodash' }),\n ];\n\n const result = serializeAll(deps);\n expect(result.components).toHaveLength(2);\n expect(result.errors).toHaveLength(0);\n });\n\n it('should collect errors for failing nodes and continue with remaining', () => {\n const deps = [\n makeDependencyRow({ package_name: 'express' }),\n makeDependencyRow({ package_name: 'bad-dep', ecosystem: 'unsupported' }),\n makeDependencyRow({ package_name: 'lodash' }),\n ];\n\n const result = serializeAll(deps);\n expect(result.components).toHaveLength(2);\n expect(result.errors).toHaveLength(1);\n expect(result.errors[0].name).toBe('bad-dep');\n expect(result.errors[0].reason).toContain('Unsupported ecosystem');\n });\n\n it('should handle empty input', () => {\n const result = serializeAll([]);\n expect(result.components).toHaveLength(0);\n expect(result.errors).toHaveLength(0);\n });\n\n it('should handle all failures gracefully', () => {\n const deps = [\n makeDependencyRow({ ecosystem: 'unknown1', package_name: 'a' }),\n makeDependencyRow({ ecosystem: 'unknown2', package_name: 'b' }),\n ];\n\n const result = serializeAll(deps);\n expect(result.components).toHaveLength(0);\n expect(result.errors).toHaveLength(2);\n });\n});\n\ndescribe('deserializeAll', () => {\n it('should deserialize all valid components', () => {\n const components: CycloneDXComponent[] = [\n { type: 'library', name: 'express', version: '4.18.2', purl: 'pkg:npm/express@4.18.2' },\n { type: 'library', name: 'lodash', version: '4.17.21', purl: 'pkg:npm/lodash@4.17.21' },\n ];\n\n const result = deserializeAll(components);\n expect(result.deps).toHaveLength(2);\n expect(result.errors).toHaveLength(0);\n });\n\n it('should collect errors for failing components and continue with remaining', () => {\n const components: CycloneDXComponent[] = [\n { type: 'library', name: 'express', version: '4.18.2', purl: 'pkg:npm/express@4.18.2' },\n { type: 'library', name: 'bad', version: '1.0.0', purl: 'invalid-purl' },\n { type: 'library', name: 'lodash', version: '4.17.21', purl: 'pkg:npm/lodash@4.17.21' },\n ];\n\n const result = deserializeAll(components);\n expect(result.deps).toHaveLength(2);\n expect(result.errors).toHaveLength(1);\n expect(result.errors[0].name).toBe('bad');\n expect(result.errors[0].reason).toContain('Invalid purl format');\n });\n\n it('should handle empty input', () => {\n const result = deserializeAll([]);\n expect(result.deps).toHaveLength(0);\n expect(result.errors).toHaveLength(0);\n });\n\n it('should handle all failures gracefully', () => {\n const components: CycloneDXComponent[] = [\n { type: 'library', name: 'a', version: '1.0', purl: 'bad1' },\n { type: 'library', name: 'b', version: '2.0', purl: 'bad2' },\n ];\n\n const result = deserializeAll(components);\n expect(result.deps).toHaveLength(0);\n expect(result.errors).toHaveLength(2);\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,278 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __create = Object.create;
|
|
3
|
-
var __defProp = Object.defineProperty;
|
|
4
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __copyProps = (to, from, except, desc) => {
|
|
9
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
10
|
-
for (let key of __getOwnPropNames(from))
|
|
11
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
12
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
13
|
-
}
|
|
14
|
-
return to;
|
|
15
|
-
};
|
|
16
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
17
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
18
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
19
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
20
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
21
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
|
-
mod
|
|
23
|
-
));
|
|
24
|
-
var import_vitest = require("vitest");
|
|
25
|
-
var import_vex = require("./vex");
|
|
26
|
-
var import_database = require("../../db/database");
|
|
27
|
-
var fs = __toESM(require("fs"));
|
|
28
|
-
var path = __toESM(require("path"));
|
|
29
|
-
var os = __toESM(require("os"));
|
|
30
|
-
(0, import_vitest.describe)("VEXExporter", () => {
|
|
31
|
-
let db;
|
|
32
|
-
let tmpDir;
|
|
33
|
-
(0, import_vitest.beforeEach)(() => {
|
|
34
|
-
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "vex-test-"));
|
|
35
|
-
db = new import_database.GraphDatabase(tmpDir);
|
|
36
|
-
db.applySecuritySchema();
|
|
37
|
-
});
|
|
38
|
-
(0, import_vitest.afterEach)(() => {
|
|
39
|
-
db.close();
|
|
40
|
-
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
41
|
-
});
|
|
42
|
-
function insertDependency(nodeId, ecosystem, packageName, version) {
|
|
43
|
-
const rawDb = db.getRawDb();
|
|
44
|
-
db.upsertNode({
|
|
45
|
-
id: nodeId,
|
|
46
|
-
kind: "dependency",
|
|
47
|
-
name: packageName,
|
|
48
|
-
qualifiedName: `${ecosystem}/${packageName}`,
|
|
49
|
-
filePath: "package.json",
|
|
50
|
-
language: "unknown",
|
|
51
|
-
startLine: 0,
|
|
52
|
-
endLine: 0,
|
|
53
|
-
startColumn: 0,
|
|
54
|
-
endColumn: 0,
|
|
55
|
-
updatedAt: Date.now()
|
|
56
|
-
});
|
|
57
|
-
rawDb.run(
|
|
58
|
-
`INSERT OR REPLACE INTO sec_dependencies
|
|
59
|
-
(node_id, ecosystem, package_name, declared_constraint, resolved_version, scope, source_manifests)
|
|
60
|
-
VALUES (?, ?, ?, ?, ?, 'production', '["package.json"]')`,
|
|
61
|
-
[nodeId, ecosystem, packageName, `^${version}`, version]
|
|
62
|
-
);
|
|
63
|
-
}
|
|
64
|
-
function insertVulnerability(vulnNodeId, cveId, depNodeId, severity = 7.5) {
|
|
65
|
-
const rawDb = db.getRawDb();
|
|
66
|
-
db.upsertNode({
|
|
67
|
-
id: vulnNodeId,
|
|
68
|
-
kind: "vulnerability",
|
|
69
|
-
name: cveId,
|
|
70
|
-
qualifiedName: cveId,
|
|
71
|
-
filePath: "",
|
|
72
|
-
language: "unknown",
|
|
73
|
-
startLine: 0,
|
|
74
|
-
endLine: 0,
|
|
75
|
-
startColumn: 0,
|
|
76
|
-
endColumn: 0,
|
|
77
|
-
updatedAt: Date.now()
|
|
78
|
-
});
|
|
79
|
-
rawDb.run(
|
|
80
|
-
`INSERT OR REPLACE INTO sec_vulnerabilities (node_id, cve_id, severity_score, affected_ranges, source_database)
|
|
81
|
-
VALUES (?, ?, ?, '[]', 'OSV')`,
|
|
82
|
-
[vulnNodeId, cveId, severity]
|
|
83
|
-
);
|
|
84
|
-
db.insertEdge({
|
|
85
|
-
source: depNodeId,
|
|
86
|
-
target: vulnNodeId,
|
|
87
|
-
kind: "has_vulnerability",
|
|
88
|
-
filePath: ""
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
function insertReachability(vulnNodeId, verdict, paths = null, unresolvedSymbols = null, entryPointCount = 0) {
|
|
92
|
-
const rawDb = db.getRawDb();
|
|
93
|
-
rawDb.run(
|
|
94
|
-
`INSERT INTO sec_reachability (vulnerability_node_id, verdict, paths, unresolved_symbols, reaching_entry_point_count, analyzed_at)
|
|
95
|
-
VALUES (?, ?, ?, ?, ?, ?)`,
|
|
96
|
-
[
|
|
97
|
-
vulnNodeId,
|
|
98
|
-
verdict,
|
|
99
|
-
paths ? JSON.stringify(paths) : null,
|
|
100
|
-
unresolvedSymbols ? JSON.stringify(unresolvedSymbols) : null,
|
|
101
|
-
entryPointCount,
|
|
102
|
-
Date.now()
|
|
103
|
-
]
|
|
104
|
-
);
|
|
105
|
-
}
|
|
106
|
-
function insertImpact(vulnNodeId, layers, entryPoints, pathCount) {
|
|
107
|
-
const rawDb = db.getRawDb();
|
|
108
|
-
rawDb.run(
|
|
109
|
-
`INSERT INTO sec_impact (vulnerability_node_id, affected_layers, affected_entry_points, distinct_path_count, analyzed_at)
|
|
110
|
-
VALUES (?, ?, ?, ?, ?)`,
|
|
111
|
-
[vulnNodeId, JSON.stringify(layers), JSON.stringify(entryPoints), pathCount, Date.now()]
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
(0, import_vitest.describe)("export()", () => {
|
|
115
|
-
(0, import_vitest.it)("should produce valid CycloneDX 1.5 VEX with empty vulnerabilities when none exist", () => {
|
|
116
|
-
const exporter = new import_vex.VEXExporter(db, tmpDir);
|
|
117
|
-
const vex = exporter.export();
|
|
118
|
-
(0, import_vitest.expect)(vex.bomFormat).toBe("CycloneDX");
|
|
119
|
-
(0, import_vitest.expect)(vex.specVersion).toBe("1.5");
|
|
120
|
-
(0, import_vitest.expect)(vex.version).toBe(1);
|
|
121
|
-
(0, import_vitest.expect)(vex.metadata).toBeDefined();
|
|
122
|
-
(0, import_vitest.expect)(vex.vulnerabilities).toEqual([]);
|
|
123
|
-
});
|
|
124
|
-
(0, import_vitest.it)("should include correct metadata with tool name, version, and timestamp", () => {
|
|
125
|
-
const exporter = new import_vex.VEXExporter(db, "/projects/my-app");
|
|
126
|
-
const vex = exporter.export();
|
|
127
|
-
const meta = vex.metadata;
|
|
128
|
-
(0, import_vitest.expect)(meta.tools.components[0].name).toBe("kirograph-sec");
|
|
129
|
-
(0, import_vitest.expect)(meta.tools.components[0].version).toBe("0.1.0");
|
|
130
|
-
(0, import_vitest.expect)(meta.timestamp).toMatch(/^\d{4}-\d{2}-\d{2}T/);
|
|
131
|
-
(0, import_vitest.expect)(meta.component.name).toBe("my-app");
|
|
132
|
-
});
|
|
133
|
-
(0, import_vitest.it)('should map "affected" verdict correctly', () => {
|
|
134
|
-
insertDependency("dep-1", "npm", "lodash", "4.17.20");
|
|
135
|
-
insertVulnerability("vuln-1", "CVE-2021-23337", "dep-1", 9.8);
|
|
136
|
-
insertReachability(
|
|
137
|
-
"vuln-1",
|
|
138
|
-
"affected",
|
|
139
|
-
[
|
|
140
|
-
{ entryPoint: "ep-1", path: ["ep-1", "mid-1", "dep-1"] },
|
|
141
|
-
{ entryPoint: "ep-2", path: ["ep-2", "dep-1"] }
|
|
142
|
-
],
|
|
143
|
-
null,
|
|
144
|
-
2
|
|
145
|
-
);
|
|
146
|
-
insertImpact("vuln-1", ["api", "service"], ["ep-1", "ep-2"], 2);
|
|
147
|
-
const exporter = new import_vex.VEXExporter(db, tmpDir);
|
|
148
|
-
const vex = exporter.export();
|
|
149
|
-
(0, import_vitest.expect)(vex.vulnerabilities).toHaveLength(1);
|
|
150
|
-
const v = vex.vulnerabilities[0];
|
|
151
|
-
(0, import_vitest.expect)(v.id).toBe("CVE-2021-23337");
|
|
152
|
-
(0, import_vitest.expect)(v.analysis?.state).toBe("affected");
|
|
153
|
-
(0, import_vitest.expect)(v.analysis?.detail).toContain("2 entry points");
|
|
154
|
-
(0, import_vitest.expect)(v.analysis?.detail).toContain("2 layers");
|
|
155
|
-
(0, import_vitest.expect)(v.analysis?.detail).toContain("Shortest path length: 2 nodes");
|
|
156
|
-
(0, import_vitest.expect)(v.affects).toEqual([{ ref: "pkg:npm/lodash@4.17.20" }]);
|
|
157
|
-
(0, import_vitest.expect)(v.ratings).toEqual([{ score: 9.8, method: "CVSSv31" }]);
|
|
158
|
-
});
|
|
159
|
-
(0, import_vitest.it)('should map "not_affected" verdict with justification "code_not_reachable"', () => {
|
|
160
|
-
insertDependency("dep-1", "npm", "express", "4.17.1");
|
|
161
|
-
insertVulnerability("vuln-1", "CVE-2022-24999", "dep-1", 5.3);
|
|
162
|
-
insertReachability("vuln-1", "not_affected", null, null, 0);
|
|
163
|
-
const exporter = new import_vex.VEXExporter(db, tmpDir);
|
|
164
|
-
const vex = exporter.export();
|
|
165
|
-
(0, import_vitest.expect)(vex.vulnerabilities).toHaveLength(1);
|
|
166
|
-
const v = vex.vulnerabilities[0];
|
|
167
|
-
(0, import_vitest.expect)(v.analysis?.state).toBe("not_affected");
|
|
168
|
-
(0, import_vitest.expect)(v.analysis?.justification).toBe("code_not_reachable");
|
|
169
|
-
(0, import_vitest.expect)(v.analysis?.detail).toContain("No reachable path found");
|
|
170
|
-
});
|
|
171
|
-
(0, import_vitest.it)('should map "under_investigation" verdict with unresolved symbols', () => {
|
|
172
|
-
insertDependency("dep-1", "pypi", "requests", "2.28.0");
|
|
173
|
-
insertVulnerability("vuln-1", "CVE-2023-32681", "dep-1", 6.1);
|
|
174
|
-
insertReachability(
|
|
175
|
-
"vuln-1",
|
|
176
|
-
"under_investigation",
|
|
177
|
-
null,
|
|
178
|
-
["sym-unresolved-1", "sym-unresolved-2"],
|
|
179
|
-
0
|
|
180
|
-
);
|
|
181
|
-
const exporter = new import_vex.VEXExporter(db, tmpDir);
|
|
182
|
-
const vex = exporter.export();
|
|
183
|
-
(0, import_vitest.expect)(vex.vulnerabilities).toHaveLength(1);
|
|
184
|
-
const v = vex.vulnerabilities[0];
|
|
185
|
-
(0, import_vitest.expect)(v.analysis?.state).toBe("under_investigation");
|
|
186
|
-
(0, import_vitest.expect)(v.analysis?.detail).toContain("2 unresolved symbols");
|
|
187
|
-
(0, import_vitest.expect)(v.analysis?.detail).toContain("sym-unresolved-1");
|
|
188
|
-
(0, import_vitest.expect)(v.analysis?.detail).toContain("sym-unresolved-2");
|
|
189
|
-
});
|
|
190
|
-
(0, import_vitest.it)('should set "under_investigation" when no reachability analysis performed', () => {
|
|
191
|
-
insertDependency("dep-1", "cargo", "serde", "1.0.188");
|
|
192
|
-
insertVulnerability("vuln-1", "CVE-2024-00001", "dep-1", 4);
|
|
193
|
-
const exporter = new import_vex.VEXExporter(db, tmpDir);
|
|
194
|
-
const vex = exporter.export();
|
|
195
|
-
(0, import_vitest.expect)(vex.vulnerabilities).toHaveLength(1);
|
|
196
|
-
const v = vex.vulnerabilities[0];
|
|
197
|
-
(0, import_vitest.expect)(v.analysis?.state).toBe("under_investigation");
|
|
198
|
-
(0, import_vitest.expect)(v.analysis?.detail).toContain("has not yet been executed");
|
|
199
|
-
});
|
|
200
|
-
(0, import_vitest.it)("should handle multiple vulnerabilities", () => {
|
|
201
|
-
insertDependency("dep-1", "npm", "lodash", "4.17.20");
|
|
202
|
-
insertDependency("dep-2", "npm", "express", "4.17.1");
|
|
203
|
-
insertVulnerability("vuln-1", "CVE-2021-23337", "dep-1", 9.8);
|
|
204
|
-
insertVulnerability("vuln-2", "CVE-2022-24999", "dep-2", 5.3);
|
|
205
|
-
insertReachability(
|
|
206
|
-
"vuln-1",
|
|
207
|
-
"affected",
|
|
208
|
-
[{ entryPoint: "ep-1", path: ["ep-1", "dep-1"] }],
|
|
209
|
-
null,
|
|
210
|
-
1
|
|
211
|
-
);
|
|
212
|
-
insertReachability("vuln-2", "not_affected", null, null, 0);
|
|
213
|
-
const exporter = new import_vex.VEXExporter(db, tmpDir);
|
|
214
|
-
const vex = exporter.export();
|
|
215
|
-
(0, import_vitest.expect)(vex.vulnerabilities).toHaveLength(2);
|
|
216
|
-
const affected = vex.vulnerabilities.find((v) => v.id === "CVE-2021-23337");
|
|
217
|
-
const notAffected = vex.vulnerabilities.find((v) => v.id === "CVE-2022-24999");
|
|
218
|
-
(0, import_vitest.expect)(affected?.analysis?.state).toBe("affected");
|
|
219
|
-
(0, import_vitest.expect)(notAffected?.analysis?.state).toBe("not_affected");
|
|
220
|
-
});
|
|
221
|
-
(0, import_vitest.it)("should use declared_constraint as version when resolved_version is null", () => {
|
|
222
|
-
const rawDb = db.getRawDb();
|
|
223
|
-
db.upsertNode({
|
|
224
|
-
id: "dep-1",
|
|
225
|
-
kind: "dependency",
|
|
226
|
-
name: "axios",
|
|
227
|
-
qualifiedName: "npm/axios",
|
|
228
|
-
filePath: "package.json",
|
|
229
|
-
language: "unknown",
|
|
230
|
-
startLine: 0,
|
|
231
|
-
endLine: 0,
|
|
232
|
-
startColumn: 0,
|
|
233
|
-
endColumn: 0,
|
|
234
|
-
updatedAt: Date.now()
|
|
235
|
-
});
|
|
236
|
-
rawDb.run(
|
|
237
|
-
`INSERT OR REPLACE INTO sec_dependencies
|
|
238
|
-
(node_id, ecosystem, package_name, declared_constraint, resolved_version, scope, source_manifests)
|
|
239
|
-
VALUES ('dep-1', 'npm', 'axios', '^1.0.0', NULL, 'production', '["package.json"]')`
|
|
240
|
-
);
|
|
241
|
-
insertVulnerability("vuln-1", "CVE-2023-45857", "dep-1", 6.5);
|
|
242
|
-
insertReachability("vuln-1", "not_affected", null, null, 0);
|
|
243
|
-
const exporter = new import_vex.VEXExporter(db, tmpDir);
|
|
244
|
-
const vex = exporter.export();
|
|
245
|
-
(0, import_vitest.expect)(vex.vulnerabilities[0].affects).toEqual([{ ref: "pkg:npm/axios@^1.0.0" }]);
|
|
246
|
-
});
|
|
247
|
-
(0, import_vitest.it)("should handle vulnerability with no severity score", () => {
|
|
248
|
-
insertDependency("dep-1", "go", "github.com/gin-gonic/gin", "1.9.1");
|
|
249
|
-
insertVulnerability("vuln-1", "CVE-2023-99999", "dep-1", null);
|
|
250
|
-
insertReachability("vuln-1", "not_affected", null, null, 0);
|
|
251
|
-
const exporter = new import_vex.VEXExporter(db, tmpDir);
|
|
252
|
-
const vex = exporter.export();
|
|
253
|
-
(0, import_vitest.expect)(vex.vulnerabilities[0].ratings).toBeUndefined();
|
|
254
|
-
});
|
|
255
|
-
(0, import_vitest.it)('should handle "under_investigation" with empty unresolved symbols', () => {
|
|
256
|
-
insertDependency("dep-1", "npm", "minimist", "1.2.5");
|
|
257
|
-
insertVulnerability("vuln-1", "CVE-2021-44906", "dep-1", 9.8);
|
|
258
|
-
insertReachability("vuln-1", "under_investigation", null, [], 0);
|
|
259
|
-
const exporter = new import_vex.VEXExporter(db, tmpDir);
|
|
260
|
-
const vex = exporter.export();
|
|
261
|
-
const v = vex.vulnerabilities[0];
|
|
262
|
-
(0, import_vitest.expect)(v.analysis?.state).toBe("under_investigation");
|
|
263
|
-
(0, import_vitest.expect)(v.analysis?.detail).toBe("Reachability analysis pending.");
|
|
264
|
-
});
|
|
265
|
-
});
|
|
266
|
-
(0, import_vitest.describe)("exportJSON()", () => {
|
|
267
|
-
(0, import_vitest.it)("should return pretty-printed JSON string", () => {
|
|
268
|
-
const exporter = new import_vex.VEXExporter(db, tmpDir);
|
|
269
|
-
const json = exporter.exportJSON();
|
|
270
|
-
(0, import_vitest.expect)(() => JSON.parse(json)).not.toThrow();
|
|
271
|
-
(0, import_vitest.expect)(json).toContain("\n");
|
|
272
|
-
const parsed = JSON.parse(json);
|
|
273
|
-
(0, import_vitest.expect)(parsed.bomFormat).toBe("CycloneDX");
|
|
274
|
-
(0, import_vitest.expect)(parsed.specVersion).toBe("1.5");
|
|
275
|
-
});
|
|
276
|
-
});
|
|
277
|
-
});
|
|
278
|
-
//# sourceMappingURL=vex.test.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/security/export/vex.test.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Unit tests for VEXExporter\n *\n * Tests CycloneDX 1.5 VEX generation with various vulnerability/reachability scenarios.\n */\n\nimport { describe, it, expect, beforeEach, afterEach } from 'vitest';\nimport { VEXExporter } from './vex';\nimport { GraphDatabase } from '../../db/database';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\n\ndescribe('VEXExporter', () => {\n let db: GraphDatabase;\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'vex-test-'));\n db = new GraphDatabase(tmpDir);\n db.applySecuritySchema();\n });\n\n afterEach(() => {\n db.close();\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n /**\n * Helper to insert a dependency node into the database.\n */\n function insertDependency(\n nodeId: string,\n ecosystem: string,\n packageName: string,\n version: string,\n ): void {\n const rawDb = db.getRawDb();\n\n db.upsertNode({\n id: nodeId,\n kind: 'dependency',\n name: packageName,\n qualifiedName: `${ecosystem}/${packageName}`,\n filePath: 'package.json',\n language: 'unknown',\n startLine: 0,\n endLine: 0,\n startColumn: 0,\n endColumn: 0,\n updatedAt: Date.now(),\n });\n\n rawDb.run(\n `INSERT OR REPLACE INTO sec_dependencies\n (node_id, ecosystem, package_name, declared_constraint, resolved_version, scope, source_manifests)\n VALUES (?, ?, ?, ?, ?, 'production', '[\"package.json\"]')`,\n [nodeId, ecosystem, packageName, `^${version}`, version],\n );\n }\n\n /**\n * Helper to insert a vulnerability node linked to a dependency.\n */\n function insertVulnerability(\n vulnNodeId: string,\n cveId: string,\n depNodeId: string,\n severity: number | null = 7.5,\n ): void {\n const rawDb = db.getRawDb();\n\n db.upsertNode({\n id: vulnNodeId,\n kind: 'vulnerability',\n name: cveId,\n qualifiedName: cveId,\n filePath: '',\n language: 'unknown',\n startLine: 0,\n endLine: 0,\n startColumn: 0,\n endColumn: 0,\n updatedAt: Date.now(),\n });\n\n rawDb.run(\n `INSERT OR REPLACE INTO sec_vulnerabilities (node_id, cve_id, severity_score, affected_ranges, source_database)\n VALUES (?, ?, ?, '[]', 'OSV')`,\n [vulnNodeId, cveId, severity],\n );\n\n db.insertEdge({\n source: depNodeId,\n target: vulnNodeId,\n kind: 'has_vulnerability',\n filePath: '',\n });\n }\n\n /**\n * Helper to insert a reachability result.\n */\n function insertReachability(\n vulnNodeId: string,\n verdict: string,\n paths: any[] | null = null,\n unresolvedSymbols: string[] | null = null,\n entryPointCount: number = 0,\n ): void {\n const rawDb = db.getRawDb();\n rawDb.run(\n `INSERT INTO sec_reachability (vulnerability_node_id, verdict, paths, unresolved_symbols, reaching_entry_point_count, analyzed_at)\n VALUES (?, ?, ?, ?, ?, ?)`,\n [\n vulnNodeId,\n verdict,\n paths ? JSON.stringify(paths) : null,\n unresolvedSymbols ? JSON.stringify(unresolvedSymbols) : null,\n entryPointCount,\n Date.now(),\n ],\n );\n }\n\n /**\n * Helper to insert an impact summary.\n */\n function insertImpact(\n vulnNodeId: string,\n layers: string[],\n entryPoints: string[],\n pathCount: number,\n ): void {\n const rawDb = db.getRawDb();\n rawDb.run(\n `INSERT INTO sec_impact (vulnerability_node_id, affected_layers, affected_entry_points, distinct_path_count, analyzed_at)\n VALUES (?, ?, ?, ?, ?)`,\n [vulnNodeId, JSON.stringify(layers), JSON.stringify(entryPoints), pathCount, Date.now()],\n );\n }\n\n describe('export()', () => {\n it('should produce valid CycloneDX 1.5 VEX with empty vulnerabilities when none exist', () => {\n const exporter = new VEXExporter(db, tmpDir);\n const vex = exporter.export();\n\n expect(vex.bomFormat).toBe('CycloneDX');\n expect(vex.specVersion).toBe('1.5');\n expect(vex.version).toBe(1);\n expect(vex.metadata).toBeDefined();\n expect(vex.vulnerabilities).toEqual([]);\n });\n\n it('should include correct metadata with tool name, version, and timestamp', () => {\n const exporter = new VEXExporter(db, '/projects/my-app');\n const vex = exporter.export();\n\n const meta = vex.metadata as any;\n expect(meta.tools.components[0].name).toBe('kirograph-sec');\n expect(meta.tools.components[0].version).toBe('0.1.0');\n expect(meta.timestamp).toMatch(/^\\d{4}-\\d{2}-\\d{2}T/);\n expect(meta.component.name).toBe('my-app');\n });\n\n it('should map \"affected\" verdict correctly', () => {\n insertDependency('dep-1', 'npm', 'lodash', '4.17.20');\n insertVulnerability('vuln-1', 'CVE-2021-23337', 'dep-1', 9.8);\n insertReachability(\n 'vuln-1',\n 'affected',\n [\n { entryPoint: 'ep-1', path: ['ep-1', 'mid-1', 'dep-1'] },\n { entryPoint: 'ep-2', path: ['ep-2', 'dep-1'] },\n ],\n null,\n 2,\n );\n insertImpact('vuln-1', ['api', 'service'], ['ep-1', 'ep-2'], 2);\n\n const exporter = new VEXExporter(db, tmpDir);\n const vex = exporter.export();\n\n expect(vex.vulnerabilities).toHaveLength(1);\n const v = vex.vulnerabilities[0];\n expect(v.id).toBe('CVE-2021-23337');\n expect(v.analysis?.state).toBe('affected');\n expect(v.analysis?.detail).toContain('2 entry points');\n expect(v.analysis?.detail).toContain('2 layers');\n expect(v.analysis?.detail).toContain('Shortest path length: 2 nodes');\n expect(v.affects).toEqual([{ ref: 'pkg:npm/lodash@4.17.20' }]);\n expect(v.ratings).toEqual([{ score: 9.8, method: 'CVSSv31' }]);\n });\n\n it('should map \"not_affected\" verdict with justification \"code_not_reachable\"', () => {\n insertDependency('dep-1', 'npm', 'express', '4.17.1');\n insertVulnerability('vuln-1', 'CVE-2022-24999', 'dep-1', 5.3);\n insertReachability('vuln-1', 'not_affected', null, null, 0);\n\n const exporter = new VEXExporter(db, tmpDir);\n const vex = exporter.export();\n\n expect(vex.vulnerabilities).toHaveLength(1);\n const v = vex.vulnerabilities[0];\n expect(v.analysis?.state).toBe('not_affected');\n expect(v.analysis?.justification).toBe('code_not_reachable');\n expect(v.analysis?.detail).toContain('No reachable path found');\n });\n\n it('should map \"under_investigation\" verdict with unresolved symbols', () => {\n insertDependency('dep-1', 'pypi', 'requests', '2.28.0');\n insertVulnerability('vuln-1', 'CVE-2023-32681', 'dep-1', 6.1);\n insertReachability(\n 'vuln-1',\n 'under_investigation',\n null,\n ['sym-unresolved-1', 'sym-unresolved-2'],\n 0,\n );\n\n const exporter = new VEXExporter(db, tmpDir);\n const vex = exporter.export();\n\n expect(vex.vulnerabilities).toHaveLength(1);\n const v = vex.vulnerabilities[0];\n expect(v.analysis?.state).toBe('under_investigation');\n expect(v.analysis?.detail).toContain('2 unresolved symbols');\n expect(v.analysis?.detail).toContain('sym-unresolved-1');\n expect(v.analysis?.detail).toContain('sym-unresolved-2');\n });\n\n it('should set \"under_investigation\" when no reachability analysis performed', () => {\n insertDependency('dep-1', 'cargo', 'serde', '1.0.188');\n insertVulnerability('vuln-1', 'CVE-2024-00001', 'dep-1', 4.0);\n // No reachability row inserted\n\n const exporter = new VEXExporter(db, tmpDir);\n const vex = exporter.export();\n\n expect(vex.vulnerabilities).toHaveLength(1);\n const v = vex.vulnerabilities[0];\n expect(v.analysis?.state).toBe('under_investigation');\n expect(v.analysis?.detail).toContain('has not yet been executed');\n });\n\n it('should handle multiple vulnerabilities', () => {\n insertDependency('dep-1', 'npm', 'lodash', '4.17.20');\n insertDependency('dep-2', 'npm', 'express', '4.17.1');\n\n insertVulnerability('vuln-1', 'CVE-2021-23337', 'dep-1', 9.8);\n insertVulnerability('vuln-2', 'CVE-2022-24999', 'dep-2', 5.3);\n\n insertReachability(\n 'vuln-1',\n 'affected',\n [{ entryPoint: 'ep-1', path: ['ep-1', 'dep-1'] }],\n null,\n 1,\n );\n insertReachability('vuln-2', 'not_affected', null, null, 0);\n\n const exporter = new VEXExporter(db, tmpDir);\n const vex = exporter.export();\n\n expect(vex.vulnerabilities).toHaveLength(2);\n const affected = vex.vulnerabilities.find(v => v.id === 'CVE-2021-23337');\n const notAffected = vex.vulnerabilities.find(v => v.id === 'CVE-2022-24999');\n expect(affected?.analysis?.state).toBe('affected');\n expect(notAffected?.analysis?.state).toBe('not_affected');\n });\n\n it('should use declared_constraint as version when resolved_version is null', () => {\n const rawDb = db.getRawDb();\n\n db.upsertNode({\n id: 'dep-1',\n kind: 'dependency',\n name: 'axios',\n qualifiedName: 'npm/axios',\n filePath: 'package.json',\n language: 'unknown',\n startLine: 0,\n endLine: 0,\n startColumn: 0,\n endColumn: 0,\n updatedAt: Date.now(),\n });\n\n rawDb.run(\n `INSERT OR REPLACE INTO sec_dependencies\n (node_id, ecosystem, package_name, declared_constraint, resolved_version, scope, source_manifests)\n VALUES ('dep-1', 'npm', 'axios', '^1.0.0', NULL, 'production', '[\"package.json\"]')`,\n );\n insertVulnerability('vuln-1', 'CVE-2023-45857', 'dep-1', 6.5);\n insertReachability('vuln-1', 'not_affected', null, null, 0);\n\n const exporter = new VEXExporter(db, tmpDir);\n const vex = exporter.export();\n\n expect(vex.vulnerabilities[0].affects).toEqual([{ ref: 'pkg:npm/axios@^1.0.0' }]);\n });\n\n it('should handle vulnerability with no severity score', () => {\n insertDependency('dep-1', 'go', 'github.com/gin-gonic/gin', '1.9.1');\n insertVulnerability('vuln-1', 'CVE-2023-99999', 'dep-1', null);\n insertReachability('vuln-1', 'not_affected', null, null, 0);\n\n const exporter = new VEXExporter(db, tmpDir);\n const vex = exporter.export();\n\n expect(vex.vulnerabilities[0].ratings).toBeUndefined();\n });\n\n it('should handle \"under_investigation\" with empty unresolved symbols', () => {\n insertDependency('dep-1', 'npm', 'minimist', '1.2.5');\n insertVulnerability('vuln-1', 'CVE-2021-44906', 'dep-1', 9.8);\n insertReachability('vuln-1', 'under_investigation', null, [], 0);\n\n const exporter = new VEXExporter(db, tmpDir);\n const vex = exporter.export();\n\n const v = vex.vulnerabilities[0];\n expect(v.analysis?.state).toBe('under_investigation');\n expect(v.analysis?.detail).toBe('Reachability analysis pending.');\n });\n });\n\n describe('exportJSON()', () => {\n it('should return pretty-printed JSON string', () => {\n const exporter = new VEXExporter(db, tmpDir);\n const json = exporter.exportJSON();\n\n expect(() => JSON.parse(json)).not.toThrow();\n // Pretty-printed means it contains newlines\n expect(json).toContain('\\n');\n\n const parsed = JSON.parse(json);\n expect(parsed.bomFormat).toBe('CycloneDX');\n expect(parsed.specVersion).toBe('1.5');\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|