summaryrefslogtreecommitdiff
path: root/cli/tsc
diff options
context:
space:
mode:
Diffstat (limited to 'cli/tsc')
-rw-r--r--cli/tsc/99_main_compiler.js41
-rw-r--r--cli/tsc/mod.rs78
2 files changed, 69 insertions, 50 deletions
diff --git a/cli/tsc/99_main_compiler.js b/cli/tsc/99_main_compiler.js
index 52c9134da..68d099253 100644
--- a/cli/tsc/99_main_compiler.js
+++ b/cli/tsc/99_main_compiler.js
@@ -121,8 +121,8 @@ delete Object.prototype.__proto__;
/** @type {Map<string, ts.SourceFile>} */
const sourceFileCache = new Map();
- /** @type {Map<string, string>} */
- const sourceTextCache = new Map();
+ /** @type {Map<string, ts.IScriptSnapshot & { isCjs?: boolean; }>} */
+ const scriptSnapshotCache = new Map();
/** @type {Map<string, number>} */
const sourceRefCounts = new Map();
@@ -133,9 +133,6 @@ delete Object.prototype.__proto__;
/** @type {Map<string, boolean>} */
const isNodeSourceFileCache = new Map();
- /** @type {Map<string, boolean>} */
- const isCjsCache = new Map();
-
// Maps asset specifiers to the first scope that the asset was loaded into.
/** @type {Map<string, string | null>} */
const assetScopes = new Map();
@@ -210,12 +207,13 @@ delete Object.prototype.__proto__;
const mapKey = path + key;
let sourceFile = documentRegistrySourceFileCache.get(mapKey);
if (!sourceFile || sourceFile.version !== version) {
+ const isCjs = /** @type {any} */ (scriptSnapshot).isCjs;
sourceFile = ts.createLanguageServiceSourceFile(
fileName,
scriptSnapshot,
{
...getCreateSourceFileOptions(sourceFileOptions),
- impliedNodeFormat: (isCjsCache.get(fileName) ?? false)
+ impliedNodeFormat: isCjs
? ts.ModuleKind.CommonJS
: ts.ModuleKind.ESNext,
// in the lsp we want to be able to show documentation
@@ -320,7 +318,7 @@ delete Object.prototype.__proto__;
if (lastRequestMethod != "cleanupSemanticCache") {
const mapKey = path + key;
documentRegistrySourceFileCache.delete(mapKey);
- sourceTextCache.delete(path);
+ scriptSnapshotCache.delete(path);
ops.op_release(path);
}
} else {
@@ -624,8 +622,6 @@ delete Object.prototype.__proto__;
`"data" is unexpectedly null for "${specifier}".`,
);
- isCjsCache.set(specifier, isCjs);
-
sourceFile = ts.createSourceFile(
specifier,
data,
@@ -699,7 +695,7 @@ delete Object.prototype.__proto__;
/** @type {[string, ts.Extension] | undefined} */
const resolved = ops.op_resolve(
containingFilePath,
- isCjsCache.get(containingFilePath) ?? false,
+ containingFileMode === ts.ModuleKind.CommonJS,
[fileReference.fileName],
)?.[0];
if (resolved) {
@@ -723,7 +719,14 @@ delete Object.prototype.__proto__;
}
});
},
- resolveModuleNames(specifiers, base) {
+ resolveModuleNames(
+ specifiers,
+ base,
+ _reusedNames,
+ _redirectedReference,
+ _options,
+ containingSourceFile,
+ ) {
if (logDebug) {
debug(`host.resolveModuleNames()`);
debug(` base: ${base}`);
@@ -732,7 +735,7 @@ delete Object.prototype.__proto__;
/** @type {Array<[string, ts.Extension] | undefined>} */
const resolved = ops.op_resolve(
base,
- isCjsCache.get(base) ?? false,
+ containingSourceFile?.impliedNodeFormat === ts.ModuleKind.CommonJS,
specifiers,
);
if (resolved) {
@@ -814,19 +817,19 @@ delete Object.prototype.__proto__;
return ts.ScriptSnapshot.fromString(sourceFile.text);
}
}
- let sourceText = sourceTextCache.get(specifier);
- if (sourceText == undefined) {
+ let scriptSnapshot = scriptSnapshotCache.get(specifier);
+ if (scriptSnapshot == undefined) {
/** @type {{ data: string, version: string, isCjs: boolean }} */
const fileInfo = ops.op_load(specifier);
if (!fileInfo) {
return undefined;
}
- isCjsCache.set(specifier, fileInfo.isCjs);
- sourceTextCache.set(specifier, fileInfo.data);
+ scriptSnapshot = ts.ScriptSnapshot.fromString(fileInfo.data);
+ scriptSnapshot.isCjs = fileInfo.isCjs;
+ scriptSnapshotCache.set(specifier, scriptSnapshot);
scriptVersionCache.set(specifier, fileInfo.version);
- sourceText = fileInfo.data;
}
- return ts.ScriptSnapshot.fromString(sourceText);
+ return scriptSnapshot;
},
};
@@ -1238,7 +1241,7 @@ delete Object.prototype.__proto__;
closed = true;
}
scriptVersionCache.delete(script);
- sourceTextCache.delete(script);
+ scriptSnapshotCache.delete(script);
}
if (newConfigsByScope || opened || closed) {
diff --git a/cli/tsc/mod.rs b/cli/tsc/mod.rs
index dc7fc38f7..a56906162 100644
--- a/cli/tsc/mod.rs
+++ b/cli/tsc/mod.rs
@@ -343,31 +343,36 @@ impl TypeCheckingCjsTracker {
media_type: MediaType,
code: &Arc<str>,
) -> bool {
- if let Some(module_kind) =
- self.cjs_tracker.get_known_kind(specifier, media_type)
- {
- module_kind.is_cjs()
- } else {
- let maybe_is_script = self
- .module_info_cache
- .as_module_analyzer()
- .analyze_sync(specifier, media_type, code)
- .ok()
- .map(|info| info.is_script);
- maybe_is_script
- .and_then(|is_script| {
- self
- .cjs_tracker
- .is_cjs_with_known_is_script(specifier, media_type, is_script)
- .ok()
- })
- .unwrap_or_else(|| {
- self
- .cjs_tracker
- .is_maybe_cjs(specifier, media_type)
- .unwrap_or(false)
- })
- }
+ let maybe_is_script = self
+ .module_info_cache
+ .as_module_analyzer()
+ .analyze_sync(specifier, media_type, code)
+ .ok()
+ .map(|info| info.is_script);
+ maybe_is_script
+ .and_then(|is_script| {
+ self
+ .cjs_tracker
+ .is_cjs_with_known_is_script(specifier, media_type, is_script)
+ .ok()
+ })
+ .unwrap_or_else(|| {
+ self
+ .cjs_tracker
+ .is_maybe_cjs(specifier, media_type)
+ .unwrap_or(false)
+ })
+ }
+
+ pub fn is_cjs_with_known_is_script(
+ &self,
+ specifier: &ModuleSpecifier,
+ media_type: MediaType,
+ is_script: bool,
+ ) -> Result<bool, node_resolver::errors::ClosestPkgJsonError> {
+ self
+ .cjs_tracker
+ .is_cjs_with_known_is_script(specifier, media_type, is_script)
}
}
@@ -627,8 +632,12 @@ fn op_load_inner(
match module {
Module::Js(module) => {
media_type = module.media_type;
- if matches!(media_type, MediaType::Cjs | MediaType::Cts) {
- is_cjs = true;
+ if let Some(npm_state) = &state.maybe_npm {
+ is_cjs = npm_state.cjs_tracker.is_cjs_with_known_is_script(
+ specifier,
+ module.media_type,
+ module.is_script,
+ )?;
}
let source = module
.fast_check_module()
@@ -737,6 +746,7 @@ fn op_resolve_inner(
"Error converting a string module specifier for \"op_resolve\".",
)?
};
+ let referrer_module = state.graph.get(&referrer);
for specifier in args.specifiers {
if specifier.starts_with("node:") {
resolved.push((
@@ -752,16 +762,19 @@ fn op_resolve_inner(
continue;
}
- let graph = &state.graph;
- let resolved_dep = graph
- .get(&referrer)
+ let resolved_dep = referrer_module
.and_then(|m| m.js())
.and_then(|m| m.dependencies_prefer_fast_check().get(&specifier))
.and_then(|d| d.maybe_type.ok().or_else(|| d.maybe_code.ok()));
let maybe_result = match resolved_dep {
Some(ResolutionResolved { specifier, .. }) => {
- resolve_graph_specifier_types(specifier, &referrer, state)?
+ resolve_graph_specifier_types(
+ specifier,
+ &referrer,
+ referrer_kind,
+ state,
+ )?
}
_ => {
match resolve_non_graph_specifier_types(
@@ -834,6 +847,7 @@ fn op_resolve_inner(
fn resolve_graph_specifier_types(
specifier: &ModuleSpecifier,
referrer: &ModuleSpecifier,
+ referrer_kind: NodeModuleKind,
state: &State,
) -> Result<Option<(ModuleSpecifier, MediaType)>, AnyError> {
let graph = &state.graph;
@@ -886,6 +900,7 @@ fn resolve_graph_specifier_types(
&package_folder,
module.nv_reference.sub_path(),
Some(referrer),
+ referrer_kind,
NodeResolutionMode::Types,
);
let maybe_url = match res_result {
@@ -965,6 +980,7 @@ fn resolve_non_graph_specifier_types(
&package_folder,
npm_req_ref.sub_path(),
Some(referrer),
+ referrer_kind,
NodeResolutionMode::Types,
);
let maybe_url = match res_result {