diff options
Diffstat (limited to 'cli/proc_state.rs')
-rw-r--r-- | cli/proc_state.rs | 447 |
1 files changed, 0 insertions, 447 deletions
diff --git a/cli/proc_state.rs b/cli/proc_state.rs deleted file mode 100644 index 6c1a5e7c5..000000000 --- a/cli/proc_state.rs +++ /dev/null @@ -1,447 +0,0 @@ -// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. - -use crate::args::CliOptions; -use crate::args::DenoSubcommand; -use crate::args::Flags; -use crate::args::Lockfile; -use crate::args::StorageKeyResolver; -use crate::args::TsConfigType; -use crate::cache::Caches; -use crate::cache::DenoDir; -use crate::cache::EmitCache; -use crate::cache::HttpCache; -use crate::cache::NodeAnalysisCache; -use crate::cache::ParsedSourceCache; -use crate::emit::Emitter; -use crate::file_fetcher::FileFetcher; -use crate::graph_util::ModuleGraphBuilder; -use crate::graph_util::ModuleGraphContainer; -use crate::http_util::HttpClient; -use crate::module_loader::CliModuleLoaderFactory; -use crate::module_loader::ModuleLoadPreparer; -use crate::module_loader::NpmModuleLoader; -use crate::node::CliCjsEsmCodeAnalyzer; -use crate::node::CliNodeCodeTranslator; -use crate::npm::create_npm_fs_resolver; -use crate::npm::CliNpmRegistryApi; -use crate::npm::CliNpmResolver; -use crate::npm::NpmCache; -use crate::npm::NpmResolution; -use crate::npm::PackageJsonDepsInstaller; -use crate::resolver::CliGraphResolver; -use crate::tools::check::TypeChecker; -use crate::util::progress_bar::ProgressBar; -use crate::util::progress_bar::ProgressBarStyle; -use crate::worker::CliMainWorkerFactory; -use crate::worker::CliMainWorkerOptions; -use crate::worker::HasNodeSpecifierChecker; - -use deno_core::error::AnyError; -use deno_core::parking_lot::Mutex; -use deno_core::ModuleSpecifier; - -use deno_runtime::deno_node; -use deno_runtime::deno_node::analyze::NodeCodeTranslator; -use deno_runtime::deno_node::NodeResolver; -use deno_runtime::deno_tls::rustls::RootCertStore; -use deno_runtime::deno_web::BlobStore; -use deno_runtime::inspector_server::InspectorServer; -use deno_semver::npm::NpmPackageReqReference; -use import_map::ImportMap; -use log::warn; -use std::collections::HashSet; -use std::path::PathBuf; -use std::sync::Arc; - -/// This structure used to represent state of single "deno" program -/// that was shared by all created workers. It morphed into being the -/// "factory" for all objects, but is being slowly phased out. -pub struct ProcState { - pub dir: DenoDir, - pub caches: Arc<Caches>, - pub file_fetcher: Arc<FileFetcher>, - pub http_client: HttpClient, - pub options: Arc<CliOptions>, - pub emit_cache: EmitCache, - pub emitter: Arc<Emitter>, - pub graph_container: Arc<ModuleGraphContainer>, - pub lockfile: Option<Arc<Mutex<Lockfile>>>, - pub maybe_import_map: Option<Arc<ImportMap>>, - pub maybe_inspector_server: Option<Arc<InspectorServer>>, - pub root_cert_store: RootCertStore, - pub blob_store: BlobStore, - pub parsed_source_cache: Arc<ParsedSourceCache>, - pub resolver: Arc<CliGraphResolver>, - maybe_file_watcher_reporter: Option<FileWatcherReporter>, - pub module_graph_builder: Arc<ModuleGraphBuilder>, - pub module_load_preparer: Arc<ModuleLoadPreparer>, - pub node_code_translator: Arc<CliNodeCodeTranslator>, - pub node_fs: Arc<dyn deno_node::NodeFs>, - pub node_resolver: Arc<NodeResolver>, - pub npm_api: Arc<CliNpmRegistryApi>, - pub npm_cache: Arc<NpmCache>, - pub npm_resolver: Arc<CliNpmResolver>, - pub npm_resolution: Arc<NpmResolution>, - pub package_json_deps_installer: Arc<PackageJsonDepsInstaller>, - pub cjs_resolutions: Arc<CjsResolutionStore>, -} - -impl ProcState { - pub async fn from_cli_options( - options: Arc<CliOptions>, - ) -> Result<Self, AnyError> { - Self::build_with_sender(options, None).await - } - - pub async fn from_flags(flags: Flags) -> Result<Self, AnyError> { - Self::from_cli_options(Arc::new(CliOptions::from_flags(flags)?)).await - } - - pub async fn from_flags_for_file_watcher( - flags: Flags, - files_to_watch_sender: tokio::sync::mpsc::UnboundedSender<Vec<PathBuf>>, - ) -> Result<Self, AnyError> { - // resolve the config each time - let cli_options = Arc::new(CliOptions::from_flags(flags)?); - let ps = - Self::build_with_sender(cli_options, Some(files_to_watch_sender.clone())) - .await?; - ps.init_watcher(); - Ok(ps) - } - - /// Reset all runtime state to its default. This should be used on file - /// watcher restarts. - pub fn reset_for_file_watcher(&self) { - self.cjs_resolutions.clear(); - self.parsed_source_cache.clear(); - self.graph_container.clear(); - - self.init_watcher(); - } - - // Add invariant files like the import map and explicit watch flag list to - // the watcher. Dedup for build_for_file_watcher and reset_for_file_watcher. - fn init_watcher(&self) { - let files_to_watch_sender = match &self.maybe_file_watcher_reporter { - Some(reporter) => &reporter.sender, - None => return, - }; - if let Some(watch_paths) = self.options.watch_paths() { - files_to_watch_sender.send(watch_paths.clone()).unwrap(); - } - if let Ok(Some(import_map_path)) = self - .options - .resolve_import_map_specifier() - .map(|ms| ms.and_then(|ref s| s.to_file_path().ok())) - { - files_to_watch_sender.send(vec![import_map_path]).unwrap(); - } - } - - async fn build_with_sender( - cli_options: Arc<CliOptions>, - maybe_sender: Option<tokio::sync::mpsc::UnboundedSender<Vec<PathBuf>>>, - ) -> Result<Self, AnyError> { - let dir = cli_options.resolve_deno_dir()?; - let caches = Arc::new(Caches::default()); - // Warm up the caches we know we'll likely need based on the CLI mode - match cli_options.sub_command() { - DenoSubcommand::Run(_) => { - _ = caches.dep_analysis_db(&dir); - _ = caches.node_analysis_db(&dir); - } - DenoSubcommand::Check(_) => { - _ = caches.dep_analysis_db(&dir); - _ = caches.node_analysis_db(&dir); - _ = caches.type_checking_cache_db(&dir); - } - _ => {} - } - let blob_store = BlobStore::default(); - let deps_cache_location = dir.deps_folder_path(); - let http_cache = HttpCache::new(&deps_cache_location); - let root_cert_store = cli_options.resolve_root_cert_store()?; - let cache_usage = cli_options.cache_setting(); - let progress_bar = ProgressBar::new(ProgressBarStyle::TextOnly); - let http_client = HttpClient::new( - Some(root_cert_store.clone()), - cli_options.unsafely_ignore_certificate_errors().clone(), - )?; - let file_fetcher = FileFetcher::new( - http_cache, - cache_usage, - !cli_options.no_remote(), - http_client.clone(), - blob_store.clone(), - Some(progress_bar.clone()), - ); - - let lockfile = cli_options.maybe_lock_file(); - - let npm_registry_url = CliNpmRegistryApi::default_url().to_owned(); - let npm_cache = Arc::new(NpmCache::new( - dir.npm_folder_path(), - cli_options.cache_setting(), - http_client.clone(), - progress_bar.clone(), - )); - let npm_api = Arc::new(CliNpmRegistryApi::new( - npm_registry_url.clone(), - npm_cache.clone(), - http_client.clone(), - progress_bar.clone(), - )); - let npm_snapshot = cli_options - .resolve_npm_resolution_snapshot(&npm_api) - .await?; - let npm_resolution = Arc::new(NpmResolution::from_serialized( - npm_api.clone(), - npm_snapshot, - lockfile.as_ref().cloned(), - )); - let node_fs = Arc::new(deno_node::RealFs); - let npm_fs_resolver = create_npm_fs_resolver( - node_fs.clone(), - npm_cache.clone(), - &progress_bar, - npm_registry_url, - npm_resolution.clone(), - cli_options.node_modules_dir_path(), - ); - let npm_resolver = Arc::new(CliNpmResolver::new( - npm_resolution.clone(), - npm_fs_resolver, - lockfile.as_ref().cloned(), - )); - let package_json_deps_installer = Arc::new(PackageJsonDepsInstaller::new( - npm_api.clone(), - npm_resolution.clone(), - cli_options.maybe_package_json_deps(), - )); - let maybe_import_map = cli_options - .resolve_import_map(&file_fetcher) - .await? - .map(Arc::new); - let maybe_inspector_server = - cli_options.resolve_inspector_server().map(Arc::new); - - let resolver = Arc::new(CliGraphResolver::new( - cli_options.to_maybe_jsx_import_source_config(), - maybe_import_map.clone(), - cli_options.no_npm(), - npm_api.clone(), - npm_resolution.clone(), - package_json_deps_installer.clone(), - )); - - let maybe_file_watcher_reporter = - maybe_sender.map(|sender| FileWatcherReporter { - sender, - file_paths: Arc::new(Mutex::new(vec![])), - }); - - let ts_config_result = - cli_options.resolve_ts_config_for_emit(TsConfigType::Emit)?; - if let Some(ignored_options) = ts_config_result.maybe_ignored_options { - warn!("{}", ignored_options); - } - let emit_cache = EmitCache::new(dir.gen_cache.clone()); - let parsed_source_cache = - Arc::new(ParsedSourceCache::new(caches.dep_analysis_db(&dir))); - let emit_options: deno_ast::EmitOptions = ts_config_result.ts_config.into(); - let emitter = Arc::new(Emitter::new( - emit_cache.clone(), - parsed_source_cache.clone(), - emit_options, - )); - let file_fetcher = Arc::new(file_fetcher); - let node_analysis_cache = - NodeAnalysisCache::new(caches.node_analysis_db(&dir)); - let cjs_esm_analyzer = CliCjsEsmCodeAnalyzer::new(node_analysis_cache); - let node_resolver = - Arc::new(NodeResolver::new(node_fs.clone(), npm_resolver.clone())); - let node_code_translator = Arc::new(NodeCodeTranslator::new( - cjs_esm_analyzer, - node_fs.clone(), - node_resolver.clone(), - npm_resolver.clone(), - )); - let type_checker = Arc::new(TypeChecker::new( - dir.clone(), - caches.clone(), - cli_options.clone(), - node_resolver.clone(), - npm_resolver.clone(), - )); - let module_graph_builder = Arc::new(ModuleGraphBuilder::new( - cli_options.clone(), - resolver.clone(), - npm_resolver.clone(), - parsed_source_cache.clone(), - lockfile.clone(), - emit_cache.clone(), - file_fetcher.clone(), - type_checker.clone(), - )); - let graph_container: Arc<ModuleGraphContainer> = Default::default(); - let module_load_preparer = Arc::new(ModuleLoadPreparer::new( - cli_options.clone(), - graph_container.clone(), - lockfile.clone(), - maybe_file_watcher_reporter.clone(), - module_graph_builder.clone(), - parsed_source_cache.clone(), - progress_bar.clone(), - resolver.clone(), - type_checker, - )); - - Ok(ProcState { - dir, - caches, - options: cli_options, - emit_cache, - emitter, - file_fetcher, - http_client, - graph_container, - lockfile, - maybe_import_map, - maybe_inspector_server, - root_cert_store, - blob_store, - parsed_source_cache, - resolver, - maybe_file_watcher_reporter, - module_graph_builder, - node_code_translator, - node_fs, - node_resolver, - npm_api, - npm_cache, - npm_resolver, - npm_resolution, - package_json_deps_installer, - cjs_resolutions: Default::default(), - module_load_preparer, - }) - } - - // todo(dsherret): this is a transitory method as we separate out - // ProcState from more code - pub fn create_cli_main_worker_factory(&self) -> CliMainWorkerFactory { - CliMainWorkerFactory::new( - StorageKeyResolver::from_options(&self.options), - self.npm_resolver.clone(), - self.node_resolver.clone(), - Box::new(CliHasNodeSpecifierChecker(self.graph_container.clone())), - self.blob_store.clone(), - Box::new(CliModuleLoaderFactory::new( - &self.options, - self.emitter.clone(), - self.graph_container.clone(), - self.module_load_preparer.clone(), - self.parsed_source_cache.clone(), - self.resolver.clone(), - NpmModuleLoader::new( - self.cjs_resolutions.clone(), - self.node_code_translator.clone(), - self.node_resolver.clone(), - ), - )), - self.root_cert_store.clone(), - self.node_fs.clone(), - self.maybe_inspector_server.clone(), - CliMainWorkerOptions { - argv: self.options.argv().clone(), - debug: self - .options - .log_level() - .map(|l| l == log::Level::Debug) - .unwrap_or(false), - coverage_dir: self.options.coverage_dir(), - enable_testing_features: self.options.enable_testing_features(), - has_node_modules_dir: self.options.has_node_modules_dir(), - inspect_brk: self.options.inspect_brk().is_some(), - inspect_wait: self.options.inspect_wait().is_some(), - is_inspecting: self.options.is_inspecting(), - is_npm_main: self.options.is_npm_main(), - location: self.options.location_flag().clone(), - maybe_binary_npm_command_name: { - let mut maybe_binary_command_name = None; - if let DenoSubcommand::Run(flags) = self.options.sub_command() { - if let Ok(pkg_ref) = NpmPackageReqReference::from_str(&flags.script) - { - // if the user ran a binary command, we'll need to set process.argv[0] - // to be the name of the binary command instead of deno - let binary_name = pkg_ref - .sub_path - .as_deref() - .unwrap_or(pkg_ref.req.name.as_str()); - maybe_binary_command_name = Some(binary_name.to_string()); - } - } - maybe_binary_command_name - }, - origin_data_folder_path: Some(self.dir.origin_data_folder_path()), - seed: self.options.seed(), - unsafely_ignore_certificate_errors: self - .options - .unsafely_ignore_certificate_errors() - .clone(), - unstable: self.options.unstable(), - }, - ) - } -} - -struct CliHasNodeSpecifierChecker(Arc<ModuleGraphContainer>); - -impl HasNodeSpecifierChecker for CliHasNodeSpecifierChecker { - fn has_node_specifier(&self) -> bool { - self.0.graph().has_node_specifier - } -} - -/// Keeps track of what module specifiers were resolved as CJS. -#[derive(Default)] -pub struct CjsResolutionStore(Mutex<HashSet<ModuleSpecifier>>); - -impl CjsResolutionStore { - pub fn clear(&self) { - self.0.lock().clear(); - } - - pub fn contains(&self, specifier: &ModuleSpecifier) -> bool { - self.0.lock().contains(specifier) - } - - pub fn insert(&self, specifier: ModuleSpecifier) { - self.0.lock().insert(specifier); - } -} - -#[derive(Clone, Debug)] -pub struct FileWatcherReporter { - sender: tokio::sync::mpsc::UnboundedSender<Vec<PathBuf>>, - file_paths: Arc<Mutex<Vec<PathBuf>>>, -} - -impl deno_graph::source::Reporter for FileWatcherReporter { - fn on_load( - &self, - specifier: &ModuleSpecifier, - modules_done: usize, - modules_total: usize, - ) { - let mut file_paths = self.file_paths.lock(); - if specifier.scheme() == "file" { - file_paths.push(specifier.to_file_path().unwrap()); - } - - if modules_done == modules_total { - self.sender.send(file_paths.drain(..).collect()).unwrap(); - } - } -} |