summaryrefslogtreecommitdiff
path: root/cli/ops/runtime_compiler.rs
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2022-05-17 19:50:31 +0200
committerGitHub <noreply@github.com>2022-05-17 13:50:31 -0400
commitf57aac77ff9ce514730504066daca0a61a959d32 (patch)
tree34be59895172b93a255c933d0f2e579dbf3a3ccc /cli/ops/runtime_compiler.rs
parent9766399a3fefcab322051b4a7af41f9d40d79150 (diff)
BREAKING: Remove unstable Deno.emit and Deno.formatDiagnostics APIs (#14463)
Diffstat (limited to 'cli/ops/runtime_compiler.rs')
-rw-r--r--cli/ops/runtime_compiler.rs328
1 files changed, 0 insertions, 328 deletions
diff --git a/cli/ops/runtime_compiler.rs b/cli/ops/runtime_compiler.rs
deleted file mode 100644
index feed07a1c..000000000
--- a/cli/ops/runtime_compiler.rs
+++ /dev/null
@@ -1,328 +0,0 @@
-// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
-
-use crate::cache;
-use crate::config_file::IgnoredCompilerOptions;
-use crate::diagnostics::Diagnostics;
-use crate::emit;
-use crate::errors::get_error_class_name;
-use crate::flags;
-use crate::graph_util::graph_valid;
-use crate::proc_state::import_map_from_text;
-use crate::proc_state::ProcState;
-use crate::resolver::ImportMapResolver;
-use crate::resolver::JsxResolver;
-
-use deno_core::anyhow::Context;
-use deno_core::error::custom_error;
-use deno_core::error::generic_error;
-use deno_core::error::AnyError;
-
-use deno_core::op;
-use deno_core::parking_lot::RwLock;
-use deno_core::resolve_url_or_path;
-use deno_core::serde_json;
-use deno_core::serde_json::Value;
-use deno_core::Extension;
-use deno_core::ModuleSpecifier;
-use deno_core::OpState;
-use deno_graph::ModuleKind;
-use deno_runtime::permissions::Permissions;
-use serde::Deserialize;
-use serde::Serialize;
-use std::cell::RefCell;
-use std::collections::HashMap;
-use std::collections::HashSet;
-use std::rc::Rc;
-use std::sync::Arc;
-
-pub fn init() -> Extension {
- Extension::builder().ops(vec![op_emit::decl()]).build()
-}
-
-#[derive(Debug, Deserialize)]
-enum RuntimeBundleType {
- #[serde(rename = "module")]
- Module,
- #[serde(rename = "classic")]
- Classic,
-}
-
-impl<'a> From<&'a RuntimeBundleType> for emit::BundleType {
- fn from(bundle_type: &'a RuntimeBundleType) -> Self {
- match bundle_type {
- RuntimeBundleType::Classic => Self::Classic,
- RuntimeBundleType::Module => Self::Module,
- }
- }
-}
-
-#[derive(Debug, Deserialize)]
-#[serde(rename_all = "camelCase")]
-struct EmitArgs {
- bundle: Option<RuntimeBundleType>,
- check: Option<bool>,
- compiler_options: Option<HashMap<String, Value>>,
- import_map: Option<Value>,
- import_map_path: Option<String>,
- root_specifier: String,
- sources: Option<HashMap<String, Arc<String>>>,
-}
-
-#[derive(Serialize)]
-#[serde(rename_all = "camelCase")]
-struct EmitResult {
- diagnostics: Diagnostics,
- files: HashMap<String, String>,
- #[serde(rename = "ignoredOptions")]
- maybe_ignored_options: Option<IgnoredCompilerOptions>,
- stats: emit::Stats,
-}
-
-/// Provides inferred imported modules from configuration options, like the
-/// `"types"` and `"jsxImportSource"` imports.
-fn to_maybe_imports(
- referrer: &ModuleSpecifier,
- maybe_options: Option<&HashMap<String, Value>>,
-) -> Option<Vec<(ModuleSpecifier, Vec<String>)>> {
- let options = maybe_options?;
- let mut imports = Vec::new();
- if let Some(types_value) = options.get("types") {
- if let Ok(types) =
- serde_json::from_value::<Vec<String>>(types_value.clone())
- {
- imports.extend(types);
- }
- }
- if let Some(jsx_value) = options.get("jsx") {
- if let Ok(jsx) = serde_json::from_value::<String>(jsx_value.clone()) {
- let jsx_import_source =
- if let Some(jsx_import_source_value) = options.get("jsxImportSource") {
- if let Ok(jsx_import_source) =
- serde_json::from_value::<String>(jsx_import_source_value.clone())
- {
- jsx_import_source
- } else {
- "react".to_string()
- }
- } else {
- "react".to_string()
- };
- match jsx.as_str() {
- "react-jsx" => {
- imports.push(format!("{}/jsx-runtime", jsx_import_source));
- }
- "react-jsxdev" => {
- imports.push(format!("{}/jsx-dev-runtime", jsx_import_source));
- }
- _ => (),
- }
- }
- }
- if !imports.is_empty() {
- Some(vec![(referrer.clone(), imports)])
- } else {
- None
- }
-}
-
-/// Converts the compiler options to the JSX import source module that will be
-/// loaded when transpiling JSX.
-fn to_maybe_jsx_import_source_module(
- maybe_options: Option<&HashMap<String, Value>>,
-) -> Option<String> {
- let options = maybe_options?;
- let jsx_value = options.get("jsx")?;
- let jsx: String = serde_json::from_value(jsx_value.clone()).ok()?;
- match jsx.as_str() {
- "react-jsx" => Some("jsx-runtime".to_string()),
- "react-jsxdev" => Some("jsx-dev-runtime".to_string()),
- _ => None,
- }
-}
-
-#[op]
-async fn op_emit(
- state: Rc<RefCell<OpState>>,
- args: EmitArgs,
-) -> Result<EmitResult, AnyError> {
- deno_runtime::ops::check_unstable2(&state, "Deno.emit");
- let root_specifier = args.root_specifier;
- let ps = {
- let state = state.borrow();
- state.borrow::<ProcState>().clone()
- };
- let mut runtime_permissions = {
- let state = state.borrow();
- state.borrow::<Permissions>().clone()
- };
-
- let mut cache: Box<dyn cache::CacherLoader> =
- if let Some(sources) = &args.sources {
- Box::new(cache::MemoryCacher::new(sources.clone()))
- } else {
- Box::new(cache::FetchCacher::new(
- ps.dir.gen_cache.clone(),
- ps.file_fetcher.clone(),
- runtime_permissions.clone(),
- runtime_permissions.clone(),
- ))
- };
- let maybe_import_map_resolver = if let Some(import_map_str) =
- args.import_map_path
- {
- let import_map_specifier = resolve_url_or_path(&import_map_str)
- .with_context(|| {
- format!("Bad URL (\"{}\") for import map.", import_map_str)
- })?;
- let import_map_source = if let Some(value) = args.import_map {
- Arc::new(value.to_string())
- } else {
- let file = ps
- .file_fetcher
- .fetch(&import_map_specifier, &mut runtime_permissions)
- .await
- .map_err(|e| {
- generic_error(format!(
- "Unable to load '{}' import map: {}",
- import_map_specifier, e
- ))
- })?;
- file.source
- };
- let import_map =
- import_map_from_text(&import_map_specifier, &import_map_source)?;
- Some(ImportMapResolver::new(Arc::new(import_map)))
- } else if args.import_map.is_some() {
- return Err(generic_error("An importMap was specified, but no importMapPath was provided, which is required."));
- } else {
- None
- };
- let maybe_jsx_resolver =
- to_maybe_jsx_import_source_module(args.compiler_options.as_ref())
- .map(|im| JsxResolver::new(im, maybe_import_map_resolver.clone()));
- let maybe_resolver = if maybe_jsx_resolver.is_some() {
- maybe_jsx_resolver.as_ref().map(|jr| jr.as_resolver())
- } else {
- maybe_import_map_resolver
- .as_ref()
- .map(|imr| imr.as_resolver())
- };
- let roots = vec![(resolve_url_or_path(&root_specifier)?, ModuleKind::Esm)];
- let maybe_imports =
- to_maybe_imports(&roots[0].0, args.compiler_options.as_ref());
- let graph = Arc::new(
- deno_graph::create_graph(
- roots,
- true,
- maybe_imports,
- cache.as_mut_loader(),
- maybe_resolver,
- None,
- None,
- None,
- )
- .await,
- );
- let check = args.check.unwrap_or(true);
- // There are certain graph errors that we want to return as an error of an op,
- // versus something that gets returned as a diagnostic of the op, this is
- // handled here.
- if let Err(err) = graph_valid(&graph, check, true) {
- if get_error_class_name(&err) == "PermissionDenied" {
- return Err(err);
- }
- }
- let debug = ps.flags.log_level == Some(log::Level::Debug);
- let tsc_emit = check && args.bundle.is_none();
- let (ts_config, maybe_ignored_options) = emit::get_ts_config(
- emit::ConfigType::RuntimeEmit { tsc_emit },
- None,
- args.compiler_options.as_ref(),
- )?;
- let (files, mut diagnostics, stats) = if check && args.bundle.is_none() {
- let emit_result = emit::check_and_maybe_emit(
- &graph.roots,
- Arc::new(RwLock::new(graph.as_ref().into())),
- cache.as_mut_cacher(),
- emit::CheckOptions {
- type_check_mode: flags::TypeCheckMode::All,
- debug,
- emit_with_diagnostics: true,
- maybe_config_specifier: None,
- ts_config,
- log_checks: false,
- reload: ps.flags.reload || args.sources.is_some(),
- // TODO(nayeemrmn): Determine reload exclusions.
- reload_exclusions: Default::default(),
- },
- )?;
- let files = emit::to_file_map(graph.as_ref(), cache.as_mut_cacher());
- (files, emit_result.diagnostics, emit_result.stats)
- } else if let Some(bundle) = &args.bundle {
- let (diagnostics, stats) = if check {
- if ts_config.get_declaration() {
- return Err(custom_error("TypeError", "The bundle option is set, but the compiler option of `declaration` is true which is not currently supported."));
- }
- let emit_result = emit::check_and_maybe_emit(
- &graph.roots,
- Arc::new(RwLock::new(graph.as_ref().into())),
- cache.as_mut_cacher(),
- emit::CheckOptions {
- type_check_mode: flags::TypeCheckMode::All,
- debug,
- emit_with_diagnostics: true,
- maybe_config_specifier: None,
- ts_config: ts_config.clone(),
- log_checks: false,
- reload: ps.flags.reload || args.sources.is_some(),
- // TODO(nayeemrmn): Determine reload exclusions.
- reload_exclusions: Default::default(),
- },
- )?;
- (emit_result.diagnostics, emit_result.stats)
- } else {
- (Diagnostics::default(), Default::default())
- };
- let (emit, maybe_map) = emit::bundle(
- graph.as_ref(),
- emit::BundleOptions {
- bundle_type: bundle.into(),
- ts_config,
- emit_ignore_directives: true,
- },
- )?;
- let mut files = HashMap::new();
- files.insert("deno:///bundle.js".to_string(), emit);
- if let Some(map) = maybe_map {
- files.insert("deno:///bundle.js.map".to_string(), map);
- }
- (files, diagnostics, stats)
- } else {
- if ts_config.get_declaration() {
- return Err(custom_error("TypeError", "The option of `check` is false, but the compiler option of `declaration` is true which is not currently supported."));
- }
- let emit_result = emit::emit(
- graph.as_ref(),
- cache.as_mut_cacher(),
- emit::EmitOptions {
- ts_config,
- reload: ps.flags.reload || args.sources.is_some(),
- // TODO(nayeemrmn): Determine reload exclusions.
- reload_exclusions: HashSet::default(),
- },
- )?;
- let files = emit::to_file_map(graph.as_ref(), cache.as_mut_cacher());
- (files, emit_result.diagnostics, emit_result.stats)
- };
-
- // we want to add any errors that were returned as an `Err` earlier by adding
- // them to the diagnostics.
- diagnostics.extend_graph_errors(graph.errors());
-
- Ok(EmitResult {
- diagnostics,
- files,
- maybe_ignored_options,
- stats,
- })
-}