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/integrator.test.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Tests for DependencyGraphIntegrator.cleanup()\n *\n * Verifies that orphaned Dependency_Nodes are correctly identified and removed\n * when their source manifests no longer exist on disk or when they have no\n * declared_in edges.\n */\nimport { describe, it, expect, beforeEach, afterEach } from 'vitest';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { DependencyGraphIntegrator } from './integrator';\nimport { GraphDatabase } from '../db/database';\nimport type { Node, Edge } from '../types';\n\ndescribe('DependencyGraphIntegrator.cleanup()', () => {\n let db: GraphDatabase;\n let integrator: DependencyGraphIntegrator;\n let tmpDir: string;\n const projectRoot = '/tmp/test-project';\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'kirograph-integrator-test-'));\n db = new GraphDatabase(tmpDir);\n db.applySecuritySchema();\n integrator = new DependencyGraphIntegrator(db, projectRoot);\n });\n\n afterEach(() => {\n db.close();\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n function createDependencyNode(\n name: string,\n ecosystem: string,\n sourceManifests: string[],\n options?: { addDeclaredInEdge?: boolean },\n ): string {\n const nodeId = `dep:${ecosystem}:${name}`;\n const rawDb = db.getRawDb();\n\n const node: Node = {\n id: nodeId,\n kind: 'dependency',\n name,\n qualifiedName: `${ecosystem}/${name}`,\n filePath: sourceManifests[0] ?? '',\n language: 'unknown',\n startLine: 0,\n endLine: 0,\n startColumn: 0,\n endColumn: 0,\n isExported: false,\n isAsync: false,\n isStatic: false,\n isAbstract: false,\n updatedAt: Date.now(),\n };\n\n db.upsertNode(node);\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 (?, ?, ?, ?, ?, ?, ?)`,\n [nodeId, ecosystem, name, '^1.0.0', '1.0.0', 'production', JSON.stringify(sourceManifests)],\n );\n\n // Optionally add declared_in edge (simulates a manifest that still declares this dep)\n if (options?.addDeclaredInEdge !== false) {\n for (const manifest of sourceManifests) {\n const edge: Edge = {\n source: nodeId,\n target: manifest,\n kind: 'declared_in',\n };\n db.insertEdge(edge);\n }\n }\n\n return nodeId;\n }\n\n function createEdge(source: string, target: string, kind: string): void {\n const edge: Edge = {\n source,\n target,\n kind: kind as Edge['kind'],\n };\n db.insertEdge(edge);\n }\n\n it('should return zero counts when no dependencies exist', async () => {\n const result = await integrator.cleanup(() => true);\n expect(result.nodesRemoved).toBe(0);\n expect(result.edgesRemoved).toBe(0);\n });\n\n it('should not remove dependencies whose manifests still exist and have declared_in edges', async () => {\n const manifestPath = 'package.json';\n const nodeId = createDependencyNode('express', 'npm', [manifestPath]);\n\n const manifestExists = () => true;\n\n const result = await integrator.cleanup(manifestExists);\n expect(result.nodesRemoved).toBe(0);\n expect(result.edgesRemoved).toBe(0);\n\n const node = db.getNode(nodeId);\n expect(node).not.toBeNull();\n });\n\n it('should remove dependencies with no declared_in edges', async () => {\n const manifestPath = 'package.json';\n const nodeId = createDependencyNode('express', 'npm', [manifestPath], {\n addDeclaredInEdge: false,\n });\n\n const manifestExists = () => true;\n\n const result = await integrator.cleanup(manifestExists);\n expect(result.nodesRemoved).toBe(1);\n\n const node = db.getNode(nodeId);\n expect(node).toBeNull();\n });\n\n it('should remove dependencies whose manifests no longer exist on disk', async () => {\n const manifestPath = 'package.json';\n const nodeId = createDependencyNode('express', 'npm', [manifestPath]);\n\n const manifestExists = () => false;\n\n const result = await integrator.cleanup(manifestExists);\n expect(result.nodesRemoved).toBe(1);\n\n const node = db.getNode(nodeId);\n expect(node).toBeNull();\n });\n\n it('should remove edges connected to orphaned nodes', async () => {\n const manifestPath = 'package.json';\n const depNodeId = createDependencyNode('lodash', 'npm', [manifestPath], {\n addDeclaredInEdge: false,\n });\n\n const codeNode: Node = {\n id: 'file:src/index.ts:import:lodash',\n kind: 'import',\n name: 'lodash',\n qualifiedName: 'src/index.ts:lodash',\n filePath: 'src/index.ts',\n language: 'typescript',\n startLine: 1,\n endLine: 1,\n startColumn: 0,\n endColumn: 20,\n updatedAt: Date.now(),\n };\n db.upsertNode(codeNode);\n createEdge(codeNode.id, depNodeId, 'imports');\n\n const manifestExists = () => true;\n const result = await integrator.cleanup(manifestExists);\n expect(result.nodesRemoved).toBe(1);\n expect(result.edgesRemoved).toBe(1);\n });\n\n it('should keep dependency if at least one source manifest exists on disk', async () => {\n const manifests = ['packages/a/package.json', 'packages/b/package.json'];\n const nodeId = createDependencyNode('react', 'npm', manifests);\n\n const manifestExists = (p: string) => p.includes('packages/a/package.json');\n\n const result = await integrator.cleanup(manifestExists);\n expect(result.nodesRemoved).toBe(0);\n\n const node = db.getNode(nodeId);\n expect(node).not.toBeNull();\n });\n\n it('should remove transitive dependencies no longer reachable from direct deps', async () => {\n const manifest = 'package.json';\n\n // Direct dependency (manifest exists, has declared_in edge)\n const directId = createDependencyNode('express', 'npm', [manifest]);\n\n // Transitive dependency reachable from express\n const reachableTransId = createDependencyNode('accepts', 'npm', [manifest]);\n createEdge(directId, reachableTransId, 'depends_on');\n\n // Orphaned direct dependency (no declared_in edge)\n const orphanedDirectId = createDependencyNode('lodash', 'npm', ['old-package.json'], {\n addDeclaredInEdge: false,\n });\n\n // Transitive dependency ONLY reachable from orphaned direct (no declared_in edge)\n const unreachableTransId = createDependencyNode('lodash.merge', 'npm', ['old-package.json'], {\n addDeclaredInEdge: false,\n });\n createEdge(orphanedDirectId, unreachableTransId, 'depends_on');\n\n const manifestExists = () => true;\n\n const result = await integrator.cleanup(manifestExists);\n\n // lodash and lodash.merge should be removed\n expect(result.nodesRemoved).toBe(2);\n\n // express and accepts should remain\n expect(db.getNode(directId)).not.toBeNull();\n expect(db.getNode(reachableTransId)).not.toBeNull();\n\n // orphaned nodes should be gone\n expect(db.getNode(orphanedDirectId)).toBeNull();\n expect(db.getNode(unreachableTransId)).toBeNull();\n });\n\n it('should handle transitive chains correctly \u2014 all reachable from direct dep', async () => {\n const manifest = 'package.json';\n\n const directId = createDependencyNode('express', 'npm', [manifest]);\n\n // Chain: express \u2192 body-parser \u2192 raw-body \u2192 bytes\n const bp = createDependencyNode('body-parser', 'npm', [manifest]);\n const rb = createDependencyNode('raw-body', 'npm', [manifest]);\n const bytes = createDependencyNode('bytes', 'npm', [manifest]);\n\n createEdge(directId, bp, 'depends_on');\n createEdge(bp, rb, 'depends_on');\n createEdge(rb, bytes, 'depends_on');\n\n const manifestExists = () => true;\n\n const result = await integrator.cleanup(manifestExists);\n\n expect(result.nodesRemoved).toBe(0);\n expect(result.edgesRemoved).toBe(0);\n });\n\n it('should count edges correctly when multiple edges connect to orphaned node', async () => {\n const orphanedManifest = 'removed/package.json';\n const depId = createDependencyNode('old-pkg', 'npm', [orphanedManifest], {\n addDeclaredInEdge: false,\n });\n\n const codeNode1: Node = {\n id: 'node:a',\n kind: 'function',\n name: 'funcA',\n qualifiedName: 'funcA',\n filePath: 'src/a.ts',\n language: 'typescript',\n startLine: 1,\n endLine: 5,\n startColumn: 0,\n endColumn: 0,\n updatedAt: Date.now(),\n };\n const codeNode2: Node = {\n id: 'node:b',\n kind: 'function',\n name: 'funcB',\n qualifiedName: 'funcB',\n filePath: 'src/b.ts',\n language: 'typescript',\n startLine: 1,\n endLine: 5,\n startColumn: 0,\n endColumn: 0,\n updatedAt: Date.now(),\n };\n db.upsertNode(codeNode1);\n db.upsertNode(codeNode2);\n\n createEdge(codeNode1.id, depId, 'imports');\n createEdge(codeNode2.id, depId, 'references');\n createEdge(depId, 'some-manifest', 'declared_in');\n\n // No manifests exist on disk\n const manifestExists = () => false;\n\n const result = await integrator.cleanup(manifestExists);\n expect(result.nodesRemoved).toBe(1);\n // 2 incoming (imports, references) + 1 outgoing (declared_in) = 3\n expect(result.edgesRemoved).toBe(3);\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,272 +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 fs = __toESM(require("fs"));
|
|
26
|
-
var path = __toESM(require("path"));
|
|
27
|
-
var os = __toESM(require("os"));
|
|
28
|
-
var import_adapter = require("./adapter");
|
|
29
|
-
(0, import_vitest.describe)("SecurityManifestAdapter", () => {
|
|
30
|
-
let tmpDir;
|
|
31
|
-
(0, import_vitest.beforeEach)(() => {
|
|
32
|
-
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "sec-adapter-test-"));
|
|
33
|
-
});
|
|
34
|
-
(0, import_vitest.afterEach)(() => {
|
|
35
|
-
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
36
|
-
});
|
|
37
|
-
(0, import_vitest.describe)("constructor", () => {
|
|
38
|
-
(0, import_vitest.it)("should initialize with architecture parsers", () => {
|
|
39
|
-
const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
|
|
40
|
-
const parsers = adapter.getArchParsers();
|
|
41
|
-
(0, import_vitest.expect)(parsers.length).toBeGreaterThan(0);
|
|
42
|
-
const names = parsers.map((p) => p.name);
|
|
43
|
-
(0, import_vitest.expect)(names).toContain("npm");
|
|
44
|
-
(0, import_vitest.expect)(names).toContain("cargo");
|
|
45
|
-
(0, import_vitest.expect)(names).toContain("go");
|
|
46
|
-
(0, import_vitest.expect)(names).toContain("maven");
|
|
47
|
-
(0, import_vitest.expect)(names).toContain("python");
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
(0, import_vitest.describe)("registerPlugin", () => {
|
|
51
|
-
(0, import_vitest.it)("should register and retrieve a version extraction plugin", () => {
|
|
52
|
-
const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
|
|
53
|
-
const plugin = {
|
|
54
|
-
ecosystem: "npm",
|
|
55
|
-
manifestFiles: ["package.json"],
|
|
56
|
-
canExtract: (p) => path.basename(p) === "package.json",
|
|
57
|
-
extract: async () => []
|
|
58
|
-
};
|
|
59
|
-
adapter.registerPlugin(plugin);
|
|
60
|
-
const plugins = adapter.getPlugins();
|
|
61
|
-
(0, import_vitest.expect)(plugins).toHaveLength(1);
|
|
62
|
-
(0, import_vitest.expect)(plugins[0].ecosystem).toBe("npm");
|
|
63
|
-
});
|
|
64
|
-
(0, import_vitest.it)("should overwrite plugin for same ecosystem", () => {
|
|
65
|
-
const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
|
|
66
|
-
const plugin1 = {
|
|
67
|
-
ecosystem: "npm",
|
|
68
|
-
manifestFiles: ["package.json"],
|
|
69
|
-
canExtract: () => true,
|
|
70
|
-
extract: async () => [{ name: "a", declaredConstraint: "1.0", scope: "production", ecosystem: "npm", sourceManifest: "package.json" }]
|
|
71
|
-
};
|
|
72
|
-
const plugin2 = {
|
|
73
|
-
ecosystem: "npm",
|
|
74
|
-
manifestFiles: ["package.json"],
|
|
75
|
-
canExtract: () => true,
|
|
76
|
-
extract: async () => [{ name: "b", declaredConstraint: "2.0", scope: "development", ecosystem: "npm", sourceManifest: "package.json" }]
|
|
77
|
-
};
|
|
78
|
-
adapter.registerPlugin(plugin1);
|
|
79
|
-
adapter.registerPlugin(plugin2);
|
|
80
|
-
const plugins = adapter.getPlugins();
|
|
81
|
-
(0, import_vitest.expect)(plugins).toHaveLength(1);
|
|
82
|
-
(0, import_vitest.expect)(plugins[0]).toBe(plugin2);
|
|
83
|
-
});
|
|
84
|
-
});
|
|
85
|
-
(0, import_vitest.describe)("discoverManifests", () => {
|
|
86
|
-
(0, import_vitest.it)("should discover package.json files", () => {
|
|
87
|
-
fs.writeFileSync(path.join(tmpDir, "package.json"), JSON.stringify({ name: "test", dependencies: { express: "^4.0.0" } }));
|
|
88
|
-
const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
|
|
89
|
-
const manifests = adapter.discoverManifests();
|
|
90
|
-
(0, import_vitest.expect)(manifests).toHaveLength(1);
|
|
91
|
-
(0, import_vitest.expect)(manifests[0]).toBe(path.join(tmpDir, "package.json"));
|
|
92
|
-
});
|
|
93
|
-
(0, import_vitest.it)("should discover nested manifest files", () => {
|
|
94
|
-
fs.mkdirSync(path.join(tmpDir, "sub"));
|
|
95
|
-
fs.writeFileSync(path.join(tmpDir, "package.json"), JSON.stringify({ name: "root" }));
|
|
96
|
-
fs.writeFileSync(path.join(tmpDir, "sub", "package.json"), JSON.stringify({ name: "sub" }));
|
|
97
|
-
const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
|
|
98
|
-
const manifests = adapter.discoverManifests();
|
|
99
|
-
(0, import_vitest.expect)(manifests).toHaveLength(2);
|
|
100
|
-
});
|
|
101
|
-
(0, import_vitest.it)("should skip node_modules directory", () => {
|
|
102
|
-
fs.mkdirSync(path.join(tmpDir, "node_modules"));
|
|
103
|
-
fs.writeFileSync(path.join(tmpDir, "node_modules", "package.json"), JSON.stringify({ name: "dep" }));
|
|
104
|
-
fs.writeFileSync(path.join(tmpDir, "package.json"), JSON.stringify({ name: "root" }));
|
|
105
|
-
const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
|
|
106
|
-
const manifests = adapter.discoverManifests();
|
|
107
|
-
(0, import_vitest.expect)(manifests).toHaveLength(1);
|
|
108
|
-
(0, import_vitest.expect)(manifests[0]).toBe(path.join(tmpDir, "package.json"));
|
|
109
|
-
});
|
|
110
|
-
(0, import_vitest.it)("should skip .git directory", () => {
|
|
111
|
-
fs.mkdirSync(path.join(tmpDir, ".git"));
|
|
112
|
-
fs.writeFileSync(path.join(tmpDir, ".git", "package.json"), JSON.stringify({ name: "git" }));
|
|
113
|
-
fs.writeFileSync(path.join(tmpDir, "package.json"), JSON.stringify({ name: "root" }));
|
|
114
|
-
const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
|
|
115
|
-
const manifests = adapter.discoverManifests();
|
|
116
|
-
(0, import_vitest.expect)(manifests).toHaveLength(1);
|
|
117
|
-
});
|
|
118
|
-
(0, import_vitest.it)("should skip dist and build directories", () => {
|
|
119
|
-
fs.mkdirSync(path.join(tmpDir, "dist"));
|
|
120
|
-
fs.mkdirSync(path.join(tmpDir, "build"));
|
|
121
|
-
fs.writeFileSync(path.join(tmpDir, "dist", "package.json"), JSON.stringify({ name: "dist" }));
|
|
122
|
-
fs.writeFileSync(path.join(tmpDir, "build", "package.json"), JSON.stringify({ name: "build" }));
|
|
123
|
-
fs.writeFileSync(path.join(tmpDir, "package.json"), JSON.stringify({ name: "root" }));
|
|
124
|
-
const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
|
|
125
|
-
const manifests = adapter.discoverManifests();
|
|
126
|
-
(0, import_vitest.expect)(manifests).toHaveLength(1);
|
|
127
|
-
});
|
|
128
|
-
(0, import_vitest.it)("should discover multiple ecosystem manifests", () => {
|
|
129
|
-
fs.writeFileSync(path.join(tmpDir, "package.json"), JSON.stringify({ name: "js-project" }));
|
|
130
|
-
fs.writeFileSync(path.join(tmpDir, "Cargo.toml"), '[package]\nname = "rust-project"\nversion = "0.1.0"');
|
|
131
|
-
fs.writeFileSync(path.join(tmpDir, "go.mod"), "module example.com/mymod\n\ngo 1.21");
|
|
132
|
-
const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
|
|
133
|
-
const manifests = adapter.discoverManifests();
|
|
134
|
-
(0, import_vitest.expect)(manifests).toHaveLength(3);
|
|
135
|
-
});
|
|
136
|
-
(0, import_vitest.it)("should return empty array for empty directory", () => {
|
|
137
|
-
const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
|
|
138
|
-
const manifests = adapter.discoverManifests();
|
|
139
|
-
(0, import_vitest.expect)(manifests).toHaveLength(0);
|
|
140
|
-
});
|
|
141
|
-
});
|
|
142
|
-
(0, import_vitest.describe)("getEcosystem", () => {
|
|
143
|
-
(0, import_vitest.it)("should return npm for package.json", () => {
|
|
144
|
-
const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
|
|
145
|
-
(0, import_vitest.expect)(adapter.getEcosystem("/some/path/package.json")).toBe("npm");
|
|
146
|
-
});
|
|
147
|
-
(0, import_vitest.it)("should return cargo for Cargo.toml", () => {
|
|
148
|
-
const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
|
|
149
|
-
(0, import_vitest.expect)(adapter.getEcosystem("/some/path/Cargo.toml")).toBe("cargo");
|
|
150
|
-
});
|
|
151
|
-
(0, import_vitest.it)("should return go for go.mod", () => {
|
|
152
|
-
const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
|
|
153
|
-
(0, import_vitest.expect)(adapter.getEcosystem("/some/path/go.mod")).toBe("go");
|
|
154
|
-
});
|
|
155
|
-
(0, import_vitest.it)("should return maven for pom.xml", () => {
|
|
156
|
-
const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
|
|
157
|
-
(0, import_vitest.expect)(adapter.getEcosystem("/some/path/pom.xml")).toBe("maven");
|
|
158
|
-
});
|
|
159
|
-
(0, import_vitest.it)("should return undefined for unknown files", () => {
|
|
160
|
-
const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
|
|
161
|
-
(0, import_vitest.expect)(adapter.getEcosystem("/some/path/unknown.txt")).toBeUndefined();
|
|
162
|
-
});
|
|
163
|
-
});
|
|
164
|
-
(0, import_vitest.describe)("extractAll", () => {
|
|
165
|
-
(0, import_vitest.it)("should use registered plugin for extraction", async () => {
|
|
166
|
-
fs.writeFileSync(path.join(tmpDir, "package.json"), JSON.stringify({
|
|
167
|
-
name: "test-project",
|
|
168
|
-
dependencies: { express: "^4.18.0", lodash: "~4.17.21" },
|
|
169
|
-
devDependencies: { vitest: "^1.0.0" }
|
|
170
|
-
}));
|
|
171
|
-
const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
|
|
172
|
-
const mockDeps = [
|
|
173
|
-
{ name: "express", declaredConstraint: "^4.18.0", scope: "production", ecosystem: "npm", sourceManifest: "package.json" },
|
|
174
|
-
{ name: "lodash", declaredConstraint: "~4.17.21", scope: "production", ecosystem: "npm", sourceManifest: "package.json" },
|
|
175
|
-
{ name: "vitest", declaredConstraint: "^1.0.0", scope: "development", ecosystem: "npm", sourceManifest: "package.json" }
|
|
176
|
-
];
|
|
177
|
-
const plugin = {
|
|
178
|
-
ecosystem: "npm",
|
|
179
|
-
manifestFiles: ["package.json"],
|
|
180
|
-
canExtract: (p) => path.basename(p) === "package.json",
|
|
181
|
-
extract: async () => mockDeps
|
|
182
|
-
};
|
|
183
|
-
adapter.registerPlugin(plugin);
|
|
184
|
-
const result = await adapter.extractAll();
|
|
185
|
-
(0, import_vitest.expect)(result.dependenciesCreated).toBe(3);
|
|
186
|
-
(0, import_vitest.expect)(result.manifestsParsed).toBe(1);
|
|
187
|
-
(0, import_vitest.expect)(result.warnings).toHaveLength(0);
|
|
188
|
-
(0, import_vitest.expect)(result.errors).toHaveLength(0);
|
|
189
|
-
});
|
|
190
|
-
(0, import_vitest.it)("should fall back to architecture parser when no plugin registered", async () => {
|
|
191
|
-
fs.writeFileSync(path.join(tmpDir, "package.json"), JSON.stringify({
|
|
192
|
-
name: "test-project",
|
|
193
|
-
dependencies: { express: "^4.18.0", lodash: "~4.17.21" }
|
|
194
|
-
}));
|
|
195
|
-
const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
|
|
196
|
-
const result = await adapter.extractAll();
|
|
197
|
-
(0, import_vitest.expect)(result.dependenciesCreated).toBe(2);
|
|
198
|
-
(0, import_vitest.expect)(result.manifestsParsed).toBe(1);
|
|
199
|
-
(0, import_vitest.expect)(result.warnings.length).toBeGreaterThan(0);
|
|
200
|
-
(0, import_vitest.expect)(result.warnings[0].message).toContain("No version extraction plugin");
|
|
201
|
-
});
|
|
202
|
-
(0, import_vitest.it)("should handle plugin extraction errors gracefully", async () => {
|
|
203
|
-
fs.writeFileSync(path.join(tmpDir, "package.json"), JSON.stringify({
|
|
204
|
-
name: "test-project",
|
|
205
|
-
dependencies: { express: "^4.18.0" }
|
|
206
|
-
}));
|
|
207
|
-
const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
|
|
208
|
-
const plugin = {
|
|
209
|
-
ecosystem: "npm",
|
|
210
|
-
manifestFiles: ["package.json"],
|
|
211
|
-
canExtract: () => true,
|
|
212
|
-
extract: async () => {
|
|
213
|
-
throw new Error("Parse failed");
|
|
214
|
-
}
|
|
215
|
-
};
|
|
216
|
-
adapter.registerPlugin(plugin);
|
|
217
|
-
const result = await adapter.extractAll();
|
|
218
|
-
(0, import_vitest.expect)(result.dependenciesCreated).toBe(0);
|
|
219
|
-
(0, import_vitest.expect)(result.errors).toHaveLength(1);
|
|
220
|
-
(0, import_vitest.expect)(result.errors[0].message).toBe("Parse failed");
|
|
221
|
-
});
|
|
222
|
-
(0, import_vitest.it)("should handle empty project with no manifests", async () => {
|
|
223
|
-
const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
|
|
224
|
-
const result = await adapter.extractAll();
|
|
225
|
-
(0, import_vitest.expect)(result.dependenciesCreated).toBe(0);
|
|
226
|
-
(0, import_vitest.expect)(result.manifestsParsed).toBe(0);
|
|
227
|
-
(0, import_vitest.expect)(result.warnings).toHaveLength(0);
|
|
228
|
-
(0, import_vitest.expect)(result.errors).toHaveLength(0);
|
|
229
|
-
});
|
|
230
|
-
});
|
|
231
|
-
(0, import_vitest.describe)("extractFromManifest", () => {
|
|
232
|
-
(0, import_vitest.it)("should use plugin when available", async () => {
|
|
233
|
-
const manifestPath = path.join(tmpDir, "package.json");
|
|
234
|
-
fs.writeFileSync(manifestPath, JSON.stringify({
|
|
235
|
-
name: "test",
|
|
236
|
-
dependencies: { express: "^4.0.0" }
|
|
237
|
-
}));
|
|
238
|
-
const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
|
|
239
|
-
const expectedDeps = [
|
|
240
|
-
{ name: "express", declaredConstraint: "^4.0.0", scope: "production", ecosystem: "npm", sourceManifest: "package.json" }
|
|
241
|
-
];
|
|
242
|
-
adapter.registerPlugin({
|
|
243
|
-
ecosystem: "npm",
|
|
244
|
-
manifestFiles: ["package.json"],
|
|
245
|
-
canExtract: (p) => path.basename(p) === "package.json",
|
|
246
|
-
extract: async () => expectedDeps
|
|
247
|
-
});
|
|
248
|
-
const deps = await adapter.extractFromManifest(manifestPath);
|
|
249
|
-
(0, import_vitest.expect)(deps).toEqual(expectedDeps);
|
|
250
|
-
});
|
|
251
|
-
(0, import_vitest.it)("should fall back to architecture parser when no plugin", async () => {
|
|
252
|
-
const manifestPath = path.join(tmpDir, "package.json");
|
|
253
|
-
fs.writeFileSync(manifestPath, JSON.stringify({
|
|
254
|
-
name: "test",
|
|
255
|
-
dependencies: { express: "^4.0.0", lodash: "~4.17.0" }
|
|
256
|
-
}));
|
|
257
|
-
const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
|
|
258
|
-
const deps = await adapter.extractFromManifest(manifestPath);
|
|
259
|
-
(0, import_vitest.expect)(deps).toHaveLength(2);
|
|
260
|
-
(0, import_vitest.expect)(deps[0].declaredConstraint).toBe("*");
|
|
261
|
-
(0, import_vitest.expect)(deps[0].scope).toBe("production");
|
|
262
|
-
});
|
|
263
|
-
(0, import_vitest.it)("should return empty array for unknown manifest type", async () => {
|
|
264
|
-
const manifestPath = path.join(tmpDir, "unknown.txt");
|
|
265
|
-
fs.writeFileSync(manifestPath, "some content");
|
|
266
|
-
const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
|
|
267
|
-
const deps = await adapter.extractFromManifest(manifestPath);
|
|
268
|
-
(0, import_vitest.expect)(deps).toHaveLength(0);
|
|
269
|
-
});
|
|
270
|
-
});
|
|
271
|
-
});
|
|
272
|
-
//# sourceMappingURL=adapter.test.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/security/manifest/adapter.test.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Unit tests for SecurityManifestAdapter\n */\nimport { describe, it, expect, beforeEach, afterEach } from 'vitest';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { SecurityManifestAdapter, type VersionExtractionPlugin } from './adapter';\nimport type { ParsedDependency } from '../types';\n\ndescribe('SecurityManifestAdapter', () => {\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'sec-adapter-test-'));\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n describe('constructor', () => {\n it('should initialize with architecture parsers', () => {\n const adapter = new SecurityManifestAdapter(tmpDir);\n const parsers = adapter.getArchParsers();\n expect(parsers.length).toBeGreaterThan(0);\n // Should include the known parsers\n const names = parsers.map(p => p.name);\n expect(names).toContain('npm');\n expect(names).toContain('cargo');\n expect(names).toContain('go');\n expect(names).toContain('maven');\n expect(names).toContain('python');\n });\n });\n\n describe('registerPlugin', () => {\n it('should register and retrieve a version extraction plugin', () => {\n const adapter = new SecurityManifestAdapter(tmpDir);\n const plugin: VersionExtractionPlugin = {\n ecosystem: 'npm',\n manifestFiles: ['package.json'],\n canExtract: (p) => path.basename(p) === 'package.json',\n extract: async () => [],\n };\n adapter.registerPlugin(plugin);\n const plugins = adapter.getPlugins();\n expect(plugins).toHaveLength(1);\n expect(plugins[0].ecosystem).toBe('npm');\n });\n\n it('should overwrite plugin for same ecosystem', () => {\n const adapter = new SecurityManifestAdapter(tmpDir);\n const plugin1: VersionExtractionPlugin = {\n ecosystem: 'npm',\n manifestFiles: ['package.json'],\n canExtract: () => true,\n extract: async () => [{ name: 'a', declaredConstraint: '1.0', scope: 'production', ecosystem: 'npm', sourceManifest: 'package.json' }],\n };\n const plugin2: VersionExtractionPlugin = {\n ecosystem: 'npm',\n manifestFiles: ['package.json'],\n canExtract: () => true,\n extract: async () => [{ name: 'b', declaredConstraint: '2.0', scope: 'development', ecosystem: 'npm', sourceManifest: 'package.json' }],\n };\n adapter.registerPlugin(plugin1);\n adapter.registerPlugin(plugin2);\n const plugins = adapter.getPlugins();\n expect(plugins).toHaveLength(1);\n expect(plugins[0]).toBe(plugin2);\n });\n });\n\n describe('discoverManifests', () => {\n it('should discover package.json files', () => {\n fs.writeFileSync(path.join(tmpDir, 'package.json'), JSON.stringify({ name: 'test', dependencies: { express: '^4.0.0' } }));\n const adapter = new SecurityManifestAdapter(tmpDir);\n const manifests = adapter.discoverManifests();\n expect(manifests).toHaveLength(1);\n expect(manifests[0]).toBe(path.join(tmpDir, 'package.json'));\n });\n\n it('should discover nested manifest files', () => {\n fs.mkdirSync(path.join(tmpDir, 'sub'));\n fs.writeFileSync(path.join(tmpDir, 'package.json'), JSON.stringify({ name: 'root' }));\n fs.writeFileSync(path.join(tmpDir, 'sub', 'package.json'), JSON.stringify({ name: 'sub' }));\n const adapter = new SecurityManifestAdapter(tmpDir);\n const manifests = adapter.discoverManifests();\n expect(manifests).toHaveLength(2);\n });\n\n it('should skip node_modules directory', () => {\n fs.mkdirSync(path.join(tmpDir, 'node_modules'));\n fs.writeFileSync(path.join(tmpDir, 'node_modules', 'package.json'), JSON.stringify({ name: 'dep' }));\n fs.writeFileSync(path.join(tmpDir, 'package.json'), JSON.stringify({ name: 'root' }));\n const adapter = new SecurityManifestAdapter(tmpDir);\n const manifests = adapter.discoverManifests();\n expect(manifests).toHaveLength(1);\n expect(manifests[0]).toBe(path.join(tmpDir, 'package.json'));\n });\n\n it('should skip .git directory', () => {\n fs.mkdirSync(path.join(tmpDir, '.git'));\n fs.writeFileSync(path.join(tmpDir, '.git', 'package.json'), JSON.stringify({ name: 'git' }));\n fs.writeFileSync(path.join(tmpDir, 'package.json'), JSON.stringify({ name: 'root' }));\n const adapter = new SecurityManifestAdapter(tmpDir);\n const manifests = adapter.discoverManifests();\n expect(manifests).toHaveLength(1);\n });\n\n it('should skip dist and build directories', () => {\n fs.mkdirSync(path.join(tmpDir, 'dist'));\n fs.mkdirSync(path.join(tmpDir, 'build'));\n fs.writeFileSync(path.join(tmpDir, 'dist', 'package.json'), JSON.stringify({ name: 'dist' }));\n fs.writeFileSync(path.join(tmpDir, 'build', 'package.json'), JSON.stringify({ name: 'build' }));\n fs.writeFileSync(path.join(tmpDir, 'package.json'), JSON.stringify({ name: 'root' }));\n const adapter = new SecurityManifestAdapter(tmpDir);\n const manifests = adapter.discoverManifests();\n expect(manifests).toHaveLength(1);\n });\n\n it('should discover multiple ecosystem manifests', () => {\n fs.writeFileSync(path.join(tmpDir, 'package.json'), JSON.stringify({ name: 'js-project' }));\n fs.writeFileSync(path.join(tmpDir, 'Cargo.toml'), '[package]\\nname = \"rust-project\"\\nversion = \"0.1.0\"');\n fs.writeFileSync(path.join(tmpDir, 'go.mod'), 'module example.com/mymod\\n\\ngo 1.21');\n const adapter = new SecurityManifestAdapter(tmpDir);\n const manifests = adapter.discoverManifests();\n expect(manifests).toHaveLength(3);\n });\n\n it('should return empty array for empty directory', () => {\n const adapter = new SecurityManifestAdapter(tmpDir);\n const manifests = adapter.discoverManifests();\n expect(manifests).toHaveLength(0);\n });\n });\n\n describe('getEcosystem', () => {\n it('should return npm for package.json', () => {\n const adapter = new SecurityManifestAdapter(tmpDir);\n expect(adapter.getEcosystem('/some/path/package.json')).toBe('npm');\n });\n\n it('should return cargo for Cargo.toml', () => {\n const adapter = new SecurityManifestAdapter(tmpDir);\n expect(adapter.getEcosystem('/some/path/Cargo.toml')).toBe('cargo');\n });\n\n it('should return go for go.mod', () => {\n const adapter = new SecurityManifestAdapter(tmpDir);\n expect(adapter.getEcosystem('/some/path/go.mod')).toBe('go');\n });\n\n it('should return maven for pom.xml', () => {\n const adapter = new SecurityManifestAdapter(tmpDir);\n expect(adapter.getEcosystem('/some/path/pom.xml')).toBe('maven');\n });\n\n it('should return undefined for unknown files', () => {\n const adapter = new SecurityManifestAdapter(tmpDir);\n expect(adapter.getEcosystem('/some/path/unknown.txt')).toBeUndefined();\n });\n });\n\n describe('extractAll', () => {\n it('should use registered plugin for extraction', async () => {\n fs.writeFileSync(path.join(tmpDir, 'package.json'), JSON.stringify({\n name: 'test-project',\n dependencies: { express: '^4.18.0', lodash: '~4.17.21' },\n devDependencies: { vitest: '^1.0.0' },\n }));\n\n const adapter = new SecurityManifestAdapter(tmpDir);\n const mockDeps: ParsedDependency[] = [\n { name: 'express', declaredConstraint: '^4.18.0', scope: 'production', ecosystem: 'npm', sourceManifest: 'package.json' },\n { name: 'lodash', declaredConstraint: '~4.17.21', scope: 'production', ecosystem: 'npm', sourceManifest: 'package.json' },\n { name: 'vitest', declaredConstraint: '^1.0.0', scope: 'development', ecosystem: 'npm', sourceManifest: 'package.json' },\n ];\n\n const plugin: VersionExtractionPlugin = {\n ecosystem: 'npm',\n manifestFiles: ['package.json'],\n canExtract: (p) => path.basename(p) === 'package.json',\n extract: async () => mockDeps,\n };\n adapter.registerPlugin(plugin);\n\n const result = await adapter.extractAll();\n expect(result.dependenciesCreated).toBe(3);\n expect(result.manifestsParsed).toBe(1);\n expect(result.warnings).toHaveLength(0);\n expect(result.errors).toHaveLength(0);\n });\n\n it('should fall back to architecture parser when no plugin registered', async () => {\n fs.writeFileSync(path.join(tmpDir, 'package.json'), JSON.stringify({\n name: 'test-project',\n dependencies: { express: '^4.18.0', lodash: '~4.17.21' },\n }));\n\n const adapter = new SecurityManifestAdapter(tmpDir);\n const result = await adapter.extractAll();\n\n // Should extract deps from architecture parser (names only)\n expect(result.dependenciesCreated).toBe(2);\n expect(result.manifestsParsed).toBe(1);\n // Should warn about missing plugin\n expect(result.warnings.length).toBeGreaterThan(0);\n expect(result.warnings[0].message).toContain('No version extraction plugin');\n });\n\n it('should handle plugin extraction errors gracefully', async () => {\n fs.writeFileSync(path.join(tmpDir, 'package.json'), JSON.stringify({\n name: 'test-project',\n dependencies: { express: '^4.18.0' },\n }));\n\n const adapter = new SecurityManifestAdapter(tmpDir);\n const plugin: VersionExtractionPlugin = {\n ecosystem: 'npm',\n manifestFiles: ['package.json'],\n canExtract: () => true,\n extract: async () => { throw new Error('Parse failed'); },\n };\n adapter.registerPlugin(plugin);\n\n const result = await adapter.extractAll();\n expect(result.dependenciesCreated).toBe(0);\n expect(result.errors).toHaveLength(1);\n expect(result.errors[0].message).toBe('Parse failed');\n });\n\n it('should handle empty project with no manifests', async () => {\n const adapter = new SecurityManifestAdapter(tmpDir);\n const result = await adapter.extractAll();\n expect(result.dependenciesCreated).toBe(0);\n expect(result.manifestsParsed).toBe(0);\n expect(result.warnings).toHaveLength(0);\n expect(result.errors).toHaveLength(0);\n });\n });\n\n describe('extractFromManifest', () => {\n it('should use plugin when available', async () => {\n const manifestPath = path.join(tmpDir, 'package.json');\n fs.writeFileSync(manifestPath, JSON.stringify({\n name: 'test',\n dependencies: { express: '^4.0.0' },\n }));\n\n const adapter = new SecurityManifestAdapter(tmpDir);\n const expectedDeps: ParsedDependency[] = [\n { name: 'express', declaredConstraint: '^4.0.0', scope: 'production', ecosystem: 'npm', sourceManifest: 'package.json' },\n ];\n\n adapter.registerPlugin({\n ecosystem: 'npm',\n manifestFiles: ['package.json'],\n canExtract: (p) => path.basename(p) === 'package.json',\n extract: async () => expectedDeps,\n });\n\n const deps = await adapter.extractFromManifest(manifestPath);\n expect(deps).toEqual(expectedDeps);\n });\n\n it('should fall back to architecture parser when no plugin', async () => {\n const manifestPath = path.join(tmpDir, 'package.json');\n fs.writeFileSync(manifestPath, JSON.stringify({\n name: 'test',\n dependencies: { express: '^4.0.0', lodash: '~4.17.0' },\n }));\n\n const adapter = new SecurityManifestAdapter(tmpDir);\n const deps = await adapter.extractFromManifest(manifestPath);\n expect(deps).toHaveLength(2);\n // Fallback uses '*' as constraint and 'production' as default scope\n expect(deps[0].declaredConstraint).toBe('*');\n expect(deps[0].scope).toBe('production');\n });\n\n it('should return empty array for unknown manifest type', async () => {\n const manifestPath = path.join(tmpDir, 'unknown.txt');\n fs.writeFileSync(manifestPath, 'some content');\n\n const adapter = new SecurityManifestAdapter(tmpDir);\n const deps = await adapter.extractFromManifest(manifestPath);\n expect(deps).toHaveLength(0);\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var import_vitest = require("vitest");
|
|
3
|
-
var import_parser = require("./parser");
|
|
4
|
-
(0, import_vitest.describe)("compareVersions", () => {
|
|
5
|
-
(0, import_vitest.it)("should compare simple semver versions", () => {
|
|
6
|
-
(0, import_vitest.expect)((0, import_parser.compareVersions)("1.0.0", "2.0.0")).toBeLessThan(0);
|
|
7
|
-
(0, import_vitest.expect)((0, import_parser.compareVersions)("2.0.0", "1.0.0")).toBeGreaterThan(0);
|
|
8
|
-
(0, import_vitest.expect)((0, import_parser.compareVersions)("1.0.0", "1.0.0")).toBe(0);
|
|
9
|
-
});
|
|
10
|
-
(0, import_vitest.it)("should compare versions with different patch levels", () => {
|
|
11
|
-
(0, import_vitest.expect)((0, import_parser.compareVersions)("1.2.3", "1.2.4")).toBeLessThan(0);
|
|
12
|
-
(0, import_vitest.expect)((0, import_parser.compareVersions)("1.2.10", "1.2.9")).toBeGreaterThan(0);
|
|
13
|
-
});
|
|
14
|
-
(0, import_vitest.it)("should compare versions with different minor levels", () => {
|
|
15
|
-
(0, import_vitest.expect)((0, import_parser.compareVersions)("1.1.0", "1.2.0")).toBeLessThan(0);
|
|
16
|
-
(0, import_vitest.expect)((0, import_parser.compareVersions)("1.10.0", "1.9.0")).toBeGreaterThan(0);
|
|
17
|
-
});
|
|
18
|
-
(0, import_vitest.it)("should handle versions with leading v", () => {
|
|
19
|
-
(0, import_vitest.expect)((0, import_parser.compareVersions)("v1.2.3", "v1.2.4")).toBeLessThan(0);
|
|
20
|
-
(0, import_vitest.expect)((0, import_parser.compareVersions)("v2.0.0", "1.0.0")).toBeGreaterThan(0);
|
|
21
|
-
});
|
|
22
|
-
(0, import_vitest.it)("should handle constraint prefixes (^, ~, >=)", () => {
|
|
23
|
-
(0, import_vitest.expect)((0, import_parser.compareVersions)("^1.2.3", "^1.2.4")).toBeLessThan(0);
|
|
24
|
-
(0, import_vitest.expect)((0, import_parser.compareVersions)("~2.0.0", "~1.0.0")).toBeGreaterThan(0);
|
|
25
|
-
(0, import_vitest.expect)((0, import_parser.compareVersions)(">=1.0.0", ">=2.0.0")).toBeLessThan(0);
|
|
26
|
-
});
|
|
27
|
-
(0, import_vitest.it)("should handle versions with different segment counts", () => {
|
|
28
|
-
(0, import_vitest.expect)((0, import_parser.compareVersions)("1.2", "1.2.1")).toBeLessThan(0);
|
|
29
|
-
(0, import_vitest.expect)((0, import_parser.compareVersions)("1.2.0", "1.2")).toBe(0);
|
|
30
|
-
});
|
|
31
|
-
(0, import_vitest.it)("should handle wildcard constraint as lowest", () => {
|
|
32
|
-
(0, import_vitest.expect)((0, import_parser.compareVersions)("1.0.0", "*")).toBeGreaterThan(0);
|
|
33
|
-
});
|
|
34
|
-
});
|
|
35
|
-
(0, import_vitest.describe)("deduplicateDependencies", () => {
|
|
36
|
-
(0, import_vitest.it)("should return unique dependencies when no duplicates exist", () => {
|
|
37
|
-
const deps = [
|
|
38
|
-
{ name: "express", declaredConstraint: "^4.18.0", resolvedVersion: "4.18.2", scope: "production", ecosystem: "npm", sourceManifest: "package.json" },
|
|
39
|
-
{ name: "lodash", declaredConstraint: "^4.17.0", resolvedVersion: "4.17.21", scope: "production", ecosystem: "npm", sourceManifest: "package.json" }
|
|
40
|
-
];
|
|
41
|
-
const result = (0, import_parser.deduplicateDependencies)(deps);
|
|
42
|
-
(0, import_vitest.expect)(result).toHaveLength(2);
|
|
43
|
-
});
|
|
44
|
-
(0, import_vitest.it)("should deduplicate same (name, ecosystem) keeping highest version", () => {
|
|
45
|
-
const deps = [
|
|
46
|
-
{ name: "express", declaredConstraint: "^4.17.0", resolvedVersion: "4.17.1", scope: "production", ecosystem: "npm", sourceManifest: "packages/a/package.json" },
|
|
47
|
-
{ name: "express", declaredConstraint: "^4.18.0", resolvedVersion: "4.18.2", scope: "production", ecosystem: "npm", sourceManifest: "packages/b/package.json" }
|
|
48
|
-
];
|
|
49
|
-
const result = (0, import_parser.deduplicateDependencies)(deps);
|
|
50
|
-
(0, import_vitest.expect)(result).toHaveLength(1);
|
|
51
|
-
(0, import_vitest.expect)(result[0].name).toBe("express");
|
|
52
|
-
(0, import_vitest.expect)(result[0].resolvedVersion).toBe("4.18.2");
|
|
53
|
-
(0, import_vitest.expect)(result[0].declaredConstraint).toBe("^4.18.0");
|
|
54
|
-
(0, import_vitest.expect)(result[0].sourceManifests).toEqual(["packages/a/package.json", "packages/b/package.json"]);
|
|
55
|
-
});
|
|
56
|
-
(0, import_vitest.it)("should keep both when same name but different ecosystems", () => {
|
|
57
|
-
const deps = [
|
|
58
|
-
{ name: "serde", declaredConstraint: "1.0.0", resolvedVersion: "1.0.0", scope: "production", ecosystem: "cargo", sourceManifest: "Cargo.toml" },
|
|
59
|
-
{ name: "serde", declaredConstraint: "1.0.0", resolvedVersion: "1.0.0", scope: "production", ecosystem: "npm", sourceManifest: "package.json" }
|
|
60
|
-
];
|
|
61
|
-
const result = (0, import_parser.deduplicateDependencies)(deps);
|
|
62
|
-
(0, import_vitest.expect)(result).toHaveLength(2);
|
|
63
|
-
});
|
|
64
|
-
(0, import_vitest.it)("should collect all source manifests for duplicates", () => {
|
|
65
|
-
const deps = [
|
|
66
|
-
{ name: "lodash", declaredConstraint: "^4.17.0", resolvedVersion: "4.17.21", scope: "production", ecosystem: "npm", sourceManifest: "package.json" },
|
|
67
|
-
{ name: "lodash", declaredConstraint: "^4.17.0", resolvedVersion: "4.17.21", scope: "development", ecosystem: "npm", sourceManifest: "packages/lib/package.json" },
|
|
68
|
-
{ name: "lodash", declaredConstraint: "^4.17.0", resolvedVersion: "4.17.21", scope: "production", ecosystem: "npm", sourceManifest: "packages/app/package.json" }
|
|
69
|
-
];
|
|
70
|
-
const result = (0, import_parser.deduplicateDependencies)(deps);
|
|
71
|
-
(0, import_vitest.expect)(result).toHaveLength(1);
|
|
72
|
-
(0, import_vitest.expect)(result[0].sourceManifests).toHaveLength(3);
|
|
73
|
-
(0, import_vitest.expect)(result[0].sourceManifests).toContain("package.json");
|
|
74
|
-
(0, import_vitest.expect)(result[0].sourceManifests).toContain("packages/lib/package.json");
|
|
75
|
-
(0, import_vitest.expect)(result[0].sourceManifests).toContain("packages/app/package.json");
|
|
76
|
-
});
|
|
77
|
-
(0, import_vitest.it)("should not duplicate source manifests when same manifest appears twice", () => {
|
|
78
|
-
const deps = [
|
|
79
|
-
{ name: "express", declaredConstraint: "^4.17.0", scope: "production", ecosystem: "npm", sourceManifest: "package.json" },
|
|
80
|
-
{ name: "express", declaredConstraint: "^4.18.0", scope: "production", ecosystem: "npm", sourceManifest: "package.json" }
|
|
81
|
-
];
|
|
82
|
-
const result = (0, import_parser.deduplicateDependencies)(deps);
|
|
83
|
-
(0, import_vitest.expect)(result).toHaveLength(1);
|
|
84
|
-
(0, import_vitest.expect)(result[0].sourceManifests).toEqual(["package.json"]);
|
|
85
|
-
});
|
|
86
|
-
(0, import_vitest.it)("should use declaredConstraint for comparison when resolvedVersion is missing", () => {
|
|
87
|
-
const deps = [
|
|
88
|
-
{ name: "django", declaredConstraint: "3.2.0", scope: "production", ecosystem: "python", sourceManifest: "requirements.txt" },
|
|
89
|
-
{ name: "django", declaredConstraint: "4.2.0", scope: "production", ecosystem: "python", sourceManifest: "packages/api/requirements.txt" }
|
|
90
|
-
];
|
|
91
|
-
const result = (0, import_parser.deduplicateDependencies)(deps);
|
|
92
|
-
(0, import_vitest.expect)(result).toHaveLength(1);
|
|
93
|
-
(0, import_vitest.expect)(result[0].declaredConstraint).toBe("4.2.0");
|
|
94
|
-
});
|
|
95
|
-
(0, import_vitest.it)("should handle empty input", () => {
|
|
96
|
-
const result = (0, import_parser.deduplicateDependencies)([]);
|
|
97
|
-
(0, import_vitest.expect)(result).toHaveLength(0);
|
|
98
|
-
});
|
|
99
|
-
(0, import_vitest.it)("should prefer resolvedVersion over declaredConstraint for comparison", () => {
|
|
100
|
-
const deps = [
|
|
101
|
-
{ name: "express", declaredConstraint: "^4.0.0", resolvedVersion: "4.18.2", scope: "production", ecosystem: "npm", sourceManifest: "a/package.json" },
|
|
102
|
-
{ name: "express", declaredConstraint: "^5.0.0", resolvedVersion: "5.0.0", scope: "production", ecosystem: "npm", sourceManifest: "b/package.json" }
|
|
103
|
-
];
|
|
104
|
-
const result = (0, import_parser.deduplicateDependencies)(deps);
|
|
105
|
-
(0, import_vitest.expect)(result).toHaveLength(1);
|
|
106
|
-
(0, import_vitest.expect)(result[0].resolvedVersion).toBe("5.0.0");
|
|
107
|
-
(0, import_vitest.expect)(result[0].declaredConstraint).toBe("^5.0.0");
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
//# sourceMappingURL=parser.test.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/security/manifest/parser.test.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Unit tests for ManifestParser orchestrator\n */\nimport { describe, it, expect } from 'vitest';\nimport { compareVersions, deduplicateDependencies } from './parser';\nimport type { ParsedDependency } from '../types';\n\ndescribe('compareVersions', () => {\n it('should compare simple semver versions', () => {\n expect(compareVersions('1.0.0', '2.0.0')).toBeLessThan(0);\n expect(compareVersions('2.0.0', '1.0.0')).toBeGreaterThan(0);\n expect(compareVersions('1.0.0', '1.0.0')).toBe(0);\n });\n\n it('should compare versions with different patch levels', () => {\n expect(compareVersions('1.2.3', '1.2.4')).toBeLessThan(0);\n expect(compareVersions('1.2.10', '1.2.9')).toBeGreaterThan(0);\n });\n\n it('should compare versions with different minor levels', () => {\n expect(compareVersions('1.1.0', '1.2.0')).toBeLessThan(0);\n expect(compareVersions('1.10.0', '1.9.0')).toBeGreaterThan(0);\n });\n\n it('should handle versions with leading v', () => {\n expect(compareVersions('v1.2.3', 'v1.2.4')).toBeLessThan(0);\n expect(compareVersions('v2.0.0', '1.0.0')).toBeGreaterThan(0);\n });\n\n it('should handle constraint prefixes (^, ~, >=)', () => {\n expect(compareVersions('^1.2.3', '^1.2.4')).toBeLessThan(0);\n expect(compareVersions('~2.0.0', '~1.0.0')).toBeGreaterThan(0);\n expect(compareVersions('>=1.0.0', '>=2.0.0')).toBeLessThan(0);\n });\n\n it('should handle versions with different segment counts', () => {\n expect(compareVersions('1.2', '1.2.1')).toBeLessThan(0);\n expect(compareVersions('1.2.0', '1.2')).toBe(0);\n });\n\n it('should handle wildcard constraint as lowest', () => {\n // '*' is not numeric, so it falls to lexicographic comparison\n // but in practice we compare effective versions\n expect(compareVersions('1.0.0', '*')).toBeGreaterThan(0);\n });\n});\n\ndescribe('deduplicateDependencies', () => {\n it('should return unique dependencies when no duplicates exist', () => {\n const deps: ParsedDependency[] = [\n { name: 'express', declaredConstraint: '^4.18.0', resolvedVersion: '4.18.2', scope: 'production', ecosystem: 'npm', sourceManifest: 'package.json' },\n { name: 'lodash', declaredConstraint: '^4.17.0', resolvedVersion: '4.17.21', scope: 'production', ecosystem: 'npm', sourceManifest: 'package.json' },\n ];\n\n const result = deduplicateDependencies(deps);\n expect(result).toHaveLength(2);\n });\n\n it('should deduplicate same (name, ecosystem) keeping highest version', () => {\n const deps: ParsedDependency[] = [\n { name: 'express', declaredConstraint: '^4.17.0', resolvedVersion: '4.17.1', scope: 'production', ecosystem: 'npm', sourceManifest: 'packages/a/package.json' },\n { name: 'express', declaredConstraint: '^4.18.0', resolvedVersion: '4.18.2', scope: 'production', ecosystem: 'npm', sourceManifest: 'packages/b/package.json' },\n ];\n\n const result = deduplicateDependencies(deps);\n expect(result).toHaveLength(1);\n expect(result[0].name).toBe('express');\n expect(result[0].resolvedVersion).toBe('4.18.2');\n expect(result[0].declaredConstraint).toBe('^4.18.0');\n expect(result[0].sourceManifests).toEqual(['packages/a/package.json', 'packages/b/package.json']);\n });\n\n it('should keep both when same name but different ecosystems', () => {\n const deps: ParsedDependency[] = [\n { name: 'serde', declaredConstraint: '1.0.0', resolvedVersion: '1.0.0', scope: 'production', ecosystem: 'cargo', sourceManifest: 'Cargo.toml' },\n { name: 'serde', declaredConstraint: '1.0.0', resolvedVersion: '1.0.0', scope: 'production', ecosystem: 'npm', sourceManifest: 'package.json' },\n ];\n\n const result = deduplicateDependencies(deps);\n expect(result).toHaveLength(2);\n });\n\n it('should collect all source manifests for duplicates', () => {\n const deps: ParsedDependency[] = [\n { name: 'lodash', declaredConstraint: '^4.17.0', resolvedVersion: '4.17.21', scope: 'production', ecosystem: 'npm', sourceManifest: 'package.json' },\n { name: 'lodash', declaredConstraint: '^4.17.0', resolvedVersion: '4.17.21', scope: 'development', ecosystem: 'npm', sourceManifest: 'packages/lib/package.json' },\n { name: 'lodash', declaredConstraint: '^4.17.0', resolvedVersion: '4.17.21', scope: 'production', ecosystem: 'npm', sourceManifest: 'packages/app/package.json' },\n ];\n\n const result = deduplicateDependencies(deps);\n expect(result).toHaveLength(1);\n expect(result[0].sourceManifests).toHaveLength(3);\n expect(result[0].sourceManifests).toContain('package.json');\n expect(result[0].sourceManifests).toContain('packages/lib/package.json');\n expect(result[0].sourceManifests).toContain('packages/app/package.json');\n });\n\n it('should not duplicate source manifests when same manifest appears twice', () => {\n const deps: ParsedDependency[] = [\n { name: 'express', declaredConstraint: '^4.17.0', scope: 'production', ecosystem: 'npm', sourceManifest: 'package.json' },\n { name: 'express', declaredConstraint: '^4.18.0', scope: 'production', ecosystem: 'npm', sourceManifest: 'package.json' },\n ];\n\n const result = deduplicateDependencies(deps);\n expect(result).toHaveLength(1);\n expect(result[0].sourceManifests).toEqual(['package.json']);\n });\n\n it('should use declaredConstraint for comparison when resolvedVersion is missing', () => {\n const deps: ParsedDependency[] = [\n { name: 'django', declaredConstraint: '3.2.0', scope: 'production', ecosystem: 'python', sourceManifest: 'requirements.txt' },\n { name: 'django', declaredConstraint: '4.2.0', scope: 'production', ecosystem: 'python', sourceManifest: 'packages/api/requirements.txt' },\n ];\n\n const result = deduplicateDependencies(deps);\n expect(result).toHaveLength(1);\n expect(result[0].declaredConstraint).toBe('4.2.0');\n });\n\n it('should handle empty input', () => {\n const result = deduplicateDependencies([]);\n expect(result).toHaveLength(0);\n });\n\n it('should prefer resolvedVersion over declaredConstraint for comparison', () => {\n const deps: ParsedDependency[] = [\n { name: 'express', declaredConstraint: '^4.0.0', resolvedVersion: '4.18.2', scope: 'production', ecosystem: 'npm', sourceManifest: 'a/package.json' },\n { name: 'express', declaredConstraint: '^5.0.0', resolvedVersion: '5.0.0', scope: 'production', ecosystem: 'npm', sourceManifest: 'b/package.json' },\n ];\n\n const result = deduplicateDependencies(deps);\n expect(result).toHaveLength(1);\n expect(result[0].resolvedVersion).toBe('5.0.0');\n expect(result[0].declaredConstraint).toBe('^5.0.0');\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|