mirror of
https://github.com/denoland/deno.git
synced 2025-10-01 22:51:14 +00:00
feat(init): add --npm flag to initialize npm projects (#26896)
This commit adds support for `deno init --npm <package>`. Running this will actually call to `npm:create-<package>` package that is equivalent to running `npm create <package>`. User will be prompted if they want to allow all permissions and lifecycle scripts to be executed. Closes https://github.com/denoland/deno/issues/26461 --------- Signed-off-by: Bartek Iwańczuk <biwanczuk@gmail.com> Co-authored-by: crowlkats <crowlkats@toaxl.com> Co-authored-by: David Sherret <dsherret@users.noreply.github.com>
This commit is contained in:
parent
f0b245c8ee
commit
d17f4590a2
6 changed files with 191 additions and 12 deletions
|
@ -222,6 +222,8 @@ impl FmtFlags {
|
|||
|
||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||
pub struct InitFlags {
|
||||
pub package: Option<String>,
|
||||
pub package_args: Vec<String>,
|
||||
pub dir: Option<String>,
|
||||
pub lib: bool,
|
||||
pub serve: bool,
|
||||
|
@ -1395,7 +1397,7 @@ pub fn flags_from_vec(args: Vec<OsString>) -> clap::error::Result<Flags> {
|
|||
"doc" => doc_parse(&mut flags, &mut m)?,
|
||||
"eval" => eval_parse(&mut flags, &mut m)?,
|
||||
"fmt" => fmt_parse(&mut flags, &mut m)?,
|
||||
"init" => init_parse(&mut flags, &mut m),
|
||||
"init" => init_parse(&mut flags, &mut m)?,
|
||||
"info" => info_parse(&mut flags, &mut m)?,
|
||||
"install" => install_parse(&mut flags, &mut m)?,
|
||||
"json_reference" => json_reference_parse(&mut flags, &mut m, app),
|
||||
|
@ -2448,7 +2450,19 @@ fn init_subcommand() -> Command {
|
|||
command("init", "scaffolds a basic Deno project with a script, test, and configuration file", UnstableArgsConfig::None).defer(
|
||||
|cmd| {
|
||||
cmd
|
||||
.arg(Arg::new("dir").value_hint(ValueHint::DirPath))
|
||||
.arg(Arg::new("args")
|
||||
.num_args(0..)
|
||||
.action(ArgAction::Append)
|
||||
.value_name("DIRECTORY OR PACKAGE")
|
||||
.trailing_var_arg(true)
|
||||
)
|
||||
.arg(
|
||||
Arg::new("npm")
|
||||
.long("npm")
|
||||
.help("Generate a npm create-* project")
|
||||
.conflicts_with_all(["lib", "serve"])
|
||||
.action(ArgAction::SetTrue),
|
||||
)
|
||||
.arg(
|
||||
Arg::new("lib")
|
||||
.long("lib")
|
||||
|
@ -4820,12 +4834,44 @@ fn fmt_parse(
|
|||
Ok(())
|
||||
}
|
||||
|
||||
fn init_parse(flags: &mut Flags, matches: &mut ArgMatches) {
|
||||
fn init_parse(
|
||||
flags: &mut Flags,
|
||||
matches: &mut ArgMatches,
|
||||
) -> Result<(), clap::Error> {
|
||||
let mut lib = matches.get_flag("lib");
|
||||
let mut serve = matches.get_flag("serve");
|
||||
let mut dir = None;
|
||||
let mut package = None;
|
||||
let mut package_args = vec![];
|
||||
|
||||
if let Some(mut args) = matches.remove_many::<String>("args") {
|
||||
let name = args.next().unwrap();
|
||||
let mut args = args.collect::<Vec<_>>();
|
||||
|
||||
if matches.get_flag("npm") {
|
||||
package = Some(name);
|
||||
package_args = args;
|
||||
} else {
|
||||
dir = Some(name);
|
||||
|
||||
if !args.is_empty() {
|
||||
args.insert(0, "init".to_string());
|
||||
let inner_matches = init_subcommand().try_get_matches_from_mut(args)?;
|
||||
lib = inner_matches.get_flag("lib");
|
||||
serve = inner_matches.get_flag("serve");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
flags.subcommand = DenoSubcommand::Init(InitFlags {
|
||||
dir: matches.remove_one::<String>("dir"),
|
||||
lib: matches.get_flag("lib"),
|
||||
serve: matches.get_flag("serve"),
|
||||
package,
|
||||
package_args,
|
||||
dir,
|
||||
lib,
|
||||
serve,
|
||||
});
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn info_parse(
|
||||
|
@ -10907,6 +10953,8 @@ mod tests {
|
|||
r.unwrap(),
|
||||
Flags {
|
||||
subcommand: DenoSubcommand::Init(InitFlags {
|
||||
package: None,
|
||||
package_args: vec![],
|
||||
dir: None,
|
||||
lib: false,
|
||||
serve: false,
|
||||
|
@ -10920,6 +10968,8 @@ mod tests {
|
|||
r.unwrap(),
|
||||
Flags {
|
||||
subcommand: DenoSubcommand::Init(InitFlags {
|
||||
package: None,
|
||||
package_args: vec![],
|
||||
dir: Some(String::from("foo")),
|
||||
lib: false,
|
||||
serve: false,
|
||||
|
@ -10933,6 +10983,8 @@ mod tests {
|
|||
r.unwrap(),
|
||||
Flags {
|
||||
subcommand: DenoSubcommand::Init(InitFlags {
|
||||
package: None,
|
||||
package_args: vec![],
|
||||
dir: None,
|
||||
lib: false,
|
||||
serve: false,
|
||||
|
@ -10947,6 +10999,8 @@ mod tests {
|
|||
r.unwrap(),
|
||||
Flags {
|
||||
subcommand: DenoSubcommand::Init(InitFlags {
|
||||
package: None,
|
||||
package_args: vec![],
|
||||
dir: None,
|
||||
lib: true,
|
||||
serve: false,
|
||||
|
@ -10960,6 +11014,8 @@ mod tests {
|
|||
r.unwrap(),
|
||||
Flags {
|
||||
subcommand: DenoSubcommand::Init(InitFlags {
|
||||
package: None,
|
||||
package_args: vec![],
|
||||
dir: None,
|
||||
lib: false,
|
||||
serve: true,
|
||||
|
@ -10973,6 +11029,8 @@ mod tests {
|
|||
r.unwrap(),
|
||||
Flags {
|
||||
subcommand: DenoSubcommand::Init(InitFlags {
|
||||
package: None,
|
||||
package_args: vec![],
|
||||
dir: Some(String::from("foo")),
|
||||
lib: true,
|
||||
serve: false,
|
||||
|
@ -10980,6 +11038,57 @@ mod tests {
|
|||
..Flags::default()
|
||||
}
|
||||
);
|
||||
|
||||
let r = flags_from_vec(svec!["deno", "init", "--lib", "--npm", "vite"]);
|
||||
assert!(r.is_err());
|
||||
|
||||
let r = flags_from_vec(svec!["deno", "init", "--serve", "--npm", "vite"]);
|
||||
assert!(r.is_err());
|
||||
|
||||
let r = flags_from_vec(svec!["deno", "init", "--npm", "vite", "--lib"]);
|
||||
assert_eq!(
|
||||
r.unwrap(),
|
||||
Flags {
|
||||
subcommand: DenoSubcommand::Init(InitFlags {
|
||||
package: Some("vite".to_string()),
|
||||
package_args: svec!["--lib"],
|
||||
dir: None,
|
||||
lib: false,
|
||||
serve: false,
|
||||
}),
|
||||
..Flags::default()
|
||||
}
|
||||
);
|
||||
|
||||
let r = flags_from_vec(svec!["deno", "init", "--npm", "vite", "--serve"]);
|
||||
assert_eq!(
|
||||
r.unwrap(),
|
||||
Flags {
|
||||
subcommand: DenoSubcommand::Init(InitFlags {
|
||||
package: Some("vite".to_string()),
|
||||
package_args: svec!["--serve"],
|
||||
dir: None,
|
||||
lib: false,
|
||||
serve: false,
|
||||
}),
|
||||
..Flags::default()
|
||||
}
|
||||
);
|
||||
|
||||
let r = flags_from_vec(svec!["deno", "init", "--npm", "vite", "new_dir"]);
|
||||
assert_eq!(
|
||||
r.unwrap(),
|
||||
Flags {
|
||||
subcommand: DenoSubcommand::Init(InitFlags {
|
||||
package: Some("vite".to_string()),
|
||||
package_args: svec!["new_dir"],
|
||||
dir: None,
|
||||
lib: false,
|
||||
serve: false,
|
||||
}),
|
||||
..Flags::default()
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
|
@ -1628,9 +1628,10 @@ impl CliOptions {
|
|||
DenoSubcommand::Install(_)
|
||||
| DenoSubcommand::Add(_)
|
||||
| DenoSubcommand::Remove(_)
|
||||
| DenoSubcommand::Init(_)
|
||||
| DenoSubcommand::Outdated(_)
|
||||
) {
|
||||
// For `deno install/add/remove` we want to force the managed resolver so it can set up `node_modules/` directory.
|
||||
// For `deno install/add/remove/init` we want to force the managed resolver so it can set up `node_modules/` directory.
|
||||
return false;
|
||||
}
|
||||
if self.node_modules_dir().ok().flatten().is_none()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue