Skip to content

Commit fadda6a

Browse files
authored
fix(lockfile): track dependencies specified in TypeScript compiler options (#26551)
We should track dependencies in `jsxImportSource`, `jsxImportSourceTypes`, and `types`. That way, for example, if someone removes or changes the `jsxImportSource` then we can remove those items from the lockfile.
1 parent 9956731 commit fadda6a

File tree

7 files changed

+109
-10
lines changed

7 files changed

+109
-10
lines changed

cli/args/deno_json.rs

+47-5
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,41 @@ pub fn deno_json_deps(
7070
let values = imports_values(config.json.imports.as_ref())
7171
.into_iter()
7272
.chain(scope_values(config.json.scopes.as_ref()));
73-
values_to_set(values)
73+
let mut set = values_to_set(values);
74+
75+
if let Some(serde_json::Value::Object(compiler_options)) =
76+
&config.json.compiler_options
77+
{
78+
// add jsxImportSource
79+
if let Some(serde_json::Value::String(value)) =
80+
compiler_options.get("jsxImportSource")
81+
{
82+
if let Some(dep_req) = value_to_dep_req(value) {
83+
set.insert(dep_req);
84+
}
85+
}
86+
// add jsxImportSourceTypes
87+
if let Some(serde_json::Value::String(value)) =
88+
compiler_options.get("jsxImportSourceTypes")
89+
{
90+
if let Some(dep_req) = value_to_dep_req(value) {
91+
set.insert(dep_req);
92+
}
93+
}
94+
// add the dependencies in the types array
95+
if let Some(serde_json::Value::Array(types)) = compiler_options.get("types")
96+
{
97+
for value in types {
98+
if let serde_json::Value::String(value) = value {
99+
if let Some(dep_req) = value_to_dep_req(value) {
100+
set.insert(dep_req);
101+
}
102+
}
103+
}
104+
}
105+
}
106+
107+
set
74108
}
75109

76110
fn imports_values(value: Option<&serde_json::Value>) -> Vec<&String> {
@@ -98,15 +132,23 @@ fn values_to_set<'a>(
98132
) -> HashSet<JsrDepPackageReq> {
99133
let mut entries = HashSet::new();
100134
for value in values {
101-
if let Ok(req_ref) = JsrPackageReqReference::from_str(value) {
102-
entries.insert(JsrDepPackageReq::jsr(req_ref.into_inner().req));
103-
} else if let Ok(req_ref) = NpmPackageReqReference::from_str(value) {
104-
entries.insert(JsrDepPackageReq::npm(req_ref.into_inner().req));
135+
if let Some(dep_req) = value_to_dep_req(value) {
136+
entries.insert(dep_req);
105137
}
106138
}
107139
entries
108140
}
109141

142+
fn value_to_dep_req(value: &str) -> Option<JsrDepPackageReq> {
143+
if let Ok(req_ref) = JsrPackageReqReference::from_str(value) {
144+
Some(JsrDepPackageReq::jsr(req_ref.into_inner().req))
145+
} else if let Ok(req_ref) = NpmPackageReqReference::from_str(value) {
146+
Some(JsrDepPackageReq::npm(req_ref.into_inner().req))
147+
} else {
148+
None
149+
}
150+
}
151+
110152
pub fn check_warn_tsconfig(ts_config: &TsConfigForEmit) {
111153
if let Some(ignored_options) = &ts_config.maybe_ignored_options {
112154
log::warn!("{}", ignored_options);

cli/args/lockfile.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -126,11 +126,7 @@ impl CliLockfile {
126126
maybe_deno_json: Option<&ConfigFile>,
127127
) -> HashSet<JsrDepPackageReq> {
128128
maybe_deno_json
129-
.map(|c| {
130-
crate::args::deno_json::deno_json_deps(c)
131-
.into_iter()
132-
.collect()
133-
})
129+
.map(crate::args::deno_json::deno_json_deps)
134130
.unwrap_or_default()
135131
}
136132

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"tempDir": true,
3+
"steps": [{
4+
"args": "run index.tsx",
5+
"output": "index.out"
6+
}, {
7+
"args": [
8+
"eval",
9+
"console.log(Deno.readTextFileSync('deno.lock').trim())"
10+
],
11+
"output": "deno.lock.out"
12+
}]
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"compilerOptions": {
3+
"jsx": "react-jsx",
4+
"jsxImportSource": "npm:react",
5+
"jsxImportSourceTypes": "npm:@types/react",
6+
"types": [
7+
"npm:@types/node"
8+
]
9+
}
10+
}

tests/specs/lockfile/jsx_import_source_and_types/deno.lock.out

+30
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Download http://localhost:4260/react
2+
Download http://localhost:4260/loose-envify
3+
Download http://localhost:4260/js-tokens
4+
Download http://localhost:4260/react/react-18.2.0.tgz
5+
Download http://localhost:4260/loose-envify/loose-envify-1.4.0.tgz
6+
Download http://localhost:4260/js-tokens/js-tokens-4.0.0.tgz
7+
1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
console.log(1);

0 commit comments

Comments
 (0)