pr-checkmate 3.0.4 → 3.2.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/dist/{cli.js → cjs/cli.js} +30 -30
- package/dist/{config → cjs/config}/index.d.ts +2 -2
- package/dist/{config → cjs/config}/index.js +8 -7
- package/dist/{config → cjs/config}/loader.d.ts +1 -1
- package/dist/{config → cjs/config}/loader.js +8 -8
- package/dist/{core → cjs/core}/checks/dependencies/banned-imports.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/dependencies/banned-imports.js +10 -10
- package/dist/{core → cjs/core}/checks/dependencies/circular-deps.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/dependencies/circular-deps.js +27 -27
- package/dist/{core → cjs/core}/checks/dependencies/dependency-check.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/dependencies/dependency-check.js +17 -17
- package/dist/{core → cjs/core}/checks/dependencies/grype-scan.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/dependencies/grype-scan.js +18 -18
- package/dist/{core → cjs/core}/checks/dependencies/license-check.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/dependencies/license-check.js +12 -12
- package/dist/{core → cjs/core}/checks/dependencies/npm-audit.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/dependencies/npm-audit.js +14 -14
- package/dist/{core → cjs/core}/checks/dependencies/outdated-deps.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/dependencies/outdated-deps.js +14 -14
- package/dist/{core → cjs/core}/checks/dependencies/vuln-scan.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/dependencies/vuln-scan.js +14 -14
- package/dist/{core → cjs/core}/checks/findings.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/findings.js +16 -16
- package/dist/{core → cjs/core}/checks/git/custom-rules.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/git/custom-rules.js +19 -19
- package/dist/{core → cjs/core}/checks/git/diff-smell.d.ts +2 -2
- package/dist/{core → cjs/core}/checks/git/diff-smell.js +13 -13
- package/dist/{core → cjs/core}/checks/git/large-files.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/git/large-files.js +15 -15
- package/dist/{core → cjs/core}/checks/git/leftover-debug.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/git/leftover-debug.js +13 -13
- package/dist/{core → cjs/core}/checks/git/lockfile-drift.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/git/lockfile-drift.js +12 -12
- package/dist/{core → cjs/core}/checks/git/merge-conflict.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/git/merge-conflict.js +15 -15
- package/dist/{core → cjs/core}/checks/git/missing-tests.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/git/missing-tests.js +15 -15
- package/dist/{core → cjs/core}/checks/git/todo-fixme.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/git/todo-fixme.js +11 -11
- package/dist/{core → cjs/core}/checks/languages/cpp-format.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/languages/cpp-format.js +18 -18
- package/dist/{core → cjs/core}/checks/languages/external-checks.d.ts +9 -9
- package/dist/{core → cjs/core}/checks/languages/external-checks.js +10 -10
- package/dist/{core → cjs/core}/checks/languages/external-runner.d.ts +2 -2
- package/dist/{core → cjs/core}/checks/languages/external-runner.js +21 -21
- package/dist/{core → cjs/core}/checks/languages/go-format.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/languages/go-format.js +21 -21
- package/dist/cjs/core/checks/languages/lint.d.ts +2 -0
- package/dist/{core → cjs/core}/checks/languages/lint.js +21 -21
- package/dist/{core → cjs/core}/checks/languages/prettier.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/languages/prettier.js +18 -18
- package/dist/{core → cjs/core}/checks/languages/python-format.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/languages/python-format.js +14 -14
- package/dist/{core → cjs/core}/checks/languages/python-lint.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/languages/python-lint.js +13 -13
- package/dist/{core → cjs/core}/checks/languages/python-typecheck.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/languages/python-typecheck.js +29 -29
- package/dist/{core → cjs/core}/checks/languages/typecheck.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/languages/typecheck.js +13 -13
- package/dist/{core → cjs/core}/checks/pr/commitlint.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/pr/commitlint.js +12 -12
- package/dist/{core → cjs/core}/checks/pr/pr-body.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/pr/pr-body.js +8 -8
- package/dist/{core → cjs/core}/checks/pr/pr-size-check.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/pr/pr-size-check.js +10 -10
- package/dist/{core → cjs/core}/checks/pr/pr-title-lint.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/pr/pr-title-lint.js +8 -8
- package/dist/{core → cjs/core}/checks/quality/case-collision.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/quality/case-collision.js +7 -7
- package/dist/{core → cjs/core}/checks/quality/config-validation.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/quality/config-validation.js +9 -9
- package/dist/{core → cjs/core}/checks/quality/coverage.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/quality/coverage.js +4 -4
- package/dist/{core → cjs/core}/checks/quality/dead-code.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/quality/dead-code.js +23 -23
- package/dist/{core → cjs/core}/checks/quality/duplicate-check.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/quality/duplicate-check.js +22 -22
- package/dist/{core → cjs/core}/checks/quality/license-header.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/quality/license-header.js +16 -16
- package/dist/{core → cjs/core}/checks/quality/markdown-lint.d.ts +1 -1
- package/dist/cjs/core/checks/quality/markdown-lint.js +147 -0
- package/dist/{core → cjs/core}/checks/quality/package-size.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/quality/package-size.js +12 -12
- package/dist/{core → cjs/core}/checks/quality/spellcheck.d.ts +2 -2
- package/dist/{core → cjs/core}/checks/quality/spellcheck.js +18 -18
- package/dist/{core → cjs/core}/checks/quality/symlinks.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/quality/symlinks.js +8 -8
- package/dist/{core → cjs/core}/checks/quality/yaml-lint.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/quality/yaml-lint.js +12 -12
- package/dist/{core → cjs/core}/checks/security/diff-security.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/security/diff-security.js +15 -15
- package/dist/{core → cjs/core}/checks/security/dockerfile-security.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/security/dockerfile-security.js +16 -16
- package/dist/{core → cjs/core}/checks/security/migration-safety.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/security/migration-safety.js +17 -17
- package/dist/{core → cjs/core}/checks/security/security.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/security/security.js +21 -21
- package/dist/{core → cjs/core}/checks/security/sensitive-file-guard.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/security/sensitive-file-guard.js +14 -14
- package/dist/{core → cjs/core}/checks/security/workflow-security.d.ts +2 -2
- package/dist/{core → cjs/core}/checks/security/workflow-security.js +14 -14
- package/dist/{core → cjs/core}/checks/tool-install.d.ts +1 -1
- package/dist/{core → cjs/core}/checks/tool-install.js +2 -2
- package/dist/{core → cjs/core}/context.d.ts +1 -1
- package/dist/{core → cjs/core}/context.js +16 -16
- package/dist/cjs/core/index.d.ts +4 -0
- package/dist/{core → cjs/core}/index.js +7 -7
- package/dist/{core → cjs/core}/install/cache.js +2 -2
- package/dist/{core → cjs/core}/install/doctor.d.ts +4 -4
- package/dist/{core → cjs/core}/install/doctor.js +34 -34
- package/dist/{core → cjs/core}/install/ensure.d.ts +2 -2
- package/dist/{core → cjs/core}/install/ensure.js +15 -14
- package/dist/{core → cjs/core}/install/lock.js +4 -4
- package/dist/{core → cjs/core}/install/prepare.d.ts +4 -4
- package/dist/{core → cjs/core}/install/prepare.js +13 -13
- package/dist/{core → cjs/core}/install/profiles.d.ts +2 -2
- package/dist/{core → cjs/core}/install/profiles.js +1 -1
- package/dist/{core → cjs/core}/install/reuse.d.ts +1 -1
- package/dist/{core → cjs/core}/install/reuse.js +4 -4
- package/dist/{core → cjs/core}/registry.d.ts +1 -1
- package/dist/cjs/core/registry.js +112 -0
- package/dist/{core → cjs/core}/reporters.d.ts +1 -1
- package/dist/{core → cjs/core}/reporters.js +28 -28
- package/dist/{core → cjs/core}/run-checks.d.ts +2 -2
- package/dist/{core → cjs/core}/run-checks.js +31 -31
- package/dist/{core → cjs/core}/targets.d.ts +1 -1
- package/dist/{core → cjs/core}/targets.js +20 -20
- package/dist/{core → cjs/core}/types.d.ts +3 -3
- package/dist/cjs/index.d.ts +12 -0
- package/dist/{index.js → cjs/index.js} +18 -18
- package/dist/{init.js → cjs/init.js} +68 -56
- package/dist/{interfaces → cjs/interfaces}/index.d.ts +3 -3
- package/dist/cjs/package.json +1 -0
- package/dist/{scripts → cjs/scripts}/copy-configs.js +22 -7
- package/dist/{scripts → cjs/scripts}/generate-install-manifests.js +2 -2
- package/dist/{scripts → cjs/scripts}/publish-github.js +4 -4
- package/dist/{utils → cjs/utils}/detect-language.js +12 -12
- package/dist/{utils → cjs/utils}/git.js +2 -2
- package/dist/{utils → cjs/utils}/http.js +2 -2
- package/dist/cjs/utils/index.d.ts +15 -0
- package/dist/{utils → cjs/utils}/index.js +13 -13
- package/dist/{utils → cjs/utils}/own-deps.d.ts +2 -0
- package/dist/{utils → cjs/utils}/own-deps.js +1 -0
- package/dist/{utils → cjs/utils}/package-version.js +2 -1
- package/dist/{utils → cjs/utils}/resolve-bin.js +2 -1
- package/dist/{utils → cjs/utils}/update-notifier.js +4 -4
- package/dist/esm/cli.d.ts +2 -0
- package/dist/esm/cli.js +137 -0
- package/dist/esm/config/constants.d.ts +153 -0
- package/dist/esm/config/constants.js +360 -0
- package/dist/esm/config/index.d.ts +40 -0
- package/dist/esm/config/index.js +60 -0
- package/dist/esm/config/loader.d.ts +6 -0
- package/dist/esm/config/loader.js +191 -0
- package/dist/esm/config/pr-checkmate-workflow-docker.yml +79 -0
- package/dist/esm/config/pr-checkmate-workflow.yml +92 -0
- package/dist/esm/core/checks/dependencies/banned-imports.d.ts +2 -0
- package/dist/esm/core/checks/dependencies/banned-imports.js +70 -0
- package/dist/esm/core/checks/dependencies/circular-deps.d.ts +2 -0
- package/dist/esm/core/checks/dependencies/circular-deps.js +155 -0
- package/dist/esm/core/checks/dependencies/dependency-check.d.ts +43 -0
- package/dist/esm/core/checks/dependencies/dependency-check.js +174 -0
- package/dist/esm/core/checks/dependencies/grype-scan.d.ts +22 -0
- package/dist/esm/core/checks/dependencies/grype-scan.js +112 -0
- package/dist/esm/core/checks/dependencies/license-check.d.ts +2 -0
- package/dist/esm/core/checks/dependencies/license-check.js +61 -0
- package/dist/esm/core/checks/dependencies/npm-audit.d.ts +6 -0
- package/dist/esm/core/checks/dependencies/npm-audit.js +80 -0
- package/dist/esm/core/checks/dependencies/outdated-deps.d.ts +2 -0
- package/dist/esm/core/checks/dependencies/outdated-deps.js +66 -0
- package/dist/esm/core/checks/dependencies/vuln-scan.d.ts +2 -0
- package/dist/esm/core/checks/dependencies/vuln-scan.js +54 -0
- package/dist/esm/core/checks/findings.d.ts +299 -0
- package/dist/esm/core/checks/findings.js +701 -0
- package/dist/esm/core/checks/git/custom-rules.d.ts +2 -0
- package/dist/esm/core/checks/git/custom-rules.js +106 -0
- package/dist/esm/core/checks/git/diff-smell.d.ts +19 -0
- package/dist/esm/core/checks/git/diff-smell.js +69 -0
- package/dist/esm/core/checks/git/large-files.d.ts +2 -0
- package/dist/esm/core/checks/git/large-files.js +112 -0
- package/dist/esm/core/checks/git/leftover-debug.d.ts +2 -0
- package/dist/esm/core/checks/git/leftover-debug.js +89 -0
- package/dist/esm/core/checks/git/lockfile-drift.d.ts +2 -0
- package/dist/esm/core/checks/git/lockfile-drift.js +114 -0
- package/dist/esm/core/checks/git/merge-conflict.d.ts +2 -0
- package/dist/esm/core/checks/git/merge-conflict.js +117 -0
- package/dist/esm/core/checks/git/missing-tests.d.ts +2 -0
- package/dist/esm/core/checks/git/missing-tests.js +105 -0
- package/dist/esm/core/checks/git/todo-fixme.d.ts +7 -0
- package/dist/esm/core/checks/git/todo-fixme.js +80 -0
- package/dist/esm/core/checks/languages/cpp-format.d.ts +7 -0
- package/dist/esm/core/checks/languages/cpp-format.js +91 -0
- package/dist/esm/core/checks/languages/external-checks.d.ts +77 -0
- package/dist/esm/core/checks/languages/external-checks.js +197 -0
- package/dist/esm/core/checks/languages/external-runner.d.ts +119 -0
- package/dist/esm/core/checks/languages/external-runner.js +138 -0
- package/dist/esm/core/checks/languages/go-format.d.ts +8 -0
- package/dist/esm/core/checks/languages/go-format.js +163 -0
- package/dist/esm/core/checks/languages/lint.d.ts +2 -0
- package/dist/esm/core/checks/languages/lint.js +92 -0
- package/dist/esm/core/checks/languages/prettier.d.ts +2 -0
- package/dist/esm/core/checks/languages/prettier.js +85 -0
- package/dist/esm/core/checks/languages/python-format.d.ts +7 -0
- package/dist/esm/core/checks/languages/python-format.js +61 -0
- package/dist/esm/core/checks/languages/python-lint.d.ts +9 -0
- package/dist/esm/core/checks/languages/python-lint.js +55 -0
- package/dist/esm/core/checks/languages/python-typecheck.d.ts +14 -0
- package/dist/esm/core/checks/languages/python-typecheck.js +184 -0
- package/dist/esm/core/checks/languages/ruff-shared.d.ts +10 -0
- package/dist/esm/core/checks/languages/ruff-shared.js +35 -0
- package/dist/esm/core/checks/languages/typecheck.d.ts +2 -0
- package/dist/esm/core/checks/languages/typecheck.js +61 -0
- package/dist/esm/core/checks/pr/commitlint.d.ts +2 -0
- package/dist/esm/core/checks/pr/commitlint.js +102 -0
- package/dist/esm/core/checks/pr/pr-body.d.ts +2 -0
- package/dist/esm/core/checks/pr/pr-body.js +43 -0
- package/dist/esm/core/checks/pr/pr-size-check.d.ts +2 -0
- package/dist/esm/core/checks/pr/pr-size-check.js +42 -0
- package/dist/esm/core/checks/pr/pr-title-lint.d.ts +2 -0
- package/dist/esm/core/checks/pr/pr-title-lint.js +31 -0
- package/dist/esm/core/checks/quality/case-collision.d.ts +8 -0
- package/dist/esm/core/checks/quality/case-collision.js +39 -0
- package/dist/esm/core/checks/quality/config-validation.d.ts +11 -0
- package/dist/esm/core/checks/quality/config-validation.js +188 -0
- package/dist/esm/core/checks/quality/coverage.d.ts +2 -0
- package/dist/esm/core/checks/quality/coverage.js +62 -0
- package/dist/esm/core/checks/quality/dead-code.d.ts +2 -0
- package/dist/esm/core/checks/quality/dead-code.js +124 -0
- package/dist/esm/core/checks/quality/duplicate-check.d.ts +2 -0
- package/dist/esm/core/checks/quality/duplicate-check.js +141 -0
- package/dist/esm/core/checks/quality/license-header.d.ts +7 -0
- package/dist/esm/core/checks/quality/license-header.js +81 -0
- package/dist/esm/core/checks/quality/markdown-lint.d.ts +2 -0
- package/dist/esm/core/checks/quality/markdown-lint.js +141 -0
- package/dist/esm/core/checks/quality/package-size.d.ts +36 -0
- package/dist/esm/core/checks/quality/package-size.js +196 -0
- package/dist/esm/core/checks/quality/spellcheck.d.ts +77 -0
- package/dist/esm/core/checks/quality/spellcheck.js +296 -0
- package/dist/esm/core/checks/quality/symlinks.d.ts +16 -0
- package/dist/esm/core/checks/quality/symlinks.js +57 -0
- package/dist/esm/core/checks/quality/yaml-lint.d.ts +20 -0
- package/dist/esm/core/checks/quality/yaml-lint.js +116 -0
- package/dist/esm/core/checks/security/diff-security.d.ts +2 -0
- package/dist/esm/core/checks/security/diff-security.js +354 -0
- package/dist/esm/core/checks/security/dockerfile-security.d.ts +2 -0
- package/dist/esm/core/checks/security/dockerfile-security.js +98 -0
- package/dist/esm/core/checks/security/migration-safety.d.ts +2 -0
- package/dist/esm/core/checks/security/migration-safety.js +137 -0
- package/dist/esm/core/checks/security/security.d.ts +63 -0
- package/dist/esm/core/checks/security/security.js +201 -0
- package/dist/esm/core/checks/security/sensitive-file-guard.d.ts +2 -0
- package/dist/esm/core/checks/security/sensitive-file-guard.js +160 -0
- package/dist/esm/core/checks/security/workflow-security.d.ts +12 -0
- package/dist/esm/core/checks/security/workflow-security.js +100 -0
- package/dist/esm/core/checks/tool-install.d.ts +102 -0
- package/dist/esm/core/checks/tool-install.js +66 -0
- package/dist/esm/core/commands.d.ts +27 -0
- package/dist/esm/core/commands.js +89 -0
- package/dist/esm/core/context.d.ts +62 -0
- package/dist/esm/core/context.js +241 -0
- package/dist/esm/core/index.d.ts +4 -0
- package/dist/esm/core/index.js +4 -0
- package/dist/esm/core/install/cache.d.ts +58 -0
- package/dist/esm/core/install/cache.js +142 -0
- package/dist/esm/core/install/doctor.d.ts +35 -0
- package/dist/esm/core/install/doctor.js +164 -0
- package/dist/esm/core/install/ensure.d.ts +77 -0
- package/dist/esm/core/install/ensure.js +269 -0
- package/dist/esm/core/install/lock.d.ts +34 -0
- package/dist/esm/core/install/lock.js +92 -0
- package/dist/esm/core/install/merge.d.ts +47 -0
- package/dist/esm/core/install/merge.js +85 -0
- package/dist/esm/core/install/prepare.d.ts +76 -0
- package/dist/esm/core/install/prepare.js +142 -0
- package/dist/esm/core/install/profiles.d.ts +78 -0
- package/dist/esm/core/install/profiles.js +192 -0
- package/dist/esm/core/install/reuse.d.ts +41 -0
- package/dist/esm/core/install/reuse.js +100 -0
- package/dist/esm/core/registry.d.ts +6 -0
- package/dist/esm/core/registry.js +109 -0
- package/dist/esm/core/reporters.d.ts +18 -0
- package/dist/esm/core/reporters.js +266 -0
- package/dist/esm/core/run-checks.d.ts +33 -0
- package/dist/esm/core/run-checks.js +293 -0
- package/dist/esm/core/targets.d.ts +140 -0
- package/dist/esm/core/targets.js +213 -0
- package/dist/esm/core/types.d.ts +195 -0
- package/dist/esm/core/types.js +38 -0
- package/dist/esm/index.d.ts +12 -0
- package/dist/esm/index.js +15 -0
- package/dist/esm/init.d.ts +38 -0
- package/dist/esm/init.js +421 -0
- package/dist/esm/interfaces/index.d.ts +432 -0
- package/dist/esm/interfaces/index.js +2 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/scripts/copy-configs.d.ts +1 -0
- package/dist/esm/scripts/copy-configs.js +64 -0
- package/dist/esm/scripts/generate-install-manifests.d.ts +39 -0
- package/dist/esm/scripts/generate-install-manifests.js +115 -0
- package/dist/esm/scripts/publish-github.d.ts +1 -0
- package/dist/esm/scripts/publish-github.js +45 -0
- package/dist/esm/utils/ci.d.ts +11 -0
- package/dist/esm/utils/ci.js +40 -0
- package/dist/esm/utils/detect-language.d.ts +48 -0
- package/dist/esm/utils/detect-language.js +234 -0
- package/dist/esm/utils/direct-deps.d.ts +21 -0
- package/dist/esm/utils/direct-deps.js +220 -0
- package/dist/esm/utils/execa.d.ts +22 -0
- package/dist/esm/utils/execa.js +10 -0
- package/dist/esm/utils/git.d.ts +14 -0
- package/dist/esm/utils/git.js +21 -0
- package/dist/esm/utils/glob.d.ts +24 -0
- package/dist/esm/utils/glob.js +40 -0
- package/dist/esm/utils/http.d.ts +59 -0
- package/dist/esm/utils/http.js +115 -0
- package/dist/esm/utils/index.d.ts +15 -0
- package/dist/esm/utils/index.js +26 -0
- package/dist/esm/utils/logger.d.ts +65 -0
- package/dist/esm/utils/logger.js +157 -0
- package/dist/esm/utils/own-deps.d.ts +16 -0
- package/dist/esm/utils/own-deps.js +107 -0
- package/dist/esm/utils/package-version.d.ts +4 -0
- package/dist/esm/utils/package-version.js +38 -0
- package/dist/esm/utils/pool.d.ts +49 -0
- package/dist/esm/utils/pool.js +113 -0
- package/dist/esm/utils/resolve-bin.d.ts +67 -0
- package/dist/esm/utils/resolve-bin.js +156 -0
- package/dist/esm/utils/result-collector.d.ts +33 -0
- package/dist/esm/utils/result-collector.js +44 -0
- package/dist/esm/utils/update-notifier.d.ts +19 -0
- package/dist/esm/utils/update-notifier.js +108 -0
- package/install-manifests/core/package-lock.json +4 -4
- package/install-manifests/core/package.json +1 -1
- package/install-manifests/duplicate/package-lock.json +0 -12
- package/install-manifests/js/package-lock.json +17 -41
- package/install-manifests/js/package.json +1 -1
- package/install-manifests/markdown/package-lock.json +1 -492
- package/install-manifests/markdown/package.json +1 -1
- package/package.json +17 -15
- package/dist/core/checks/languages/lint.d.ts +0 -2
- package/dist/core/checks/quality/markdown-lint.js +0 -110
- package/dist/core/index.d.ts +0 -4
- package/dist/core/registry.js +0 -112
- package/dist/index.d.ts +0 -12
- package/dist/utils/index.d.ts +0 -15
- /package/dist/{cli.d.ts → cjs/cli.d.ts} +0 -0
- /package/dist/{config → cjs/config}/constants.d.ts +0 -0
- /package/dist/{config → cjs/config}/constants.js +0 -0
- /package/dist/{config → cjs/config}/pr-checkmate-workflow-docker.yml +0 -0
- /package/dist/{config → cjs/config}/pr-checkmate-workflow.yml +0 -0
- /package/dist/{core → cjs/core}/checks/languages/ruff-shared.d.ts +0 -0
- /package/dist/{core → cjs/core}/checks/languages/ruff-shared.js +0 -0
- /package/dist/{core → cjs/core}/commands.d.ts +0 -0
- /package/dist/{core → cjs/core}/commands.js +0 -0
- /package/dist/{core → cjs/core}/install/cache.d.ts +0 -0
- /package/dist/{core → cjs/core}/install/lock.d.ts +0 -0
- /package/dist/{core → cjs/core}/install/merge.d.ts +0 -0
- /package/dist/{core → cjs/core}/install/merge.js +0 -0
- /package/dist/{core → cjs/core}/types.js +0 -0
- /package/dist/{init.d.ts → cjs/init.d.ts} +0 -0
- /package/dist/{interfaces → cjs/interfaces}/index.js +0 -0
- /package/dist/{scripts → cjs/scripts}/copy-configs.d.ts +0 -0
- /package/dist/{scripts → cjs/scripts}/generate-install-manifests.d.ts +0 -0
- /package/dist/{scripts → cjs/scripts}/publish-github.d.ts +0 -0
- /package/dist/{utils → cjs/utils}/ci.d.ts +0 -0
- /package/dist/{utils → cjs/utils}/ci.js +0 -0
- /package/dist/{utils → cjs/utils}/detect-language.d.ts +0 -0
- /package/dist/{utils → cjs/utils}/direct-deps.d.ts +0 -0
- /package/dist/{utils → cjs/utils}/direct-deps.js +0 -0
- /package/dist/{utils → cjs/utils}/execa.d.ts +0 -0
- /package/dist/{utils → cjs/utils}/execa.js +0 -0
- /package/dist/{utils → cjs/utils}/git.d.ts +0 -0
- /package/dist/{utils → cjs/utils}/glob.d.ts +0 -0
- /package/dist/{utils → cjs/utils}/glob.js +0 -0
- /package/dist/{utils → cjs/utils}/http.d.ts +0 -0
- /package/dist/{utils → cjs/utils}/logger.d.ts +0 -0
- /package/dist/{utils → cjs/utils}/logger.js +0 -0
- /package/dist/{utils → cjs/utils}/package-version.d.ts +0 -0
- /package/dist/{utils → cjs/utils}/pool.d.ts +0 -0
- /package/dist/{utils → cjs/utils}/pool.js +0 -0
- /package/dist/{utils → cjs/utils}/resolve-bin.d.ts +0 -0
- /package/dist/{utils → cjs/utils}/result-collector.d.ts +0 -0
- /package/dist/{utils → cjs/utils}/result-collector.js +0 -0
- /package/dist/{utils → cjs/utils}/update-notifier.d.ts +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.grypeScanCheck = void 0;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
4
|
+
const execa_js_1 = require("../../../utils/execa.js");
|
|
5
|
+
const index_js_1 = require("../../../utils/index.js");
|
|
6
|
+
const types_js_1 = require("../../types.js");
|
|
7
|
+
const tool_install_js_1 = require("../tool-install.js");
|
|
8
8
|
const SEVERITY_ORDER = ['negligible', 'low', 'medium', 'high', 'critical'];
|
|
9
9
|
/** grype artifact `type` → the ecosystem we can resolve direct deps for. */
|
|
10
10
|
const TYPE_TO_ECOSYSTEM = {
|
|
@@ -62,7 +62,7 @@ exports.grypeScanCheck = {
|
|
|
62
62
|
// third-party code is not something the client could fix anyway (see below).
|
|
63
63
|
const excludes = (ctx.config.ignoreDirs ?? []).flatMap(dir => ['--exclude', `**/${dir}/**`]);
|
|
64
64
|
const timeout = ctx.config.grypeScan?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
65
|
-
const result = await (0,
|
|
65
|
+
const result = await (0, execa_js_1.execa)('grype', ['dir:.', '-o', 'json', '-q', ...excludes], {
|
|
66
66
|
cwd: ctx.cwd,
|
|
67
67
|
reject: false,
|
|
68
68
|
timeout,
|
|
@@ -70,27 +70,27 @@ exports.grypeScanCheck = {
|
|
|
70
70
|
// execa v9 with reject:false resolves (not throws) with `code: 'ENOENT'`
|
|
71
71
|
// when the binary is absent — detect the missing scanner on the result.
|
|
72
72
|
if (result.code === 'ENOENT')
|
|
73
|
-
return (0,
|
|
73
|
+
return (0, tool_install_js_1.notInstalled)('grype');
|
|
74
74
|
if (result.timedOut) {
|
|
75
|
-
|
|
76
|
-
return (0,
|
|
75
|
+
index_js_1.logger.warn(`[Grype Scan]: ⚠️ grype timed out after ${timeout}ms — skipping`);
|
|
76
|
+
return (0, types_js_1.skip)('grype timed out');
|
|
77
77
|
}
|
|
78
78
|
let report;
|
|
79
79
|
try {
|
|
80
80
|
report = JSON.parse(result.stdout);
|
|
81
81
|
}
|
|
82
82
|
catch {
|
|
83
|
-
return (0,
|
|
83
|
+
return (0, types_js_1.warn)('grype produced no parseable output');
|
|
84
84
|
}
|
|
85
85
|
const matches = report.matches ?? [];
|
|
86
|
-
const direct = (0,
|
|
86
|
+
const direct = (0, index_js_1.collectDirectDeps)(ctx.cwd);
|
|
87
87
|
// Keep only: severity >= threshold, a direct dependency, and not ignored.
|
|
88
88
|
const isDirect = (m) => {
|
|
89
89
|
const ecosystem = TYPE_TO_ECOSYSTEM[m.artifact?.type ?? ''];
|
|
90
90
|
const names = ecosystem && direct.get(ecosystem);
|
|
91
91
|
if (!names)
|
|
92
92
|
return false; // unknown/unparseable ecosystem → not our concern
|
|
93
|
-
return names.has((0,
|
|
93
|
+
return names.has((0, index_js_1.normalizeName)(ecosystem, m.artifact?.name ?? ''));
|
|
94
94
|
};
|
|
95
95
|
const isIgnored = (m) => ignore.includes((m.vulnerability?.id ?? '').toLowerCase()) ||
|
|
96
96
|
ignore.includes((m.artifact?.name ?? '').toLowerCase());
|
|
@@ -98,18 +98,18 @@ exports.grypeScanCheck = {
|
|
|
98
98
|
const findings = atSeverity.filter(m => isDirect(m) && !isIgnored(m));
|
|
99
99
|
const suppressed = atSeverity.length - findings.length;
|
|
100
100
|
if (suppressed > 0) {
|
|
101
|
-
|
|
101
|
+
index_js_1.logger.info(`[Grype Scan]: suppressed ${suppressed} finding(s) — transitive/third-party (not directly fixable) or ignored`);
|
|
102
102
|
}
|
|
103
103
|
if (findings.length === 0) {
|
|
104
|
-
|
|
105
|
-
return (0,
|
|
104
|
+
index_js_1.logger.info('[Grype Scan]: ✅ No known vulnerabilities in direct dependencies');
|
|
105
|
+
return (0, types_js_1.pass)();
|
|
106
106
|
}
|
|
107
|
-
|
|
107
|
+
index_js_1.logger.warn(`[Grype Scan]: ⚠️ vulnerabilities in direct dependencies (>= ${minSeverity}):`);
|
|
108
108
|
findings
|
|
109
109
|
.slice(0, 10)
|
|
110
|
-
.forEach(m =>
|
|
110
|
+
.forEach(m => index_js_1.logger.warn(` ${m.vulnerability?.id ?? 'unknown'} — ${m.artifact?.name ?? '?'}@${m.artifact?.version ?? '?'} (${m.vulnerability?.severity ?? '?'})`));
|
|
111
111
|
if (findings.length > 10)
|
|
112
|
-
|
|
113
|
-
return (0,
|
|
112
|
+
index_js_1.logger.warn(` ... and ${findings.length - 10} more`);
|
|
113
|
+
return (0, types_js_1.warn)(`${findings.length} direct-dependency vulnerability(ies) at "${minSeverity}"+ (grype)`);
|
|
114
114
|
},
|
|
115
115
|
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Check } from '../../types';
|
|
1
|
+
import { Check } from '../../types.js';
|
|
2
2
|
export declare const licenseCheck: Check;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.licenseCheck = void 0;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
4
|
+
const execa_js_1 = require("../../../utils/execa.js");
|
|
5
|
+
const index_js_1 = require("../../../utils/index.js");
|
|
6
|
+
const types_js_1 = require("../../types.js");
|
|
7
7
|
const FORBIDDEN_LICENSES = ['GPL-2.0', 'GPL-3.0', 'AGPL-3.0', 'LGPL-2.0', 'LGPL-2.1', 'LGPL-3.0'];
|
|
8
8
|
/** Strip the trailing "@version" to get the bare package name (scoped-safe). */
|
|
9
9
|
function bareName(pkgKey) {
|
|
@@ -14,7 +14,7 @@ exports.licenseCheck = {
|
|
|
14
14
|
name: 'License Check',
|
|
15
15
|
phase: 'blocking',
|
|
16
16
|
applies(ctx) {
|
|
17
|
-
return (0,
|
|
17
|
+
return (0, types_js_1.isNpmProject)(ctx);
|
|
18
18
|
},
|
|
19
19
|
async run(ctx) {
|
|
20
20
|
const allowPackages = new Set(ctx.config.licenseCheck?.allowPackages ?? []);
|
|
@@ -23,24 +23,24 @@ exports.licenseCheck = {
|
|
|
23
23
|
// deps (eslint plugins, cspell dictionaries, …) leak into the client's
|
|
24
24
|
// production tree. Those are our dependencies, not the client's — never fail
|
|
25
25
|
// a client's PR because of a license we ourselves pulled in.
|
|
26
|
-
const ownDeps = (0,
|
|
26
|
+
const ownDeps = (0, index_js_1.getOwnDependencyClosure)();
|
|
27
27
|
// Resolve the bundled license-checker binary and run it via the current node — never
|
|
28
28
|
// shell out to `npx`, which fails (exit 127) when license-checker isn't on the path.
|
|
29
29
|
let licenseCheckerBin;
|
|
30
30
|
try {
|
|
31
|
-
licenseCheckerBin = (0,
|
|
31
|
+
licenseCheckerBin = (0, index_js_1.resolvePackageBin)('license-checker-rseidelsohn', 'bin/license-checker-rseidelsohn.js');
|
|
32
32
|
}
|
|
33
33
|
catch {
|
|
34
|
-
return (0,
|
|
34
|
+
return (0, types_js_1.skip)('license-checker unavailable');
|
|
35
35
|
}
|
|
36
|
-
const { stdout, failed } = await (0,
|
|
36
|
+
const { stdout, failed } = await (0, execa_js_1.execa)(process.execPath, [licenseCheckerBin, '--json', '--production'], { cwd: ctx.cwd, reject: false });
|
|
37
37
|
let licenses;
|
|
38
38
|
try {
|
|
39
39
|
licenses = JSON.parse(stdout);
|
|
40
40
|
}
|
|
41
41
|
catch {
|
|
42
42
|
// Tool couldn't produce parseable output; skip rather than fail the client's PR.
|
|
43
|
-
return (0,
|
|
43
|
+
return (0, types_js_1.skip)(failed ? 'license-checker failed to run' : 'license-checker produced invalid JSON');
|
|
44
44
|
}
|
|
45
45
|
const violations = [];
|
|
46
46
|
for (const [pkg, info] of Object.entries(licenses)) {
|
|
@@ -56,9 +56,9 @@ exports.licenseCheck = {
|
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
58
|
if (violations.length > 0) {
|
|
59
|
-
violations.forEach(v =>
|
|
60
|
-
return (0,
|
|
59
|
+
violations.forEach(v => index_js_1.logger.error(`[License Check]: ❌ ${v}`));
|
|
60
|
+
return (0, types_js_1.fail)(`${violations.length} forbidden license(s)`);
|
|
61
61
|
}
|
|
62
|
-
return (0,
|
|
62
|
+
return (0, types_js_1.pass)();
|
|
63
63
|
},
|
|
64
64
|
};
|
|
@@ -6,9 +6,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.npmAuditCheck = void 0;
|
|
7
7
|
const node_fs_1 = __importDefault(require("node:fs"));
|
|
8
8
|
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
const
|
|
9
|
+
const execa_js_1 = require("../../../utils/execa.js");
|
|
10
|
+
const index_js_1 = require("../../../utils/index.js");
|
|
11
|
+
const types_js_1 = require("../../types.js");
|
|
12
12
|
const SEVERITY_ORDER = ['info', 'low', 'moderate', 'high', 'critical'];
|
|
13
13
|
function isSeverityAtLeast(severity, level) {
|
|
14
14
|
const sevIdx = SEVERITY_ORDER.indexOf(severity);
|
|
@@ -17,7 +17,7 @@ function isSeverityAtLeast(severity, level) {
|
|
|
17
17
|
}
|
|
18
18
|
function getOwnPackageName() {
|
|
19
19
|
try {
|
|
20
|
-
const ownPkg = node_path_1.default.resolve(__dirname, '
|
|
20
|
+
const ownPkg = node_path_1.default.join((0, index_js_1.findOwnPackageRoot)() ?? node_path_1.default.resolve(__dirname, '../../../..'), 'package.json');
|
|
21
21
|
return JSON.parse(node_fs_1.default.readFileSync(ownPkg, 'utf-8')).name ?? null;
|
|
22
22
|
}
|
|
23
23
|
catch {
|
|
@@ -34,7 +34,7 @@ exports.npmAuditCheck = {
|
|
|
34
34
|
applies(ctx) {
|
|
35
35
|
if (ctx.config.security?.['npm-audit']?.enabled === false)
|
|
36
36
|
return false;
|
|
37
|
-
return (0,
|
|
37
|
+
return (0, types_js_1.isNpmProject)(ctx);
|
|
38
38
|
},
|
|
39
39
|
async run(ctx) {
|
|
40
40
|
// `high`, not `moderate`. A moderate CVE in a direct dependency often has no
|
|
@@ -45,7 +45,7 @@ exports.npmAuditCheck = {
|
|
|
45
45
|
const auditLevel = ctx.config.security?.['npm-audit']?.auditLevel ?? 'high';
|
|
46
46
|
const ignore = new Set((ctx.config.security?.['npm-audit']?.ignore ?? []).map(name => name.toLowerCase()));
|
|
47
47
|
const ownName = getOwnPackageName();
|
|
48
|
-
const { stdout } = await (0,
|
|
48
|
+
const { stdout } = await (0, execa_js_1.execa)('npm', ['audit', '--json'], { cwd: ctx.cwd, reject: false });
|
|
49
49
|
// `npm audit` reports registry/lockfile problems as JSON on stdout, but not
|
|
50
50
|
// always: an absent npm (execa resolves with `code: 'ENOENT'`), a killed
|
|
51
51
|
// process or a proxy that answers with HTML all leave stdout unparseable.
|
|
@@ -57,16 +57,16 @@ exports.npmAuditCheck = {
|
|
|
57
57
|
report = JSON.parse(stdout);
|
|
58
58
|
}
|
|
59
59
|
catch {
|
|
60
|
-
|
|
61
|
-
return (0,
|
|
60
|
+
index_js_1.logger.warn('[NPM Audit]: ⚠️ npm audit produced no parseable report — skipping');
|
|
61
|
+
return (0, types_js_1.skip)('npm audit produced no parseable report');
|
|
62
62
|
}
|
|
63
63
|
// A repo with no lockfile, or a registry npm cannot reach, yields
|
|
64
64
|
// `{"error":{"code":"ENOLOCK",…}}` — no `vulnerabilities` key at all. Passing
|
|
65
65
|
// on that reads as "no vulnerabilities" when nothing was actually audited.
|
|
66
66
|
if (report.error) {
|
|
67
67
|
const detail = report.error.summary ?? report.error.code ?? 'unknown error';
|
|
68
|
-
|
|
69
|
-
return (0,
|
|
68
|
+
index_js_1.logger.warn(`[NPM Audit]: ⚠️ npm could not audit this project — ${detail}`);
|
|
69
|
+
return (0, types_js_1.skip)(`npm audit unavailable: ${report.error.code ?? 'error'}`);
|
|
70
70
|
}
|
|
71
71
|
const relevant = Object.values(report.vulnerabilities ?? {}).filter(v => v.isDirect && v.name !== ownName && isSeverityAtLeast(v.severity, auditLevel));
|
|
72
72
|
const [ignored, directVulns] = relevant.reduce(([skip, block], v) => {
|
|
@@ -74,10 +74,10 @@ exports.npmAuditCheck = {
|
|
|
74
74
|
return [skip, block];
|
|
75
75
|
}, [[], []]);
|
|
76
76
|
// Ignored advisories stay visible as warnings — an exception is not a silent drop.
|
|
77
|
-
ignored.forEach(v =>
|
|
77
|
+
ignored.forEach(v => index_js_1.logger.warn(`[NPM Audit]: ⚠ ${v.name} — severity: ${v.severity} (ignored via config)`));
|
|
78
78
|
if (directVulns.length === 0)
|
|
79
|
-
return (0,
|
|
80
|
-
directVulns.forEach(v =>
|
|
81
|
-
return (0,
|
|
79
|
+
return (0, types_js_1.pass)();
|
|
80
|
+
directVulns.forEach(v => index_js_1.logger.error(`[NPM Audit]: ❌ ${v.name} — severity: ${v.severity}`));
|
|
81
|
+
return (0, types_js_1.fail)(`${directVulns.length} direct vulnerability(ies) at "${auditLevel}"+`);
|
|
82
82
|
},
|
|
83
83
|
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Check } from '../../types';
|
|
1
|
+
import { Check } from '../../types.js';
|
|
2
2
|
export declare const outdatedDepsCheck: Check;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.outdatedDepsCheck = void 0;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
4
|
+
const execa_js_1 = require("../../../utils/execa.js");
|
|
5
|
+
const index_js_1 = require("../../../utils/index.js");
|
|
6
|
+
const types_js_1 = require("../../types.js");
|
|
7
7
|
const DEFAULT_TIMEOUT_MS = 30000;
|
|
8
8
|
exports.outdatedDepsCheck = {
|
|
9
9
|
name: 'Outdated Deps',
|
|
@@ -11,7 +11,7 @@ exports.outdatedDepsCheck = {
|
|
|
11
11
|
applies(ctx) {
|
|
12
12
|
if (ctx.config.outdatedDeps?.enabled === false)
|
|
13
13
|
return false;
|
|
14
|
-
return (0,
|
|
14
|
+
return (0, types_js_1.isNpmProject)(ctx);
|
|
15
15
|
},
|
|
16
16
|
async run(ctx) {
|
|
17
17
|
// `npm outdated` queries the registry for every dependency and can take a
|
|
@@ -19,30 +19,30 @@ exports.outdatedDepsCheck = {
|
|
|
19
19
|
// holds up CI. On timeout, skip rather than fail.
|
|
20
20
|
const timeout = ctx.config.outdatedDeps?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
21
21
|
// npm outdated exits 1 when outdated packages exist — use reject:false.
|
|
22
|
-
const result = await (0,
|
|
22
|
+
const result = await (0, execa_js_1.execa)('npm', ['outdated', '--json'], {
|
|
23
23
|
cwd: ctx.cwd,
|
|
24
24
|
reject: false,
|
|
25
25
|
timeout,
|
|
26
26
|
});
|
|
27
27
|
if (result.timedOut) {
|
|
28
|
-
|
|
29
|
-
return (0,
|
|
28
|
+
index_js_1.logger.warn(`[Outdated Deps]: ⚠️ npm outdated timed out after ${timeout}ms — skipping`);
|
|
29
|
+
return (0, types_js_1.skip)('npm outdated timed out');
|
|
30
30
|
}
|
|
31
31
|
if (!result.stdout?.trim())
|
|
32
|
-
return (0,
|
|
32
|
+
return (0, types_js_1.pass)();
|
|
33
33
|
let outdated;
|
|
34
34
|
try {
|
|
35
35
|
outdated = JSON.parse(result.stdout);
|
|
36
36
|
}
|
|
37
37
|
catch {
|
|
38
|
-
return (0,
|
|
38
|
+
return (0, types_js_1.pass)();
|
|
39
39
|
}
|
|
40
40
|
// Packages deliberately pinned behind their latest major (see outdatedDeps.ignore
|
|
41
41
|
// in pr-checkmate.json) are dropped before counting, so they never warn.
|
|
42
42
|
const ignore = new Set(ctx.config.outdatedDeps?.ignore ?? []);
|
|
43
43
|
const entries = Object.entries(outdated).filter(([pkg]) => !ignore.has(pkg));
|
|
44
44
|
if (entries.length === 0)
|
|
45
|
-
return (0,
|
|
45
|
+
return (0, types_js_1.pass)();
|
|
46
46
|
// `current` is only populated when the package is installed in node_modules.
|
|
47
47
|
// In CI (npx-invoked validator, no `npm ci` for the target repo) it's absent,
|
|
48
48
|
// so fall back to `wanted` — the version the package.json range resolves to,
|
|
@@ -57,13 +57,13 @@ exports.outdatedDepsCheck = {
|
|
|
57
57
|
return parseInt(latest?.split('.')[0] ?? '0', 10) > parseInt(baseline.split('.')[0], 10);
|
|
58
58
|
});
|
|
59
59
|
if (majorBehind.length > 0) {
|
|
60
|
-
majorBehind.forEach(({ pkg, baseline, latest }) =>
|
|
61
|
-
return (0,
|
|
60
|
+
majorBehind.forEach(({ pkg, baseline, latest }) => index_js_1.logger.warn(`[Outdated Deps]: ⚠️ ${pkg}: ${baseline} → ${latest}`));
|
|
61
|
+
return (0, types_js_1.warn)(`${majorBehind.length} package(s) major versions behind`);
|
|
62
62
|
}
|
|
63
63
|
const minorBehind = entries.length - majorBehind.length;
|
|
64
64
|
if (minorBehind > 0) {
|
|
65
|
-
|
|
65
|
+
index_js_1.logger.info(`[Outdated Deps]: ${minorBehind} package(s) have minor/patch updates`);
|
|
66
66
|
}
|
|
67
|
-
return (0,
|
|
67
|
+
return (0, types_js_1.pass)();
|
|
68
68
|
},
|
|
69
69
|
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Check } from '../../types';
|
|
1
|
+
import { Check } from '../../types.js';
|
|
2
2
|
export declare const vulnScanCheck: Check;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.vulnScanCheck = void 0;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
4
|
+
const execa_js_1 = require("../../../utils/execa.js");
|
|
5
|
+
const index_js_1 = require("../../../utils/index.js");
|
|
6
|
+
const types_js_1 = require("../../types.js");
|
|
7
|
+
const tool_install_js_1 = require("../tool-install.js");
|
|
8
8
|
/**
|
|
9
9
|
* Cross-language dependency vulnerability scan via osv-scanner, which reads
|
|
10
10
|
* lockfiles across ecosystems (npm, PyPI, Go, crates, Maven, …) against the OSV
|
|
@@ -26,7 +26,7 @@ exports.vulnScanCheck = {
|
|
|
26
26
|
},
|
|
27
27
|
async run(ctx) {
|
|
28
28
|
const timeout = ctx.config.vulnScan?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
29
|
-
const result = await (0,
|
|
29
|
+
const result = await (0, execa_js_1.execa)('osv-scanner', ['-r', '.'], {
|
|
30
30
|
cwd: ctx.cwd,
|
|
31
31
|
reject: false,
|
|
32
32
|
timeout,
|
|
@@ -34,24 +34,24 @@ exports.vulnScanCheck = {
|
|
|
34
34
|
// execa v9 with reject:false resolves (not throws) with `code: 'ENOENT'`
|
|
35
35
|
// when the binary is absent — detect the missing scanner on the result.
|
|
36
36
|
if (result.code === 'ENOENT')
|
|
37
|
-
return (0,
|
|
37
|
+
return (0, tool_install_js_1.notInstalled)('osv-scanner');
|
|
38
38
|
if (result.timedOut) {
|
|
39
|
-
|
|
40
|
-
return (0,
|
|
39
|
+
index_js_1.logger.warn(`[Vuln Scan]: ⚠️ osv-scanner timed out after ${timeout}ms — skipping`);
|
|
40
|
+
return (0, types_js_1.skip)('osv-scanner timed out');
|
|
41
41
|
}
|
|
42
42
|
if (result.exitCode === 0) {
|
|
43
|
-
|
|
44
|
-
return (0,
|
|
43
|
+
index_js_1.logger.info('[Vuln Scan]: ✅ No known vulnerabilities');
|
|
44
|
+
return (0, types_js_1.pass)();
|
|
45
45
|
}
|
|
46
46
|
const lines = [result.stdout, result.stderr]
|
|
47
47
|
.filter(Boolean)
|
|
48
48
|
.join('\n')
|
|
49
49
|
.split('\n')
|
|
50
50
|
.filter(l => /\b(CVE-|GHSA-|vulnerab|advisor)/i.test(l));
|
|
51
|
-
|
|
52
|
-
lines.slice(0, 10).forEach(l =>
|
|
51
|
+
index_js_1.logger.warn('[Vuln Scan]: ⚠️ known vulnerabilities found:');
|
|
52
|
+
lines.slice(0, 10).forEach(l => index_js_1.logger.warn(` ${l.trim()}`));
|
|
53
53
|
if (lines.length > 10)
|
|
54
|
-
|
|
55
|
-
return (0,
|
|
54
|
+
index_js_1.logger.warn(` ... and ${lines.length - 10} more`);
|
|
55
|
+
return (0, types_js_1.warn)(`${lines.length || 'unknown'} vulnerability finding(s) (osv-scanner)`);
|
|
56
56
|
},
|
|
57
57
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CheckContext, CheckOutcome } from '../types';
|
|
1
|
+
import { CheckContext, CheckOutcome } from '../types.js';
|
|
2
2
|
/**
|
|
3
3
|
* Client-configurable severity for a check's findings, read from that check's
|
|
4
4
|
* config block (e.g. `mergeConflict.severity`). `error` fails the run, `warn`
|
|
@@ -21,10 +21,10 @@ exports.clientFindingOptions = clientFindingOptions;
|
|
|
21
21
|
exports.reportSeverityBuckets = reportSeverityBuckets;
|
|
22
22
|
const node_fs_1 = __importDefault(require("node:fs"));
|
|
23
23
|
const node_path_1 = __importDefault(require("node:path"));
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
const
|
|
24
|
+
const execa_js_1 = require("../../utils/execa.js");
|
|
25
|
+
const index_js_1 = require("../../utils/index.js");
|
|
26
|
+
const targets_js_1 = require("../targets.js");
|
|
27
|
+
const types_js_1 = require("../types.js");
|
|
28
28
|
/**
|
|
29
29
|
* Resolve a check's effective severity (`configured` from config, else its
|
|
30
30
|
* `fallback`) into a matched logger, icon, and outcome constructor — so a check
|
|
@@ -33,9 +33,9 @@ const types_1 = require("../types");
|
|
|
33
33
|
function severityEmitter(configured, fallback) {
|
|
34
34
|
const isError = (configured ?? fallback) === 'error';
|
|
35
35
|
return {
|
|
36
|
-
log: (isError ?
|
|
36
|
+
log: (isError ? index_js_1.logger.error : index_js_1.logger.warn).bind(index_js_1.logger),
|
|
37
37
|
icon: isError ? '❌' : '⚠️',
|
|
38
|
-
emit: (details) => (isError ? (0,
|
|
38
|
+
emit: (details) => (isError ? (0, types_js_1.fail)(details) : (0, types_js_1.warn)(details)),
|
|
39
39
|
};
|
|
40
40
|
}
|
|
41
41
|
/** Append `from`'s samples to `into`, merging labels both sides produced. */
|
|
@@ -80,7 +80,7 @@ async function diffAddedLines(ctx, globs) {
|
|
|
80
80
|
const cacheKey = `d:${args.join('')}`;
|
|
81
81
|
let stdout = ctx.cache?.get(cacheKey);
|
|
82
82
|
if (stdout === undefined) {
|
|
83
|
-
stdout = (await (0,
|
|
83
|
+
stdout = (await (0, execa_js_1.execa)('git', args, { cwd: ctx.cwd })).stdout;
|
|
84
84
|
ctx.cache?.set(cacheKey, stdout);
|
|
85
85
|
}
|
|
86
86
|
// Universal inline suppression: strip added lines opted out with the
|
|
@@ -159,7 +159,7 @@ async function reviewLines(ctx, globs, onChunk) {
|
|
|
159
159
|
}
|
|
160
160
|
if (ctx.config.run?.fullScanBehaviour === 'skip')
|
|
161
161
|
return true;
|
|
162
|
-
const files = await (0,
|
|
162
|
+
const files = await (0, targets_js_1.listTrackedFiles)(ctx, globs, ['.']);
|
|
163
163
|
if (files === null)
|
|
164
164
|
return false;
|
|
165
165
|
await scanTrackedFiles(ctx, files, onChunk);
|
|
@@ -476,7 +476,7 @@ function scanDiffPatterns(stdout, patterns, opts = {}) {
|
|
|
476
476
|
if (header) {
|
|
477
477
|
syntax = mode === 'language' ? commentSyntaxFor(header[1]) : 'both';
|
|
478
478
|
inBlockComment = false;
|
|
479
|
-
skippingFile = ignorePaths.length > 0 && (0,
|
|
479
|
+
skippingFile = ignorePaths.length > 0 && (0, index_js_1.matchesAnyGlob)(header[1], ignorePaths);
|
|
480
480
|
taint.reset();
|
|
481
481
|
continue;
|
|
482
482
|
}
|
|
@@ -578,10 +578,10 @@ const MAX_LOGGED = 10;
|
|
|
578
578
|
* shape (ticket 079).
|
|
579
579
|
*/
|
|
580
580
|
function logSample(name, summary, lines) {
|
|
581
|
-
|
|
582
|
-
lines.slice(0, MAX_LOGGED).forEach(line =>
|
|
581
|
+
index_js_1.logger.warn(`[${name}]: ⚠️ ${summary}`);
|
|
582
|
+
lines.slice(0, MAX_LOGGED).forEach(line => index_js_1.logger.warn(` ${line}`));
|
|
583
583
|
if (lines.length > MAX_LOGGED)
|
|
584
|
-
|
|
584
|
+
index_js_1.logger.warn(` ... and ${lines.length - MAX_LOGGED} more`);
|
|
585
585
|
}
|
|
586
586
|
function bucketTotal(bucket) {
|
|
587
587
|
return Object.values(bucket).reduce((sum, arr) => sum + arr.length, 0);
|
|
@@ -617,7 +617,7 @@ function reportCountedFindings(findings, ctx, opts) {
|
|
|
617
617
|
* two cannot report different levels.
|
|
618
618
|
*/
|
|
619
619
|
function logFindings(bucket, opts) {
|
|
620
|
-
const emit = opts.isError ?
|
|
620
|
+
const emit = opts.isError ? index_js_1.logger.error.bind(index_js_1.logger) : index_js_1.logger.warn.bind(index_js_1.logger);
|
|
621
621
|
const icon = opts.isError ? '❌' : '⚠️';
|
|
622
622
|
const showCount = opts.showCount ?? true;
|
|
623
623
|
const { sampleLimit } = opts;
|
|
@@ -705,18 +705,18 @@ function reportSeverityBuckets(errorsIn, warningsIn, opts) {
|
|
|
705
705
|
const totalErrors = bucketTotal(errors);
|
|
706
706
|
const totalWarnings = bucketTotal(warnings);
|
|
707
707
|
if (totalErrors === 0 && totalWarnings === 0)
|
|
708
|
-
return (0,
|
|
708
|
+
return (0, types_js_1.pass)();
|
|
709
709
|
const logOpts = { prefix: opts.prefix, showCount: opts.showCount, sampleLimit: opts.sampleLimit };
|
|
710
710
|
logFindings(errors, { ...logOpts, isError: true });
|
|
711
711
|
logFindings(warnings, { ...logOpts, isError: false });
|
|
712
712
|
const failOn = opts.failOn ?? opts.defaults?.failOn ?? 'error';
|
|
713
713
|
if (failOn === 'never')
|
|
714
|
-
return (0,
|
|
714
|
+
return (0, types_js_1.pass)();
|
|
715
715
|
const parts = [];
|
|
716
716
|
if (totalErrors > 0)
|
|
717
717
|
parts.push(opts.errorSummary(totalErrors));
|
|
718
718
|
if (totalWarnings > 0)
|
|
719
719
|
parts.push(opts.warningSummary(totalWarnings));
|
|
720
720
|
const summary = parts.join(', ');
|
|
721
|
-
return failOn === 'error' && totalErrors > 0 ? (0,
|
|
721
|
+
return failOn === 'error' && totalErrors > 0 ? (0, types_js_1.fail)(summary) : (0, types_js_1.warn)(summary);
|
|
722
722
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Check } from '../../types';
|
|
1
|
+
import { Check } from '../../types.js';
|
|
2
2
|
export declare const customRulesCheck: Check;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.customRulesCheck = void 0;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
const
|
|
4
|
+
const execa_js_1 = require("../../../utils/execa.js");
|
|
5
|
+
const index_js_1 = require("../../../utils/index.js");
|
|
6
|
+
const targets_js_1 = require("../../targets.js");
|
|
7
|
+
const types_js_1 = require("../../types.js");
|
|
8
|
+
const findings_js_1 = require("../findings.js");
|
|
9
9
|
/**
|
|
10
10
|
* Compile the user's `customRules` into ready-to-run matchers. A rule with an
|
|
11
11
|
* invalid regex is skipped with a warning rather than crashing the run. `g`/`y`
|
|
@@ -23,7 +23,7 @@ function compileRules(ctx) {
|
|
|
23
23
|
re = new RegExp(r.pattern, (r.flags ?? '').replace(/[gy]/g, ''));
|
|
24
24
|
}
|
|
25
25
|
catch (err) {
|
|
26
|
-
|
|
26
|
+
index_js_1.logger.warn(`[Custom Rules]: ⚠️ invalid regex in rule "${r.name}" — skipped\n${err}`);
|
|
27
27
|
continue;
|
|
28
28
|
}
|
|
29
29
|
compiled.push({
|
|
@@ -55,9 +55,9 @@ function scanDiff(stdout, rules) {
|
|
|
55
55
|
continue;
|
|
56
56
|
const content = raw.slice(1);
|
|
57
57
|
for (const rule of rules) {
|
|
58
|
-
if (rule.include && !(0,
|
|
58
|
+
if (rule.include && !(0, index_js_1.matchesAnyGlob)(file, rule.include))
|
|
59
59
|
continue;
|
|
60
|
-
if (rule.exclude && (0,
|
|
60
|
+
if (rule.exclude && (0, index_js_1.matchesAnyGlob)(file, rule.exclude))
|
|
61
61
|
continue;
|
|
62
62
|
if (rule.re.test(content)) {
|
|
63
63
|
const bucket = rule.severity === 'error' ? errors : warnings;
|
|
@@ -79,31 +79,31 @@ exports.customRulesCheck = {
|
|
|
79
79
|
async run(ctx) {
|
|
80
80
|
const rules = compileRules(ctx);
|
|
81
81
|
if (rules.length === 0)
|
|
82
|
-
return (0,
|
|
82
|
+
return (0, types_js_1.pass)('no valid custom rules');
|
|
83
83
|
try {
|
|
84
|
-
const found = (0,
|
|
85
|
-
const collect = (stdout) => (0,
|
|
84
|
+
const found = (0, findings_js_1.emptyBuckets)();
|
|
85
|
+
const collect = (stdout) => (0, findings_js_1.mergeSeverityBuckets)(found, scanDiff(stdout, rules));
|
|
86
86
|
if (ctx.baseSha) {
|
|
87
|
-
const { stdout } = await (0,
|
|
87
|
+
const { stdout } = await (0, execa_js_1.execa)('git', ['diff', '--unified=0', '--diff-filter=ACMR', ctx.baseSha, ctx.headSha ?? 'HEAD'], { cwd: ctx.cwd });
|
|
88
88
|
collect(stdout);
|
|
89
89
|
}
|
|
90
90
|
else if (ctx.config.run?.fullScanBehaviour !== 'skip') {
|
|
91
|
-
const files = await (0,
|
|
91
|
+
const files = await (0, targets_js_1.listTrackedFiles)(ctx, ['*'], ['.']);
|
|
92
92
|
if (files === null)
|
|
93
|
-
return (0,
|
|
94
|
-
await (0,
|
|
93
|
+
return (0, types_js_1.skip)('git unavailable');
|
|
94
|
+
await (0, findings_js_1.scanTrackedFiles)(ctx, files, collect);
|
|
95
95
|
}
|
|
96
96
|
// A rule with severity "error" blocks the run (fail), regardless of phase.
|
|
97
|
-
return (0,
|
|
97
|
+
return (0, findings_js_1.reportSeverityBuckets)(found.errors, found.warnings, {
|
|
98
98
|
prefix: PREFIX,
|
|
99
99
|
errorSummary: n => `${n} error(s)`,
|
|
100
100
|
warningSummary: n => `${n} warning(s)`,
|
|
101
|
-
...(0,
|
|
101
|
+
...(0, findings_js_1.clientFindingOptions)(ctx),
|
|
102
102
|
});
|
|
103
103
|
}
|
|
104
104
|
catch (err) {
|
|
105
|
-
|
|
106
|
-
return (0,
|
|
105
|
+
index_js_1.logger.warn(`[Custom Rules]: ⚠️ Could not analyze diff\n${err}`);
|
|
106
|
+
return (0, types_js_1.skip)('diff unavailable');
|
|
107
107
|
}
|
|
108
108
|
},
|
|
109
109
|
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.diffSmellCheck = exports.COMMENT_SMELLS = exports.CODE_SMELLS = void 0;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
4
|
+
const index_js_1 = require("../../../utils/index.js");
|
|
5
|
+
const types_js_1 = require("../../types.js");
|
|
6
|
+
const findings_js_1 = require("../findings.js");
|
|
7
7
|
/**
|
|
8
8
|
* Smells that are only smells in live code.
|
|
9
9
|
*
|
|
@@ -49,24 +49,24 @@ exports.diffSmellCheck = {
|
|
|
49
49
|
async run(ctx) {
|
|
50
50
|
try {
|
|
51
51
|
const { ignorePaths } = ctx.config.diffSmell ?? {};
|
|
52
|
-
const found = (0,
|
|
53
|
-
const reviewed = await (0,
|
|
54
|
-
(0,
|
|
55
|
-
(0,
|
|
52
|
+
const found = (0, findings_js_1.emptyBuckets)();
|
|
53
|
+
const reviewed = await (0, findings_js_1.reviewLines)(ctx, ['*.ts', '*.tsx', '*.js', '*.jsx'], stdout => {
|
|
54
|
+
(0, findings_js_1.mergeSeverityBuckets)(found, (0, findings_js_1.scanDiffPatterns)(stdout, exports.CODE_SMELLS, { ignorePaths }));
|
|
55
|
+
(0, findings_js_1.mergeSeverityBuckets)(found, (0, findings_js_1.scanDiffPatterns)(stdout, exports.COMMENT_SMELLS, { comments: 'off', ignorePaths }));
|
|
56
56
|
});
|
|
57
57
|
// An unreadable file list is not "no smells" (ticket 072). Checked before
|
|
58
58
|
// the empty-bucket branch below, because that branch is what turned it into
|
|
59
59
|
// a green row.
|
|
60
60
|
if (!reviewed)
|
|
61
|
-
return (0,
|
|
61
|
+
return (0, types_js_1.skip)('git unavailable');
|
|
62
62
|
// Every smell here is declared `warn`, so nothing reaches the error bucket.
|
|
63
|
-
if ((0,
|
|
64
|
-
return (0,
|
|
65
|
-
return (0,
|
|
63
|
+
if ((0, findings_js_1.bucketTotal)(found.warnings) === 0)
|
|
64
|
+
return (0, types_js_1.pass)();
|
|
65
|
+
return (0, findings_js_1.reportCountedFindings)(found.warnings, ctx, { prefix: 'Diff Smells' });
|
|
66
66
|
}
|
|
67
67
|
catch (err) {
|
|
68
|
-
|
|
69
|
-
return (0,
|
|
68
|
+
index_js_1.logger.warn(`[Diff Smells]: ⚠️ Could not analyze diff\n${err}`);
|
|
69
|
+
return (0, types_js_1.skip)('diff unavailable');
|
|
70
70
|
}
|
|
71
71
|
},
|
|
72
72
|
};
|