@opencodehub/ingestion 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +69 -0
- package/dist/extract/index.d.ts +8 -0
- package/dist/extract/index.d.ts.map +1 -0
- package/dist/extract/index.js +6 -0
- package/dist/extract/index.js.map +1 -0
- package/dist/extract/orm-detector.d.ts +19 -0
- package/dist/extract/orm-detector.d.ts.map +1 -0
- package/dist/extract/orm-detector.js +209 -0
- package/dist/extract/orm-detector.js.map +1 -0
- package/dist/extract/property-access.d.ts +76 -0
- package/dist/extract/property-access.d.ts.map +1 -0
- package/dist/extract/property-access.js +260 -0
- package/dist/extract/property-access.js.map +1 -0
- package/dist/extract/receiver-resolver.d.ts +86 -0
- package/dist/extract/receiver-resolver.d.ts.map +1 -0
- package/dist/extract/receiver-resolver.js +77 -0
- package/dist/extract/receiver-resolver.js.map +1 -0
- package/dist/extract/route-detector-java.d.ts +29 -0
- package/dist/extract/route-detector-java.d.ts.map +1 -0
- package/dist/extract/route-detector-java.js +190 -0
- package/dist/extract/route-detector-java.js.map +1 -0
- package/dist/extract/route-detector-nestjs.d.ts +30 -0
- package/dist/extract/route-detector-nestjs.d.ts.map +1 -0
- package/dist/extract/route-detector-nestjs.js +134 -0
- package/dist/extract/route-detector-nestjs.js.map +1 -0
- package/dist/extract/route-detector-python.d.ts +28 -0
- package/dist/extract/route-detector-python.d.ts.map +1 -0
- package/dist/extract/route-detector-python.js +100 -0
- package/dist/extract/route-detector-python.js.map +1 -0
- package/dist/extract/route-detector-rails.d.ts +28 -0
- package/dist/extract/route-detector-rails.d.ts.map +1 -0
- package/dist/extract/route-detector-rails.js +162 -0
- package/dist/extract/route-detector-rails.js.map +1 -0
- package/dist/extract/route-detector.d.ts +45 -0
- package/dist/extract/route-detector.d.ts.map +1 -0
- package/dist/extract/route-detector.js +467 -0
- package/dist/extract/route-detector.js.map +1 -0
- package/dist/extract/tool-detector.d.ts +26 -0
- package/dist/extract/tool-detector.d.ts.map +1 -0
- package/dist/extract/tool-detector.js +364 -0
- package/dist/extract/tool-detector.js.map +1 -0
- package/dist/extract/types.d.ts +89 -0
- package/dist/extract/types.d.ts.map +1 -0
- package/dist/extract/types.js +11 -0
- package/dist/extract/types.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/parse/cobol-regex.d.ts +85 -0
- package/dist/parse/cobol-regex.d.ts.map +1 -0
- package/dist/parse/cobol-regex.js +355 -0
- package/dist/parse/cobol-regex.js.map +1 -0
- package/dist/parse/grammar-registry.d.ts +115 -0
- package/dist/parse/grammar-registry.d.ts.map +1 -0
- package/dist/parse/grammar-registry.js +278 -0
- package/dist/parse/grammar-registry.js.map +1 -0
- package/dist/parse/index.d.ts +14 -0
- package/dist/parse/index.d.ts.map +1 -0
- package/dist/parse/index.js +10 -0
- package/dist/parse/index.js.map +1 -0
- package/dist/parse/language-detector.d.ts +17 -0
- package/dist/parse/language-detector.d.ts.map +1 -0
- package/dist/parse/language-detector.js +104 -0
- package/dist/parse/language-detector.js.map +1 -0
- package/dist/parse/parse-worker.d.ts +24 -0
- package/dist/parse/parse-worker.d.ts.map +1 -0
- package/dist/parse/parse-worker.js +230 -0
- package/dist/parse/parse-worker.js.map +1 -0
- package/dist/parse/types.d.ts +49 -0
- package/dist/parse/types.d.ts.map +1 -0
- package/dist/parse/types.js +11 -0
- package/dist/parse/types.js.map +1 -0
- package/dist/parse/unified-queries.d.ts +37 -0
- package/dist/parse/unified-queries.d.ts.map +1 -0
- package/dist/parse/unified-queries.js +623 -0
- package/dist/parse/unified-queries.js.map +1 -0
- package/dist/parse/wasm-fallback.d.ts +88 -0
- package/dist/parse/wasm-fallback.d.ts.map +1 -0
- package/dist/parse/wasm-fallback.js +258 -0
- package/dist/parse/wasm-fallback.js.map +1 -0
- package/dist/parse/worker-pool.d.ts +48 -0
- package/dist/parse/worker-pool.d.ts.map +1 -0
- package/dist/parse/worker-pool.js +97 -0
- package/dist/parse/worker-pool.js.map +1 -0
- package/dist/pipeline/dep-parsers/go.d.ts +25 -0
- package/dist/pipeline/dep-parsers/go.d.ts.map +1 -0
- package/dist/pipeline/dep-parsers/go.js +146 -0
- package/dist/pipeline/dep-parsers/go.js.map +1 -0
- package/dist/pipeline/dep-parsers/index.d.ts +17 -0
- package/dist/pipeline/dep-parsers/index.d.ts.map +1 -0
- package/dist/pipeline/dep-parsers/index.js +16 -0
- package/dist/pipeline/dep-parsers/index.js.map +1 -0
- package/dist/pipeline/dep-parsers/maven.d.ts +24 -0
- package/dist/pipeline/dep-parsers/maven.d.ts.map +1 -0
- package/dist/pipeline/dep-parsers/maven.js +131 -0
- package/dist/pipeline/dep-parsers/maven.js.map +1 -0
- package/dist/pipeline/dep-parsers/npm.d.ts +30 -0
- package/dist/pipeline/dep-parsers/npm.d.ts.map +1 -0
- package/dist/pipeline/dep-parsers/npm.js +309 -0
- package/dist/pipeline/dep-parsers/npm.js.map +1 -0
- package/dist/pipeline/dep-parsers/nuget.d.ts +24 -0
- package/dist/pipeline/dep-parsers/nuget.d.ts.map +1 -0
- package/dist/pipeline/dep-parsers/nuget.js +178 -0
- package/dist/pipeline/dep-parsers/nuget.js.map +1 -0
- package/dist/pipeline/dep-parsers/python.d.ts +21 -0
- package/dist/pipeline/dep-parsers/python.d.ts.map +1 -0
- package/dist/pipeline/dep-parsers/python.js +369 -0
- package/dist/pipeline/dep-parsers/python.js.map +1 -0
- package/dist/pipeline/dep-parsers/rust.d.ts +18 -0
- package/dist/pipeline/dep-parsers/rust.d.ts.map +1 -0
- package/dist/pipeline/dep-parsers/rust.js +134 -0
- package/dist/pipeline/dep-parsers/rust.js.map +1 -0
- package/dist/pipeline/dep-parsers/spdx-normalize.d.ts +15 -0
- package/dist/pipeline/dep-parsers/spdx-normalize.d.ts.map +1 -0
- package/dist/pipeline/dep-parsers/spdx-normalize.js +31 -0
- package/dist/pipeline/dep-parsers/spdx-normalize.js.map +1 -0
- package/dist/pipeline/dep-parsers/types.d.ts +63 -0
- package/dist/pipeline/dep-parsers/types.d.ts.map +1 -0
- package/dist/pipeline/dep-parsers/types.js +56 -0
- package/dist/pipeline/dep-parsers/types.js.map +1 -0
- package/dist/pipeline/gitignore-stack.d.ts +44 -0
- package/dist/pipeline/gitignore-stack.d.ts.map +1 -0
- package/dist/pipeline/gitignore-stack.js +69 -0
- package/dist/pipeline/gitignore-stack.js.map +1 -0
- package/dist/pipeline/gitignore.d.ts +67 -0
- package/dist/pipeline/gitignore.d.ts.map +1 -0
- package/dist/pipeline/gitignore.js +210 -0
- package/dist/pipeline/gitignore.js.map +1 -0
- package/dist/pipeline/index.d.ts +53 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +29 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/orchestrator.d.ts +105 -0
- package/dist/pipeline/orchestrator.d.ts.map +1 -0
- package/dist/pipeline/orchestrator.js +175 -0
- package/dist/pipeline/orchestrator.js.map +1 -0
- package/dist/pipeline/ownership-helpers/drift.d.ts +41 -0
- package/dist/pipeline/ownership-helpers/drift.d.ts.map +1 -0
- package/dist/pipeline/ownership-helpers/drift.js +122 -0
- package/dist/pipeline/ownership-helpers/drift.js.map +1 -0
- package/dist/pipeline/ownership-helpers/gini-community.d.ts +24 -0
- package/dist/pipeline/ownership-helpers/gini-community.d.ts.map +1 -0
- package/dist/pipeline/ownership-helpers/gini-community.js +32 -0
- package/dist/pipeline/ownership-helpers/gini-community.js.map +1 -0
- package/dist/pipeline/ownership-helpers/git-blame-batcher.d.ts +71 -0
- package/dist/pipeline/ownership-helpers/git-blame-batcher.d.ts.map +1 -0
- package/dist/pipeline/ownership-helpers/git-blame-batcher.js +178 -0
- package/dist/pipeline/ownership-helpers/git-blame-batcher.js.map +1 -0
- package/dist/pipeline/ownership-helpers/line-overlap.d.ts +35 -0
- package/dist/pipeline/ownership-helpers/line-overlap.d.ts.map +1 -0
- package/dist/pipeline/ownership-helpers/line-overlap.js +62 -0
- package/dist/pipeline/ownership-helpers/line-overlap.js.map +1 -0
- package/dist/pipeline/ownership-helpers/orphan.d.ts +73 -0
- package/dist/pipeline/ownership-helpers/orphan.d.ts.map +1 -0
- package/dist/pipeline/ownership-helpers/orphan.js +117 -0
- package/dist/pipeline/ownership-helpers/orphan.js.map +1 -0
- package/dist/pipeline/phases/accesses.d.ts +44 -0
- package/dist/pipeline/phases/accesses.d.ts.map +1 -0
- package/dist/pipeline/phases/accesses.js +194 -0
- package/dist/pipeline/phases/accesses.js.map +1 -0
- package/dist/pipeline/phases/annotate.d.ts +28 -0
- package/dist/pipeline/phases/annotate.d.ts.map +1 -0
- package/dist/pipeline/phases/annotate.js +60 -0
- package/dist/pipeline/phases/annotate.js.map +1 -0
- package/dist/pipeline/phases/cochange.d.ts +42 -0
- package/dist/pipeline/phases/cochange.d.ts.map +1 -0
- package/dist/pipeline/phases/cochange.js +0 -0
- package/dist/pipeline/phases/cochange.js.map +1 -0
- package/dist/pipeline/phases/communities.d.ts +34 -0
- package/dist/pipeline/phases/communities.d.ts.map +1 -0
- package/dist/pipeline/phases/communities.js +412 -0
- package/dist/pipeline/phases/communities.js.map +1 -0
- package/dist/pipeline/phases/complexity.d.ts +50 -0
- package/dist/pipeline/phases/complexity.d.ts.map +1 -0
- package/dist/pipeline/phases/complexity.js +794 -0
- package/dist/pipeline/phases/complexity.js.map +1 -0
- package/dist/pipeline/phases/confidence-demote.d.ts +23 -0
- package/dist/pipeline/phases/confidence-demote.d.ts.map +1 -0
- package/dist/pipeline/phases/confidence-demote.js +113 -0
- package/dist/pipeline/phases/confidence-demote.js.map +1 -0
- package/dist/pipeline/phases/content-cache.d.ts +166 -0
- package/dist/pipeline/phases/content-cache.d.ts.map +1 -0
- package/dist/pipeline/phases/content-cache.js +323 -0
- package/dist/pipeline/phases/content-cache.js.map +1 -0
- package/dist/pipeline/phases/coverage-parsers/cobertura.d.ts +25 -0
- package/dist/pipeline/phases/coverage-parsers/cobertura.d.ts.map +1 -0
- package/dist/pipeline/phases/coverage-parsers/cobertura.js +139 -0
- package/dist/pipeline/phases/coverage-parsers/cobertura.js.map +1 -0
- package/dist/pipeline/phases/coverage-parsers/coverage-py.d.ts +25 -0
- package/dist/pipeline/phases/coverage-parsers/coverage-py.d.ts.map +1 -0
- package/dist/pipeline/phases/coverage-parsers/coverage-py.js +51 -0
- package/dist/pipeline/phases/coverage-parsers/coverage-py.js.map +1 -0
- package/dist/pipeline/phases/coverage-parsers/jacoco.d.ts +32 -0
- package/dist/pipeline/phases/coverage-parsers/jacoco.d.ts.map +1 -0
- package/dist/pipeline/phases/coverage-parsers/jacoco.js +98 -0
- package/dist/pipeline/phases/coverage-parsers/jacoco.js.map +1 -0
- package/dist/pipeline/phases/coverage-parsers/lcov.d.ts +21 -0
- package/dist/pipeline/phases/coverage-parsers/lcov.d.ts.map +1 -0
- package/dist/pipeline/phases/coverage-parsers/lcov.js +104 -0
- package/dist/pipeline/phases/coverage-parsers/lcov.js.map +1 -0
- package/dist/pipeline/phases/coverage-parsers/types.d.ts +27 -0
- package/dist/pipeline/phases/coverage-parsers/types.d.ts.map +1 -0
- package/dist/pipeline/phases/coverage-parsers/types.js +39 -0
- package/dist/pipeline/phases/coverage-parsers/types.js.map +1 -0
- package/dist/pipeline/phases/coverage.d.ts +39 -0
- package/dist/pipeline/phases/coverage.d.ts.map +1 -0
- package/dist/pipeline/phases/coverage.js +154 -0
- package/dist/pipeline/phases/coverage.js.map +1 -0
- package/dist/pipeline/phases/cross-file.d.ts +40 -0
- package/dist/pipeline/phases/cross-file.d.ts.map +1 -0
- package/dist/pipeline/phases/cross-file.js +411 -0
- package/dist/pipeline/phases/cross-file.js.map +1 -0
- package/dist/pipeline/phases/dead-code.d.ts +28 -0
- package/dist/pipeline/phases/dead-code.d.ts.map +1 -0
- package/dist/pipeline/phases/dead-code.js +157 -0
- package/dist/pipeline/phases/dead-code.js.map +1 -0
- package/dist/pipeline/phases/default-set.d.ts +24 -0
- package/dist/pipeline/phases/default-set.d.ts.map +1 -0
- package/dist/pipeline/phases/default-set.js +133 -0
- package/dist/pipeline/phases/default-set.js.map +1 -0
- package/dist/pipeline/phases/dependencies.d.ts +59 -0
- package/dist/pipeline/phases/dependencies.d.ts.map +1 -0
- package/dist/pipeline/phases/dependencies.js +281 -0
- package/dist/pipeline/phases/dependencies.js.map +1 -0
- package/dist/pipeline/phases/embedder-pool.d.ts +31 -0
- package/dist/pipeline/phases/embedder-pool.d.ts.map +1 -0
- package/dist/pipeline/phases/embedder-pool.js +79 -0
- package/dist/pipeline/phases/embedder-pool.js.map +1 -0
- package/dist/pipeline/phases/embedder-worker.d.ts +28 -0
- package/dist/pipeline/phases/embedder-worker.d.ts.map +1 -0
- package/dist/pipeline/phases/embedder-worker.js +43 -0
- package/dist/pipeline/phases/embedder-worker.js.map +1 -0
- package/dist/pipeline/phases/embeddings.d.ts +117 -0
- package/dist/pipeline/phases/embeddings.d.ts.map +1 -0
- package/dist/pipeline/phases/embeddings.js +697 -0
- package/dist/pipeline/phases/embeddings.js.map +1 -0
- package/dist/pipeline/phases/fetches.d.ts +47 -0
- package/dist/pipeline/phases/fetches.d.ts.map +1 -0
- package/dist/pipeline/phases/fetches.js +207 -0
- package/dist/pipeline/phases/fetches.js.map +1 -0
- package/dist/pipeline/phases/incremental-helper.d.ts +96 -0
- package/dist/pipeline/phases/incremental-helper.d.ts.map +1 -0
- package/dist/pipeline/phases/incremental-helper.js +125 -0
- package/dist/pipeline/phases/incremental-helper.js.map +1 -0
- package/dist/pipeline/phases/incremental-scope.d.ts +67 -0
- package/dist/pipeline/phases/incremental-scope.d.ts.map +1 -0
- package/dist/pipeline/phases/incremental-scope.js +225 -0
- package/dist/pipeline/phases/incremental-scope.js.map +1 -0
- package/dist/pipeline/phases/markdown.d.ts +29 -0
- package/dist/pipeline/phases/markdown.d.ts.map +1 -0
- package/dist/pipeline/phases/markdown.js +298 -0
- package/dist/pipeline/phases/markdown.js.map +1 -0
- package/dist/pipeline/phases/mro.d.ts +24 -0
- package/dist/pipeline/phases/mro.d.ts.map +1 -0
- package/dist/pipeline/phases/mro.js +303 -0
- package/dist/pipeline/phases/mro.js.map +1 -0
- package/dist/pipeline/phases/openapi.d.ts +52 -0
- package/dist/pipeline/phases/openapi.d.ts.map +1 -0
- package/dist/pipeline/phases/openapi.js +285 -0
- package/dist/pipeline/phases/openapi.js.map +1 -0
- package/dist/pipeline/phases/orm.d.ts +26 -0
- package/dist/pipeline/phases/orm.d.ts.map +1 -0
- package/dist/pipeline/phases/orm.js +183 -0
- package/dist/pipeline/phases/orm.js.map +1 -0
- package/dist/pipeline/phases/ownership.d.ts +88 -0
- package/dist/pipeline/phases/ownership.d.ts.map +1 -0
- package/dist/pipeline/phases/ownership.js +479 -0
- package/dist/pipeline/phases/ownership.js.map +1 -0
- package/dist/pipeline/phases/parse.d.ts +63 -0
- package/dist/pipeline/phases/parse.d.ts.map +1 -0
- package/dist/pipeline/phases/parse.js +994 -0
- package/dist/pipeline/phases/parse.js.map +1 -0
- package/dist/pipeline/phases/processes.d.ts +47 -0
- package/dist/pipeline/phases/processes.d.ts.map +1 -0
- package/dist/pipeline/phases/processes.js +620 -0
- package/dist/pipeline/phases/processes.js.map +1 -0
- package/dist/pipeline/phases/profile.d.ts +33 -0
- package/dist/pipeline/phases/profile.d.ts.map +1 -0
- package/dist/pipeline/phases/profile.js +91 -0
- package/dist/pipeline/phases/profile.js.map +1 -0
- package/dist/pipeline/phases/repo-node.d.ts +112 -0
- package/dist/pipeline/phases/repo-node.d.ts.map +1 -0
- package/dist/pipeline/phases/repo-node.js +272 -0
- package/dist/pipeline/phases/repo-node.js.map +1 -0
- package/dist/pipeline/phases/risk-snapshot.d.ts +34 -0
- package/dist/pipeline/phases/risk-snapshot.d.ts.map +1 -0
- package/dist/pipeline/phases/risk-snapshot.js +63 -0
- package/dist/pipeline/phases/risk-snapshot.js.map +1 -0
- package/dist/pipeline/phases/routes.d.ts +31 -0
- package/dist/pipeline/phases/routes.d.ts.map +1 -0
- package/dist/pipeline/phases/routes.js +262 -0
- package/dist/pipeline/phases/routes.js.map +1 -0
- package/dist/pipeline/phases/sbom.d.ts +45 -0
- package/dist/pipeline/phases/sbom.d.ts.map +1 -0
- package/dist/pipeline/phases/sbom.js +289 -0
- package/dist/pipeline/phases/sbom.js.map +1 -0
- package/dist/pipeline/phases/scan.d.ts +54 -0
- package/dist/pipeline/phases/scan.d.ts.map +1 -0
- package/dist/pipeline/phases/scan.js +340 -0
- package/dist/pipeline/phases/scan.js.map +1 -0
- package/dist/pipeline/phases/scip-index.d.ts +54 -0
- package/dist/pipeline/phases/scip-index.d.ts.map +1 -0
- package/dist/pipeline/phases/scip-index.js +469 -0
- package/dist/pipeline/phases/scip-index.js.map +1 -0
- package/dist/pipeline/phases/structure.d.ts +21 -0
- package/dist/pipeline/phases/structure.d.ts.map +1 -0
- package/dist/pipeline/phases/structure.js +115 -0
- package/dist/pipeline/phases/structure.js.map +1 -0
- package/dist/pipeline/phases/summarize.d.ts +126 -0
- package/dist/pipeline/phases/summarize.d.ts.map +1 -0
- package/dist/pipeline/phases/summarize.js +401 -0
- package/dist/pipeline/phases/summarize.js.map +1 -0
- package/dist/pipeline/phases/temporal-helpers/branch-divergence.d.ts +42 -0
- package/dist/pipeline/phases/temporal-helpers/branch-divergence.d.ts.map +1 -0
- package/dist/pipeline/phases/temporal-helpers/branch-divergence.js +96 -0
- package/dist/pipeline/phases/temporal-helpers/branch-divergence.js.map +1 -0
- package/dist/pipeline/phases/temporal-helpers/churn-decay.d.ts +22 -0
- package/dist/pipeline/phases/temporal-helpers/churn-decay.d.ts.map +1 -0
- package/dist/pipeline/phases/temporal-helpers/churn-decay.js +32 -0
- package/dist/pipeline/phases/temporal-helpers/churn-decay.js.map +1 -0
- package/dist/pipeline/phases/temporal-helpers/conventional-commits.d.ts +21 -0
- package/dist/pipeline/phases/temporal-helpers/conventional-commits.d.ts.map +1 -0
- package/dist/pipeline/phases/temporal-helpers/conventional-commits.js +37 -0
- package/dist/pipeline/phases/temporal-helpers/conventional-commits.js.map +1 -0
- package/dist/pipeline/phases/temporal-helpers/gini.d.ts +32 -0
- package/dist/pipeline/phases/temporal-helpers/gini.d.ts.map +1 -0
- package/dist/pipeline/phases/temporal-helpers/gini.js +78 -0
- package/dist/pipeline/phases/temporal-helpers/gini.js.map +1 -0
- package/dist/pipeline/phases/temporal-helpers/revert-detect.d.ts +14 -0
- package/dist/pipeline/phases/temporal-helpers/revert-detect.d.ts.map +1 -0
- package/dist/pipeline/phases/temporal-helpers/revert-detect.js +25 -0
- package/dist/pipeline/phases/temporal-helpers/revert-detect.js.map +1 -0
- package/dist/pipeline/phases/temporal-helpers/test-pair.d.ts +18 -0
- package/dist/pipeline/phases/temporal-helpers/test-pair.d.ts.map +1 -0
- package/dist/pipeline/phases/temporal-helpers/test-pair.js +119 -0
- package/dist/pipeline/phases/temporal-helpers/test-pair.js.map +1 -0
- package/dist/pipeline/phases/temporal.d.ts +65 -0
- package/dist/pipeline/phases/temporal.d.ts.map +1 -0
- package/dist/pipeline/phases/temporal.js +621 -0
- package/dist/pipeline/phases/temporal.js.map +1 -0
- package/dist/pipeline/phases/tools.d.ts +21 -0
- package/dist/pipeline/phases/tools.d.ts.map +1 -0
- package/dist/pipeline/phases/tools.js +118 -0
- package/dist/pipeline/phases/tools.js.map +1 -0
- package/dist/pipeline/profile-detectors/api-contracts.d.ts +18 -0
- package/dist/pipeline/profile-detectors/api-contracts.d.ts.map +1 -0
- package/dist/pipeline/profile-detectors/api-contracts.js +78 -0
- package/dist/pipeline/profile-detectors/api-contracts.js.map +1 -0
- package/dist/pipeline/profile-detectors/framework-detector.d.ts +11 -0
- package/dist/pipeline/profile-detectors/framework-detector.d.ts.map +1 -0
- package/dist/pipeline/profile-detectors/framework-detector.js +11 -0
- package/dist/pipeline/profile-detectors/framework-detector.js.map +1 -0
- package/dist/pipeline/profile-detectors/frameworks-catalog.d.ts +7 -0
- package/dist/pipeline/profile-detectors/frameworks-catalog.d.ts.map +1 -0
- package/dist/pipeline/profile-detectors/frameworks-catalog.js +7 -0
- package/dist/pipeline/profile-detectors/frameworks-catalog.js.map +1 -0
- package/dist/pipeline/profile-detectors/frameworks.d.ts +7 -0
- package/dist/pipeline/profile-detectors/frameworks.d.ts.map +1 -0
- package/dist/pipeline/profile-detectors/frameworks.js +7 -0
- package/dist/pipeline/profile-detectors/frameworks.js.map +1 -0
- package/dist/pipeline/profile-detectors/iac.d.ts +22 -0
- package/dist/pipeline/profile-detectors/iac.d.ts.map +1 -0
- package/dist/pipeline/profile-detectors/iac.js +97 -0
- package/dist/pipeline/profile-detectors/iac.js.map +1 -0
- package/dist/pipeline/profile-detectors/languages.d.ts +18 -0
- package/dist/pipeline/profile-detectors/languages.d.ts.map +1 -0
- package/dist/pipeline/profile-detectors/languages.js +60 -0
- package/dist/pipeline/profile-detectors/languages.js.map +1 -0
- package/dist/pipeline/profile-detectors/manifests.d.ts +7 -0
- package/dist/pipeline/profile-detectors/manifests.d.ts.map +1 -0
- package/dist/pipeline/profile-detectors/manifests.js +7 -0
- package/dist/pipeline/profile-detectors/manifests.js.map +1 -0
- package/dist/pipeline/profile-detectors/src-dirs.d.ts +17 -0
- package/dist/pipeline/profile-detectors/src-dirs.d.ts.map +1 -0
- package/dist/pipeline/profile-detectors/src-dirs.js +89 -0
- package/dist/pipeline/profile-detectors/src-dirs.js.map +1 -0
- package/dist/pipeline/profile-detectors/variant-detectors.d.ts +7 -0
- package/dist/pipeline/profile-detectors/variant-detectors.d.ts.map +1 -0
- package/dist/pipeline/profile-detectors/variant-detectors.js +7 -0
- package/dist/pipeline/profile-detectors/variant-detectors.js.map +1 -0
- package/dist/pipeline/runner.d.ts +54 -0
- package/dist/pipeline/runner.d.ts.map +1 -0
- package/dist/pipeline/runner.js +247 -0
- package/dist/pipeline/runner.js.map +1 -0
- package/dist/pipeline/types.d.ts +235 -0
- package/dist/pipeline/types.d.ts.map +1 -0
- package/dist/pipeline/types.js +15 -0
- package/dist/pipeline/types.js.map +1 -0
- package/dist/providers/c.d.ts +3 -0
- package/dist/providers/c.d.ts.map +1 -0
- package/dist/providers/c.js +162 -0
- package/dist/providers/c.js.map +1 -0
- package/dist/providers/cobol.d.ts +19 -0
- package/dist/providers/cobol.d.ts.map +1 -0
- package/dist/providers/cobol.js +44 -0
- package/dist/providers/cobol.js.map +1 -0
- package/dist/providers/cpp.d.ts +3 -0
- package/dist/providers/cpp.d.ts.map +1 -0
- package/dist/providers/cpp.js +200 -0
- package/dist/providers/cpp.js.map +1 -0
- package/dist/providers/csharp.d.ts +3 -0
- package/dist/providers/csharp.d.ts.map +1 -0
- package/dist/providers/csharp.js +292 -0
- package/dist/providers/csharp.js.map +1 -0
- package/dist/providers/dart.d.ts +3 -0
- package/dist/providers/dart.d.ts.map +1 -0
- package/dist/providers/dart.js +214 -0
- package/dist/providers/dart.js.map +1 -0
- package/dist/providers/definition-ids.d.ts +18 -0
- package/dist/providers/definition-ids.d.ts.map +1 -0
- package/dist/providers/definition-ids.js +23 -0
- package/dist/providers/definition-ids.js.map +1 -0
- package/dist/providers/extract-helpers.d.ts +60 -0
- package/dist/providers/extract-helpers.d.ts.map +1 -0
- package/dist/providers/extract-helpers.js +296 -0
- package/dist/providers/extract-helpers.js.map +1 -0
- package/dist/providers/extraction-types.d.ts +85 -0
- package/dist/providers/extraction-types.d.ts.map +1 -0
- package/dist/providers/extraction-types.js +13 -0
- package/dist/providers/extraction-types.js.map +1 -0
- package/dist/providers/go.d.ts +3 -0
- package/dist/providers/go.d.ts.map +1 -0
- package/dist/providers/go.js +359 -0
- package/dist/providers/go.js.map +1 -0
- package/dist/providers/http-detect.d.ts +44 -0
- package/dist/providers/http-detect.d.ts.map +1 -0
- package/dist/providers/http-detect.js +307 -0
- package/dist/providers/http-detect.js.map +1 -0
- package/dist/providers/index.d.ts +38 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +33 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/java.d.ts +3 -0
- package/dist/providers/java.d.ts.map +1 -0
- package/dist/providers/java.js +259 -0
- package/dist/providers/java.js.map +1 -0
- package/dist/providers/javascript.d.ts +3 -0
- package/dist/providers/javascript.d.ts.map +1 -0
- package/dist/providers/javascript.js +139 -0
- package/dist/providers/javascript.js.map +1 -0
- package/dist/providers/kotlin.d.ts +3 -0
- package/dist/providers/kotlin.d.ts.map +1 -0
- package/dist/providers/kotlin.js +175 -0
- package/dist/providers/kotlin.js.map +1 -0
- package/dist/providers/php.d.ts +3 -0
- package/dist/providers/php.d.ts.map +1 -0
- package/dist/providers/php.js +218 -0
- package/dist/providers/php.js.map +1 -0
- package/dist/providers/python-accesses.d.ts +9 -0
- package/dist/providers/python-accesses.d.ts.map +1 -0
- package/dist/providers/python-accesses.js +22 -0
- package/dist/providers/python-accesses.js.map +1 -0
- package/dist/providers/python.d.ts +3 -0
- package/dist/providers/python.d.ts.map +1 -0
- package/dist/providers/python.js +323 -0
- package/dist/providers/python.js.map +1 -0
- package/dist/providers/registry.d.ts +4 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +46 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/resolution/c3.d.ts +6 -0
- package/dist/providers/resolution/c3.d.ts.map +1 -0
- package/dist/providers/resolution/c3.js +76 -0
- package/dist/providers/resolution/c3.js.map +1 -0
- package/dist/providers/resolution/context.d.ts +38 -0
- package/dist/providers/resolution/context.d.ts.map +1 -0
- package/dist/providers/resolution/context.js +45 -0
- package/dist/providers/resolution/context.js.map +1 -0
- package/dist/providers/resolution/first-wins.d.ts +3 -0
- package/dist/providers/resolution/first-wins.d.ts.map +1 -0
- package/dist/providers/resolution/first-wins.js +27 -0
- package/dist/providers/resolution/first-wins.js.map +1 -0
- package/dist/providers/resolution/mro.d.ts +16 -0
- package/dist/providers/resolution/mro.d.ts.map +1 -0
- package/dist/providers/resolution/mro.js +14 -0
- package/dist/providers/resolution/mro.js.map +1 -0
- package/dist/providers/resolution/none.d.ts +3 -0
- package/dist/providers/resolution/none.d.ts.map +1 -0
- package/dist/providers/resolution/none.js +11 -0
- package/dist/providers/resolution/none.js.map +1 -0
- package/dist/providers/resolution/python-all-filter.d.ts +25 -0
- package/dist/providers/resolution/python-all-filter.d.ts.map +1 -0
- package/dist/providers/resolution/python-all-filter.js +64 -0
- package/dist/providers/resolution/python-all-filter.js.map +1 -0
- package/dist/providers/resolution/resolver-strategy.d.ts +42 -0
- package/dist/providers/resolution/resolver-strategy.d.ts.map +1 -0
- package/dist/providers/resolution/resolver-strategy.js +50 -0
- package/dist/providers/resolution/resolver-strategy.js.map +1 -0
- package/dist/providers/resolution/single-inheritance.d.ts +3 -0
- package/dist/providers/resolution/single-inheritance.d.ts.map +1 -0
- package/dist/providers/resolution/single-inheritance.js +21 -0
- package/dist/providers/resolution/single-inheritance.js.map +1 -0
- package/dist/providers/resolution/stack-graphs/__fixtures__/mock-tree.d.ts +16 -0
- package/dist/providers/resolution/stack-graphs/__fixtures__/mock-tree.d.ts.map +1 -0
- package/dist/providers/resolution/stack-graphs/__fixtures__/mock-tree.js +50 -0
- package/dist/providers/resolution/stack-graphs/__fixtures__/mock-tree.js.map +1 -0
- package/dist/providers/resolution/stack-graphs/glue.d.ts +15 -0
- package/dist/providers/resolution/stack-graphs/glue.d.ts.map +1 -0
- package/dist/providers/resolution/stack-graphs/glue.js +44 -0
- package/dist/providers/resolution/stack-graphs/glue.js.map +1 -0
- package/dist/providers/resolution/stack-graphs/node-edge-builder.d.ts +30 -0
- package/dist/providers/resolution/stack-graphs/node-edge-builder.d.ts.map +1 -0
- package/dist/providers/resolution/stack-graphs/node-edge-builder.js +366 -0
- package/dist/providers/resolution/stack-graphs/node-edge-builder.js.map +1 -0
- package/dist/providers/resolution/stack-graphs/partial-path-engine.d.ts +9 -0
- package/dist/providers/resolution/stack-graphs/partial-path-engine.d.ts.map +1 -0
- package/dist/providers/resolution/stack-graphs/partial-path-engine.js +152 -0
- package/dist/providers/resolution/stack-graphs/partial-path-engine.js.map +1 -0
- package/dist/providers/resolution/stack-graphs/rule-parser.d.ts +11 -0
- package/dist/providers/resolution/stack-graphs/rule-parser.d.ts.map +1 -0
- package/dist/providers/resolution/stack-graphs/rule-parser.js +247 -0
- package/dist/providers/resolution/stack-graphs/rule-parser.js.map +1 -0
- package/dist/providers/resolution/stack-graphs/types.d.ts +93 -0
- package/dist/providers/resolution/stack-graphs/types.d.ts.map +1 -0
- package/dist/providers/resolution/stack-graphs/types.js +11 -0
- package/dist/providers/resolution/stack-graphs/types.js.map +1 -0
- package/dist/providers/resolution/stack-graphs-python.d.ts +27 -0
- package/dist/providers/resolution/stack-graphs-python.d.ts.map +1 -0
- package/dist/providers/resolution/stack-graphs-python.js +104 -0
- package/dist/providers/resolution/stack-graphs-python.js.map +1 -0
- package/dist/providers/resolution/stack-graphs-ts.d.ts +134 -0
- package/dist/providers/resolution/stack-graphs-ts.d.ts.map +1 -0
- package/dist/providers/resolution/stack-graphs-ts.js +372 -0
- package/dist/providers/resolution/stack-graphs-ts.js.map +1 -0
- package/dist/providers/ruby.d.ts +3 -0
- package/dist/providers/ruby.d.ts.map +1 -0
- package/dist/providers/ruby.js +259 -0
- package/dist/providers/ruby.js.map +1 -0
- package/dist/providers/rust.d.ts +3 -0
- package/dist/providers/rust.d.ts.map +1 -0
- package/dist/providers/rust.js +318 -0
- package/dist/providers/rust.js.map +1 -0
- package/dist/providers/swift.d.ts +3 -0
- package/dist/providers/swift.d.ts.map +1 -0
- package/dist/providers/swift.js +177 -0
- package/dist/providers/swift.js.map +1 -0
- package/dist/providers/test-helpers.d.ts +24 -0
- package/dist/providers/test-helpers.d.ts.map +1 -0
- package/dist/providers/test-helpers.js +33 -0
- package/dist/providers/test-helpers.js.map +1 -0
- package/dist/providers/ts-shared.d.ts +30 -0
- package/dist/providers/ts-shared.d.ts.map +1 -0
- package/dist/providers/ts-shared.js +328 -0
- package/dist/providers/ts-shared.js.map +1 -0
- package/dist/providers/tsx.d.ts +7 -0
- package/dist/providers/tsx.d.ts.map +1 -0
- package/dist/providers/tsx.js +79 -0
- package/dist/providers/tsx.js.map +1 -0
- package/dist/providers/types.d.ts +166 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +7 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/providers/typescript-family-accesses.d.ts +14 -0
- package/dist/providers/typescript-family-accesses.d.ts.map +1 -0
- package/dist/providers/typescript-family-accesses.js +27 -0
- package/dist/providers/typescript-family-accesses.js.map +1 -0
- package/dist/providers/typescript.d.ts +9 -0
- package/dist/providers/typescript.d.ts.map +1 -0
- package/dist/providers/typescript.js +84 -0
- package/dist/providers/typescript.js.map +1 -0
- package/package.json +108 -0
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Routes phase — materialises HTTP route metadata emitted by the static
|
|
3
|
+
* detectors (Next.js, Express, FastAPI, NestJS, Spring MVC, Rails) as
|
|
4
|
+
* graph nodes and edges.
|
|
5
|
+
*
|
|
6
|
+
* The phase:
|
|
7
|
+
* 1. Feeds the scanned files through every detector that matches the
|
|
8
|
+
* active {@link ProjectProfileNode.frameworks} list. Next.js +
|
|
9
|
+
* Express always run when TS/JS files are present. FastAPI runs on
|
|
10
|
+
* `fastapi`, NestJS on `nestjs`, Spring on any `spring-*` variant,
|
|
11
|
+
* Rails on `rails`.
|
|
12
|
+
* 2. Creates one `Route` node per unique `(url, method)` pair, keyed
|
|
13
|
+
* by the handler file so two frameworks declaring the same URL on
|
|
14
|
+
* the same file reuse the node.
|
|
15
|
+
* 3. Emits `HANDLES_ROUTE` edges from the declaring File node to the
|
|
16
|
+
* Route node with a fixed confidence of 0.9.
|
|
17
|
+
* 4. Detects cross-file duplicates for the same `(url, method)` and
|
|
18
|
+
* surfaces them as warnings via the progress callback — but keeps
|
|
19
|
+
* one edge per handler file (the route *is* re-declared).
|
|
20
|
+
*
|
|
21
|
+
* Depends on `parse` to order the DAG; the profile node is read from
|
|
22
|
+
* the in-memory graph.
|
|
23
|
+
*/
|
|
24
|
+
import { promises as fs } from "node:fs";
|
|
25
|
+
import { makeNodeId } from "@opencodehub/core-types";
|
|
26
|
+
import { importsMapFromExtracted } from "../../extract/receiver-resolver.js";
|
|
27
|
+
import { detectExpressRoutes, detectNextJsRoutes, populateNextJsResponseKeys, } from "../../extract/route-detector.js";
|
|
28
|
+
import { detectSpringRoutes } from "../../extract/route-detector-java.js";
|
|
29
|
+
import { detectNestJsRoutes } from "../../extract/route-detector-nestjs.js";
|
|
30
|
+
import { detectFastApiRoutes } from "../../extract/route-detector-python.js";
|
|
31
|
+
import { detectRailsRoutes } from "../../extract/route-detector-rails.js";
|
|
32
|
+
import { PARSE_PHASE_NAME } from "./parse.js";
|
|
33
|
+
import { SCAN_PHASE_NAME } from "./scan.js";
|
|
34
|
+
/** Extensions that could plausibly host a Next.js route or Express code. */
|
|
35
|
+
const JS_TS_EXTS = new Set([
|
|
36
|
+
".ts",
|
|
37
|
+
".tsx",
|
|
38
|
+
".mts",
|
|
39
|
+
".cts",
|
|
40
|
+
".js",
|
|
41
|
+
".jsx",
|
|
42
|
+
".mjs",
|
|
43
|
+
".cjs",
|
|
44
|
+
]);
|
|
45
|
+
/** Extensions the FastAPI detector scans. */
|
|
46
|
+
const PYTHON_EXTS = new Set([".py"]);
|
|
47
|
+
/** Extensions the Spring detector scans. */
|
|
48
|
+
const JAVA_EXTS = new Set([".java"]);
|
|
49
|
+
export const ROUTES_PHASE_NAME = "routes";
|
|
50
|
+
export const routesPhase = {
|
|
51
|
+
name: ROUTES_PHASE_NAME,
|
|
52
|
+
// `profile` is a dependency so the detected-frameworks gating can
|
|
53
|
+
// read the ProjectProfile node out of the graph without a race.
|
|
54
|
+
deps: [PARSE_PHASE_NAME, "profile"],
|
|
55
|
+
async run(ctx, deps) {
|
|
56
|
+
const scan = ctx.phaseOutputs.get(SCAN_PHASE_NAME);
|
|
57
|
+
if (scan === undefined) {
|
|
58
|
+
throw new Error("routes: scan output missing from phase outputs");
|
|
59
|
+
}
|
|
60
|
+
const parse = deps.get(PARSE_PHASE_NAME);
|
|
61
|
+
if (parse === undefined) {
|
|
62
|
+
throw new Error("routes: parse output missing from dependency map");
|
|
63
|
+
}
|
|
64
|
+
return runRoutes(ctx, scan, parse);
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
async function runRoutes(ctx, scan, parse) {
|
|
68
|
+
const frameworks = readDetectedFrameworks(ctx);
|
|
69
|
+
const importsByFile = importsMapFromExtracted(parse.importsByFile);
|
|
70
|
+
const strictDetectors = ctx.options.strictDetectors === true;
|
|
71
|
+
// Bundle files we might hand to TS/JS detectors (Next.js, Express,
|
|
72
|
+
// NestJS). Each entry is read once so all three detectors share the
|
|
73
|
+
// same buffer.
|
|
74
|
+
const jsTsCandidates = scan.files.filter((f) => JS_TS_EXTS.has(extLower(f.relPath)));
|
|
75
|
+
const bundle = await readBundle(ctx, jsTsCandidates);
|
|
76
|
+
// Next.js App Router is filesystem-routed — pass the full bundle.
|
|
77
|
+
const nextRoutesRaw = detectNextJsRoutes(bundle, ctx.repoPath);
|
|
78
|
+
// Walk each verb handler's body for `NextResponse.json({...})` /
|
|
79
|
+
// `Response.json({...})` literals and promote the keys onto `responseKeys`.
|
|
80
|
+
const nextRoutes = populateNextJsResponseKeys(nextRoutesRaw, bundle);
|
|
81
|
+
// Express is file-local.
|
|
82
|
+
const expressRoutes = [];
|
|
83
|
+
for (const entry of bundle) {
|
|
84
|
+
for (const r of detectExpressRoutes({
|
|
85
|
+
filePath: entry.filePath,
|
|
86
|
+
content: entry.content,
|
|
87
|
+
importsByFile,
|
|
88
|
+
strictDetectors,
|
|
89
|
+
})) {
|
|
90
|
+
expressRoutes.push(r);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// NestJS — profile-gated.
|
|
94
|
+
const nestRoutes = [];
|
|
95
|
+
if (frameworks.has("nestjs")) {
|
|
96
|
+
for (const entry of bundle) {
|
|
97
|
+
for (const r of detectNestJsRoutes({ filePath: entry.filePath, content: entry.content })) {
|
|
98
|
+
nestRoutes.push(r);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// FastAPI — profile-gated. Reads `.py` candidates from the scan.
|
|
103
|
+
const fastApiRoutes = [];
|
|
104
|
+
if (frameworks.has("fastapi")) {
|
|
105
|
+
const pyFiles = scan.files.filter((f) => PYTHON_EXTS.has(extLower(f.relPath)));
|
|
106
|
+
const pyBundle = await readBundle(ctx, pyFiles);
|
|
107
|
+
for (const entry of pyBundle) {
|
|
108
|
+
for (const r of detectFastApiRoutes({ filePath: entry.filePath, content: entry.content })) {
|
|
109
|
+
fastApiRoutes.push(r);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Spring — profile-gated on any `spring-*` detected framework.
|
|
114
|
+
const springRoutes = [];
|
|
115
|
+
const hasSpring = [...frameworks].some((f) => f === "spring" || f.startsWith("spring-"));
|
|
116
|
+
if (hasSpring) {
|
|
117
|
+
const javaFiles = scan.files.filter((f) => JAVA_EXTS.has(extLower(f.relPath)));
|
|
118
|
+
const javaBundle = await readBundle(ctx, javaFiles);
|
|
119
|
+
for (const entry of javaBundle) {
|
|
120
|
+
for (const r of detectSpringRoutes({ filePath: entry.filePath, content: entry.content })) {
|
|
121
|
+
springRoutes.push(r);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Rails — profile-gated. Only scans `config/routes*.rb`.
|
|
126
|
+
const railsRoutes = [];
|
|
127
|
+
if (frameworks.has("rails")) {
|
|
128
|
+
const routeFiles = scan.files.filter((f) => /(^|\/)config\/routes(?:\.[\w-]+)?\.rb$/.test(f.relPath));
|
|
129
|
+
const routesBundle = await readBundle(ctx, routeFiles);
|
|
130
|
+
for (const entry of routesBundle) {
|
|
131
|
+
for (const r of detectRailsRoutes(entry.filePath, entry.content)) {
|
|
132
|
+
railsRoutes.push(r);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Stable ordering so edge insertion is deterministic.
|
|
137
|
+
const all = [
|
|
138
|
+
...nextRoutes,
|
|
139
|
+
...expressRoutes,
|
|
140
|
+
...nestRoutes,
|
|
141
|
+
...fastApiRoutes,
|
|
142
|
+
...springRoutes,
|
|
143
|
+
...railsRoutes,
|
|
144
|
+
]
|
|
145
|
+
.slice()
|
|
146
|
+
.sort(compareRoute);
|
|
147
|
+
// Dedupe (url, method) to count duplicates while still emitting one edge
|
|
148
|
+
// per (handlerFile, url, method). Multiple files claiming the same URL
|
|
149
|
+
// is a warning; multiple edges from the same file to the same route
|
|
150
|
+
// collapse in addEdge.
|
|
151
|
+
const globalKeyCounts = new Map();
|
|
152
|
+
for (const r of all) {
|
|
153
|
+
const key = globalKey(r);
|
|
154
|
+
globalKeyCounts.set(key, (globalKeyCounts.get(key) ?? 0) + 1);
|
|
155
|
+
}
|
|
156
|
+
let duplicateCount = 0;
|
|
157
|
+
const warnedKeys = new Set();
|
|
158
|
+
const emittedEdgeKeys = new Set();
|
|
159
|
+
let routeCount = 0;
|
|
160
|
+
for (const r of all) {
|
|
161
|
+
const method = r.method ?? "ANY";
|
|
162
|
+
const routeId = makeNodeId("Route", r.handlerFile, `${method}:${r.url}`);
|
|
163
|
+
const routeNode = {
|
|
164
|
+
id: routeId,
|
|
165
|
+
kind: "Route",
|
|
166
|
+
name: `${method} ${r.url}`,
|
|
167
|
+
filePath: r.handlerFile,
|
|
168
|
+
url: r.url,
|
|
169
|
+
...(r.method !== undefined ? { method: r.method } : {}),
|
|
170
|
+
...(r.responseKeys !== undefined ? { responseKeys: r.responseKeys } : {}),
|
|
171
|
+
};
|
|
172
|
+
ctx.graph.addNode(routeNode);
|
|
173
|
+
routeCount += 1;
|
|
174
|
+
const fileId = makeNodeId("File", r.handlerFile, r.handlerFile);
|
|
175
|
+
const edgeKey = `${r.handlerFile}\u0000${method}\u0000${r.url}`;
|
|
176
|
+
if (!emittedEdgeKeys.has(edgeKey)) {
|
|
177
|
+
emittedEdgeKeys.add(edgeKey);
|
|
178
|
+
ctx.graph.addEdge({
|
|
179
|
+
from: fileId,
|
|
180
|
+
to: routeId,
|
|
181
|
+
type: "HANDLES_ROUTE",
|
|
182
|
+
confidence: 0.9,
|
|
183
|
+
reason: `${r.framework}-handler`,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
const gKey = globalKey(r);
|
|
187
|
+
if ((globalKeyCounts.get(gKey) ?? 0) > 1 && !warnedKeys.has(gKey)) {
|
|
188
|
+
warnedKeys.add(gKey);
|
|
189
|
+
duplicateCount += 1;
|
|
190
|
+
ctx.onProgress?.({
|
|
191
|
+
phase: ROUTES_PHASE_NAME,
|
|
192
|
+
kind: "warn",
|
|
193
|
+
message: `routes: duplicate registration for ${method} ${r.url}`,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return { routeCount, duplicateCount };
|
|
198
|
+
}
|
|
199
|
+
function globalKey(r) {
|
|
200
|
+
const method = r.method ?? "ANY";
|
|
201
|
+
return `${method}\u0000${r.url}`;
|
|
202
|
+
}
|
|
203
|
+
function compareRoute(a, b) {
|
|
204
|
+
if (a.handlerFile !== b.handlerFile)
|
|
205
|
+
return a.handlerFile < b.handlerFile ? -1 : 1;
|
|
206
|
+
const am = a.method ?? "";
|
|
207
|
+
const bm = b.method ?? "";
|
|
208
|
+
if (am !== bm)
|
|
209
|
+
return am < bm ? -1 : 1;
|
|
210
|
+
if (a.url !== b.url)
|
|
211
|
+
return a.url < b.url ? -1 : 1;
|
|
212
|
+
return 0;
|
|
213
|
+
}
|
|
214
|
+
function extLower(relPath) {
|
|
215
|
+
const idx = relPath.lastIndexOf(".");
|
|
216
|
+
if (idx < 0)
|
|
217
|
+
return "";
|
|
218
|
+
return relPath.slice(idx).toLowerCase();
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Read a list of scan files into a [path, content] bundle for a
|
|
222
|
+
* detector. Errors are logged as warnings; affected files simply don't
|
|
223
|
+
* appear in the returned bundle.
|
|
224
|
+
*/
|
|
225
|
+
async function readBundle(ctx, files) {
|
|
226
|
+
const out = [];
|
|
227
|
+
for (const f of files) {
|
|
228
|
+
try {
|
|
229
|
+
const buf = await fs.readFile(f.absPath);
|
|
230
|
+
out.push({ filePath: f.relPath, content: buf.toString("utf8") });
|
|
231
|
+
}
|
|
232
|
+
catch (err) {
|
|
233
|
+
ctx.onProgress?.({
|
|
234
|
+
phase: ROUTES_PHASE_NAME,
|
|
235
|
+
kind: "warn",
|
|
236
|
+
message: `routes: cannot read ${f.relPath}: ${err.message}`,
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return out;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Pull the detected framework set from the in-memory graph's singleton
|
|
244
|
+
* `ProjectProfile` node. Returns an empty set when the profile phase
|
|
245
|
+
* has not yet populated the node — which is also the default when the
|
|
246
|
+
* profile phase is disabled.
|
|
247
|
+
*/
|
|
248
|
+
function readDetectedFrameworks(ctx) {
|
|
249
|
+
const out = new Set();
|
|
250
|
+
for (const n of ctx.graph.nodes()) {
|
|
251
|
+
if (n.kind !== "ProjectProfile")
|
|
252
|
+
continue;
|
|
253
|
+
const profile = n;
|
|
254
|
+
for (const name of profile.frameworks ?? [])
|
|
255
|
+
out.add(name);
|
|
256
|
+
for (const d of profile.frameworksDetected ?? [])
|
|
257
|
+
out.add(d.name);
|
|
258
|
+
break;
|
|
259
|
+
}
|
|
260
|
+
return out;
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/pipeline/phases/routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SBOM phase — emit CycloneDX 1.5 + SPDX 2.3 from Dependency nodes.
|
|
3
|
+
*
|
|
4
|
+
* Responsibilities
|
|
5
|
+
* 1. Collect every DependencyNode the `dependencies` phase produced.
|
|
6
|
+
* 2. Emit a CycloneDX 1.5 JSON document to
|
|
7
|
+
* `.codehub/sbom.cyclonedx.json` via `@cyclonedx/cyclonedx-library`.
|
|
8
|
+
* 3. Emit a SPDX 2.3 JSON document (DIY emitter) to
|
|
9
|
+
* `.codehub/sbom.spdx.json`.
|
|
10
|
+
*
|
|
11
|
+
* Opt-in: the phase is a no-op unless `options.sbom === true` (default
|
|
12
|
+
* false). This keeps `codehub analyze` quiet for repos where supply-chain
|
|
13
|
+
* documentation is not part of the flow.
|
|
14
|
+
*
|
|
15
|
+
* Determinism
|
|
16
|
+
* - Components and packages are emitted in canonical order
|
|
17
|
+
* (ecosystem, name, version).
|
|
18
|
+
* - When `options.reproducibleSbom` is `true` (default), the CycloneDX
|
|
19
|
+
* `metadata.timestamp` is fixed to the Unix epoch, the CycloneDX
|
|
20
|
+
* serialNumber is derived from a sha256 hash of the dependency
|
|
21
|
+
* fingerprint, and the SPDX `creationInfo.created` is fixed to the
|
|
22
|
+
* epoch. The SPDX `documentNamespace` is `urn:uuid:<sha256[0..32]>` of
|
|
23
|
+
* the same fingerprint — a stable URN, still globally unique for a
|
|
24
|
+
* given dependency set.
|
|
25
|
+
* - When `reproducibleSbom === false`, timestamps become `Date.now()`
|
|
26
|
+
* (floored to the second) and the namespace becomes a random v4 UUID.
|
|
27
|
+
* We still sort components.
|
|
28
|
+
*
|
|
29
|
+
* Licensing
|
|
30
|
+
* - `@cyclonedx/cyclonedx-library@10.0.0` is Apache-2.0 (bundle-safe for
|
|
31
|
+
* our Apache-2.0 host).
|
|
32
|
+
* - The SPDX emitter is a ~150 LOC DIY transform of Dependency nodes
|
|
33
|
+
* into JSON — no third-party SPDX library is linked.
|
|
34
|
+
*
|
|
35
|
+
* No network: PURLs and IDs are synthesised from Dependency fields only.
|
|
36
|
+
*/
|
|
37
|
+
import type { PipelinePhase } from "../types.js";
|
|
38
|
+
export declare const SBOM_PHASE_NAME: "sbom";
|
|
39
|
+
export interface SbomOutput {
|
|
40
|
+
readonly cyclonedxPath: string | null;
|
|
41
|
+
readonly spdxPath: string | null;
|
|
42
|
+
readonly componentCount: number;
|
|
43
|
+
}
|
|
44
|
+
export declare const sbomPhase: PipelinePhase<SbomOutput>;
|
|
45
|
+
//# sourceMappingURL=sbom.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sbom.d.ts","sourceRoot":"","sources":["../../../src/pipeline/phases/sbom.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AASH,OAAO,KAAK,EAAmB,aAAa,EAAE,MAAM,aAAa,CAAC;AAGlE,eAAO,MAAM,eAAe,EAAG,MAAe,CAAC;AAS/C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,eAAO,MAAM,SAAS,EAAE,aAAa,CAAC,UAAU,CAS/C,CAAC"}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SBOM phase — emit CycloneDX 1.5 + SPDX 2.3 from Dependency nodes.
|
|
3
|
+
*
|
|
4
|
+
* Responsibilities
|
|
5
|
+
* 1. Collect every DependencyNode the `dependencies` phase produced.
|
|
6
|
+
* 2. Emit a CycloneDX 1.5 JSON document to
|
|
7
|
+
* `.codehub/sbom.cyclonedx.json` via `@cyclonedx/cyclonedx-library`.
|
|
8
|
+
* 3. Emit a SPDX 2.3 JSON document (DIY emitter) to
|
|
9
|
+
* `.codehub/sbom.spdx.json`.
|
|
10
|
+
*
|
|
11
|
+
* Opt-in: the phase is a no-op unless `options.sbom === true` (default
|
|
12
|
+
* false). This keeps `codehub analyze` quiet for repos where supply-chain
|
|
13
|
+
* documentation is not part of the flow.
|
|
14
|
+
*
|
|
15
|
+
* Determinism
|
|
16
|
+
* - Components and packages are emitted in canonical order
|
|
17
|
+
* (ecosystem, name, version).
|
|
18
|
+
* - When `options.reproducibleSbom` is `true` (default), the CycloneDX
|
|
19
|
+
* `metadata.timestamp` is fixed to the Unix epoch, the CycloneDX
|
|
20
|
+
* serialNumber is derived from a sha256 hash of the dependency
|
|
21
|
+
* fingerprint, and the SPDX `creationInfo.created` is fixed to the
|
|
22
|
+
* epoch. The SPDX `documentNamespace` is `urn:uuid:<sha256[0..32]>` of
|
|
23
|
+
* the same fingerprint — a stable URN, still globally unique for a
|
|
24
|
+
* given dependency set.
|
|
25
|
+
* - When `reproducibleSbom === false`, timestamps become `Date.now()`
|
|
26
|
+
* (floored to the second) and the namespace becomes a random v4 UUID.
|
|
27
|
+
* We still sort components.
|
|
28
|
+
*
|
|
29
|
+
* Licensing
|
|
30
|
+
* - `@cyclonedx/cyclonedx-library@10.0.0` is Apache-2.0 (bundle-safe for
|
|
31
|
+
* our Apache-2.0 host).
|
|
32
|
+
* - The SPDX emitter is a ~150 LOC DIY transform of Dependency nodes
|
|
33
|
+
* into JSON — no third-party SPDX library is linked.
|
|
34
|
+
*
|
|
35
|
+
* No network: PURLs and IDs are synthesised from Dependency fields only.
|
|
36
|
+
*/
|
|
37
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
38
|
+
import { mkdir } from "node:fs/promises";
|
|
39
|
+
import path from "node:path";
|
|
40
|
+
import { Enums, Models, Serialize, Spec } from "@cyclonedx/cyclonedx-library";
|
|
41
|
+
import { META_DIR_NAME } from "@opencodehub/storage";
|
|
42
|
+
import wfa from "write-file-atomic";
|
|
43
|
+
import { DEPENDENCIES_PHASE_NAME } from "./dependencies.js";
|
|
44
|
+
export const SBOM_PHASE_NAME = "sbom";
|
|
45
|
+
const CYCLONEDX_FILE = "sbom.cyclonedx.json";
|
|
46
|
+
const SPDX_FILE = "sbom.spdx.json";
|
|
47
|
+
const TOOL_NAME = "opencodehub";
|
|
48
|
+
const TOOL_VERSION = "1.1.0";
|
|
49
|
+
// Stable epoch = 0 (1970-01-01T00:00:00Z) for reproducible builds.
|
|
50
|
+
const REPRODUCIBLE_EPOCH = new Date(0);
|
|
51
|
+
export const sbomPhase = {
|
|
52
|
+
name: SBOM_PHASE_NAME,
|
|
53
|
+
deps: [DEPENDENCIES_PHASE_NAME],
|
|
54
|
+
async run(ctx) {
|
|
55
|
+
if (ctx.options.sbom !== true) {
|
|
56
|
+
return { cyclonedxPath: null, spdxPath: null, componentCount: 0 };
|
|
57
|
+
}
|
|
58
|
+
return runSbom(ctx);
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
async function runSbom(ctx) {
|
|
62
|
+
const reproducible = ctx.options.reproducibleSbom !== false;
|
|
63
|
+
// Collect and sort Dependency nodes. Sorting by (ecosystem, name,
|
|
64
|
+
// version) is the contract that makes SBOM output byte-identical
|
|
65
|
+
// across runs; node insertion order is already canonical per the
|
|
66
|
+
// dependencies phase but we sort again defensively.
|
|
67
|
+
const deps = [];
|
|
68
|
+
for (const n of ctx.graph.nodes()) {
|
|
69
|
+
if (n.kind === "Dependency")
|
|
70
|
+
deps.push(n);
|
|
71
|
+
}
|
|
72
|
+
deps.sort(compareDeps);
|
|
73
|
+
const repoMeta = path.join(ctx.repoPath, META_DIR_NAME);
|
|
74
|
+
await mkdir(repoMeta, { recursive: true });
|
|
75
|
+
const cyclonedxPath = path.join(repoMeta, CYCLONEDX_FILE);
|
|
76
|
+
const spdxPath = path.join(repoMeta, SPDX_FILE);
|
|
77
|
+
const fingerprint = fingerprintDeps(deps);
|
|
78
|
+
const timestamp = reproducible ? REPRODUCIBLE_EPOCH : new Date(floorMs(Date.now()));
|
|
79
|
+
const cycloneDxJson = emitCycloneDx(deps, {
|
|
80
|
+
reproducible,
|
|
81
|
+
timestamp,
|
|
82
|
+
fingerprint,
|
|
83
|
+
});
|
|
84
|
+
await wfa(cyclonedxPath, cycloneDxJson, { encoding: "utf8", fsync: false });
|
|
85
|
+
const spdxJson = emitSpdx(deps, {
|
|
86
|
+
reproducible,
|
|
87
|
+
timestamp,
|
|
88
|
+
fingerprint,
|
|
89
|
+
});
|
|
90
|
+
await wfa(spdxPath, spdxJson, { encoding: "utf8", fsync: false });
|
|
91
|
+
return {
|
|
92
|
+
cyclonedxPath,
|
|
93
|
+
spdxPath,
|
|
94
|
+
componentCount: deps.length,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function compareDeps(a, b) {
|
|
98
|
+
if (a.ecosystem !== b.ecosystem)
|
|
99
|
+
return a.ecosystem < b.ecosystem ? -1 : 1;
|
|
100
|
+
if (a.name !== b.name)
|
|
101
|
+
return a.name < b.name ? -1 : 1;
|
|
102
|
+
if (a.version !== b.version)
|
|
103
|
+
return a.version < b.version ? -1 : 1;
|
|
104
|
+
return 0;
|
|
105
|
+
}
|
|
106
|
+
function floorMs(ms) {
|
|
107
|
+
return Math.floor(ms / 1000) * 1000;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Content-addressed hash of the Dependency set. Used as the CycloneDX
|
|
111
|
+
* serialNumber and SPDX documentNamespace so byte-identical Dependency
|
|
112
|
+
* graphs produce byte-identical SBOM documents.
|
|
113
|
+
*/
|
|
114
|
+
function fingerprintDeps(deps) {
|
|
115
|
+
const h = createHash("sha256");
|
|
116
|
+
for (const d of deps) {
|
|
117
|
+
h.update(`${d.ecosystem}\x1f${d.name}\x1f${d.version}\x1f${d.license ?? ""}\x1e`);
|
|
118
|
+
}
|
|
119
|
+
return h.digest("hex");
|
|
120
|
+
}
|
|
121
|
+
function emitCycloneDx(deps, emit) {
|
|
122
|
+
const bom = new Models.Bom();
|
|
123
|
+
bom.metadata.timestamp = emit.timestamp;
|
|
124
|
+
// Tool that generated the SBOM. Using `.components.add` rather than the
|
|
125
|
+
// legacy `.tools.tools` set — `Tools.components` is the modern 1.5+ path.
|
|
126
|
+
// `bomRef` is set to a stable string so serialized output is byte-stable
|
|
127
|
+
// across runs; unset, the library generates a random address-backed ref.
|
|
128
|
+
const toolComponent = new Models.Component(Enums.ComponentType.Application, TOOL_NAME, {
|
|
129
|
+
version: TOOL_VERSION,
|
|
130
|
+
bomRef: `tool-${TOOL_NAME}-${TOOL_VERSION}`,
|
|
131
|
+
});
|
|
132
|
+
bom.metadata.tools.components.add(toolComponent);
|
|
133
|
+
// Deterministic serialNumber from the fingerprint. CycloneDX requires
|
|
134
|
+
// `urn:uuid:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX`; we map the first 32
|
|
135
|
+
// hex chars of the fingerprint into a v4-shaped UUID string.
|
|
136
|
+
bom.serialNumber = emit.reproducible
|
|
137
|
+
? `urn:uuid:${fingerprintToUuid(emit.fingerprint)}`
|
|
138
|
+
: `urn:uuid:${randomUUID()}`;
|
|
139
|
+
for (const d of deps) {
|
|
140
|
+
const purl = buildPurl(d.ecosystem, d.name, d.version);
|
|
141
|
+
// Use PURL as the bomRef so two Dependency sets with the same
|
|
142
|
+
// (ecosystem, name, version) trio yield byte-identical serialised
|
|
143
|
+
// SBOMs. PURLs are unique by construction of the dependencies phase.
|
|
144
|
+
const comp = new Models.Component(Enums.ComponentType.Library, d.name, {
|
|
145
|
+
version: d.version,
|
|
146
|
+
purl,
|
|
147
|
+
bomRef: purl,
|
|
148
|
+
});
|
|
149
|
+
if (d.license && d.license !== "UNKNOWN") {
|
|
150
|
+
// Use a NamedLicense so we do not inadvertently emit invalid SPDX
|
|
151
|
+
// IDs; CycloneDX validators reject unknown IDs on SpdxLicense.
|
|
152
|
+
comp.licenses.add(new Models.NamedLicense(d.license));
|
|
153
|
+
}
|
|
154
|
+
bom.components.add(comp);
|
|
155
|
+
}
|
|
156
|
+
const spec = Spec.Spec1dot5;
|
|
157
|
+
// `@cyclonedx/cyclonedx-library@10` relocated the JSON normalizer factory
|
|
158
|
+
// from `Serialize.JSON.Factory` to `Serialize.JSON.Normalize.Factory`.
|
|
159
|
+
const factory = new Serialize.JSON.Normalize.Factory(spec);
|
|
160
|
+
const serializer = new Serialize.JsonSerializer(factory);
|
|
161
|
+
// sortLists=true so repository iteration order never affects output.
|
|
162
|
+
// space=2 so the emitted file is human-reviewable.
|
|
163
|
+
return serializer.serialize(bom, { sortLists: true, space: 2 });
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Map a 64-hex-char sha256 fingerprint into a UUID-shaped string.
|
|
167
|
+
* The output is a well-formed UUID (hex + dashes) but is NOT a true RFC
|
|
168
|
+
* 4122 UUID — callers MUST treat it as an opaque content fingerprint, not
|
|
169
|
+
* a unique identifier.
|
|
170
|
+
*/
|
|
171
|
+
function fingerprintToUuid(fingerprint) {
|
|
172
|
+
const hex = fingerprint.slice(0, 32);
|
|
173
|
+
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Build a PURL (https://github.com/package-url/purl-spec).
|
|
177
|
+
* Centralises ecosystem-specific quirks so both CycloneDX and SPDX
|
|
178
|
+
* emitters agree.
|
|
179
|
+
*/
|
|
180
|
+
function buildPurl(ecosystem, name, version) {
|
|
181
|
+
switch (ecosystem) {
|
|
182
|
+
case "npm":
|
|
183
|
+
return `pkg:npm/${encodePurlName(name)}@${encodePurlVersion(version)}`;
|
|
184
|
+
case "pypi":
|
|
185
|
+
// PURL spec §Known types — PyPI normalises names to lowercase, dashes.
|
|
186
|
+
return `pkg:pypi/${encodePurlName(name.toLowerCase().replace(/_/g, "-"))}@${encodePurlVersion(version)}`;
|
|
187
|
+
case "go":
|
|
188
|
+
// Go module paths may contain `/`. The PURL spec treats the path
|
|
189
|
+
// as-is inside the name segment but spec requires `/` to mark the
|
|
190
|
+
// namespace, so embedded slashes stay literal. We do percent-encode
|
|
191
|
+
// only the few illegal chars (space, `#`, `?`).
|
|
192
|
+
return `pkg:golang/${encodePurlGoName(name)}@${encodePurlVersion(version)}`;
|
|
193
|
+
case "cargo":
|
|
194
|
+
return `pkg:cargo/${encodePurlName(name)}@${encodePurlVersion(version)}`;
|
|
195
|
+
case "maven": {
|
|
196
|
+
// Maven names are `groupId:artifactId`.
|
|
197
|
+
const colon = name.indexOf(":");
|
|
198
|
+
if (colon === -1) {
|
|
199
|
+
return `pkg:maven/${encodePurlName(name)}@${encodePurlVersion(version)}`;
|
|
200
|
+
}
|
|
201
|
+
const group = name.slice(0, colon);
|
|
202
|
+
const artifact = name.slice(colon + 1);
|
|
203
|
+
return `pkg:maven/${encodePurlName(group)}/${encodePurlName(artifact)}@${encodePurlVersion(version)}`;
|
|
204
|
+
}
|
|
205
|
+
case "nuget":
|
|
206
|
+
return `pkg:nuget/${encodePurlName(name)}@${encodePurlVersion(version)}`;
|
|
207
|
+
default: {
|
|
208
|
+
// Exhaustiveness check: if a new ecosystem shows up, TypeScript will
|
|
209
|
+
// flag it at build time and we fall back to a best-effort PURL.
|
|
210
|
+
const _exhaustive = ecosystem;
|
|
211
|
+
return `pkg:generic/${encodePurlName(String(_exhaustive ?? name))}@${encodePurlVersion(version)}`;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
function encodePurlName(raw) {
|
|
216
|
+
// PURL spec: name must be percent-encoded except for unreserved chars.
|
|
217
|
+
// encodeURIComponent handles this correctly for single-segment names.
|
|
218
|
+
return encodeURIComponent(raw);
|
|
219
|
+
}
|
|
220
|
+
function encodePurlGoName(raw) {
|
|
221
|
+
// Preserve path separators in Go module paths; encode each segment.
|
|
222
|
+
return raw
|
|
223
|
+
.split("/")
|
|
224
|
+
.map((seg) => encodeURIComponent(seg))
|
|
225
|
+
.join("/");
|
|
226
|
+
}
|
|
227
|
+
function encodePurlVersion(raw) {
|
|
228
|
+
return encodeURIComponent(raw);
|
|
229
|
+
}
|
|
230
|
+
function emitSpdx(deps, emit) {
|
|
231
|
+
const packages = deps.map((d) => ({
|
|
232
|
+
SPDXID: makeSpdxId(d),
|
|
233
|
+
name: d.name,
|
|
234
|
+
versionInfo: d.version,
|
|
235
|
+
downloadLocation: "NOASSERTION",
|
|
236
|
+
filesAnalyzed: false,
|
|
237
|
+
licenseConcluded: "NOASSERTION",
|
|
238
|
+
licenseDeclared: d.license && d.license !== "UNKNOWN" ? d.license : "NOASSERTION",
|
|
239
|
+
copyrightText: "NOASSERTION",
|
|
240
|
+
externalRefs: [
|
|
241
|
+
{
|
|
242
|
+
referenceCategory: "PACKAGE-MANAGER",
|
|
243
|
+
referenceType: "purl",
|
|
244
|
+
referenceLocator: buildPurl(d.ecosystem, d.name, d.version),
|
|
245
|
+
},
|
|
246
|
+
],
|
|
247
|
+
}));
|
|
248
|
+
// Stable sort by SPDXID — the SPDX spec mandates uniqueness but not a
|
|
249
|
+
// specific order; we pick ID-ascending so diff-based review stays quiet.
|
|
250
|
+
packages.sort((a, b) => (a.SPDXID < b.SPDXID ? -1 : a.SPDXID > b.SPDXID ? 1 : 0));
|
|
251
|
+
const doc = {
|
|
252
|
+
spdxVersion: "SPDX-2.3",
|
|
253
|
+
dataLicense: "CC0-1.0",
|
|
254
|
+
SPDXID: "SPDXRef-DOCUMENT",
|
|
255
|
+
name: "opencodehub-sbom",
|
|
256
|
+
documentNamespace: emit.reproducible
|
|
257
|
+
? `urn:uuid:${fingerprintToUuid(emit.fingerprint)}`
|
|
258
|
+
: `urn:uuid:${randomUUID()}`,
|
|
259
|
+
creationInfo: {
|
|
260
|
+
created: toSpdxTimestamp(emit.timestamp),
|
|
261
|
+
creators: [`Tool: ${TOOL_NAME}-${TOOL_VERSION}`],
|
|
262
|
+
},
|
|
263
|
+
packages,
|
|
264
|
+
};
|
|
265
|
+
return `${JSON.stringify(doc, null, 2)}\n`;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* SPDX timestamps are ISO-8601 with second precision: `YYYY-MM-DDThh:mm:ssZ`.
|
|
269
|
+
*/
|
|
270
|
+
function toSpdxTimestamp(d) {
|
|
271
|
+
// `Date.prototype.toISOString` returns millisecond precision. Strip the
|
|
272
|
+
// `.xxxZ` tail and replace with `Z`.
|
|
273
|
+
const iso = d.toISOString();
|
|
274
|
+
return iso.replace(/\.\d{3}Z$/, "Z");
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* SPDXID grammar (§3.2 spec): `SPDXRef-` + [A-Za-z0-9.-]+.
|
|
278
|
+
* We derive deterministic IDs from (ecosystem, name, version) and replace
|
|
279
|
+
* every illegal char with `-`. Ambiguity is acceptable because SPDX only
|
|
280
|
+
* requires IDs be unique within the document, which holds as long as
|
|
281
|
+
* (ecosystem, name, version) is unique — which is the Dependency phase's
|
|
282
|
+
* invariant.
|
|
283
|
+
*/
|
|
284
|
+
function makeSpdxId(d) {
|
|
285
|
+
const raw = `Pkg-${d.ecosystem}-${d.name}-${d.version}`;
|
|
286
|
+
const safe = raw.replace(/[^A-Za-z0-9.-]/g, "-");
|
|
287
|
+
return `SPDXRef-${safe}`;
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=sbom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sbom.js","sourceRoot":"","sources":["../../../src/pipeline/phases/sbom.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAC;AAE9E,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,GAAG,MAAM,mBAAmB,CAAC;AAEpC,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,MAAM,CAAC,MAAM,eAAe,GAAG,MAAe,CAAC;AAE/C,MAAM,cAAc,GAAG,qBAA8B,CAAC;AACtD,MAAM,SAAS,GAAG,gBAAyB,CAAC;AAC5C,MAAM,SAAS,GAAG,aAAa,CAAC;AAChC,MAAM,YAAY,GAAG,OAAO,CAAC;AAC7B,mEAAmE;AACnE,MAAM,kBAAkB,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;AAQvC,MAAM,CAAC,MAAM,SAAS,GAA8B;IAClD,IAAI,EAAE,eAAe;IACrB,IAAI,EAAE,CAAC,uBAAuB,CAAC;IAC/B,KAAK,CAAC,GAAG,CAAC,GAAG;QACX,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAC9B,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;QACpE,CAAC;QACD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;CACF,CAAC;AAEF,KAAK,UAAU,OAAO,CAAC,GAAoB;IACzC,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,KAAK,KAAK,CAAC;IAE5D,kEAAkE;IAClE,iEAAiE;IACjE,iEAAiE;IACjE,oDAAoD;IACpD,MAAM,IAAI,GAAqB,EAAE,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY;YAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACxD,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAEhD,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAEpF,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,EAAE;QACxC,YAAY;QACZ,SAAS;QACT,WAAW;KACZ,CAAC,CAAC;IACH,MAAM,GAAG,CAAC,aAAa,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAE5E,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE;QAC9B,YAAY;QACZ,SAAS;QACT,WAAW;KACZ,CAAC,CAAC;IACH,MAAM,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAElE,OAAO;QACL,aAAa;QACb,QAAQ;QACR,cAAc,EAAE,IAAI,CAAC,MAAM;KAC5B,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,CAAiB,EAAE,CAAiB;IACvD,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS;QAAE,OAAO,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO;QAAE,OAAO,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,OAAO,CAAC,EAAU;IACzB,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;AACtC,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,IAA+B;IACtD,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,OAAO,IAAI,EAAE,MAAM,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAYD,SAAS,aAAa,CAAC,IAA+B,EAAE,IAAiB;IACvE,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;IAC7B,GAAG,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAExC,wEAAwE;IACxE,0EAA0E;IAC1E,yEAAyE;IACzE,yEAAyE;IACzE,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC,WAAW,EAAE,SAAS,EAAE;QACrF,OAAO,EAAE,YAAY;QACrB,MAAM,EAAE,QAAQ,SAAS,IAAI,YAAY,EAAE;KAC5C,CAAC,CAAC;IACH,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAEjD,sEAAsE;IACtE,uEAAuE;IACvE,6DAA6D;IAC7D,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY;QAClC,CAAC,CAAC,YAAY,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;QACnD,CAAC,CAAC,YAAY,UAAU,EAAE,EAAE,CAAC;IAE/B,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QACvD,8DAA8D;QAC9D,kEAAkE;QAClE,qEAAqE;QACrE,MAAM,IAAI,GAAG,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE;YACrE,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,IAAI;YACJ,MAAM,EAAE,IAAI;SACb,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACzC,kEAAkE;YAClE,+DAA+D;YAC/D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;IAC5B,0EAA0E;IAC1E,uEAAuE;IACvE,MAAM,OAAO,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,IAAI,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IACzD,qEAAqE;IACrE,mDAAmD;IACnD,OAAO,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AAClE,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,WAAmB;IAC5C,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrC,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;AACjH,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CAAC,SAAsC,EAAE,IAAY,EAAE,OAAe;IACtF,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,KAAK;YACR,OAAO,WAAW,cAAc,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;QACzE,KAAK,MAAM;YACT,uEAAuE;YACvE,OAAO,YAAY,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3G,KAAK,IAAI;YACP,iEAAiE;YACjE,kEAAkE;YAClE,oEAAoE;YACpE,gDAAgD;YAChD,OAAO,cAAc,gBAAgB,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9E,KAAK,OAAO;YACV,OAAO,aAAa,cAAc,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3E,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,wCAAwC;YACxC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjB,OAAO,aAAa,cAAc,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3E,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YACvC,OAAO,aAAa,cAAc,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;QACxG,CAAC;QACD,KAAK,OAAO;YACV,OAAO,aAAa,cAAc,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3E,OAAO,CAAC,CAAC,CAAC;YACR,qEAAqE;YACrE,gEAAgE;YAChE,MAAM,WAAW,GAAU,SAAS,CAAC;YACrC,OAAO,eAAe,cAAc,CAAC,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;QACpG,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,uEAAuE;IACvE,sEAAsE;IACtE,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,oEAAoE;IACpE,OAAO,GAAG;SACP,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;SACrC,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AAmCD,SAAS,QAAQ,CAAC,IAA+B,EAAE,IAAiB;IAClE,MAAM,QAAQ,GAAkB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;QACrB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,WAAW,EAAE,CAAC,CAAC,OAAO;QACtB,gBAAgB,EAAE,aAAa;QAC/B,aAAa,EAAE,KAAK;QACpB,gBAAgB,EAAE,aAAa;QAC/B,eAAe,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa;QACjF,aAAa,EAAE,aAAa;QAC5B,YAAY,EAAE;YACZ;gBACE,iBAAiB,EAAE,iBAAiB;gBACpC,aAAa,EAAE,MAAM;gBACrB,gBAAgB,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC;aAC5D;SACF;KACF,CAAC,CAAC,CAAC;IACJ,sEAAsE;IACtE,yEAAyE;IACzE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAElF,MAAM,GAAG,GAAiB;QACxB,WAAW,EAAE,UAAU;QACvB,WAAW,EAAE,SAAS;QACtB,MAAM,EAAE,kBAAkB;QAC1B,IAAI,EAAE,kBAAkB;QACxB,iBAAiB,EAAE,IAAI,CAAC,YAAY;YAClC,CAAC,CAAC,YAAY,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;YACnD,CAAC,CAAC,YAAY,UAAU,EAAE,EAAE;QAC9B,YAAY,EAAE;YACZ,OAAO,EAAE,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC;YACxC,QAAQ,EAAE,CAAC,SAAS,SAAS,IAAI,YAAY,EAAE,CAAC;SACjD;QACD,QAAQ;KACT,CAAC;IACF,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,CAAO;IAC9B,wEAAwE;IACxE,qCAAqC;IACrC,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5B,OAAO,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AACvC,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,UAAU,CAAC,CAAiB;IACnC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;IACxD,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;IACjD,OAAO,WAAW,IAAI,EAAE,CAAC;AAC3B,CAAC"}
|