Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion cli/src/bin/phylum.rs
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,9 @@ async fn handle_commands() -> CommandResult {
"extension" => extensions::handle_extensions(sub_matches).await,

#[cfg(feature = "extensions")]
extension_subcmd => extensions::handle_run_extension(extension_subcmd, Box::pin(api)).await,
extension_subcmd => {
extensions::handle_run_extension(Box::pin(api), extension_subcmd, sub_matches).await
},

#[cfg(not(feature = "extensions"))]
_ => unreachable!(),
Expand Down
8 changes: 6 additions & 2 deletions cli/src/commands/extensions/extension.rs
Original file line number Diff line number Diff line change
Expand Up @@ -123,9 +123,13 @@ impl Extension {
}

/// Execute an extension subcommand.
pub async fn run(&self, api: BoxFuture<'static, Result<PhylumApi>>) -> CommandResult {
pub async fn run(
&self,
api: BoxFuture<'static, Result<PhylumApi>>,
args: Vec<String>,
) -> CommandResult {
let script_path = self.path.join(&self.manifest.entry_point);
deno::run(ExtensionState::from(api), &script_path.to_string_lossy()).await?;
deno::run(ExtensionState::from(api), &script_path.to_string_lossy(), args).await?;
Ok(ExitCode::Ok.into())
}
}
Expand Down
17 changes: 13 additions & 4 deletions cli/src/commands/extensions/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ pub fn command<'a>() -> Command<'a> {
}

/// Generate the subcommands for each extension.
/// TODO add tests.
pub fn add_extensions_subcommands(command: Command<'_>) -> Command<'_> {
let extensions = match installed_extensions() {
Ok(extensions) => extensions,
Expand All @@ -64,7 +63,14 @@ pub fn add_extensions_subcommands(command: Command<'_>) -> Command<'_> {
true
}
})
.fold(command, |command, ext| command.subcommand(Command::new(ext.name())))
.fold(command, |command, ext| {
command.subcommand(
Command::new(ext.name())
.allow_hyphen_values(true)
.disable_help_flag(true)
.arg(arg!([OPTIONS] ... "Extension parameters")),
)
})
}

/// Entry point for the `extensions` subcommand.
Expand All @@ -86,12 +92,15 @@ pub async fn handle_extensions(matches: &ArgMatches) -> CommandResult {
///
/// Run the extension by name.
pub async fn handle_run_extension(
name: &str,
api: BoxFuture<'static, Result<PhylumApi>>,
name: &str,
args: &ArgMatches,
) -> CommandResult {
let options = args.get_many("OPTIONS").map(|options| options.cloned().collect());

let extension = Extension::load(name)?;

extension.run(api).await?;
extension.run(api, options.unwrap_or_default()).await?;

Ok(CommandValue::Code(ExitCode::Ok))
}
Expand Down
8 changes: 6 additions & 2 deletions cli/src/deno.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,19 @@ use crate::commands::extensions::extension::{self, ExtensionState};
const EXTENSION_API: &str = include_str!("./extension_api.ts");

/// Execute Phylum extension.
pub async fn run(extension_state: ExtensionState, entry_point: &str) -> Result<()> {
pub async fn run(
extension_state: ExtensionState,
entry_point: &str,
args: Vec<String>,
) -> Result<()> {
let phylum_api = Extension::builder().ops(api::api_decls()).build();

let main_module = deno_core::resolve_path(entry_point)?;

let cpu_count = thread::available_parallelism().map(|p| p.get()).unwrap_or(1);
let bootstrap = BootstrapOptions {
cpu_count,
args,
runtime_version: env!("CARGO_PKG_VERSION").into(),
user_agent: "phylum-cli/extension".into(),
no_color: !colors::use_color(),
Expand All @@ -40,7 +45,6 @@ pub async fn run(extension_state: ExtensionState, entry_point: &str) -> Result<(
ts_version: Default::default(),
location: Default::default(),
unstable: Default::default(),
args: Default::default(),
};

let options = WorkerOptions {
Expand Down
26 changes: 24 additions & 2 deletions cli/tests/extensions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -217,8 +217,8 @@ fn extension_list_should_emit_output() {
}

// Extensions relying on the injected Phylum API work.
#[tokio::test]
async fn injected_api() {
#[test]
fn injected_api() {
let tempdir = TempDir::new().unwrap();
Command::cargo_bin("phylum")
.unwrap()
Expand All @@ -237,6 +237,28 @@ async fn injected_api() {
.stdout("44\n");
}

// Extensions can access CLI arguments.
#[test]
fn arg_access() {
let tempdir = TempDir::new().unwrap();
Command::cargo_bin("phylum")
.unwrap()
.env("XDG_DATA_HOME", tempdir.path())
.arg("extension")
.arg("install")
.arg(fixtures_path().join("args"))
.assert()
.success();

Command::cargo_bin("phylum")
.unwrap()
.env("XDG_DATA_HOME", tempdir.path())
.args(&["args", "--test", "-x", "a"])
.assert()
.success()
.stdout("[ \"--test\", \"-x\", \"a\" ]\n");
}

////////////////////////////////////////////////////////////////////////////////
// Miscellaneous tests
////////////////////////////////////////////////////////////////////////////////
Expand Down
3 changes: 3 additions & 0 deletions cli/tests/fixtures/extensions/args/PhylumExt.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
name = "args"
description = "Print deno args"
entry_point = "main.ts"
1 change: 1 addition & 0 deletions cli/tests/fixtures/extensions/args/main.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
console.log(Deno.args);