, // --unstabe-kv --unstable-cron
-}
-
#[derive(Clone, Debug, Eq, PartialEq, Default)]
pub struct InternalFlags {
/// Used when the language server is configured with an
@@ -1484,14 +1512,15 @@ fn handle_repl_flags(flags: &mut Flags, repl_flags: ReplFlags) {
}
pub fn clap_root() -> Command {
+ debug_assert_eq!(DENO_VERSION_INFO.typescript, deno_snapshots::TS_VERSION);
let long_version = format!(
"{} ({}, {}, {})\nv8 {}\ntypescript {}",
- crate::version::DENO_VERSION_INFO.deno,
- crate::version::DENO_VERSION_INFO.release_channel.name(),
+ DENO_VERSION_INFO.deno,
+ DENO_VERSION_INFO.release_channel.name(),
env!("PROFILE"),
env!("TARGET"),
deno_core::v8::VERSION_STRING,
- crate::version::DENO_VERSION_INFO.typescript
+ DENO_VERSION_INFO.typescript
);
run_args(Command::new("deno"), true)
@@ -1507,7 +1536,7 @@ pub fn clap_root() -> Command {
)
.color(ColorChoice::Auto)
.term_width(800)
- .version(crate::version::DENO_VERSION_INFO.deno)
+ .version(DENO_VERSION_INFO.deno)
.long_version(long_version)
.disable_version_flag(true)
.disable_help_flag(true)
@@ -4274,7 +4303,7 @@ impl CommandExt for Command {
let mut cmd = self.arg(
Arg::new("unstable")
.long("unstable")
- .help(cstr!("Enable all unstable features and APIs. Instead of using this flag, consider enabling individual unstable features
+ .help(cstr!("The `--unstable` flag has been deprecated. Use granular `--unstable-*` flags instead
To view the list of individual unstable feature flags, run this command again with --help=unstable>"))
.action(ArgAction::SetTrue)
.hide(matches!(cfg, UnstableArgsConfig::None))
diff --git a/cli/args/import_map.rs b/cli/args/import_map.rs
deleted file mode 100644
index ff7e42ef20d061..00000000000000
--- a/cli/args/import_map.rs
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2018-2025 the Deno authors. MIT license.
-
-use deno_core::error::AnyError;
-use deno_core::serde_json;
-use deno_core::url::Url;
-
-use crate::file_fetcher::CliFileFetcher;
-use crate::file_fetcher::TextDecodedFile;
-
-pub async fn resolve_import_map_value_from_specifier(
- specifier: &Url,
- file_fetcher: &CliFileFetcher,
-) -> Result {
- if specifier.scheme() == "data" {
- let data_url_text =
- deno_graph::source::RawDataUrl::parse(specifier)?.decode()?;
- Ok(serde_json::from_str(&data_url_text)?)
- } else {
- let file = TextDecodedFile::decode(
- file_fetcher.fetch_bypass_permissions(specifier).await?,
- )?;
- Ok(serde_json::from_str(&file.source)?)
- }
-}
diff --git a/cli/args/lockfile.rs b/cli/args/lockfile.rs
index 976992aac8287b..5fa6a49c43a6d2 100644
--- a/cli/args/lockfile.rs
+++ b/cli/args/lockfile.rs
@@ -61,11 +61,13 @@ impl<'a, T> std::ops::DerefMut for Guard<'a, T> {
}
#[derive(Debug, thiserror::Error, deno_error::JsError)]
-#[error("Failed writing lockfile")]
-#[class(inherit)]
-struct AtomicWriteFileWithRetriesError {
- #[source]
- source: std::io::Error,
+pub enum AtomicWriteFileWithRetriesError {
+ #[class(inherit)]
+ #[error(transparent)]
+ Changed(JsErrorBox),
+ #[class(inherit)]
+ #[error("Failed writing lockfile")]
+ Io(#[source] std::io::Error),
}
impl CliLockfile {
@@ -87,12 +89,16 @@ impl CliLockfile {
self.lockfile.lock().overwrite
}
- pub fn write_if_changed(&self) -> Result<(), JsErrorBox> {
+ pub fn write_if_changed(
+ &self,
+ ) -> Result<(), AtomicWriteFileWithRetriesError> {
if self.skip_write {
return Ok(());
}
- self.error_if_changed()?;
+ self
+ .error_if_changed()
+ .map_err(AtomicWriteFileWithRetriesError::Changed)?;
let mut lockfile = self.lockfile.lock();
let Some(bytes) = lockfile.resolve_write_bytes() else {
return Ok(()); // nothing to do
@@ -105,9 +111,7 @@ impl CliLockfile {
&bytes,
cache::CACHE_PERM,
)
- .map_err(|source| {
- JsErrorBox::from_err(AtomicWriteFileWithRetriesError { source })
- })?;
+ .map_err(AtomicWriteFileWithRetriesError::Io)?;
lockfile.has_content_changed = false;
Ok(())
}
diff --git a/cli/args/mod.rs b/cli/args/mod.rs
index 29b493046f14fb..03ca2814a7d091 100644
--- a/cli/args/mod.rs
+++ b/cli/args/mod.rs
@@ -3,17 +3,12 @@
pub mod deno_json;
mod flags;
mod flags_net;
-mod import_map;
mod lockfile;
mod package_json;
use std::borrow::Cow;
use std::collections::HashMap;
use std::env;
-use std::io::BufReader;
-use std::io::Cursor;
-use std::io::Read;
-use std::io::Seek;
use std::net::SocketAddr;
use std::num::NonZeroUsize;
use std::path::Path;
@@ -22,11 +17,9 @@ use std::sync::Arc;
use deno_ast::MediaType;
use deno_ast::ModuleSpecifier;
-use deno_ast::SourceMapOption;
use deno_cache_dir::file_fetcher::CacheSetting;
pub use deno_config::deno_json::BenchConfig;
pub use deno_config::deno_json::ConfigFile;
-use deno_config::deno_json::ConfigFileError;
use deno_config::deno_json::FmtConfig;
pub use deno_config::deno_json::FmtOptionsConfig;
use deno_config::deno_json::LintConfig;
@@ -35,21 +28,11 @@ use deno_config::deno_json::NodeModulesDirMode;
pub use deno_config::deno_json::ProseWrap;
use deno_config::deno_json::TestConfig;
pub use deno_config::deno_json::TsConfig;
-pub use deno_config::deno_json::TsConfigForEmit;
-pub use deno_config::deno_json::TsConfigType;
pub use deno_config::deno_json::TsTypeLib;
pub use deno_config::glob::FilePatterns;
-use deno_config::workspace::CreateResolverOptions;
-use deno_config::workspace::FolderConfigs;
-use deno_config::workspace::PackageJsonDepResolution;
-use deno_config::workspace::VendorEnablement;
use deno_config::workspace::Workspace;
use deno_config::workspace::WorkspaceDirectory;
-use deno_config::workspace::WorkspaceDirectoryEmptyOptions;
-use deno_config::workspace::WorkspaceDiscoverOptions;
-use deno_config::workspace::WorkspaceDiscoverStart;
use deno_config::workspace::WorkspaceLintConfig;
-use deno_config::workspace::WorkspaceResolver;
use deno_core::anyhow::bail;
use deno_core::anyhow::Context;
use deno_core::error::AnyError;
@@ -57,71 +40,31 @@ use deno_core::resolve_url_or_path;
use deno_core::serde_json;
use deno_core::url::Url;
use deno_graph::GraphKind;
-pub use deno_json::check_warn_tsconfig;
-use deno_lib::cache::DenoDirProvider;
-use deno_lib::env::has_flag_env_var;
+use deno_lib::args::has_flag_env_var;
+use deno_lib::args::npm_pkg_req_ref_to_binary_command;
+use deno_lib::args::CaData;
+use deno_lib::args::NPM_PROCESS_STATE;
+use deno_lib::version::DENO_VERSION_INFO;
use deno_lib::worker::StorageKeyResolver;
-use deno_lint::linter::LintConfig as DenoLintConfig;
-use deno_npm::npm_rc::NpmRc;
-use deno_npm::npm_rc::ResolvedNpmRc;
-use deno_npm::resolution::ValidSerializedNpmResolutionSnapshot;
use deno_npm::NpmSystemInfo;
-use deno_path_util::normalize_path;
use deno_runtime::deno_permissions::PermissionsOptions;
-use deno_runtime::deno_tls::deno_native_certs::load_native_certs;
-use deno_runtime::deno_tls::rustls;
-use deno_runtime::deno_tls::rustls::RootCertStore;
-use deno_runtime::deno_tls::rustls_pemfile;
-use deno_runtime::deno_tls::webpki_roots;
use deno_runtime::inspector_server::InspectorServer;
use deno_semver::npm::NpmPackageReqReference;
use deno_semver::StackString;
use deno_telemetry::OtelConfig;
-use deno_telemetry::OtelRuntimeConfig;
use deno_terminal::colors;
use dotenvy::from_filename;
pub use flags::*;
-use import_map::resolve_import_map_value_from_specifier;
+pub use lockfile::AtomicWriteFileWithRetriesError;
pub use lockfile::CliLockfile;
pub use lockfile::CliLockfileReadFromPathOptions;
use once_cell::sync::Lazy;
pub use package_json::NpmInstallDepsProvider;
pub use package_json::PackageJsonDepValueParseWithLocationError;
-use serde::Deserialize;
-use serde::Serialize;
-use sys_traits::EnvHomeDir;
+use sys_traits::FsRead;
use thiserror::Error;
-use crate::file_fetcher::CliFileFetcher;
use crate::sys::CliSys;
-use crate::util::fs::canonicalize_path_maybe_not_exists;
-use crate::version;
-
-pub fn npm_registry_url() -> &'static Url {
- static NPM_REGISTRY_DEFAULT_URL: Lazy = Lazy::new(|| {
- let env_var_name = "NPM_CONFIG_REGISTRY";
- if let Ok(registry_url) = std::env::var(env_var_name) {
- // ensure there is a trailing slash for the directory
- let registry_url = format!("{}/", registry_url.trim_end_matches('/'));
- match Url::parse(®istry_url) {
- Ok(url) => {
- return url;
- }
- Err(err) => {
- log::debug!(
- "Invalid {} environment variable: {:#}",
- env_var_name,
- err,
- );
- }
- }
- }
-
- Url::parse("https://registry.npmjs.org").unwrap()
- });
-
- &NPM_REGISTRY_DEFAULT_URL
-}
pub static DENO_DISABLE_PEDANTIC_NODE_WARNINGS: Lazy = Lazy::new(|| {
std::env::var("DENO_DISABLE_PEDANTIC_NODE_WARNINGS")
@@ -165,60 +108,51 @@ pub fn jsr_api_url() -> &'static Url {
&JSR_API_URL
}
-pub fn ts_config_to_transpile_and_emit_options(
- config: deno_config::deno_json::TsConfig,
-) -> Result<(deno_ast::TranspileOptions, deno_ast::EmitOptions), AnyError> {
- let options: deno_config::deno_json::EmitConfigOptions =
- serde_json::from_value(config.0)
- .context("Failed to parse compilerOptions")?;
- let imports_not_used_as_values =
- match options.imports_not_used_as_values.as_str() {
- "preserve" => deno_ast::ImportsNotUsedAsValues::Preserve,
- "error" => deno_ast::ImportsNotUsedAsValues::Error,
- _ => deno_ast::ImportsNotUsedAsValues::Remove,
- };
- let (transform_jsx, jsx_automatic, jsx_development, precompile_jsx) =
- match options.jsx.as_str() {
- "react" => (true, false, false, false),
- "react-jsx" => (true, true, false, false),
- "react-jsxdev" => (true, true, true, false),
- "precompile" => (false, false, false, true),
- _ => (false, false, false, false),
- };
- let source_map = if options.inline_source_map {
- SourceMapOption::Inline
- } else if options.source_map {
- SourceMapOption::Separate
- } else {
- SourceMapOption::None
- };
- Ok((
- deno_ast::TranspileOptions {
- use_ts_decorators: options.experimental_decorators,
- use_decorators_proposal: !options.experimental_decorators,
- emit_metadata: options.emit_decorator_metadata,
- imports_not_used_as_values,
- jsx_automatic,
- jsx_development,
- jsx_factory: options.jsx_factory,
- jsx_fragment_factory: options.jsx_fragment_factory,
- jsx_import_source: options.jsx_import_source,
- precompile_jsx,
- precompile_jsx_skip_elements: options.jsx_precompile_skip_elements,
- precompile_jsx_dynamic_props: None,
- transform_jsx,
- var_decl_imports: false,
- // todo(dsherret): support verbatim_module_syntax here properly
- verbatim_module_syntax: false,
- },
- deno_ast::EmitOptions {
- inline_sources: options.inline_sources,
- remove_comments: false,
- source_map,
- source_map_base: None,
- source_map_file: None,
- },
- ))
+#[derive(Debug, Clone)]
+pub struct ExternalImportMap {
+ pub path: PathBuf,
+ pub value: serde_json::Value,
+}
+
+#[derive(Debug)]
+pub struct WorkspaceExternalImportMapLoader {
+ sys: CliSys,
+ workspace: Arc,
+ maybe_external_import_map:
+ once_cell::sync::OnceCell