Skip to content

Commit 9a21680

Browse files
authored
feat(npm): add support for --reload=npm: and --reload=npm:<package> (#15972)
1 parent 06c77a3 commit 9a21680

File tree

7 files changed

+138
-6
lines changed

7 files changed

+138
-6
lines changed

cli/args/flags.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -1937,7 +1937,11 @@ fn reload_arg<'a>() -> Arg<'a> {
19371937
--reload=https://deno.land/std
19381938
Reload only standard modules
19391939
--reload=https://deno.land/std/fs/utils.ts,https://deno.land/std/fmt/colors.ts
1940-
Reloads specific modules",
1940+
Reloads specific modules
1941+
--reload=npm:
1942+
Reload all npm modules
1943+
--reload=npm:chalk
1944+
Reload specific npm module",
19411945
)
19421946
.value_hint(ValueHint::FilePath)
19431947
.validator(reload_arg_validate)

cli/file_fetcher.rs

+17
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,23 @@ impl CacheSetting {
146146
}
147147
}
148148
}
149+
150+
pub fn should_use_for_npm_package(&self, package_name: &str) -> bool {
151+
match self {
152+
CacheSetting::ReloadAll => false,
153+
CacheSetting::ReloadSome(list) => {
154+
if list.contains(&"npm:".to_string()) {
155+
return false;
156+
}
157+
let specifier = format!("npm:{}", package_name);
158+
if list.contains(&specifier) {
159+
return false;
160+
}
161+
true
162+
}
163+
_ => true,
164+
}
165+
}
149166
}
150167

151168
/// Fetch a source file from the local file system.

cli/npm/cache.rs

