mirror of
https://github.com/denoland/deno.git
synced 2024-12-23 15:49:44 -05:00
refactor: move dts files, diagnostics.rs, and tsc.rs to tsc folder (#16820)
This commit is contained in:
parent
0532304b5c
commit
65986986f1
98 changed files with 234 additions and 324 deletions
|
@ -21,12 +21,7 @@
|
|||
".git",
|
||||
"cli/bench/testdata/express-router.js",
|
||||
"cli/bench/testdata/npm/*",
|
||||
"cli/dts/lib.d.ts",
|
||||
"cli/dts/lib.dom*",
|
||||
"cli/dts/lib.es*",
|
||||
"cli/dts/lib.scripthost.d.ts",
|
||||
"cli/dts/lib.webworker*.d.ts",
|
||||
"cli/dts/typescript.d.ts",
|
||||
"cli/tsc/dts/*.d.ts",
|
||||
"cli/tests/testdata/fmt/badly_formatted.json",
|
||||
"cli/tests/testdata/fmt/badly_formatted.md",
|
||||
"cli/tests/testdata/byte_order_mark.ts",
|
||||
|
|
|
@ -762,6 +762,157 @@ impl ConfigFile {
|
|||
}
|
||||
}
|
||||
|
||||
/// 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 TsConfigForEmit {
|
||||
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<TsConfigForEmit, 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(TsConfigForEmit {
|
||||
ts_config,
|
||||
maybe_ignored_options,
|
||||
})
|
||||
}
|
||||
|
||||
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,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
|
|
@ -19,6 +19,9 @@ pub use config_file::MaybeImportsResult;
|
|||
pub use config_file::ProseWrap;
|
||||
pub use config_file::TestConfig;
|
||||
pub use config_file::TsConfig;
|
||||
pub use config_file::TsConfigForEmit;
|
||||
pub use config_file::TsConfigType;
|
||||
pub use config_file::TsTypeLib;
|
||||
pub use flags::*;
|
||||
pub use lockfile::Lockfile;
|
||||
pub use lockfile::LockfileError;
|
||||
|
@ -42,10 +45,6 @@ use std::path::PathBuf;
|
|||
use std::sync::Arc;
|
||||
|
||||
use crate::deno_dir::DenoDir;
|
||||
use crate::emit::get_ts_config_for_emit;
|
||||
use crate::emit::TsConfigType;
|
||||
use crate::emit::TsConfigWithIgnoredOptions;
|
||||
use crate::emit::TsTypeLib;
|
||||
use crate::file_fetcher::get_root_cert_store;
|
||||
use crate::file_fetcher::CacheSetting;
|
||||
use crate::fs_util;
|
||||
|
@ -191,8 +190,11 @@ impl CliOptions {
|
|||
pub fn resolve_ts_config_for_emit(
|
||||
&self,
|
||||
config_type: TsConfigType,
|
||||
) -> Result<TsConfigWithIgnoredOptions, AnyError> {
|
||||
get_ts_config_for_emit(config_type, self.maybe_config_file.as_ref())
|
||||
) -> Result<TsConfigForEmit, AnyError> {
|
||||
config_file::get_ts_config_for_emit(
|
||||
config_type,
|
||||
self.maybe_config_file.as_ref(),
|
||||
)
|
||||
}
|
||||
|
||||
/// Resolves the storage key to use based on the current flags, config, or main module.
|
||||
|
|
|
@ -122,7 +122,7 @@ mod ts {
|
|||
"esnext.intl",
|
||||
];
|
||||
|
||||
let path_dts = cwd.join("dts");
|
||||
let path_dts = cwd.join("tsc/dts");
|
||||
// ensure we invalidate the build properly.
|
||||
for name in libs.iter() {
|
||||
println!(
|
||||
|
@ -476,5 +476,8 @@ fn main() {
|
|||
|
||||
fn deno_webgpu_get_declaration() -> PathBuf {
|
||||
let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR"));
|
||||
manifest_dir.join("dts").join("lib.deno_webgpu.d.ts")
|
||||
manifest_dir
|
||||
.join("tsc")
|
||||
.join("dts")
|
||||
.join("lib.deno_webgpu.d.ts")
|
||||
}
|
||||
|
|
29
cli/dts/README.md
vendored
29
cli/dts/README.md
vendored
|
@ -1,29 +0,0 @@
|
|||
# How to upgrade TypeScript.
|
||||
|
||||
The files in this directory are mostly from the TypeScript repository. We
|
||||
currently (unfortunately) have a rather manual process for upgrading TypeScript.
|
||||
It works like this currently:
|
||||
|
||||
1. Checkout denoland/TypeScript repo in a separate directory.
|
||||
1. Add Microsoft/TypeScript as a remote and fetch its latest tags
|
||||
1. Checkout a new branch based on this tag.
|
||||
1. Cherry pick the custom commit we made in a previous release to the new one.
|
||||
1. This commit has a "deno.ts" file in it. Read the instructions in it.
|
||||
1. Copy typescript.js into Deno repo.
|
||||
1. Copy d.ts files into dts directory.
|
||||
|
||||
So that might look something like this:
|
||||
|
||||
```
|
||||
git clone https://github.com/denoland/TypeScript.git
|
||||
cd typescript
|
||||
git remote add upstream https://github.com/Microsoft/TypeScript
|
||||
git fetch upstream
|
||||
git checkout v3.9.7
|
||||
git checkout -b branch_v3.9.7
|
||||
git cherry pick <previous-release-branch-commit-we-did>
|
||||
npm install
|
||||
gulp local
|
||||
rsync lib/typescript.js ~/src/deno/cli/tsc/00_typescript.js
|
||||
rsync --exclude=protocol.d.ts --exclude=tsserverlibrary.d.ts --exclude=typescriptServices.d.ts lib/*.d.ts ~/src/deno/cli/dts/
|
||||
```
|
246
cli/emit.rs
246
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,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,8 +9,6 @@
|
|||
//! Diagnostics are compile-time type errors, whereas JsErrors are runtime
|
||||
//! exceptions.
|
||||
|
||||
use crate::emit::GraphError;
|
||||
|
||||
use deno_ast::Diagnostic;
|
||||
use deno_core::error::AnyError;
|
||||
use deno_graph::ModuleGraphError;
|
||||
|
@ -25,11 +23,7 @@ fn get_diagnostic_class(_: &Diagnostic) -> &'static str {
|
|||
"SyntaxError"
|
||||
}
|
||||
|
||||
fn get_graph_error_class(err: &GraphError) -> &'static str {
|
||||
get_module_graph_error_class(&err.0)
|
||||
}
|
||||
|
||||
pub fn get_module_graph_error_class(err: &ModuleGraphError) -> &'static str {
|
||||
fn get_module_graph_error_class(err: &ModuleGraphError) -> &'static str {
|
||||
match err {
|
||||
ModuleGraphError::LoadingErr(_, err) => get_error_class_name(err.as_ref()),
|
||||
ModuleGraphError::InvalidSource(_, _)
|
||||
|
@ -60,7 +54,6 @@ pub fn get_error_class_name(e: &AnyError) -> &'static str {
|
|||
.map(get_import_map_error_class)
|
||||
})
|
||||
.or_else(|| e.downcast_ref::<Diagnostic>().map(get_diagnostic_class))
|
||||
.or_else(|| e.downcast_ref::<GraphError>().map(get_graph_error_class))
|
||||
.or_else(|| {
|
||||
e.downcast_ref::<ModuleGraphError>()
|
||||
.map(get_module_graph_error_class)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
|
||||
|
||||
use crate::args::TsTypeLib;
|
||||
use crate::colors;
|
||||
use crate::emit::TsTypeLib;
|
||||
use crate::errors::get_error_class_name;
|
||||
use crate::npm::resolve_npm_package_reqs;
|
||||
use crate::npm::NpmPackageReference;
|
||||
|
|
|
@ -13,7 +13,6 @@ use super::tsc;
|
|||
use super::tsc::TsServer;
|
||||
|
||||
use crate::args::LintConfig;
|
||||
use crate::diagnostics;
|
||||
use crate::npm::NpmPackageReference;
|
||||
|
||||
use deno_ast::MediaType;
|
||||
|
@ -43,7 +42,7 @@ pub type DiagnosticRecord =
|
|||
pub type DiagnosticVec = Vec<DiagnosticRecord>;
|
||||
type DiagnosticMap =
|
||||
HashMap<ModuleSpecifier, (Option<i32>, Vec<lsp::Diagnostic>)>;
|
||||
type TsDiagnosticsMap = HashMap<String, Vec<diagnostics::Diagnostic>>;
|
||||
type TsDiagnosticsMap = HashMap<String, Vec<crate::tsc::Diagnostic>>;
|
||||
type DiagnosticsByVersionMap = HashMap<Option<i32>, Vec<lsp::Diagnostic>>;
|
||||
|
||||
#[derive(Clone)]
|
||||
|
@ -335,25 +334,25 @@ impl DiagnosticsServer {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> From<&'a diagnostics::DiagnosticCategory> for lsp::DiagnosticSeverity {
|
||||
fn from(category: &'a diagnostics::DiagnosticCategory) -> Self {
|
||||
impl<'a> From<&'a crate::tsc::DiagnosticCategory> for lsp::DiagnosticSeverity {
|
||||
fn from(category: &'a crate::tsc::DiagnosticCategory) -> Self {
|
||||
match category {
|
||||
diagnostics::DiagnosticCategory::Error => lsp::DiagnosticSeverity::ERROR,
|
||||
diagnostics::DiagnosticCategory::Warning => {
|
||||
crate::tsc::DiagnosticCategory::Error => lsp::DiagnosticSeverity::ERROR,
|
||||
crate::tsc::DiagnosticCategory::Warning => {
|
||||
lsp::DiagnosticSeverity::WARNING
|
||||
}
|
||||
diagnostics::DiagnosticCategory::Suggestion => {
|
||||
crate::tsc::DiagnosticCategory::Suggestion => {
|
||||
lsp::DiagnosticSeverity::HINT
|
||||
}
|
||||
diagnostics::DiagnosticCategory::Message => {
|
||||
crate::tsc::DiagnosticCategory::Message => {
|
||||
lsp::DiagnosticSeverity::INFORMATION
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> From<&'a diagnostics::Position> for lsp::Position {
|
||||
fn from(pos: &'a diagnostics::Position) -> Self {
|
||||
impl<'a> From<&'a crate::tsc::Position> for lsp::Position {
|
||||
fn from(pos: &'a crate::tsc::Position) -> Self {
|
||||
Self {
|
||||
line: pos.line as u32,
|
||||
character: pos.character as u32,
|
||||
|
@ -361,7 +360,7 @@ impl<'a> From<&'a diagnostics::Position> for lsp::Position {
|
|||
}
|
||||
}
|
||||
|
||||
fn get_diagnostic_message(diagnostic: &diagnostics::Diagnostic) -> String {
|
||||
fn get_diagnostic_message(diagnostic: &crate::tsc::Diagnostic) -> String {
|
||||
if let Some(message) = diagnostic.message_text.clone() {
|
||||
message
|
||||
} else if let Some(message_chain) = diagnostic.message_chain.clone() {
|
||||
|
@ -372,8 +371,8 @@ fn get_diagnostic_message(diagnostic: &diagnostics::Diagnostic) -> String {
|
|||
}
|
||||
|
||||
fn to_lsp_range(
|
||||
start: &diagnostics::Position,
|
||||
end: &diagnostics::Position,
|
||||
start: &crate::tsc::Position,
|
||||
end: &crate::tsc::Position,
|
||||
) -> lsp::Range {
|
||||
lsp::Range {
|
||||
start: start.into(),
|
||||
|
@ -382,7 +381,7 @@ fn to_lsp_range(
|
|||
}
|
||||
|
||||
fn to_lsp_related_information(
|
||||
related_information: &Option<Vec<diagnostics::Diagnostic>>,
|
||||
related_information: &Option<Vec<crate::tsc::Diagnostic>>,
|
||||
) -> Option<Vec<lsp::DiagnosticRelatedInformation>> {
|
||||
related_information.as_ref().map(|related| {
|
||||
related
|
||||
|
@ -408,7 +407,7 @@ fn to_lsp_related_information(
|
|||
}
|
||||
|
||||
fn ts_json_to_diagnostics(
|
||||
diagnostics: Vec<diagnostics::Diagnostic>,
|
||||
diagnostics: Vec<crate::tsc::Diagnostic>,
|
||||
) -> Vec<lsp::Diagnostic> {
|
||||
diagnostics
|
||||
.iter()
|
||||
|
|
|
@ -7,7 +7,6 @@ mod cdp;
|
|||
mod checksum;
|
||||
mod deno_dir;
|
||||
mod deno_std;
|
||||
mod diagnostics;
|
||||
mod diff;
|
||||
mod display;
|
||||
mod emit;
|
||||
|
@ -59,12 +58,12 @@ use crate::args::ReplFlags;
|
|||
use crate::args::RunFlags;
|
||||
use crate::args::TaskFlags;
|
||||
use crate::args::TestFlags;
|
||||
use crate::args::TsConfigType;
|
||||
use crate::args::TypeCheckMode;
|
||||
use crate::args::UninstallFlags;
|
||||
use crate::args::UpgradeFlags;
|
||||
use crate::args::VendorFlags;
|
||||
use crate::cache::TypeCheckCache;
|
||||
use crate::emit::TsConfigType;
|
||||
use crate::file_fetcher::File;
|
||||
use crate::file_watcher::ResolutionResult;
|
||||
use crate::graph_util::graph_lock_or_exit;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
|
||||
|
||||
use crate::args::TsTypeLib;
|
||||
use crate::emit::emit_parsed_source;
|
||||
use crate::emit::TsTypeLib;
|
||||
use crate::graph_util::ModuleEntry;
|
||||
use crate::node;
|
||||
use crate::proc_state::ProcState;
|
||||
|
|
|
@ -4,6 +4,8 @@ use crate::args::CliOptions;
|
|||
use crate::args::DenoSubcommand;
|
||||
use crate::args::Flags;
|
||||
use crate::args::Lockfile;
|
||||
use crate::args::TsConfigType;
|
||||
use crate::args::TsTypeLib;
|
||||
use crate::args::TypeCheckMode;
|
||||
use crate::cache;
|
||||
use crate::cache::EmitCache;
|
||||
|
@ -13,8 +15,6 @@ use crate::cache::ParsedSourceCache;
|
|||
use crate::cache::TypeCheckCache;
|
||||
use crate::deno_dir;
|
||||
use crate::emit::emit_parsed_source;
|
||||
use crate::emit::TsConfigType;
|
||||
use crate::emit::TsTypeLib;
|
||||
use crate::file_fetcher::FileFetcher;
|
||||
use crate::graph_util::graph_lock_or_exit;
|
||||
use crate::graph_util::GraphData;
|
||||
|
|
|
@ -126,7 +126,7 @@ fn typecheck_declarations_ns() {
|
|||
let output = util::deno_cmd()
|
||||
.arg("test")
|
||||
.arg("--doc")
|
||||
.arg(util::root_path().join("cli/dts/lib.deno.ns.d.ts"))
|
||||
.arg(util::root_path().join("cli/tsc/dts/lib.deno.ns.d.ts"))
|
||||
.output()
|
||||
.unwrap();
|
||||
println!("stdout: {}", String::from_utf8(output.stdout).unwrap());
|
||||
|
@ -140,7 +140,7 @@ fn typecheck_declarations_unstable() {
|
|||
.arg("test")
|
||||
.arg("--doc")
|
||||
.arg("--unstable")
|
||||
.arg(util::root_path().join("cli/dts/lib.deno.unstable.d.ts"))
|
||||
.arg(util::root_path().join("cli/tsc/dts/lib.deno.unstable.d.ts"))
|
||||
.output()
|
||||
.unwrap();
|
||||
println!("stdout: {}", String::from_utf8(output.stdout).unwrap());
|
||||
|
|
|
@ -15,11 +15,11 @@ use crate::args::TsConfig;
|
|||
use crate::args::TypeCheckMode;
|
||||
use crate::cache::FastInsecureHasher;
|
||||
use crate::cache::TypeCheckCache;
|
||||
use crate::diagnostics::Diagnostics;
|
||||
use crate::graph_util::GraphData;
|
||||
use crate::graph_util::ModuleEntry;
|
||||
use crate::npm::NpmPackageResolver;
|
||||
use crate::tsc;
|
||||
use crate::tsc::Diagnostics;
|
||||
use crate::tsc::Stats;
|
||||
use crate::version;
|
||||
|
||||
|
|
|
@ -2,3 +2,33 @@
|
|||
|
||||
This directory contains the typescript compiler and a small compiler host for
|
||||
the runtime snapshot.
|
||||
|
||||
## How to upgrade TypeScript.
|
||||
|
||||
The files in this directory are mostly from the TypeScript repository. We
|
||||
currently (unfortunately) have a rather manual process for upgrading TypeScript.
|
||||
It works like this currently:
|
||||
|
||||
1. Checkout denoland/TypeScript repo in a separate directory.
|
||||
1. Add Microsoft/TypeScript as a remote and fetch its latest tags
|
||||
1. Checkout a new branch based on this tag.
|
||||
1. Cherry pick the custom commit we made in a previous release to the new one.
|
||||
1. This commit has a "deno.ts" file in it. Read the instructions in it.
|
||||
1. Copy typescript.js into Deno repo.
|
||||
1. Copy d.ts files into dts directory.
|
||||
|
||||
So that might look something like this:
|
||||
|
||||
```
|
||||
git clone https://github.com/denoland/TypeScript.git
|
||||
cd typescript
|
||||
git remote add upstream https://github.com/Microsoft/TypeScript
|
||||
git fetch upstream
|
||||
git checkout v3.9.7
|
||||
git checkout -b branch_v3.9.7
|
||||
git cherry pick <previous-release-branch-commit-we-did>
|
||||
npm install
|
||||
gulp local
|
||||
rsync lib/typescript.js ~/src/deno/cli/tsc/00_typescript.js
|
||||
rsync --exclude=protocol.d.ts --exclude=tsserverlibrary.d.ts --exclude=typescriptServices.d.ts lib/*.d.ts ~/src/deno/cli/tsc/dts/
|
||||
```
|
||||
|
|
2
cli/tsc/compiler.d.ts
vendored
2
cli/tsc/compiler.d.ts
vendored
|
@ -2,7 +2,7 @@
|
|||
|
||||
// Contains types that can be used to validate and check `99_main_compiler.js`
|
||||
|
||||
import * as _ts from "../dts/typescript";
|
||||
import * as _ts from "./dts/typescript";
|
||||
|
||||
declare global {
|
||||
namespace ts {
|
||||
|
|
0
cli/dts/lib.d.ts → cli/tsc/dts/lib.d.ts
vendored
0
cli/dts/lib.d.ts → cli/tsc/dts/lib.d.ts
vendored
|
@ -1,7 +1,6 @@
|
|||
// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
|
||||
|
||||
use crate::args::TsConfig;
|
||||
use crate::diagnostics::Diagnostics;
|
||||
use crate::graph_util::GraphData;
|
||||
use crate::graph_util::ModuleEntry;
|
||||
use crate::node;
|
||||
|
@ -40,6 +39,14 @@ use std::fmt;
|
|||
use std::path::PathBuf;
|
||||
use std::sync::Arc;
|
||||
|
||||
mod diagnostics;
|
||||
|
||||
pub use self::diagnostics::Diagnostic;
|
||||
pub use self::diagnostics::DiagnosticCategory;
|
||||
pub use self::diagnostics::DiagnosticMessageChain;
|
||||
pub use self::diagnostics::Diagnostics;
|
||||
pub use self::diagnostics::Position;
|
||||
|
||||
// Declaration files
|
||||
|
||||
pub static DENO_NS_LIB: &str = include_str!("dts/lib.deno.ns.d.ts");
|
||||
|
@ -85,7 +92,7 @@ pub fn compiler_snapshot() -> Snapshot {
|
|||
|
||||
macro_rules! inc {
|
||||
($e:expr) => {
|
||||
include_str!(concat!("dts/", $e))
|
||||
include_str!(concat!("./dts/", $e))
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -797,10 +804,10 @@ pub fn exec(request: Request) -> Result<Response, AnyError> {
|
|||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::Diagnostic;
|
||||
use super::DiagnosticCategory;
|
||||
use super::*;
|
||||
use crate::args::TsConfig;
|
||||
use crate::diagnostics::Diagnostic;
|
||||
use crate::diagnostics::DiagnosticCategory;
|
||||
use deno_core::futures::future;
|
||||
use deno_core::OpState;
|
||||
use deno_graph::ModuleKind;
|
|
@ -24,7 +24,7 @@ async function dlint() {
|
|||
":!:cli/bench/testdata/express-router.js",
|
||||
":!:cli/bench/testdata/react-dom.js",
|
||||
":!:cli/compilers/wasm_wrap.js",
|
||||
":!:cli/dts/**",
|
||||
":!:cli/tsc/dts/**",
|
||||
":!:cli/tests/testdata/encoding/**",
|
||||
":!:cli/tests/testdata/error_syntax.js",
|
||||
":!:cli/tests/testdata/fmt/**",
|
||||
|
|
Loading…
Reference in a new issue