@svp-labs/talos 0.0.0 → 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/ENGINEERING.md +407 -0
- package/README.md +49 -0
- package/assets/claude/kit-block.md +58 -0
- package/assets/codeowners +2 -0
- package/assets/dependabot/update.yml +7 -0
- package/assets/hooks/pre-push +64 -0
- package/assets/issue-forms/bug.yml +44 -0
- package/assets/issue-forms/chore.yml +32 -0
- package/assets/issue-forms/config.yml +2 -0
- package/assets/issue-forms/dead-code.yml +32 -0
- package/assets/issue-forms/debt.yml +32 -0
- package/assets/issue-forms/epic.yml +34 -0
- package/assets/issue-forms/feature.yml +40 -0
- package/assets/issue-forms/refactor.yml +32 -0
- package/assets/issue-forms/spike.yml +32 -0
- package/assets/labels.yml +101 -0
- package/assets/patches/@stryker-mutator__vitest-runner@10.0.0.patch +14 -0
- package/assets/prompts/review.md +66 -0
- package/assets/pull_request_template.md +14 -0
- package/assets/rulesets/channel.json +28 -0
- package/assets/rulesets/channels-branch.json +8 -0
- package/assets/rulesets/merge-queue.json +34 -0
- package/assets/rulesets/owner-review.json +21 -0
- package/assets/rulesets/release-tags.json +8 -0
- package/assets/rulesets/self-test.json +21 -0
- package/assets/workflows/talos.yml +420 -0
- package/bootstrap/find-pin.sh +75 -0
- package/bootstrap/launch.ts +347 -0
- package/bootstrap/php.sh +55 -0
- package/dist/adopt/assets.js +40 -0
- package/dist/adopt/assets.js.map +1 -0
- package/dist/adopt/config.js +68 -0
- package/dist/adopt/config.js.map +1 -0
- package/dist/adopt/dependabot.js +176 -0
- package/dist/adopt/dependabot.js.map +1 -0
- package/dist/adopt/detect.js +148 -0
- package/dist/adopt/detect.js.map +1 -0
- package/dist/adopt/dev-deps.js +179 -0
- package/dist/adopt/dev-deps.js.map +1 -0
- package/dist/adopt/draft.js +43 -0
- package/dist/adopt/draft.js.map +1 -0
- package/dist/adopt/hooks.js +101 -0
- package/dist/adopt/hooks.js.map +1 -0
- package/dist/adopt/json-text.js +45 -0
- package/dist/adopt/json-text.js.map +1 -0
- package/dist/adopt/kit.js +68 -0
- package/dist/adopt/kit.js.map +1 -0
- package/dist/adopt/languages.js +127 -0
- package/dist/adopt/languages.js.map +1 -0
- package/dist/adopt/local.js +100 -0
- package/dist/adopt/local.js.map +1 -0
- package/dist/adopt/php.js +67 -0
- package/dist/adopt/php.js.map +1 -0
- package/dist/adopt/plan.js +114 -0
- package/dist/adopt/plan.js.map +1 -0
- package/dist/adopt/python.js +200 -0
- package/dist/adopt/python.js.map +1 -0
- package/dist/adopt/remote.js +110 -0
- package/dist/adopt/remote.js.map +1 -0
- package/dist/adopt/rust.js +250 -0
- package/dist/adopt/rust.js.map +1 -0
- package/dist/adopt/scaffold.js +76 -0
- package/dist/adopt/scaffold.js.map +1 -0
- package/dist/adopt/security.js +153 -0
- package/dist/adopt/security.js.map +1 -0
- package/dist/adopt/supply.js +153 -0
- package/dist/adopt/supply.js.map +1 -0
- package/dist/adopt/talos-yml.js +95 -0
- package/dist/adopt/talos-yml.js.map +1 -0
- package/dist/adopt/texts.js +121 -0
- package/dist/adopt/texts.js.map +1 -0
- package/dist/adopt/toml-text.js +180 -0
- package/dist/adopt/toml-text.js.map +1 -0
- package/dist/adopt/tool-pins.js +133 -0
- package/dist/adopt/tool-pins.js.map +1 -0
- package/dist/adopt/tsconfig.js +80 -0
- package/dist/adopt/tsconfig.js.map +1 -0
- package/dist/bin/talos.js +7 -0
- package/dist/bin/talos.js.map +1 -0
- package/dist/central/channels-file.js +82 -0
- package/dist/central/channels-file.js.map +1 -0
- package/dist/central/channels-job.js +112 -0
- package/dist/central/channels-job.js.map +1 -0
- package/dist/central/channels.js +204 -0
- package/dist/central/channels.js.map +1 -0
- package/dist/central/drift-job.js +132 -0
- package/dist/central/drift-job.js.map +1 -0
- package/dist/central/drift.js +195 -0
- package/dist/central/drift.js.map +1 -0
- package/dist/central/gate-runs.js +48 -0
- package/dist/central/gate-runs.js.map +1 -0
- package/dist/central/org-rulesets.js +129 -0
- package/dist/central/org-rulesets.js.map +1 -0
- package/dist/central/pick.js +67 -0
- package/dist/central/pick.js.map +1 -0
- package/dist/central/privacy.js +158 -0
- package/dist/central/privacy.js.map +1 -0
- package/dist/central/releases.js +130 -0
- package/dist/central/releases.js.map +1 -0
- package/dist/central/repos.js +36 -0
- package/dist/central/repos.js.map +1 -0
- package/dist/central/runtime-port.js +49 -0
- package/dist/central/runtime-port.js.map +1 -0
- package/dist/central/sweep-job.js +62 -0
- package/dist/central/sweep-job.js.map +1 -0
- package/dist/central/sweep.js +182 -0
- package/dist/central/sweep.js.map +1 -0
- package/dist/checks/common/code-files.js +59 -0
- package/dist/checks/common/code-files.js.map +1 -0
- package/dist/checks/common/custom.js +123 -0
- package/dist/checks/common/custom.js.map +1 -0
- package/dist/checks/common/duplication.js +96 -0
- package/dist/checks/common/duplication.js.map +1 -0
- package/dist/checks/common/index.js +14 -0
- package/dist/checks/common/index.js.map +1 -0
- package/dist/checks/common/jscpd-config.js +50 -0
- package/dist/checks/common/jscpd-config.js.map +1 -0
- package/dist/checks/common/jscpd-report.js +62 -0
- package/dist/checks/common/jscpd-report.js.map +1 -0
- package/dist/checks/common/suppression-rules.js +271 -0
- package/dist/checks/common/suppression-rules.js.map +1 -0
- package/dist/checks/common/suppression-scan.js +103 -0
- package/dist/checks/common/suppression-scan.js.map +1 -0
- package/dist/checks/common/suppressions.js +26 -0
- package/dist/checks/common/suppressions.js.map +1 -0
- package/dist/checks/common/texts.js +34 -0
- package/dist/checks/common/texts.js.map +1 -0
- package/dist/checks/docs/claude-md.js +71 -0
- package/dist/checks/docs/claude-md.js.map +1 -0
- package/dist/checks/docs/comments.js +31 -0
- package/dist/checks/docs/comments.js.map +1 -0
- package/dist/checks/docs/cspell.js +138 -0
- package/dist/checks/docs/cspell.js.map +1 -0
- package/dist/checks/docs/decisions.js +30 -0
- package/dist/checks/docs/decisions.js.map +1 -0
- package/dist/checks/docs/files.js +64 -0
- package/dist/checks/docs/files.js.map +1 -0
- package/dist/checks/docs/glossary.js +99 -0
- package/dist/checks/docs/glossary.js.map +1 -0
- package/dist/checks/docs/index.js +25 -0
- package/dist/checks/docs/index.js.map +1 -0
- package/dist/checks/docs/markdown.js +39 -0
- package/dist/checks/docs/markdown.js.map +1 -0
- package/dist/checks/docs/markdownlint.js +86 -0
- package/dist/checks/docs/markdownlint.js.map +1 -0
- package/dist/checks/docs/references.js +82 -0
- package/dist/checks/docs/references.js.map +1 -0
- package/dist/checks/docs/spelling.js +83 -0
- package/dist/checks/docs/spelling.js.map +1 -0
- package/dist/checks/infra/actionlint.js +95 -0
- package/dist/checks/infra/actionlint.js.map +1 -0
- package/dist/checks/infra/configs.js +52 -0
- package/dist/checks/infra/configs.js.map +1 -0
- package/dist/checks/infra/dockerfile.js +69 -0
- package/dist/checks/infra/dockerfile.js.map +1 -0
- package/dist/checks/infra/files.js +123 -0
- package/dist/checks/infra/files.js.map +1 -0
- package/dist/checks/infra/index.js +59 -0
- package/dist/checks/infra/index.js.map +1 -0
- package/dist/checks/infra/powershell.js +128 -0
- package/dist/checks/infra/powershell.js.map +1 -0
- package/dist/checks/infra/report.js +46 -0
- package/dist/checks/infra/report.js.map +1 -0
- package/dist/checks/infra/shell.js +64 -0
- package/dist/checks/infra/shell.js.map +1 -0
- package/dist/checks/infra/zizmor.js +93 -0
- package/dist/checks/infra/zizmor.js.map +1 -0
- package/dist/checks/process/commits.js +74 -0
- package/dist/checks/process/commits.js.map +1 -0
- package/dist/checks/runtime/assess.js +140 -0
- package/dist/checks/runtime/assess.js.map +1 -0
- package/dist/checks/runtime/check.js +67 -0
- package/dist/checks/runtime/check.js.map +1 -0
- package/dist/checks/runtime/declaration.js +33 -0
- package/dist/checks/runtime/declaration.js.map +1 -0
- package/dist/checks/runtime/declarations.js +38 -0
- package/dist/checks/runtime/declarations.js.map +1 -0
- package/dist/checks/runtime/dockerfile.js +228 -0
- package/dist/checks/runtime/dockerfile.js.map +1 -0
- package/dist/checks/runtime/feeds.js +120 -0
- package/dist/checks/runtime/feeds.js.map +1 -0
- package/dist/checks/runtime/fetchers.js +72 -0
- package/dist/checks/runtime/fetchers.js.map +1 -0
- package/dist/checks/runtime/index.js +7 -0
- package/dist/checks/runtime/index.js.map +1 -0
- package/dist/checks/runtime/runtimes.js +30 -0
- package/dist/checks/runtime/runtimes.js.map +1 -0
- package/dist/checks/runtime/tools-lock.js +40 -0
- package/dist/checks/runtime/tools-lock.js.map +1 -0
- package/dist/checks/runtime/version-files.js +95 -0
- package/dist/checks/runtime/version-files.js.map +1 -0
- package/dist/checks/runtime/versions.js +51 -0
- package/dist/checks/runtime/versions.js.map +1 -0
- package/dist/checks/security/dependencies.js +70 -0
- package/dist/checks/security/dependencies.js.map +1 -0
- package/dist/checks/security/gitleaks-config.js +114 -0
- package/dist/checks/security/gitleaks-config.js.map +1 -0
- package/dist/checks/security/gitleaks.js +93 -0
- package/dist/checks/security/gitleaks.js.map +1 -0
- package/dist/checks/security/index.js +12 -0
- package/dist/checks/security/index.js.map +1 -0
- package/dist/checks/security/licences.js +50 -0
- package/dist/checks/security/licences.js.map +1 -0
- package/dist/checks/security/osv-config.js +56 -0
- package/dist/checks/security/osv-config.js.map +1 -0
- package/dist/checks/security/osv.js +146 -0
- package/dist/checks/security/osv.js.map +1 -0
- package/dist/checks/security/secrets.js +35 -0
- package/dist/checks/security/secrets.js.map +1 -0
- package/dist/checks/security/semgrep.js +184 -0
- package/dist/checks/security/semgrep.js.map +1 -0
- package/dist/checks/security/strength.js +80 -0
- package/dist/checks/security/strength.js.map +1 -0
- package/dist/checks/supply/advisories.js +66 -0
- package/dist/checks/supply/advisories.js.map +1 -0
- package/dist/checks/supply/base.js +37 -0
- package/dist/checks/supply/base.js.map +1 -0
- package/dist/checks/supply/dates.js +26 -0
- package/dist/checks/supply/dates.js.map +1 -0
- package/dist/checks/supply/dependabot.js +87 -0
- package/dist/checks/supply/dependabot.js.map +1 -0
- package/dist/checks/supply/deps.js +8 -0
- package/dist/checks/supply/deps.js.map +1 -0
- package/dist/checks/supply/exotic.js +36 -0
- package/dist/checks/supply/exotic.js.map +1 -0
- package/dist/checks/supply/expired.js +72 -0
- package/dist/checks/supply/expired.js.map +1 -0
- package/dist/checks/supply/fetcher.js +52 -0
- package/dist/checks/supply/fetcher.js.map +1 -0
- package/dist/checks/supply/index.js +21 -0
- package/dist/checks/supply/index.js.map +1 -0
- package/dist/checks/supply/judged.js +55 -0
- package/dist/checks/supply/judged.js.map +1 -0
- package/dist/checks/supply/lockfiles/cargo.js +34 -0
- package/dist/checks/supply/lockfiles/cargo.js.map +1 -0
- package/dist/checks/supply/lockfiles/composer.js +41 -0
- package/dist/checks/supply/lockfiles/composer.js.map +1 -0
- package/dist/checks/supply/lockfiles/index.js +51 -0
- package/dist/checks/supply/lockfiles/index.js.map +1 -0
- package/dist/checks/supply/lockfiles/locked.js +69 -0
- package/dist/checks/supply/lockfiles/locked.js.map +1 -0
- package/dist/checks/supply/lockfiles/npm.js +68 -0
- package/dist/checks/supply/lockfiles/npm.js.map +1 -0
- package/dist/checks/supply/lockfiles/pnpm.js +47 -0
- package/dist/checks/supply/lockfiles/pnpm.js.map +1 -0
- package/dist/checks/supply/lockfiles/python.js +77 -0
- package/dist/checks/supply/lockfiles/python.js.map +1 -0
- package/dist/checks/supply/lockfiles/yarn.js +77 -0
- package/dist/checks/supply/lockfiles/yarn.js.map +1 -0
- package/dist/checks/supply/pnpm-settings.js +95 -0
- package/dist/checks/supply/pnpm-settings.js.map +1 -0
- package/dist/checks/supply/provenance.js +82 -0
- package/dist/checks/supply/provenance.js.map +1 -0
- package/dist/checks/supply/registries.js +109 -0
- package/dist/checks/supply/registries.js.map +1 -0
- package/dist/checks/supply/release-age.js +63 -0
- package/dist/checks/supply/release-age.js.map +1 -0
- package/dist/checks/supply/settings.js +129 -0
- package/dist/checks/supply/settings.js.map +1 -0
- package/dist/cli/adopt.js +269 -0
- package/dist/cli/adopt.js.map +1 -0
- package/dist/cli/central.js +201 -0
- package/dist/cli/central.js.map +1 -0
- package/dist/cli/check.js +121 -0
- package/dist/cli/check.js.map +1 -0
- package/dist/cli/configs.js +65 -0
- package/dist/cli/configs.js.map +1 -0
- package/dist/cli/debt.js +75 -0
- package/dist/cli/debt.js.map +1 -0
- package/dist/cli/doctor.js +38 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/findings.js +32 -0
- package/dist/cli/findings.js.map +1 -0
- package/dist/cli/govern.js +97 -0
- package/dist/cli/govern.js.map +1 -0
- package/dist/cli/io.js +29 -0
- package/dist/cli/io.js.map +1 -0
- package/dist/cli/job.js +173 -0
- package/dist/cli/job.js.map +1 -0
- package/dist/cli/main.js +109 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/new.js +72 -0
- package/dist/cli/new.js.map +1 -0
- package/dist/cli/org.js +84 -0
- package/dist/cli/org.js.map +1 -0
- package/dist/cli/plan.js +49 -0
- package/dist/cli/plan.js.map +1 -0
- package/dist/cli/run.js +78 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/self-test.js +127 -0
- package/dist/cli/self-test.js.map +1 -0
- package/dist/cli/shrinkwrap.js +20 -0
- package/dist/cli/shrinkwrap.js.map +1 -0
- package/dist/cli/status.js +39 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/ticket.js +180 -0
- package/dist/cli/ticket.js.map +1 -0
- package/dist/cli/verdict.js +57 -0
- package/dist/cli/verdict.js.map +1 -0
- package/dist/cli/version.js +29 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/cli/why.js +96 -0
- package/dist/cli/why.js.map +1 -0
- package/dist/config/load.js +41 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/schema.js +75 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/configs/drift.js +112 -0
- package/dist/configs/drift.js.map +1 -0
- package/dist/configs/files.js +35 -0
- package/dist/configs/files.js.map +1 -0
- package/dist/configs/header.js +31 -0
- package/dist/configs/header.js.map +1 -0
- package/dist/configs/index.js +8 -0
- package/dist/configs/index.js.map +1 -0
- package/dist/configs/json.js +26 -0
- package/dist/configs/json.js.map +1 -0
- package/dist/configs/packs.js +30 -0
- package/dist/configs/packs.js.map +1 -0
- package/dist/core/check.js +9 -0
- package/dist/core/check.js.map +1 -0
- package/dist/core/compare.js +46 -0
- package/dist/core/compare.js.map +1 -0
- package/dist/core/component.js +57 -0
- package/dist/core/component.js.map +1 -0
- package/dist/core/finding.js +2 -0
- package/dist/core/finding.js.map +1 -0
- package/dist/core/fingerprint.js +29 -0
- package/dist/core/fingerprint.js.map +1 -0
- package/dist/core/literal.js +85 -0
- package/dist/core/literal.js.map +1 -0
- package/dist/core/log.js +20 -0
- package/dist/core/log.js.map +1 -0
- package/dist/core/pack.js +2 -0
- package/dist/core/pack.js.map +1 -0
- package/dist/core/pool.js +16 -0
- package/dist/core/pool.js.map +1 -0
- package/dist/core/registry.js +28 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/result.js +45 -0
- package/dist/core/result.js.map +1 -0
- package/dist/core/xml.js +63 -0
- package/dist/core/xml.js.map +1 -0
- package/dist/docs/claude.js +79 -0
- package/dist/docs/claude.js.map +1 -0
- package/dist/docs/comments/c-family.js +180 -0
- package/dist/docs/comments/c-family.js.map +1 -0
- package/dist/docs/comments/index.js +41 -0
- package/dist/docs/comments/index.js.map +1 -0
- package/dist/docs/comments/rules.js +174 -0
- package/dist/docs/comments/rules.js.map +1 -0
- package/dist/docs/comments/scan.js +138 -0
- package/dist/docs/comments/scan.js.map +1 -0
- package/dist/docs/comments/script.js +135 -0
- package/dist/docs/comments/script.js.map +1 -0
- package/dist/docs/decisions.js +168 -0
- package/dist/docs/decisions.js.map +1 -0
- package/dist/docs/glossary.js +81 -0
- package/dist/docs/glossary.js.map +1 -0
- package/dist/docs/links.js +119 -0
- package/dist/docs/links.js.map +1 -0
- package/dist/docs/markdown.js +176 -0
- package/dist/docs/markdown.js.map +1 -0
- package/dist/engine/gate.js +144 -0
- package/dist/engine/gate.js.map +1 -0
- package/dist/engine/local.js +90 -0
- package/dist/engine/local.js.map +1 -0
- package/dist/engine/plan.js +165 -0
- package/dist/engine/plan.js.map +1 -0
- package/dist/engine/prepare.js +140 -0
- package/dist/engine/prepare.js.map +1 -0
- package/dist/engine/report.js +71 -0
- package/dist/engine/report.js.map +1 -0
- package/dist/engine/run.js +142 -0
- package/dist/engine/run.js.map +1 -0
- package/dist/engine/session.js +10 -0
- package/dist/engine/session.js.map +1 -0
- package/dist/engine/verdict-caps.js +30 -0
- package/dist/engine/verdict-caps.js.map +1 -0
- package/dist/engine/verdict.js +49 -0
- package/dist/engine/verdict.js.map +1 -0
- package/dist/exec/exec.js +136 -0
- package/dist/exec/exec.js.map +1 -0
- package/dist/github/actions.js +62 -0
- package/dist/github/actions.js.map +1 -0
- package/dist/github/api.js +106 -0
- package/dist/github/api.js.map +1 -0
- package/dist/github/artifacts.js +203 -0
- package/dist/github/artifacts.js.map +1 -0
- package/dist/github/checks.js +86 -0
- package/dist/github/checks.js.map +1 -0
- package/dist/github/contents.js +38 -0
- package/dist/github/contents.js.map +1 -0
- package/dist/github/gate-runs.js +59 -0
- package/dist/github/gate-runs.js.map +1 -0
- package/dist/github/identities.js +29 -0
- package/dist/github/identities.js.map +1 -0
- package/dist/github/pulls.js +32 -0
- package/dist/github/pulls.js.map +1 -0
- package/dist/github/remote.js +26 -0
- package/dist/github/remote.js.map +1 -0
- package/dist/github/repos.js +64 -0
- package/dist/github/repos.js.map +1 -0
- package/dist/github/rulesets.js +44 -0
- package/dist/github/rulesets.js.map +1 -0
- package/dist/govern/commit.js +31 -0
- package/dist/govern/commit.js.map +1 -0
- package/dist/govern/compare.js +52 -0
- package/dist/govern/compare.js.map +1 -0
- package/dist/govern/create.js +97 -0
- package/dist/govern/create.js.map +1 -0
- package/dist/govern/govern.js +75 -0
- package/dist/govern/govern.js.map +1 -0
- package/dist/govern/installations.js +58 -0
- package/dist/govern/installations.js.map +1 -0
- package/dist/govern/org.js +136 -0
- package/dist/govern/org.js.map +1 -0
- package/dist/govern/output.js +32 -0
- package/dist/govern/output.js.map +1 -0
- package/dist/govern/plan.js +166 -0
- package/dist/govern/plan.js.map +1 -0
- package/dist/govern/rulesets-api.js +39 -0
- package/dist/govern/rulesets-api.js.map +1 -0
- package/dist/govern/state.js +108 -0
- package/dist/govern/state.js.map +1 -0
- package/dist/govern/steps.js +131 -0
- package/dist/govern/steps.js.map +1 -0
- package/dist/govern/templates.js +140 -0
- package/dist/govern/templates.js.map +1 -0
- package/dist/jobs/act.js +60 -0
- package/dist/jobs/act.js.map +1 -0
- package/dist/jobs/analyze.js +68 -0
- package/dist/jobs/analyze.js.map +1 -0
- package/dist/jobs/artifacts.js +35 -0
- package/dist/jobs/artifacts.js.map +1 -0
- package/dist/jobs/context.js +2 -0
- package/dist/jobs/context.js.map +1 -0
- package/dist/jobs/debt-issues.js +129 -0
- package/dist/jobs/debt-issues.js.map +1 -0
- package/dist/jobs/debt-report.js +125 -0
- package/dist/jobs/debt-report.js.map +1 -0
- package/dist/jobs/dispatch.js +103 -0
- package/dist/jobs/dispatch.js.map +1 -0
- package/dist/jobs/flaky.js +151 -0
- package/dist/jobs/flaky.js.map +1 -0
- package/dist/jobs/label-sync.js +67 -0
- package/dist/jobs/label-sync.js.map +1 -0
- package/dist/jobs/payloads.js +62 -0
- package/dist/jobs/payloads.js.map +1 -0
- package/dist/jobs/readiness-job.js +91 -0
- package/dist/jobs/readiness-job.js.map +1 -0
- package/dist/jobs/readiness.js +154 -0
- package/dist/jobs/readiness.js.map +1 -0
- package/dist/jobs/schedule.js +19 -0
- package/dist/jobs/schedule.js.map +1 -0
- package/dist/jobs/sync-chore.js +77 -0
- package/dist/jobs/sync-chore.js.map +1 -0
- package/dist/jobs/talos-issues.js +79 -0
- package/dist/jobs/talos-issues.js.map +1 -0
- package/dist/langs/lua/busted.js +124 -0
- package/dist/langs/lua/busted.js.map +1 -0
- package/dist/langs/lua/configs.js +173 -0
- package/dist/langs/lua/configs.js.map +1 -0
- package/dist/langs/lua/deadcode.js +11 -0
- package/dist/langs/lua/deadcode.js.map +1 -0
- package/dist/langs/lua/devtools.js +64 -0
- package/dist/langs/lua/devtools.js.map +1 -0
- package/dist/langs/lua/format.js +41 -0
- package/dist/langs/lua/format.js.map +1 -0
- package/dist/langs/lua/index.js +86 -0
- package/dist/langs/lua/index.js.map +1 -0
- package/dist/langs/lua/install.js +80 -0
- package/dist/langs/lua/install.js.map +1 -0
- package/dist/langs/lua/lint.js +46 -0
- package/dist/langs/lua/lint.js.map +1 -0
- package/dist/langs/lua/luacheck-config.js +151 -0
- package/dist/langs/lua/luacheck-config.js.map +1 -0
- package/dist/langs/lua/luacheck.js +102 -0
- package/dist/langs/lua/luacheck.js.map +1 -0
- package/dist/langs/lua/luals.js +66 -0
- package/dist/langs/lua/luals.js.map +1 -0
- package/dist/langs/lua/paths.js +94 -0
- package/dist/langs/lua/paths.js.map +1 -0
- package/dist/langs/lua/run.js +63 -0
- package/dist/langs/lua/run.js.map +1 -0
- package/dist/langs/lua/scripts/json.js +39 -0
- package/dist/langs/lua/scripts/json.js.map +1 -0
- package/dist/langs/lua/scripts/lcov.js +77 -0
- package/dist/langs/lua/scripts/lcov.js.map +1 -0
- package/dist/langs/lua/scripts/luacheck.js +97 -0
- package/dist/langs/lua/scripts/luacheck.js.map +1 -0
- package/dist/langs/lua/scripts/shape.js +197 -0
- package/dist/langs/lua/scripts/shape.js.map +1 -0
- package/dist/langs/lua/shape.js +142 -0
- package/dist/langs/lua/shape.js.map +1 -0
- package/dist/langs/lua/strength.js +38 -0
- package/dist/langs/lua/strength.js.map +1 -0
- package/dist/langs/lua/stylua.js +43 -0
- package/dist/langs/lua/stylua.js.map +1 -0
- package/dist/langs/lua/toolchain.js +49 -0
- package/dist/langs/lua/toolchain.js.map +1 -0
- package/dist/langs/lua/types.js +41 -0
- package/dist/langs/lua/types.js.map +1 -0
- package/dist/langs/php/analysis.js +22 -0
- package/dist/langs/php/analysis.js.map +1 -0
- package/dist/langs/php/composer.js +88 -0
- package/dist/langs/php/composer.js.map +1 -0
- package/dist/langs/php/configs.js +54 -0
- package/dist/langs/php/configs.js.map +1 -0
- package/dist/langs/php/deptrac-config.js +118 -0
- package/dist/langs/php/deptrac-config.js.map +1 -0
- package/dist/langs/php/deptrac.js +117 -0
- package/dist/langs/php/deptrac.js.map +1 -0
- package/dist/langs/php/format.js +94 -0
- package/dist/langs/php/format.js.map +1 -0
- package/dist/langs/php/index.js +81 -0
- package/dist/langs/php/index.js.map +1 -0
- package/dist/langs/php/infection.js +151 -0
- package/dist/langs/php/infection.js.map +1 -0
- package/dist/langs/php/install.js +52 -0
- package/dist/langs/php/install.js.map +1 -0
- package/dist/langs/php/neon.js +41 -0
- package/dist/langs/php/neon.js.map +1 -0
- package/dist/langs/php/paths.js +78 -0
- package/dist/langs/php/paths.js.map +1 -0
- package/dist/langs/php/pest.js +91 -0
- package/dist/langs/php/pest.js.map +1 -0
- package/dist/langs/php/phpmd-config.js +58 -0
- package/dist/langs/php/phpmd-config.js.map +1 -0
- package/dist/langs/php/phpmd.js +80 -0
- package/dist/langs/php/phpmd.js.map +1 -0
- package/dist/langs/php/phpstan-config.js +100 -0
- package/dist/langs/php/phpstan-config.js.map +1 -0
- package/dist/langs/php/phpstan.js +128 -0
- package/dist/langs/php/phpstan.js.map +1 -0
- package/dist/langs/php/pint-config.js +22 -0
- package/dist/langs/php/pint-config.js.map +1 -0
- package/dist/langs/php/run.js +88 -0
- package/dist/langs/php/run.js.map +1 -0
- package/dist/langs/php/runtime.js +60 -0
- package/dist/langs/php/runtime.js.map +1 -0
- package/dist/langs/php/scope.js +50 -0
- package/dist/langs/php/scope.js.map +1 -0
- package/dist/langs/php/shape.js +212 -0
- package/dist/langs/php/shape.js.map +1 -0
- package/dist/langs/php/strength-rules.js +114 -0
- package/dist/langs/php/strength-rules.js.map +1 -0
- package/dist/langs/php/strength.js +98 -0
- package/dist/langs/php/strength.js.map +1 -0
- package/dist/langs/php/toolchain.js +73 -0
- package/dist/langs/php/toolchain.js.map +1 -0
- package/dist/langs/php/typecov.js +84 -0
- package/dist/langs/php/typecov.js.map +1 -0
- package/dist/langs/py/arch.js +97 -0
- package/dist/langs/py/arch.js.map +1 -0
- package/dist/langs/py/complexipy.js +42 -0
- package/dist/langs/py/complexipy.js.map +1 -0
- package/dist/langs/py/configs.js +144 -0
- package/dist/langs/py/configs.js.map +1 -0
- package/dist/langs/py/deadcode.js +77 -0
- package/dist/langs/py/deadcode.js.map +1 -0
- package/dist/langs/py/environment.js +35 -0
- package/dist/langs/py/environment.js.map +1 -0
- package/dist/langs/py/format.js +32 -0
- package/dist/langs/py/format.js.map +1 -0
- package/dist/langs/py/importlinter.js +147 -0
- package/dist/langs/py/importlinter.js.map +1 -0
- package/dist/langs/py/index.js +73 -0
- package/dist/langs/py/index.js.map +1 -0
- package/dist/langs/py/install.js +49 -0
- package/dist/langs/py/install.js.map +1 -0
- package/dist/langs/py/lint.js +98 -0
- package/dist/langs/py/lint.js.map +1 -0
- package/dist/langs/py/lock.js +66 -0
- package/dist/langs/py/lock.js.map +1 -0
- package/dist/langs/py/mutation.js +164 -0
- package/dist/langs/py/mutation.js.map +1 -0
- package/dist/langs/py/mutmut-report.js +81 -0
- package/dist/langs/py/mutmut-report.js.map +1 -0
- package/dist/langs/py/mutmut-settings.js +168 -0
- package/dist/langs/py/mutmut-settings.js.map +1 -0
- package/dist/langs/py/paths.js +57 -0
- package/dist/langs/py/paths.js.map +1 -0
- package/dist/langs/py/pyright-config.js +123 -0
- package/dist/langs/py/pyright-config.js.map +1 -0
- package/dist/langs/py/pytest.js +96 -0
- package/dist/langs/py/pytest.js.map +1 -0
- package/dist/langs/py/ruff-settings.js +166 -0
- package/dist/langs/py/ruff-settings.js.map +1 -0
- package/dist/langs/py/ruff.js +44 -0
- package/dist/langs/py/ruff.js.map +1 -0
- package/dist/langs/py/run.js +44 -0
- package/dist/langs/py/run.js.map +1 -0
- package/dist/langs/py/sizes.js +65 -0
- package/dist/langs/py/sizes.js.map +1 -0
- package/dist/langs/py/spans.js +76 -0
- package/dist/langs/py/spans.js.map +1 -0
- package/dist/langs/py/strength.js +101 -0
- package/dist/langs/py/strength.js.map +1 -0
- package/dist/langs/py/toolchain.js +34 -0
- package/dist/langs/py/toolchain.js.map +1 -0
- package/dist/langs/py/types.js +66 -0
- package/dist/langs/py/types.js.map +1 -0
- package/dist/langs/rust/cargo-config.js +91 -0
- package/dist/langs/rust/cargo-config.js.map +1 -0
- package/dist/langs/rust/cargo-test.js +50 -0
- package/dist/langs/rust/cargo-test.js.map +1 -0
- package/dist/langs/rust/compile.js +99 -0
- package/dist/langs/rust/compile.js.map +1 -0
- package/dist/langs/rust/configs.js +60 -0
- package/dist/langs/rust/configs.js.map +1 -0
- package/dist/langs/rust/deadcode.js +47 -0
- package/dist/langs/rust/deadcode.js.map +1 -0
- package/dist/langs/rust/diagnostics.js +103 -0
- package/dist/langs/rust/diagnostics.js.map +1 -0
- package/dist/langs/rust/doctests.js +49 -0
- package/dist/langs/rust/doctests.js.map +1 -0
- package/dist/langs/rust/format.js +97 -0
- package/dist/langs/rust/format.js.map +1 -0
- package/dist/langs/rust/index.js +49 -0
- package/dist/langs/rust/index.js.map +1 -0
- package/dist/langs/rust/install.js +56 -0
- package/dist/langs/rust/install.js.map +1 -0
- package/dist/langs/rust/junit.js +49 -0
- package/dist/langs/rust/junit.js.map +1 -0
- package/dist/langs/rust/lcov.js +53 -0
- package/dist/langs/rust/lcov.js.map +1 -0
- package/dist/langs/rust/lint.js +47 -0
- package/dist/langs/rust/lint.js.map +1 -0
- package/dist/langs/rust/lints.js +61 -0
- package/dist/langs/rust/lints.js.map +1 -0
- package/dist/langs/rust/machete.js +53 -0
- package/dist/langs/rust/machete.js.map +1 -0
- package/dist/langs/rust/metadata.js +78 -0
- package/dist/langs/rust/metadata.js.map +1 -0
- package/dist/langs/rust/mutants.js +73 -0
- package/dist/langs/rust/mutants.js.map +1 -0
- package/dist/langs/rust/nextest.js +164 -0
- package/dist/langs/rust/nextest.js.map +1 -0
- package/dist/langs/rust/paths.js +60 -0
- package/dist/langs/rust/paths.js.map +1 -0
- package/dist/langs/rust/run.js +37 -0
- package/dist/langs/rust/run.js.map +1 -0
- package/dist/langs/rust/scan.js +173 -0
- package/dist/langs/rust/scan.js.map +1 -0
- package/dist/langs/rust/shapes.js +80 -0
- package/dist/langs/rust/shapes.js.map +1 -0
- package/dist/langs/rust/strength-rules.js +109 -0
- package/dist/langs/rust/strength-rules.js.map +1 -0
- package/dist/langs/rust/strength.js +114 -0
- package/dist/langs/rust/strength.js.map +1 -0
- package/dist/langs/rust/structure.js +222 -0
- package/dist/langs/rust/structure.js.map +1 -0
- package/dist/langs/rust/testfiles.js +62 -0
- package/dist/langs/rust/testfiles.js.map +1 -0
- package/dist/langs/rust/toolchain.js +91 -0
- package/dist/langs/rust/toolchain.js.map +1 -0
- package/dist/langs/rust/types.js +9 -0
- package/dist/langs/rust/types.js.map +1 -0
- package/dist/langs/ts/checks/arch.js +129 -0
- package/dist/langs/ts/checks/arch.js.map +1 -0
- package/dist/langs/ts/checks/deadcode.js +125 -0
- package/dist/langs/ts/checks/deadcode.js.map +1 -0
- package/dist/langs/ts/checks/e2e.js +174 -0
- package/dist/langs/ts/checks/e2e.js.map +1 -0
- package/dist/langs/ts/checks/format.js +107 -0
- package/dist/langs/ts/checks/format.js.map +1 -0
- package/dist/langs/ts/checks/javascript.js +30 -0
- package/dist/langs/ts/checks/javascript.js.map +1 -0
- package/dist/langs/ts/checks/lint.js +133 -0
- package/dist/langs/ts/checks/lint.js.map +1 -0
- package/dist/langs/ts/checks/size.js +79 -0
- package/dist/langs/ts/checks/size.js.map +1 -0
- package/dist/langs/ts/checks/strength.js +168 -0
- package/dist/langs/ts/checks/strength.js.map +1 -0
- package/dist/langs/ts/checks/toolchain.js +54 -0
- package/dist/langs/ts/checks/toolchain.js.map +1 -0
- package/dist/langs/ts/checks/typecov.js +121 -0
- package/dist/langs/ts/checks/typecov.js.map +1 -0
- package/dist/langs/ts/checks/types.js +71 -0
- package/dist/langs/ts/checks/types.js.map +1 -0
- package/dist/langs/ts/compare.js +110 -0
- package/dist/langs/ts/compare.js.map +1 -0
- package/dist/langs/ts/configs/depcruise.js +97 -0
- package/dist/langs/ts/configs/depcruise.js.map +1 -0
- package/dist/langs/ts/configs/eslint.js +209 -0
- package/dist/langs/ts/configs/eslint.js.map +1 -0
- package/dist/langs/ts/configs/index.js +59 -0
- package/dist/langs/ts/configs/index.js.map +1 -0
- package/dist/langs/ts/configs/knip.js +43 -0
- package/dist/langs/ts/configs/knip.js.map +1 -0
- package/dist/langs/ts/configs/prettier.js +37 -0
- package/dist/langs/ts/configs/prettier.js.map +1 -0
- package/dist/langs/ts/configs/shared.js +19 -0
- package/dist/langs/ts/configs/shared.js.map +1 -0
- package/dist/langs/ts/configs/stryker.js +117 -0
- package/dist/langs/ts/configs/stryker.js.map +1 -0
- package/dist/langs/ts/configs/tsconfig.js +64 -0
- package/dist/langs/ts/configs/tsconfig.js.map +1 -0
- package/dist/langs/ts/configs/vitest.js +62 -0
- package/dist/langs/ts/configs/vitest.js.map +1 -0
- package/dist/langs/ts/devtools.js +29 -0
- package/dist/langs/ts/devtools.js.map +1 -0
- package/dist/langs/ts/files.js +73 -0
- package/dist/langs/ts/files.js.map +1 -0
- package/dist/langs/ts/generated.js +29 -0
- package/dist/langs/ts/generated.js.map +1 -0
- package/dist/langs/ts/index.js +45 -0
- package/dist/langs/ts/index.js.map +1 -0
- package/dist/langs/ts/install.js +48 -0
- package/dist/langs/ts/install.js.map +1 -0
- package/dist/langs/ts/node.js +139 -0
- package/dist/langs/ts/node.js.map +1 -0
- package/dist/langs/ts/runners/stryker.js +56 -0
- package/dist/langs/ts/runners/stryker.js.map +1 -0
- package/dist/langs/ts/runners/vitest.js +79 -0
- package/dist/langs/ts/runners/vitest.js.map +1 -0
- package/dist/langs/ts/shadows.js +90 -0
- package/dist/langs/ts/shadows.js.map +1 -0
- package/dist/langs/ts/spans.js +57 -0
- package/dist/langs/ts/spans.js.map +1 -0
- package/dist/quality/coverage.js +162 -0
- package/dist/quality/coverage.js.map +1 -0
- package/dist/quality/index.js +4 -0
- package/dist/quality/index.js.map +1 -0
- package/dist/quality/junit.js +166 -0
- package/dist/quality/junit.js.map +1 -0
- package/dist/quality/lines.js +58 -0
- package/dist/quality/lines.js.map +1 -0
- package/dist/quality/luacov.js +345 -0
- package/dist/quality/luacov.js.map +1 -0
- package/dist/quality/mutants.js +202 -0
- package/dist/quality/mutants.js.map +1 -0
- package/dist/quality/mutation.js +121 -0
- package/dist/quality/mutation.js.map +1 -0
- package/dist/quality/paths.js +36 -0
- package/dist/quality/paths.js.map +1 -0
- package/dist/quality/protocol.js +2 -0
- package/dist/quality/protocol.js.map +1 -0
- package/dist/quality/reports.js +79 -0
- package/dist/quality/reports.js.map +1 -0
- package/dist/quality/suite.js +64 -0
- package/dist/quality/suite.js.map +1 -0
- package/dist/quality/tests.js +63 -0
- package/dist/quality/tests.js.map +1 -0
- package/dist/quality/text.js +32 -0
- package/dist/quality/text.js.map +1 -0
- package/dist/quality/typecov.js +16 -0
- package/dist/quality/typecov.js.map +1 -0
- package/dist/quality/verdicts.js +96 -0
- package/dist/quality/verdicts.js.map +1 -0
- package/dist/quality/xml.js +42 -0
- package/dist/quality/xml.js.map +1 -0
- package/dist/repo/changes.js +108 -0
- package/dist/repo/changes.js.map +1 -0
- package/dist/repo/facts.js +38 -0
- package/dist/repo/facts.js.map +1 -0
- package/dist/repo/git.js +79 -0
- package/dist/repo/git.js.map +1 -0
- package/dist/repo/talos-dir.js +36 -0
- package/dist/repo/talos-dir.js.map +1 -0
- package/dist/review/approval.js +73 -0
- package/dist/review/approval.js.map +1 -0
- package/dist/review/assemble.js +80 -0
- package/dist/review/assemble.js.map +1 -0
- package/dist/review/codeowners.js +28 -0
- package/dist/review/codeowners.js.map +1 -0
- package/dist/review/conditions.js +114 -0
- package/dist/review/conditions.js.map +1 -0
- package/dist/review/github.js +206 -0
- package/dist/review/github.js.map +1 -0
- package/dist/review/guard.js +119 -0
- package/dist/review/guard.js.map +1 -0
- package/dist/review/header.js +61 -0
- package/dist/review/header.js.map +1 -0
- package/dist/review/integrity.js +148 -0
- package/dist/review/integrity.js.map +1 -0
- package/dist/review/job.js +213 -0
- package/dist/review/job.js.map +1 -0
- package/dist/review/model.js +178 -0
- package/dist/review/model.js.map +1 -0
- package/dist/review/prompt.js +125 -0
- package/dist/review/prompt.js.map +1 -0
- package/dist/review/report.js +73 -0
- package/dist/review/report.js.map +1 -0
- package/dist/review/reviewer.js +205 -0
- package/dist/review/reviewer.js.map +1 -0
- package/dist/review/rules.js +54 -0
- package/dist/review/rules.js.map +1 -0
- package/dist/review/scope.js +39 -0
- package/dist/review/scope.js.map +1 -0
- package/dist/review/testfiles.js +53 -0
- package/dist/review/testfiles.js.map +1 -0
- package/dist/review/types.js +6 -0
- package/dist/review/types.js.map +1 -0
- package/dist/sarif/sarif.js +63 -0
- package/dist/sarif/sarif.js.map +1 -0
- package/dist/status/build.js +154 -0
- package/dist/status/build.js.map +1 -0
- package/dist/status/collect.js +132 -0
- package/dist/status/collect.js.map +1 -0
- package/dist/status/doctor.js +191 -0
- package/dist/status/doctor.js.map +1 -0
- package/dist/status/findings.js +161 -0
- package/dist/status/findings.js.map +1 -0
- package/dist/status/history.js +113 -0
- package/dist/status/history.js.map +1 -0
- package/dist/status/markers.js +65 -0
- package/dist/status/markers.js.map +1 -0
- package/dist/status/query.js +148 -0
- package/dist/status/query.js.map +1 -0
- package/dist/status/resolve.js +92 -0
- package/dist/status/resolve.js.map +1 -0
- package/dist/status/schema.js +110 -0
- package/dist/status/schema.js.map +1 -0
- package/dist/status/text.js +57 -0
- package/dist/status/text.js.map +1 -0
- package/dist/ticket/claim.js +147 -0
- package/dist/ticket/claim.js.map +1 -0
- package/dist/ticket/github.js +94 -0
- package/dist/ticket/github.js.map +1 -0
- package/dist/ticket/labels.js +64 -0
- package/dist/ticket/labels.js.map +1 -0
- package/dist/ticket/payload.js +37 -0
- package/dist/ticket/payload.js.map +1 -0
- package/dist/ticket/queue.js +51 -0
- package/dist/ticket/queue.js.map +1 -0
- package/dist/ticket/schemas.js +106 -0
- package/dist/ticket/schemas.js.map +1 -0
- package/dist/ticket/sections.js +66 -0
- package/dist/ticket/sections.js.map +1 -0
- package/dist/ticket/stale.js +108 -0
- package/dist/ticket/stale.js.map +1 -0
- package/dist/ticket/status.js +96 -0
- package/dist/ticket/status.js.map +1 -0
- package/dist/ticket/trust.js +29 -0
- package/dist/ticket/trust.js.map +1 -0
- package/dist/tools/fetch.js +117 -0
- package/dist/tools/fetch.js.map +1 -0
- package/dist/tools/lock.js +100 -0
- package/dist/tools/lock.js.map +1 -0
- package/dist/tools/lockfile.js +81 -0
- package/dist/tools/lockfile.js.map +1 -0
- package/dist/tools/pypi.js +44 -0
- package/dist/tools/pypi.js.map +1 -0
- package/dist/tools/store.js +62 -0
- package/dist/tools/store.js.map +1 -0
- package/dist/tools/tools.js +2 -0
- package/dist/tools/tools.js.map +1 -0
- package/dist/version/cache.js +18 -0
- package/dist/version/cache.js.map +1 -0
- package/dist/version/enforced.js +54 -0
- package/dist/version/enforced.js.map +1 -0
- package/dist/version/errors.js +8 -0
- package/dist/version/errors.js.map +1 -0
- package/dist/version/install.js +149 -0
- package/dist/version/install.js.map +1 -0
- package/dist/version/launch.js +104 -0
- package/dist/version/launch.js.map +1 -0
- package/dist/version/pin.js +121 -0
- package/dist/version/pin.js.map +1 -0
- package/dist/version/provenance.js +118 -0
- package/dist/version/provenance.js.map +1 -0
- package/dist/version/release.js +44 -0
- package/dist/version/release.js.map +1 -0
- package/dist/version/self.js +55 -0
- package/dist/version/self.js.map +1 -0
- package/dist/version/shrinkwrap.js +207 -0
- package/dist/version/shrinkwrap.js.map +1 -0
- package/npm-shrinkwrap.json +2140 -0
- package/package.json +81 -8
- package/tools/semgrep.in +1 -0
- package/tools/semgrep.txt +1150 -0
- package/tools.lock +429 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { pinned } from './declaration.js';
|
|
2
|
+
const DIRECTIVE = /^#\s*([a-z]+)\s*=\s*(\S+)\s*$/i;
|
|
3
|
+
const HEREDOC_WORD = /^\d*<<-?(["']?)([^<"'\s]+)\1$/;
|
|
4
|
+
const HEREDOC_KEYWORDS = new Set(['RUN', 'COPY', 'ADD']);
|
|
5
|
+
/** The escape character, which a parser directive at the top may change to a backtick. */
|
|
6
|
+
function escapeOf(lines) {
|
|
7
|
+
for (const line of lines) {
|
|
8
|
+
const directive = DIRECTIVE.exec(line);
|
|
9
|
+
if (directive === null)
|
|
10
|
+
return '\\';
|
|
11
|
+
if (directive[1]?.toLowerCase() === 'escape')
|
|
12
|
+
return directive[2] === '`' ? '`' : '\\';
|
|
13
|
+
}
|
|
14
|
+
return '\\';
|
|
15
|
+
}
|
|
16
|
+
function isSkippable(line) {
|
|
17
|
+
const trimmed = line.trim();
|
|
18
|
+
return trimmed === '' || trimmed.startsWith('#');
|
|
19
|
+
}
|
|
20
|
+
function toInstruction(parts, line, endLine) {
|
|
21
|
+
const joined = parts.join(' ').trim();
|
|
22
|
+
const space = joined.search(/\s/);
|
|
23
|
+
const keyword = space < 0 ? joined : joined.slice(0, space);
|
|
24
|
+
const args = space < 0 ? '' : joined.slice(space + 1).trim();
|
|
25
|
+
return { keyword: keyword.toUpperCase(), args, line, endLine };
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The heredoc delimiters an instruction opens, in order: as BuildKit reads them, only in `RUN`,
|
|
29
|
+
* `COPY` and `ADD`, and only as a whole word (`<<EOF`, `<<-"EOF"`), so a here-string or a shift
|
|
30
|
+
* opens none.
|
|
31
|
+
*/
|
|
32
|
+
function delimitersOf(instruction) {
|
|
33
|
+
if (!HEREDOC_KEYWORDS.has(instruction.keyword))
|
|
34
|
+
return [];
|
|
35
|
+
return instruction.args
|
|
36
|
+
.split(/\s+/)
|
|
37
|
+
.map((word) => HEREDOC_WORD.exec(word)?.[2])
|
|
38
|
+
.filter((name) => name !== undefined);
|
|
39
|
+
}
|
|
40
|
+
function readLine(state, raw, line) {
|
|
41
|
+
if (state.delimiters.length > 0) {
|
|
42
|
+
if (raw.replace(/^\t+/, '') === state.delimiters[0])
|
|
43
|
+
state.delimiters.shift();
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (isSkippable(raw))
|
|
47
|
+
return;
|
|
48
|
+
if (state.parts.length === 0)
|
|
49
|
+
state.start = line;
|
|
50
|
+
const trimmed = raw.trimEnd();
|
|
51
|
+
const continued = trimmed.endsWith(state.escape);
|
|
52
|
+
state.parts.push(continued ? trimmed.slice(0, -1) : trimmed);
|
|
53
|
+
if (continued)
|
|
54
|
+
return;
|
|
55
|
+
const instruction = toInstruction(state.parts, state.start, line);
|
|
56
|
+
state.found.push(instruction);
|
|
57
|
+
state.delimiters = delimitersOf(instruction);
|
|
58
|
+
state.parts = [];
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The Dockerfile's instructions: continuation lines joined, comments, blank lines and heredoc
|
|
62
|
+
* bodies left out.
|
|
63
|
+
*/
|
|
64
|
+
export function instructions(text) {
|
|
65
|
+
const lines = text.split(/\r?\n/);
|
|
66
|
+
const state = {
|
|
67
|
+
escape: escapeOf(lines),
|
|
68
|
+
found: [],
|
|
69
|
+
parts: [],
|
|
70
|
+
start: 0,
|
|
71
|
+
delimiters: [],
|
|
72
|
+
};
|
|
73
|
+
for (const [index, raw] of lines.entries())
|
|
74
|
+
readLine(state, raw, index + 1);
|
|
75
|
+
if (state.parts.length > 0) {
|
|
76
|
+
state.found.push(toInstruction(state.parts, state.start, lines.length));
|
|
77
|
+
}
|
|
78
|
+
return state.found;
|
|
79
|
+
}
|
|
80
|
+
function unquote(value) {
|
|
81
|
+
return /^(["']).*\1$/.test(value) ? value.slice(1, -1) : value;
|
|
82
|
+
}
|
|
83
|
+
function argOf(token, line) {
|
|
84
|
+
const equals = token.indexOf('=');
|
|
85
|
+
if (equals < 0)
|
|
86
|
+
return [token, { line }];
|
|
87
|
+
return [token.slice(0, equals), { value: unquote(token.slice(equals + 1)), line }];
|
|
88
|
+
}
|
|
89
|
+
/** The build arguments declared before the first `FROM`, the only ones a `FROM` line may use. */
|
|
90
|
+
export function globalArgs(list) {
|
|
91
|
+
const firstFrom = list.findIndex((instruction) => instruction.keyword === 'FROM');
|
|
92
|
+
const prelude = firstFrom < 0 ? list : list.slice(0, firstFrom);
|
|
93
|
+
return new Map(prelude
|
|
94
|
+
.filter((instruction) => instruction.keyword === 'ARG')
|
|
95
|
+
.flatMap((instruction) => instruction.args
|
|
96
|
+
.split(/\s+/)
|
|
97
|
+
.filter((token) => token !== '')
|
|
98
|
+
.map((token) => argOf(token, instruction.line))));
|
|
99
|
+
}
|
|
100
|
+
const VARIABLE = /\$\{([A-Za-z_]\w*)(?::?([-+])([^}]*))?\}|\$([A-Za-z_]\w*)/g;
|
|
101
|
+
function expand(match, args, used) {
|
|
102
|
+
const [whole, braced, operator, word = '', bare] = match;
|
|
103
|
+
const name = braced ?? bare ?? '';
|
|
104
|
+
const value = args.get(name)?.value;
|
|
105
|
+
const set = value !== undefined && value !== '';
|
|
106
|
+
if (set)
|
|
107
|
+
used.push(name);
|
|
108
|
+
if (operator === '-')
|
|
109
|
+
return set ? value : word;
|
|
110
|
+
if (operator === '+')
|
|
111
|
+
return set ? word : '';
|
|
112
|
+
return value ?? whole;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Replaces `$NAME`, `${NAME}`, `${NAME:-default}` and `${NAME:+alternative}` as Docker does;
|
|
116
|
+
* a variable with no value and no default stays as written.
|
|
117
|
+
*/
|
|
118
|
+
export function substitute(text, args) {
|
|
119
|
+
const used = [];
|
|
120
|
+
let replaced = '';
|
|
121
|
+
let last = 0;
|
|
122
|
+
for (const match of text.matchAll(VARIABLE)) {
|
|
123
|
+
replaced += text.slice(last, match.index) + expand(match, args, used);
|
|
124
|
+
last = match.index + match[0].length;
|
|
125
|
+
}
|
|
126
|
+
return { text: replaced + text.slice(last), used };
|
|
127
|
+
}
|
|
128
|
+
/** `[registry/]path[:tag][@digest]`. */
|
|
129
|
+
export function splitReference(reference) {
|
|
130
|
+
const at = reference.indexOf('@');
|
|
131
|
+
const named = at < 0 ? reference : reference.slice(0, at);
|
|
132
|
+
const digest = at < 0 ? undefined : reference.slice(at + 1);
|
|
133
|
+
const colon = named.lastIndexOf(':');
|
|
134
|
+
const hasTag = colon > named.lastIndexOf('/');
|
|
135
|
+
return {
|
|
136
|
+
path: hasTag ? named.slice(0, colon) : named,
|
|
137
|
+
...(hasTag ? { tag: named.slice(colon + 1) } : {}),
|
|
138
|
+
...(digest === undefined ? {} : { digest }),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/** The image's name on Docker Hub: no registry host, no `library/`. */
|
|
142
|
+
export function officialName(path) {
|
|
143
|
+
const parts = path.toLowerCase().split('/');
|
|
144
|
+
const [first = '', ...rest] = parts;
|
|
145
|
+
const hosted = rest.length > 0 && (/[.:]/.test(first) || first === 'localhost');
|
|
146
|
+
let name = (hosted ? rest : parts).join('/');
|
|
147
|
+
for (const prefix of ['docker/library/', 'library/']) {
|
|
148
|
+
if (name.startsWith(prefix))
|
|
149
|
+
name = name.slice(prefix.length);
|
|
150
|
+
}
|
|
151
|
+
return name;
|
|
152
|
+
}
|
|
153
|
+
const IMAGES = new Map([
|
|
154
|
+
['php', 'php'],
|
|
155
|
+
['node', 'node'],
|
|
156
|
+
['python', 'python'],
|
|
157
|
+
['rust', 'rust'],
|
|
158
|
+
['golang', 'go'],
|
|
159
|
+
['ruby', 'ruby'],
|
|
160
|
+
['oven/bun', 'bun'],
|
|
161
|
+
['denoland/deno', 'deno'],
|
|
162
|
+
]);
|
|
163
|
+
/** The release a tag names: its first dash-separated part that starts with a digit. */
|
|
164
|
+
export function tagVersion(tag) {
|
|
165
|
+
return tag.split('-').find((segment) => /^\d/.test(segment));
|
|
166
|
+
}
|
|
167
|
+
function written(reference) {
|
|
168
|
+
const tag = reference.tag === undefined ? '' : `:${reference.tag}`;
|
|
169
|
+
const digest = reference.digest === undefined ? '' : `@${reference.digest.slice(0, 15)}…`;
|
|
170
|
+
return `${reference.path}${tag}${digest}`;
|
|
171
|
+
}
|
|
172
|
+
/** `FROM [--platform=…] image [AS stage]`. */
|
|
173
|
+
export function parseFrom(args) {
|
|
174
|
+
const tokens = args.split(/\s+/).filter((token) => token !== '' && !token.startsWith('--'));
|
|
175
|
+
const [image, as, stage] = tokens;
|
|
176
|
+
return {
|
|
177
|
+
...(image === undefined ? {} : { image }),
|
|
178
|
+
...(as?.toLowerCase() === 'as' && stage !== undefined ? { stage: stage.toLowerCase() } : {}),
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
/** The line that sets the version: the build argument that carries it, else the `FROM` line. */
|
|
182
|
+
function placeOf(scope, from, used, version) {
|
|
183
|
+
const carrier = version === undefined
|
|
184
|
+
? undefined
|
|
185
|
+
: used.map((name) => scope.args.get(name)).find((arg) => arg?.value?.includes(version));
|
|
186
|
+
if (carrier !== undefined)
|
|
187
|
+
return { file: scope.file, line: carrier.line };
|
|
188
|
+
const span = from.endLine > from.line ? { endLine: from.endLine } : {};
|
|
189
|
+
return { file: scope.file, line: from.line, ...span };
|
|
190
|
+
}
|
|
191
|
+
function fromDeclaration(scope, from) {
|
|
192
|
+
const { image } = parseFrom(from.args);
|
|
193
|
+
if (image === undefined || image === 'scratch' || scope.stages.has(image.toLowerCase())) {
|
|
194
|
+
return undefined;
|
|
195
|
+
}
|
|
196
|
+
const resolved = substitute(image, scope.args);
|
|
197
|
+
const reference = splitReference(resolved.text);
|
|
198
|
+
if (reference.path.includes('$'))
|
|
199
|
+
return undefined;
|
|
200
|
+
const runtime = IMAGES.get(officialName(reference.path));
|
|
201
|
+
if (runtime === undefined)
|
|
202
|
+
return undefined;
|
|
203
|
+
const tag = reference.tag;
|
|
204
|
+
const version = tag === undefined || tag.includes('$') ? undefined : tagVersion(tag);
|
|
205
|
+
const place = placeOf(scope, from, resolved.used, version);
|
|
206
|
+
return pinned(runtime, place, written(reference), version);
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* The runtimes a Dockerfile's `FROM` lines build on, every stage: official images of a runtime
|
|
210
|
+
* (`php`, `node`, `python`, `rust`, `golang`, `ruby`, `oven/bun`, `denoland/deno`) from any
|
|
211
|
+
* registry, build arguments resolved where they have a value.
|
|
212
|
+
*/
|
|
213
|
+
export function dockerfileDeclarations(file, text) {
|
|
214
|
+
const list = instructions(text);
|
|
215
|
+
const stages = new Set();
|
|
216
|
+
const scope = { file, args: globalArgs(list), stages };
|
|
217
|
+
const found = [];
|
|
218
|
+
for (const instruction of list.filter((i) => i.keyword === 'FROM')) {
|
|
219
|
+
const declaration = fromDeclaration(scope, instruction);
|
|
220
|
+
if (declaration !== undefined)
|
|
221
|
+
found.push(declaration);
|
|
222
|
+
const { stage } = parseFrom(instruction.args);
|
|
223
|
+
if (stage !== undefined)
|
|
224
|
+
stages.add(stage);
|
|
225
|
+
}
|
|
226
|
+
return found;
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=dockerfile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dockerfile.js","sourceRoot":"","sources":["../../../src/checks/runtime/dockerfile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAWxE,MAAM,SAAS,GAAG,gCAAgC,CAAC;AACnD,MAAM,YAAY,GAAG,+BAA+B,CAAC;AACrD,MAAM,gBAAgB,GAAwB,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAE9E,0FAA0F;AAC1F,SAAS,QAAQ,CAAC,KAAwB;IACxC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,SAAS,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QACpC,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IACzF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,OAAO,OAAO,KAAK,EAAE,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,aAAa,CAAC,KAAwB,EAAE,IAAY,EAAE,OAAe;IAC5E,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7D,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACjE,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CAAC,WAAwB;IAC5C,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IAC1D,OAAO,WAAW,CAAC,IAAI;SACpB,KAAK,CAAC,KAAK,CAAC;SACZ,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SAC3C,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;AAC1D,CAAC;AAUD,SAAS,QAAQ,CAAC,KAAc,EAAE,GAAW,EAAE,IAAY;IACzD,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAC9E,OAAO;IACT,CAAC;IACD,IAAI,WAAW,CAAC,GAAG,CAAC;QAAE,OAAO;IAC7B,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;IACjD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACjD,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC7D,IAAI,SAAS;QAAE,OAAO;IACtB,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAClE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC9B,KAAK,CAAC,UAAU,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAC7C,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,KAAK,GAAY;QACrB,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC;QACvB,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,CAAC;QACR,UAAU,EAAE,EAAE;KACf,CAAC;IACF,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAC5E,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC;AACrB,CAAC;AAID,SAAS,OAAO,CAAC,KAAa;IAC5B,OAAO,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACjE,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,IAAY;IACxC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;AACrF,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,UAAU,CAAC,IAA4B;IACrD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC;IAClF,MAAM,OAAO,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAChE,OAAO,IAAI,GAAG,CACZ,OAAO;SACJ,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,KAAK,KAAK,CAAC;SACtD,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,CACvB,WAAW,CAAC,IAAI;SACb,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC;SAC/B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAClD,CACJ,CAAC;AACJ,CAAC;AAED,MAAM,QAAQ,GAAG,4DAA4D,CAAC;AAQ9E,SAAS,MAAM,CAAC,KAAsB,EAAE,IAA8B,EAAE,IAAc;IACpF,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;IACzD,MAAM,IAAI,GAAG,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;IACpC,MAAM,GAAG,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC;IAChD,IAAI,GAAG;QAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,IAAI,QAAQ,KAAK,GAAG;QAAE,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAChD,IAAI,QAAQ,KAAK,GAAG;QAAE,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7C,OAAO,KAAK,IAAI,KAAK,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,IAA8B;IACrE,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5C,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACtE,IAAI,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACvC,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;AACrD,CAAC;AAID,wCAAwC;AACxC,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9C,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK;QAC5C,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;KAC5C,CAAC;AACJ,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,CAAC,KAAK,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,WAAW,CAAC,CAAC;IAChF,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,KAAK,MAAM,MAAM,IAAI,CAAC,iBAAiB,EAAE,UAAU,CAAC,EAAE,CAAC;QACrD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,MAAM,GAAiC,IAAI,GAAG,CAAkB;IACpE,CAAC,KAAK,EAAE,KAAK,CAAC;IACd,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACpB,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,QAAQ,EAAE,IAAI,CAAC;IAChB,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,UAAU,EAAE,KAAK,CAAC;IACnB,CAAC,eAAe,EAAE,MAAM,CAAC;CAC1B,CAAC,CAAC;AAEH,uFAAuF;AACvF,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,OAAO,CAAC,SAAoB;IACnC,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,GAAG,EAAE,CAAC;IACnE,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;IAC1F,OAAO,GAAG,SAAS,CAAC,IAAI,GAAG,GAAG,GAAG,MAAM,EAAE,CAAC;AAC5C,CAAC;AAID,8CAA8C;AAC9C,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5F,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,CAAC,GAAG,MAAM,CAAC;IAClC,OAAO;QACL,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QACzC,GAAG,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7F,CAAC;AACJ,CAAC;AAQD,gGAAgG;AAChG,SAAS,OAAO,CACd,KAAY,EACZ,IAAiB,EACjB,IAAuB,EACvB,OAAgB;IAEhB,MAAM,OAAO,GACX,OAAO,KAAK,SAAS;QACnB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5F,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;IAC3E,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;AACxD,CAAC;AAED,SAAS,eAAe,CAAC,KAAY,EAAE,IAAiB;IACtD,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QACxF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACnD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC;IAC1B,MAAM,OAAO,GAAG,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACrF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3D,OAAO,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;AAC7D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAY,EAAE,IAAY;IAC/D,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,MAAM,KAAK,GAAU,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9D,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,EAAE,CAAC;QACnE,MAAM,WAAW,GAAG,eAAe,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACxD,IAAI,WAAW,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACvD,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { RUNTIMES } from './runtimes.js';
|
|
3
|
+
import { cycleOf, isRelease, leadingRelease } from './versions.js';
|
|
4
|
+
import { EngineError } from '../../core/check.js';
|
|
5
|
+
const ENDOFLIFE = 'https://endoflife.date/api/v1/products';
|
|
6
|
+
export function endOfLifeRequest(product) {
|
|
7
|
+
return { name: `endoflife-${product}`, url: `${ENDOFLIFE}/${encodeURIComponent(product)}` };
|
|
8
|
+
}
|
|
9
|
+
export function phpReleasesRequest(cycle) {
|
|
10
|
+
return {
|
|
11
|
+
name: `php-releases-${cycle}`,
|
|
12
|
+
url: `https://www.php.net/releases/index.php?json&version=${encodeURIComponent(cycle)}&max=1000`,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export const NODE_INDEX = {
|
|
16
|
+
name: 'node-index',
|
|
17
|
+
url: 'https://nodejs.org/dist/index.json',
|
|
18
|
+
};
|
|
19
|
+
function json(name, text) {
|
|
20
|
+
try {
|
|
21
|
+
return JSON.parse(text);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
throw new EngineError(`the ${name} feed isn't JSON`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function shaped(name, schema, text) {
|
|
28
|
+
const parsed = schema.safeParse(json(name, text));
|
|
29
|
+
if (!parsed.success)
|
|
30
|
+
throw new EngineError(`the ${name} feed has an unexpected shape`);
|
|
31
|
+
return parsed.data;
|
|
32
|
+
}
|
|
33
|
+
const DATE = /^\d{4}-\d{2}-\d{2}$/;
|
|
34
|
+
/** A date, or `undefined` for anything else the feed puts there (`null`, `true`). */
|
|
35
|
+
const date = z
|
|
36
|
+
.union([z.string(), z.boolean()])
|
|
37
|
+
.nullish()
|
|
38
|
+
.transform((value) => (typeof value === 'string' && DATE.test(value) ? value : undefined));
|
|
39
|
+
const productSchema = z.object({
|
|
40
|
+
result: z.object({
|
|
41
|
+
releases: z.array(z.object({
|
|
42
|
+
name: z.string(),
|
|
43
|
+
isEol: z.boolean().nullish(),
|
|
44
|
+
eolFrom: date,
|
|
45
|
+
eoasFrom: date,
|
|
46
|
+
latest: z.object({ name: z.string(), date }).nullish(),
|
|
47
|
+
})),
|
|
48
|
+
}),
|
|
49
|
+
});
|
|
50
|
+
/** endoflife.date's product: each cycle's newest release and end of life. */
|
|
51
|
+
export function parseEndOfLife(text, product = 'endoflife.date') {
|
|
52
|
+
return shaped(product, productSchema, text).result.releases.map((release) => {
|
|
53
|
+
const latest = release.latest?.name;
|
|
54
|
+
return {
|
|
55
|
+
name: release.name,
|
|
56
|
+
...(latest !== undefined && isRelease(latest) ? { latest } : {}),
|
|
57
|
+
...(release.latest?.date === undefined ? {} : { latestDate: release.latest.date }),
|
|
58
|
+
...(release.eolFrom === undefined ? {} : { eol: release.eolFrom }),
|
|
59
|
+
isEol: release.isEol === true,
|
|
60
|
+
...(release.eoasFrom === undefined ? {} : { activeUntil: release.eoasFrom }),
|
|
61
|
+
};
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
const phpUnknownSchema = z.object({ error: z.string() });
|
|
65
|
+
const phpSchema = z.record(z.string(), z.object({ tags: z.array(z.string()).nullish() }));
|
|
66
|
+
/** php.net's releases of one cycle: those tagged `security`. An unknown cycle has none. */
|
|
67
|
+
export function parsePhpReleases(text) {
|
|
68
|
+
if (phpUnknownSchema.safeParse(json('php.net', text)).success)
|
|
69
|
+
return [];
|
|
70
|
+
return Object.entries(shaped('php.net', phpSchema, text))
|
|
71
|
+
.filter(([version, release]) => release.tags?.includes('security') === true && isRelease(version))
|
|
72
|
+
.map(([version]) => version);
|
|
73
|
+
}
|
|
74
|
+
const nodeSchema = z.array(z.object({ version: z.string(), security: z.boolean().nullish() }));
|
|
75
|
+
/** nodejs.org's `index.json`: the releases marked `security: true`. */
|
|
76
|
+
export function parseNodeIndex(text) {
|
|
77
|
+
return shaped('nodejs.org', nodeSchema, text)
|
|
78
|
+
.filter((release) => release.security === true)
|
|
79
|
+
.map((release) => release.version.replace(/^v/, ''))
|
|
80
|
+
.filter((version) => isRelease(version));
|
|
81
|
+
}
|
|
82
|
+
async function fetchCycles(fetcher, runtime) {
|
|
83
|
+
const { product } = RUNTIMES[runtime];
|
|
84
|
+
return parseEndOfLife(await fetcher(endOfLifeRequest(product)), product);
|
|
85
|
+
}
|
|
86
|
+
/** The cycles of the exact declarations of one runtime. */
|
|
87
|
+
function exactCycles(declarations, runtime, cycles) {
|
|
88
|
+
const names = cycles.map((cycle) => cycle.name);
|
|
89
|
+
const found = declarations
|
|
90
|
+
.filter((d) => d.runtime === runtime && d.exactness === 'exact' && d.version !== undefined)
|
|
91
|
+
.map((d) => cycleOf(leadingRelease(d.version ?? '') ?? '', names))
|
|
92
|
+
.filter((cycle) => cycle !== undefined);
|
|
93
|
+
return [...new Set(found)];
|
|
94
|
+
}
|
|
95
|
+
async function fetchSecurity(fetcher, runtime, cycles) {
|
|
96
|
+
const source = RUNTIMES[runtime].security;
|
|
97
|
+
if (cycles.length === 0)
|
|
98
|
+
return undefined;
|
|
99
|
+
if (source === 'php.net') {
|
|
100
|
+
const texts = await Promise.all(cycles.map((cycle) => fetcher(phpReleasesRequest(cycle))));
|
|
101
|
+
return new Set(texts.flatMap((text) => parsePhpReleases(text)));
|
|
102
|
+
}
|
|
103
|
+
if (source === 'nodejs')
|
|
104
|
+
return new Set(parseNodeIndex(await fetcher(NODE_INDEX)));
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* The feeds the declarations need: endoflife.date for every runtime declared, and the vendor's
|
|
109
|
+
* security flags for the cycles that an exact declaration pins.
|
|
110
|
+
*/
|
|
111
|
+
export async function loadFeeds(declarations, fetcher) {
|
|
112
|
+
const runtimes = [...new Set(declarations.map((d) => d.runtime))];
|
|
113
|
+
const entries = await Promise.all(runtimes.map(async (runtime) => {
|
|
114
|
+
const cycles = await fetchCycles(fetcher, runtime);
|
|
115
|
+
const security = await fetchSecurity(fetcher, runtime, exactCycles(declarations, runtime, cycles));
|
|
116
|
+
return [runtime, { cycles, ...(security === undefined ? {} : { security }) }];
|
|
117
|
+
}));
|
|
118
|
+
return new Map(entries);
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=feeds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feeds.js","sourceRoot":"","sources":["../../../src/checks/runtime/feeds.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { EngineError } from '../../core/check.js';
|
|
4
|
+
/** Setting it to a directory of recorded feeds (`<name>.json`) keeps the check off the network. */
|
|
5
|
+
export const FEEDS_VARIABLE = 'TALOS_RUNTIME_FEEDS';
|
|
6
|
+
const TIMEOUT_MS = 30_000;
|
|
7
|
+
/**
|
|
8
|
+
* The live feeds, through `fetchImpl`. Node's `fetch` uses `HTTPS_PROXY` only when
|
|
9
|
+
* `NODE_USE_ENV_PROXY=1` is set, as it must be behind a proxy.
|
|
10
|
+
*/
|
|
11
|
+
export function httpFetcher(fetchImpl = fetch) {
|
|
12
|
+
return async ({ name, url }) => {
|
|
13
|
+
const response = await fetchImpl(url, {
|
|
14
|
+
headers: { accept: 'application/json', 'user-agent': 'talos-runtime-check' },
|
|
15
|
+
signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
16
|
+
}).catch(() => undefined);
|
|
17
|
+
if (response === undefined)
|
|
18
|
+
throw new EngineError(`the ${name} feed could not be reached`);
|
|
19
|
+
if (!response.ok)
|
|
20
|
+
throw new EngineError(`the ${name} feed answered HTTP ${response.status}`);
|
|
21
|
+
return response.text().catch(() => {
|
|
22
|
+
throw new EngineError(`the ${name} feed was cut off`);
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export const networkFetcher = httpFetcher();
|
|
27
|
+
/** Recorded feeds: `<dir>/<name>.json`. */
|
|
28
|
+
export function fixtureFetcher(dir) {
|
|
29
|
+
return async ({ name }) => {
|
|
30
|
+
try {
|
|
31
|
+
return await readFile(join(dir, `${name}.json`), 'utf8');
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
throw new EngineError(`${FEEDS_VARIABLE} has no recorded ${name}.json`);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const TTL_MS = 10 * 60 * 1000;
|
|
39
|
+
/**
|
|
40
|
+
* Shares one fetch of each feed for `ttlMs`, across every check and repository a process
|
|
41
|
+
* judges; a failed fetch is forgotten, so the next caller tries again.
|
|
42
|
+
*/
|
|
43
|
+
export function cachedFetcher(fetcher, ttlMs = TTL_MS, now = Date.now) {
|
|
44
|
+
const cache = new Map();
|
|
45
|
+
return (request) => {
|
|
46
|
+
const known = cache.get(request.url);
|
|
47
|
+
if (known !== undefined && now() - known.at < ttlMs)
|
|
48
|
+
return known.body;
|
|
49
|
+
const body = fetcher(request);
|
|
50
|
+
cache.set(request.url, { at: now(), body });
|
|
51
|
+
void body.catch(() => {
|
|
52
|
+
if (cache.get(request.url)?.body === body)
|
|
53
|
+
cache.delete(request.url);
|
|
54
|
+
});
|
|
55
|
+
return body;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** The fetcher the environment asks for: recorded feeds when the variable is set, else live. */
|
|
59
|
+
export function fetcherFor(env) {
|
|
60
|
+
const dir = env[FEEDS_VARIABLE];
|
|
61
|
+
return dir === undefined || dir === '' ? networkFetcher : fixtureFetcher(dir);
|
|
62
|
+
}
|
|
63
|
+
let shared;
|
|
64
|
+
/** The process's cached fetcher, per `fetcherFor(process.env)`. */
|
|
65
|
+
export function defaultFetcher() {
|
|
66
|
+
const dir = process.env[FEEDS_VARIABLE];
|
|
67
|
+
if (shared === undefined || shared.dir !== dir) {
|
|
68
|
+
shared = { dir, fetcher: cachedFetcher(fetcherFor(process.env)) };
|
|
69
|
+
}
|
|
70
|
+
return shared.fetcher;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=fetchers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetchers.js","sourceRoot":"","sources":["../../../src/checks/runtime/fetchers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/checks/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG3C,+FAA+F;AAC/F,MAAM,CAAC,MAAM,WAAW,GAAS;IAC/B,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,CAAC,aAAa,EAAE,CAAC;CAC1B,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export const RUNTIMES = {
|
|
2
|
+
php: { product: 'php', label: 'PHP', security: 'php.net' },
|
|
3
|
+
node: { product: 'nodejs', label: 'Node.js', security: 'nodejs' },
|
|
4
|
+
python: { product: 'python', label: 'Python', security: 'phase' },
|
|
5
|
+
rust: { product: 'rust', label: 'Rust', security: 'none' },
|
|
6
|
+
go: { product: 'go', label: 'Go', security: 'none' },
|
|
7
|
+
ruby: { product: 'ruby', label: 'Ruby', security: 'none' },
|
|
8
|
+
bun: { product: 'bun', label: 'Bun', security: 'none' },
|
|
9
|
+
deno: { product: 'deno', label: 'Deno', security: 'none' },
|
|
10
|
+
lua: { product: 'lua', label: 'Lua', security: 'none' },
|
|
11
|
+
};
|
|
12
|
+
const NAMES = new Map([
|
|
13
|
+
['php', 'php'],
|
|
14
|
+
['node', 'node'],
|
|
15
|
+
['nodejs', 'node'],
|
|
16
|
+
['python', 'python'],
|
|
17
|
+
['cpython', 'python'],
|
|
18
|
+
['rust', 'rust'],
|
|
19
|
+
['go', 'go'],
|
|
20
|
+
['golang', 'go'],
|
|
21
|
+
['ruby', 'ruby'],
|
|
22
|
+
['bun', 'bun'],
|
|
23
|
+
['deno', 'deno'],
|
|
24
|
+
['lua', 'lua'],
|
|
25
|
+
]);
|
|
26
|
+
/** A runtime by its name or a common alias (`nodejs`, `golang`), or `undefined`. */
|
|
27
|
+
export function runtimeNamed(name) {
|
|
28
|
+
return NAMES.get(name.toLowerCase());
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=runtimes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtimes.js","sourceRoot":"","sources":["../../../src/checks/runtime/runtimes.ts"],"names":[],"mappings":"AAoBA,MAAM,CAAC,MAAM,QAAQ,GAA2C;IAC9D,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE;IAC1D,IAAI,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACjE,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE;IACjE,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE;IAC1D,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE;IACpD,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE;IAC1D,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE;IACvD,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE;IAC1D,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE;CACxD,CAAC;AAEF,MAAM,KAAK,GAAiC,IAAI,GAAG,CAAkB;IACnE,CAAC,KAAK,EAAE,KAAK,CAAC;IACd,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClB,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACpB,CAAC,SAAS,EAAE,QAAQ,CAAC;IACrB,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,QAAQ,EAAE,IAAI,CAAC;IAChB,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,KAAK,EAAE,KAAK,CAAC;IACd,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,KAAK,EAAE,KAAK,CAAC;CACf,CAAC,CAAC;AAEH,oFAAoF;AACpF,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { parse as parseYaml } from 'yaml';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { pinned } from './declaration.js';
|
|
4
|
+
import { runtimeNamed } from './runtimes.js';
|
|
5
|
+
import { EngineError } from '../../core/check.js';
|
|
6
|
+
import { setsKey } from '../../core/literal.js';
|
|
7
|
+
/** Talos's own lockfile of outside tools, at the repository root. */
|
|
8
|
+
export const TOOLS_LOCK = 'tools.lock';
|
|
9
|
+
/** `runtimes` maps each interpreter Talos installs tools into to its version. */
|
|
10
|
+
const lockSchema = z.object({ runtimes: z.record(z.string(), z.string().min(1)) });
|
|
11
|
+
/** The line of `name`'s key after the `runtimes` key, so a tool of the same name can't match. */
|
|
12
|
+
function entryLine(text, name) {
|
|
13
|
+
const lines = text.split(/\r?\n/);
|
|
14
|
+
const section = lines.findIndex((line) => setsKey(line, 'runtimes', ':'));
|
|
15
|
+
const index = lines.findIndex((line, at) => at > section && setsKey(line, name, ':'));
|
|
16
|
+
return index < 0 ? 1 : index + 1;
|
|
17
|
+
}
|
|
18
|
+
function readLock(text) {
|
|
19
|
+
try {
|
|
20
|
+
return lockSchema.safeParse(parseYaml(text)).data?.runtimes ?? {};
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return {};
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* The runtimes `tools.lock` pins under `runtimes`. A file of another shape declares nothing; a
|
|
28
|
+
* runtime Talos doesn't know is an engine error, since only Talos writes this file.
|
|
29
|
+
*/
|
|
30
|
+
export function toolsLockDeclarations(file, text) {
|
|
31
|
+
return Object.entries(readLock(text)).map(([name, written]) => {
|
|
32
|
+
const runtime = runtimeNamed(name);
|
|
33
|
+
if (runtime === undefined) {
|
|
34
|
+
throw new EngineError(`${file} pins the runtime "${name}", which Talos doesn't know`);
|
|
35
|
+
}
|
|
36
|
+
const version = written.replace(/^v(?=\d)/, '');
|
|
37
|
+
return pinned(runtime, { file, line: entryLine(text, name) }, written, version);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=tools-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools-lock.js","sourceRoot":"","sources":["../../../src/checks/runtime/tools-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAoB,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD,qEAAqE;AACrE,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC;AAEvC,iFAAiF;AACjF,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAEnF,iGAAiG;AACjG,SAAS,SAAS,CAAC,IAAY,EAAE,IAAY;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;IAC1E,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACtF,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,IAAI,EAAE,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,IAAY;IAC9D,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE;QAC5D,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,IAAI,WAAW,CAAC,GAAG,IAAI,sBAAsB,IAAI,6BAA6B,CAAC,CAAC;QACxF,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAChD,OAAO,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { parse as parseToml } from 'smol-toml';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { lineAt, meaningfulLines, pinned } from './declaration.js';
|
|
4
|
+
import { isRelease, leadingRelease } from './versions.js';
|
|
5
|
+
/**
|
|
6
|
+
* `.nvmrc` and `.node-version`: the first line that isn't a comment. `v22.12.0` and `22.12.0` pin
|
|
7
|
+
* one release; `22`, `lts/*`, `node` and ranges float.
|
|
8
|
+
*/
|
|
9
|
+
export function nodeVersionFile(file, text) {
|
|
10
|
+
const [first] = meaningfulLines(text);
|
|
11
|
+
if (first === undefined)
|
|
12
|
+
return [];
|
|
13
|
+
const bare = first.text.replace(/^v(?=\d)/, '');
|
|
14
|
+
const version = isRelease(bare) ? bare : undefined;
|
|
15
|
+
return [pinned('node', { file, line: first.line }, first.text, version)];
|
|
16
|
+
}
|
|
17
|
+
const PYTHON_LINE = /^(?:cpython[-@]|python)?(\d\S*)$/i;
|
|
18
|
+
function pythonLine(file, entry) {
|
|
19
|
+
const place = { file, line: entry.line };
|
|
20
|
+
if (entry.text.toLowerCase() === 'system') {
|
|
21
|
+
return [pinned('python', place, entry.text, undefined)];
|
|
22
|
+
}
|
|
23
|
+
const match = PYTHON_LINE.exec(entry.text);
|
|
24
|
+
if (match?.[1] === undefined)
|
|
25
|
+
return [];
|
|
26
|
+
return [pinned('python', place, entry.text, match[1].replace(/t$/, ''))];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* `.python-version`: one interpreter per line. CPython releases (`3.13.1`, `cpython@3.13`) and
|
|
30
|
+
* `system` count; other interpreters are left alone.
|
|
31
|
+
*/
|
|
32
|
+
export function pythonVersionFile(file, text) {
|
|
33
|
+
return meaningfulLines(text).flatMap((entry) => pythonLine(file, entry));
|
|
34
|
+
}
|
|
35
|
+
const toolchainSchema = z.object({ toolchain: z.object({ channel: z.string().optional() }) });
|
|
36
|
+
function channelOf(text) {
|
|
37
|
+
const trimmed = text.trim();
|
|
38
|
+
if (/^[\w.-]+$/.test(trimmed))
|
|
39
|
+
return trimmed;
|
|
40
|
+
try {
|
|
41
|
+
return toolchainSchema.safeParse(parseToml(text)).data?.toolchain.channel;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function firstLine(text, pattern) {
|
|
48
|
+
const index = text.split(/\r?\n/).findIndex((line) => pattern.test(line));
|
|
49
|
+
return index < 0 ? undefined : index + 1;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* `rust-toolchain.toml`, or the legacy `rust-toolchain`: its channel. `1.83.0` pins a release;
|
|
53
|
+
* `1.83`, `stable`, a dated nightly or no channel at all float.
|
|
54
|
+
*/
|
|
55
|
+
export function rustToolchainFile(file, text) {
|
|
56
|
+
const channel = channelOf(text);
|
|
57
|
+
const line = firstLine(text, /^\s*channel\s*=/) ?? firstLine(text, /\S/) ?? 1;
|
|
58
|
+
const version = channel !== undefined && isRelease(channel) ? channel : undefined;
|
|
59
|
+
return [pinned('rust', { file, line }, channel ?? 'no channel', version)];
|
|
60
|
+
}
|
|
61
|
+
/** `go.mod`'s `toolchain` line (`toolchain go1.23.4`); its `go` line is a language version. */
|
|
62
|
+
export function goModFile(file, text) {
|
|
63
|
+
const lines = text.split(/\r?\n/);
|
|
64
|
+
const index = lines.findIndex((line) => /^\s*toolchain\s+\S/.test(line));
|
|
65
|
+
const name = lines[index]?.trim().split(/\s+/)[1];
|
|
66
|
+
if (name === undefined)
|
|
67
|
+
return [];
|
|
68
|
+
const release = /^go(\d\S*)$/.exec(name)?.[1];
|
|
69
|
+
return [pinned('go', { file, line: index + 1 }, name, release)];
|
|
70
|
+
}
|
|
71
|
+
const composerSchema = z.object({
|
|
72
|
+
config: z.object({ platform: z.object({ php: z.string() }) }),
|
|
73
|
+
});
|
|
74
|
+
/**
|
|
75
|
+
* `composer.json`'s `config.platform.php`: the PHP that Composer resolves dependencies against,
|
|
76
|
+
* often the lowest patch the project supports. It is a minimum, not the PHP the project ships.
|
|
77
|
+
*/
|
|
78
|
+
export function composerFile(file, text) {
|
|
79
|
+
let parsed;
|
|
80
|
+
try {
|
|
81
|
+
parsed = JSON.parse(text);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
const php = composerSchema.safeParse(parsed).data?.config.platform.php;
|
|
87
|
+
const version = php === undefined ? undefined : leadingRelease(php.trim());
|
|
88
|
+
if (php === undefined || version === undefined)
|
|
89
|
+
return [];
|
|
90
|
+
const platform = text.indexOf('"platform"');
|
|
91
|
+
const key = text.slice(Math.max(platform, 0)).search(/"php"\s*:/);
|
|
92
|
+
const line = lineAt(text, key < 0 ? Math.max(platform, 0) : Math.max(platform, 0) + key);
|
|
93
|
+
return [{ runtime: 'php', file, line, written: php, version, exactness: 'minimum' }];
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=version-files.js.map
|