use nu_protocol::ast::ExternalArgument;
use super::{
CommandEffects, ExternEffect,
predicates::{always, get_subcommand},
};
use crate::{context::LintContext, effect::CommonEffect};
fn npm_has_streaming_output(context: &LintContext, args: &[ExternalArgument]) -> bool {
let subcommand = get_subcommand(args, context);
matches!(
subcommand,
"install" | "ci" | "run" | "test" | "build" | "start" | "publish" | "exec"
)
}
fn pip_has_streaming_output(context: &LintContext, args: &[ExternalArgument]) -> bool {
let subcommand = get_subcommand(args, context);
matches!(subcommand, "install" | "download" | "wheel")
}
pub const COMMANDS: &[CommandEffects] = &[
(
"npm",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesFileSystem, always),
(ExternEffect::ModifiesNetworkState, always),
(ExternEffect::SlowStreamingOutput, npm_has_streaming_output),
],
),
(
"npx",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesNetworkState, always),
(ExternEffect::SlowStreamingOutput, always),
],
),
(
"yarn",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesFileSystem, always),
(ExternEffect::ModifiesNetworkState, always),
(ExternEffect::SlowStreamingOutput, npm_has_streaming_output),
],
),
(
"pnpm",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesFileSystem, always),
(ExternEffect::ModifiesNetworkState, always),
(ExternEffect::SlowStreamingOutput, npm_has_streaming_output),
],
),
(
"bun",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesFileSystem, always),
(ExternEffect::ModifiesNetworkState, always),
(ExternEffect::SlowStreamingOutput, always),
],
),
(
"deno",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesFileSystem, always),
(ExternEffect::ModifiesNetworkState, always),
(ExternEffect::SlowStreamingOutput, always),
],
),
(
"node",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesNetworkState, always),
(ExternEffect::ModifiesFileSystem, always),
],
),
(
"pip",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesFileSystem, always),
(ExternEffect::SlowStreamingOutput, pip_has_streaming_output),
],
),
(
"pip3",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesFileSystem, always),
(ExternEffect::SlowStreamingOutput, pip_has_streaming_output),
],
),
(
"pipx",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::SlowStreamingOutput, always),
],
),
(
"uv",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::SlowStreamingOutput, always),
],
),
(
"poetry",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::SlowStreamingOutput, always),
],
),
(
"conda",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesFileSystem, always),
(ExternEffect::SlowStreamingOutput, always),
],
),
(
"python",
&[(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
)],
),
(
"python3",
&[(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
)],
),
(
"pytest",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::SlowStreamingOutput, always),
],
),
(
"mypy",
&[(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
)],
),
(
"ruff",
&[(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
)],
),
(
"black",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesFileSystem, always),
],
),
(
"isort",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesFileSystem, always),
],
),
(
"ruby",
&[(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
)],
),
(
"gem",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesFileSystem, always),
(ExternEffect::ModifiesNetworkState, always),
],
),
(
"bundle",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesFileSystem, always),
(ExternEffect::ModifiesNetworkState, always),
(ExternEffect::SlowStreamingOutput, always),
],
),
(
"bundler",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesFileSystem, always),
(ExternEffect::ModifiesNetworkState, always),
(ExternEffect::SlowStreamingOutput, always),
],
),
(
"rake",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesFileSystem, always),
(ExternEffect::SlowStreamingOutput, always),
],
),
(
"php",
&[(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
)],
),
(
"composer",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesFileSystem, always),
(ExternEffect::ModifiesNetworkState, always),
(ExternEffect::SlowStreamingOutput, always),
],
),
(
"perl",
&[(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
)],
),
(
"lua",
&[(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
)],
),
(
"luarocks",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesFileSystem, always),
(ExternEffect::ModifiesNetworkState, always),
],
),
(
"nix",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::SlowStreamingOutput, always),
],
),
(
"nix-build",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesFileSystem, always),
(ExternEffect::ModifiesNetworkState, always),
(ExternEffect::SlowStreamingOutput, always),
],
),
(
"nix-shell",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::SlowStreamingOutput, always),
],
),
(
"nix-env",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::ModifiesFileSystem, always),
(ExternEffect::ModifiesNetworkState, always),
],
),
(
"nixos-rebuild",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::SlowStreamingOutput, always),
(
ExternEffect::CommonEffect(CommonEffect::MayCauseDataLoss),
always,
),
],
),
(
"home-manager",
&[
(
ExternEffect::CommonEffect(CommonEffect::FailsInNormalCircumstances),
always,
),
(ExternEffect::SlowStreamingOutput, always),
],
),
];