From 44b2b950fd20e59fca1e6dddf522d456d2fd622f Mon Sep 17 00:00:00 2001 From: Roj Date: Thu, 8 Dec 2022 02:13:45 +0300 Subject: feat(cli): support configuring the lock file in the config file (#16781) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This allows the user to completely opt out from the lock file or rename it without having to use `--no-lock` and/or `--lock` in all commands. ## Don’t Use Lock File ```json { "lock": false } ``` ## Use Lock File With a Different Name ```json { "lock": "deno2.lock" } ``` The CLI args `--no-lock` and `--lock` will always override what is in the config file. Co-authored-by: David Sherret --- cli/args/config_file.rs | 18 ++++++++++++++++++ cli/args/lockfile.rs | 21 ++++++++++++++++++--- 2 files changed, 36 insertions(+), 3 deletions(-) (limited to 'cli/args') diff --git a/cli/args/config_file.rs b/cli/args/config_file.rs index 76340aa8b..16e11a5a8 100644 --- a/cli/args/config_file.rs +++ b/cli/args/config_file.rs @@ -429,6 +429,13 @@ pub struct TestConfig { pub files: FilesConfig, } +#[derive(Clone, Debug, Deserialize)] +#[serde(untagged)] +pub enum LockConfig { + Bool(bool), + PathBuf(PathBuf), +} + #[derive(Clone, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ConfigFileJson { @@ -438,6 +445,7 @@ pub struct ConfigFileJson { pub fmt: Option, pub tasks: Option, pub test: Option, + pub lock: Option, } #[derive(Clone, Debug)] @@ -759,6 +767,16 @@ impl ConfigFile { bail!("No tasks found in configuration file") } } + + pub fn to_lock_config(&self) -> Result, AnyError> { + if let Some(config) = self.json.lock.clone() { + let lock_config: LockConfig = serde_json::from_value(config) + .context("Failed to parse \"lock\" configuration")?; + Ok(Some(lock_config)) + } else { + Ok(None) + } + } } /// Represents the "default" type library that should be used when type diff --git a/cli/args/lockfile.rs b/cli/args/lockfile.rs index 0d3b2f249..012d9782e 100644 --- a/cli/args/lockfile.rs +++ b/cli/args/lockfile.rs @@ -10,6 +10,7 @@ use std::collections::BTreeMap; use std::io::Write; use std::path::PathBuf; +use crate::args::config_file::LockConfig; use crate::args::ConfigFile; use crate::npm::NpmPackageId; use crate::npm::NpmPackageReq; @@ -104,9 +105,23 @@ impl Lockfile { None => match maybe_config_file { Some(config_file) => { if config_file.specifier.scheme() == "file" { - let mut path = config_file.specifier.to_file_path().unwrap(); - path.set_file_name("deno.lock"); - path + match config_file.clone().to_lock_config()? { + Some(LockConfig::Bool(lock)) if !lock => { + return Ok(None); + } + Some(LockConfig::PathBuf(lock)) => config_file + .specifier + .to_file_path() + .unwrap() + .parent() + .unwrap() + .join(lock), + _ => { + let mut path = config_file.specifier.to_file_path().unwrap(); + path.set_file_name("deno.lock"); + path + } + } } else { return Ok(None); } -- cgit v1.2.3