summaryrefslogtreecommitdiff
path: root/cli/emit.rs
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2022-11-25 18:29:48 -0500
committerGitHub <noreply@github.com>2022-11-25 18:29:48 -0500
commitdcb4ffb93a380710c32cc212b937ea38db5ceacc (patch)
tree18bf860912a14b84287bb8dbafdc41c5e3cdc6ab /cli/emit.rs
parent0cc90d9246ff2c392457632d5030eaca2ca1ca6f (diff)
refactor: move dts files, diagnostics.rs, and tsc.rs to tsc folder (#16820)
Diffstat (limited to 'cli/emit.rs')
-rw-r--r--cli/emit.rs246
1 files changed, 3 insertions, 243 deletions
diff --git a/cli/emit.rs b/cli/emit.rs
index 766524187..3bf56fae6 100644
--- a/cli/emit.rs
+++ b/cli/emit.rs
@@ -1,154 +1,18 @@
// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
-//! The collection of APIs to be able to take `deno_graph` module graphs and
-//! populate a cache, emit files, and transform a graph into the structures for
-//! loading into an isolate.
-
-use crate::args::ConfigFile;
-use crate::args::EmitConfigOptions;
-use crate::args::IgnoredCompilerOptions;
-use crate::args::TsConfig;
use crate::cache::EmitCache;
use crate::cache::FastInsecureHasher;
use crate::cache::ParsedSourceCache;
-use deno_ast::swc::bundler::Hook;
-use deno_ast::swc::bundler::ModuleRecord;
-use deno_ast::swc::common::Span;
use deno_core::error::AnyError;
-use deno_core::serde::Serialize;
-use deno_core::serde::Serializer;
-use deno_core::serde_json;
-use deno_core::serde_json::json;
use deno_core::ModuleSpecifier;
use deno_graph::MediaType;
-use deno_graph::ModuleGraphError;
-use deno_graph::ResolutionError;
-use std::fmt;
use std::sync::Arc;
-/// Represents the "default" type library that should be used when type
-/// checking the code in the module graph. Note that a user provided config
-/// of `"lib"` would override this value.
-#[derive(Debug, Clone, Copy, Eq, Hash, PartialEq)]
-pub enum TsTypeLib {
- DenoWindow,
- DenoWorker,
- UnstableDenoWindow,
- UnstableDenoWorker,
-}
-
-impl Default for TsTypeLib {
- fn default() -> Self {
- Self::DenoWindow
- }
-}
-
-impl Serialize for TsTypeLib {
- fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
- where
- S: Serializer,
- {
- let value = match self {
- Self::DenoWindow => vec!["deno.window".to_string()],
- Self::DenoWorker => vec!["deno.worker".to_string()],
- Self::UnstableDenoWindow => {
- vec!["deno.window".to_string(), "deno.unstable".to_string()]
- }
- Self::UnstableDenoWorker => {
- vec!["deno.worker".to_string(), "deno.unstable".to_string()]
- }
- };
- Serialize::serialize(&value, serializer)
- }
-}
-
-/// An enum that represents the base tsc configuration to return.
-pub enum TsConfigType {
- /// Return a configuration for bundling, using swc to emit the bundle. This is
- /// independent of type checking.
- Bundle,
- /// Return a configuration to use tsc to type check. This
- /// is independent of either bundling or emitting via swc.
- Check { lib: TsTypeLib },
- /// Return a configuration to use swc to emit single module files.
- Emit,
-}
-
-pub struct TsConfigWithIgnoredOptions {
- pub ts_config: TsConfig,
- pub maybe_ignored_options: Option<IgnoredCompilerOptions>,
-}
-
-/// For a given configuration type and optionally a configuration file,
-/// return a `TsConfig` struct and optionally any user configuration
-/// options that were ignored.
-pub fn get_ts_config_for_emit(
- config_type: TsConfigType,
- maybe_config_file: Option<&ConfigFile>,
-) -> Result<TsConfigWithIgnoredOptions, AnyError> {
- let mut ts_config = match config_type {
- TsConfigType::Bundle => TsConfig::new(json!({
- "checkJs": false,
- "emitDecoratorMetadata": false,
- "importsNotUsedAsValues": "remove",
- "inlineSourceMap": false,
- "inlineSources": false,
- "sourceMap": false,
- "jsx": "react",
- "jsxFactory": "React.createElement",
- "jsxFragmentFactory": "React.Fragment",
- })),
- TsConfigType::Check { lib } => TsConfig::new(json!({
- "allowJs": true,
- "allowSyntheticDefaultImports": true,
- "checkJs": false,
- "emitDecoratorMetadata": false,
- "experimentalDecorators": true,
- "incremental": true,
- "jsx": "react",
- "importsNotUsedAsValues": "remove",
- "inlineSourceMap": true,
- "inlineSources": true,
- "isolatedModules": true,
- "lib": lib,
- "module": "esnext",
- "moduleDetection": "force",
- "noEmit": true,
- "resolveJsonModule": true,
- "sourceMap": false,
- "strict": true,
- "target": "esnext",
- "tsBuildInfoFile": "deno:///.tsbuildinfo",
- "useDefineForClassFields": true,
- // TODO(@kitsonk) remove for Deno 2.0
- "useUnknownInCatchVariables": false,
- })),
- TsConfigType::Emit => TsConfig::new(json!({
- "checkJs": false,
- "emitDecoratorMetadata": false,
- "importsNotUsedAsValues": "remove",
- "inlineSourceMap": true,
- "inlineSources": true,
- "sourceMap": false,
- "jsx": "react",
- "jsxFactory": "React.createElement",
- "jsxFragmentFactory": "React.Fragment",
- "resolveJsonModule": true,
- })),
- };
- let maybe_ignored_options =
- ts_config.merge_tsconfig_from_config_file(maybe_config_file)?;
- Ok(TsConfigWithIgnoredOptions {
- ts_config,
- maybe_ignored_options,
- })
-}
-
-/// A hashing function that takes the source code, version and optionally a
-/// user provided config and generates a string hash which can be stored to
+/// A hashing function that takes the source code and emit options
+/// hash then generates a string hash which can be stored to
/// determine if the cached emit is valid or not.
-pub fn get_source_hash(source_text: &str, emit_options_hash: u64) -> u64 {
+fn get_source_hash(source_text: &str, emit_options_hash: u64) -> u64 {
FastInsecureHasher::new()
.write_str(source_text)
.write_u64(emit_options_hash)
@@ -183,107 +47,3 @@ pub fn emit_parsed_source(
Ok(transpiled_source.text)
}
}
-
-/// An adapter struct to make a deno_graph::ModuleGraphError display as expected
-/// in the Deno CLI.
-#[derive(Debug)]
-pub struct GraphError(pub ModuleGraphError);
-
-impl std::error::Error for GraphError {}
-
-impl From<ModuleGraphError> for GraphError {
- fn from(err: ModuleGraphError) -> Self {
- Self(err)
- }
-}
-
-impl fmt::Display for GraphError {
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- match &self.0 {
- ModuleGraphError::ResolutionError(err) => {
- if matches!(
- err,
- ResolutionError::InvalidDowngrade { .. }
- | ResolutionError::InvalidLocalImport { .. }
- ) {
- write!(f, "{}", err.to_string_with_range())
- } else {
- self.0.fmt(f)
- }
- }
- _ => self.0.fmt(f),
- }
- }
-}
-
-/// This contains the logic for Deno to rewrite the `import.meta` when bundling.
-pub struct BundleHook;
-
-impl Hook for BundleHook {
- fn get_import_meta_props(
- &self,
- span: Span,
- module_record: &ModuleRecord,
- ) -> Result<Vec<deno_ast::swc::ast::KeyValueProp>, AnyError> {
- use deno_ast::swc::ast;
-
- Ok(vec![
- ast::KeyValueProp {
- key: ast::PropName::Ident(ast::Ident::new("url".into(), span)),
- value: Box::new(ast::Expr::Lit(ast::Lit::Str(ast::Str {
- span,
- value: module_record.file_name.to_string().into(),
- raw: None,
- }))),
- },
- ast::KeyValueProp {
- key: ast::PropName::Ident(ast::Ident::new("main".into(), span)),
- value: Box::new(if module_record.is_entry {
- ast::Expr::Member(ast::MemberExpr {
- span,
- obj: Box::new(ast::Expr::MetaProp(ast::MetaPropExpr {
- span,
- kind: ast::MetaPropKind::ImportMeta,
- })),
- prop: ast::MemberProp::Ident(ast::Ident::new("main".into(), span)),
- })
- } else {
- ast::Expr::Lit(ast::Lit::Bool(ast::Bool { span, value: false }))
- }),
- },
- ])
- }
-}
-
-impl From<TsConfig> for deno_ast::EmitOptions {
- fn from(config: TsConfig) -> Self {
- let options: EmitConfigOptions = serde_json::from_value(config.0).unwrap();
- 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) =
- match options.jsx.as_str() {
- "react" => (true, false, false),
- "react-jsx" => (true, true, false),
- "react-jsxdev" => (true, true, true),
- _ => (false, false, false),
- };
- deno_ast::EmitOptions {
- emit_metadata: options.emit_decorator_metadata,
- imports_not_used_as_values,
- inline_source_map: options.inline_source_map,
- inline_sources: options.inline_sources,
- source_map: options.source_map,
- jsx_automatic,
- jsx_development,
- jsx_factory: options.jsx_factory,
- jsx_fragment_factory: options.jsx_fragment_factory,
- jsx_import_source: options.jsx_import_source,
- transform_jsx,
- var_decl_imports: false,
- }
- }
-}