+1
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ impl NpmCache {
204204
// if this file exists, then the package didn't successfully extract
205205
// the first time, or another process is currently extracting the zip file
206206
&& !package_folder.join(NPM_PACKAGE_SYNC_LOCK_FILENAME).exists()
207+
&& self.cache_setting.should_use_for_npm_package(&id.name)
207208
{
208209
return Ok(());
209210
} else if self.cache_setting == CacheSetting::Only {

cli/npm/registry.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,6 @@ pub struct NpmRegistryApi {
105105
base_url: Url,
106106
cache: NpmCache,
107107
mem_cache: Arc<Mutex<HashMap<String, Option<NpmPackageInfo>>>>,
108-
reload: bool,
109108
cache_setting: CacheSetting,
110109
progress_bar: ProgressBar,
111110
}
@@ -133,15 +132,13 @@ impl NpmRegistryApi {
133132
pub fn new(
134133
base_url: Url,
135134
cache: NpmCache,
136-
reload: bool,
137135
cache_setting: CacheSetting,
138136
progress_bar: ProgressBar,
139137
) -> Self {
140138
Self {
141139
base_url,
142140
cache,
143141
mem_cache: Default::default(),
144-
reload,
145142
cache_setting,
146143
progress_bar,
147144
}
@@ -171,7 +168,7 @@ impl NpmRegistryApi {
171168
Ok(info)
172169
} else {
173170
let mut maybe_package_info = None;
174-
if !self.reload {
171+
if self.cache_setting.should_use_for_npm_package(name) {
175172
// attempt to load from the file cache
176173
maybe_package_info = self.load_file_cached_package_info(name);
177174
}

cli/proc_state.rs

-1
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,6 @@ impl ProcState {
231231
let api = NpmRegistryApi::new(
232232
registry_url,
233233
npm_cache.clone(),
234-
cli_options.reload_flag(),
235234
cli_options.cache_setting(),
236235
progress_bar.clone(),
237236
);

cli/tests/integration/npm_tests.rs

+111
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,117 @@ fn cached_only_after_first_run() {
266266
assert_contains!(stdout, "createChalk: chalk");
267267
}
268268

269+
#[test]
270+
fn reload_flag() {
271+
let _server = http_server();
272+
273+
let deno_dir = util::new_deno_dir();
274+
275+
let deno = util::deno_cmd_with_deno_dir(&deno_dir)
276+
.current_dir(util::testdata_path())
277+
.arg("run")
278+
.arg("--unstable")
279+
.arg("--allow-read")
280+
.arg("--allow-env")
281+
.arg("npm/reload/main.ts")
282+
.env("NO_COLOR", "1")
283+
.envs(env_vars())
284+
.stdout(Stdio::piped())
285+
.stderr(Stdio::piped())
286+
.spawn()
287+
.unwrap();
288+
let output = deno.wait_with_output().unwrap();
289+
let stderr = String::from_utf8_lossy(&output.stderr);
290+
let stdout = String::from_utf8_lossy(&output.stdout);
291+
assert_contains!(stderr, "Download");
292+
assert_contains!(stdout, "createChalk: chalk");
293+
assert!(output.status.success());
294+
295+
let deno = util::deno_cmd_with_deno_dir(&deno_dir)
296+
.current_dir(util::testdata_path())
297+
.arg("run")
298+
.arg("--unstable")
299+
.arg("--allow-read")
300+
.arg("--allow-env")
301+
.arg("--reload")
302+
.arg("npm/reload/main.ts")
303+
.env("NO_COLOR", "1")
304+
.envs(env_vars())
305+
.stdout(Stdio::piped())
306+
.stderr(Stdio::piped())
307+
.spawn()
308+
.unwrap();
309+
let output = deno.wait_with_output().unwrap();
310+
let stderr = String::from_utf8_lossy(&output.stderr);
311+
let stdout = String::from_utf8_lossy(&output.stdout);
312+
assert_contains!(stderr, "Download");
313+
assert_contains!(stdout, "createChalk: chalk");
314+
assert!(output.status.success());
315+
316+
let deno = util::deno_cmd_with_deno_dir(&deno_dir)
317+
.current_dir(util::testdata_path())
318+
.arg("run")
319+
.arg("--unstable")
320+
.arg("--allow-read")
321+
.arg("--allow-env")
322+
.arg("--reload=npm:")
323+
.arg("npm/reload/main.ts")
324+
.env("NO_COLOR", "1")
325+
.envs(env_vars())
326+
.stdout(Stdio::piped())
327+
.stderr(Stdio::piped())
328+
.spawn()
329+
.unwrap();
330+
let output = deno.wait_with_output().unwrap();
331+
let stderr = String::from_utf8_lossy(&output.stderr);
332+
let stdout = String::from_utf8_lossy(&output.stdout);
333+
assert_contains!(stderr, "Download");
334+
assert_contains!(stdout, "createChalk: chalk");
335+
assert!(output.status.success());
336+
337+
let deno = util::deno_cmd_with_deno_dir(&deno_dir)
338+
.current_dir(util::testdata_path())
339+
.arg("run")
340+
.arg("--unstable")
341+
.arg("--allow-read")
342+
.arg("--allow-env")
343+
.arg("--reload=npm:chalk")
344+
.arg("npm/reload/main.ts")
345+
.env("NO_COLOR", "1")
346+
.envs(env_vars())
347+
.stdout(Stdio::piped())
348+
.stderr(Stdio::piped())
349+
.spawn()
350+
.unwrap();
351+
let output = deno.wait_with_output().unwrap();
352+
let stderr = String::from_utf8_lossy(&output.stderr);
353+
let stdout = String::from_utf8_lossy(&output.stdout);
354+
assert_contains!(stderr, "Download");
355+
assert_contains!(stdout, "createChalk: chalk");
356+
assert!(output.status.success());
357+
358+
let deno = util::deno_cmd_with_deno_dir(&deno_dir)
359+
.current_dir(util::testdata_path())
360+
.arg("run")
361+
.arg("--unstable")
362+
.arg("--allow-read")
363+
.arg("--allow-env")
364+
.arg("--reload=npm:foobar")
365+
.arg("npm/reload/main.ts")
366+
.env("NO_COLOR", "1")
367+
.envs(env_vars())
368+
.stdout(Stdio::piped())
369+
.stderr(Stdio::piped())
370+
.spawn()
371+
.unwrap();
372+
let output = deno.wait_with_output().unwrap();
373+
let stderr = String::from_utf8_lossy(&output.stderr);
374+
let stdout = String::from_utf8_lossy(&output.stdout);
375+
assert!(stderr.is_empty());
376+
assert_contains!(stdout, "createChalk: chalk");
377+
assert!(output.status.success());
378+
}
379+
269380
#[test]
270381
fn no_npm_after_first_run() {
271382
let _server = http_server();

cli/tests/testdata/npm/reload/main.ts

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import chalk from "npm:chalk@5";
2+
3+
console.log(chalk);

0 commit comments

Comments
 (0)