Skip to content

Commit aa69f3b

Browse files
committed
feat: add --require run arg to support commonJS
1 parent 58f7435 commit aa69f3b

File tree

22 files changed

+200
-14
lines changed

22 files changed

+200
-14
lines changed

cli/args/flags.rs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -806,6 +806,7 @@ pub struct Flags {
806806
pub eszip: bool,
807807
pub node_conditions: Vec<String>,
808808
pub preload: Vec<String>,
809+
pub require: Vec<String>,
809810
pub tunnel: bool,
810811
}
811812

@@ -4159,6 +4160,7 @@ fn compile_args_without_check_args(app: Command) -> Command {
41594160
.arg(ca_file_arg())
41604161
.arg(unsafely_ignore_certificate_errors_arg())
41614162
.arg(preload_arg())
4163+
.arg(require_arg())
41624164
.arg(min_dep_age_arg())
41634165
}
41644166

@@ -4749,6 +4751,15 @@ fn preload_arg() -> Arg {
47494751
.value_hint(ValueHint::FilePath)
47504752
}
47514753

4754+
fn require_arg() -> Arg {
4755+
Arg::new("require")
4756+
.long("require")
4757+
.value_name("FILE")
4758+
.action(ArgAction::Append)
4759+
.help("A list of CommonJS modules that will be executed before the main module (even if it's not with a .cjs or .tjs extension)")
4760+
.value_hint(ValueHint::FilePath)
4761+
}
4762+
47524763
fn min_dep_age_arg() -> Arg {
47534764
Arg::new("minimum-dependency-age")
47544765
.long("minimum-dependency-age")
@@ -6511,6 +6522,7 @@ fn compile_args_without_check_parse(
65116522
ca_file_arg_parse(flags, matches);
65126523
unsafely_ignore_certificate_errors_parse(flags, matches);
65136524
preload_arg_parse(flags, matches);
6525+
require_arg_parse(flags, matches);
65146526
min_dep_age_arg_parse(flags, matches);
65156527
Ok(())
65166528
}
@@ -6789,6 +6801,12 @@ fn preload_arg_parse(flags: &mut Flags, matches: &mut ArgMatches) {
67896801
}
67906802
}
67916803

6804+
fn require_arg_parse(flags: &mut Flags, matches: &mut ArgMatches) {
6805+
if let Some(require) = matches.remove_many::<String>("require") {
6806+
flags.require = require.collect();
6807+
}
6808+
}
6809+
67926810
fn min_dep_age_arg_parse(flags: &mut Flags, matches: &mut ArgMatches) {
67936811
flags.minimum_dependency_age = matches.remove_one("minimum-dependency-age");
67946812
}
@@ -13464,6 +13482,53 @@ Usage: deno repl [OPTIONS] [-- [ARGS]...]\n"
1346413482
);
1346513483
}
1346613484

13485+
#[test]
13486+
fn require_flag_test() {
13487+
let flags = flags_from_vec(svec![
13488+
"deno",
13489+
"run",
13490+
"--require",
13491+
"require.js",
13492+
"main.ts"
13493+
])
13494+
.unwrap();
13495+
assert_eq!(
13496+
flags,
13497+
Flags {
13498+
subcommand: DenoSubcommand::Run(RunFlags {
13499+
script: "main.ts".into(),
13500+
..Default::default()
13501+
}),
13502+
require: svec!["require.js"],
13503+
code_cache_enabled: true,
13504+
..Default::default()
13505+
}
13506+
);
13507+
13508+
let flags = flags_from_vec(svec![
13509+
"deno",
13510+
"run",
13511+
"--require",
13512+
"r1.js",
13513+
"--require",
13514+
"./r2.js",
13515+
"main.ts"
13516+
])
13517+
.unwrap();
13518+
assert_eq!(
13519+
flags,
13520+
Flags {
13521+
subcommand: DenoSubcommand::Run(RunFlags {
13522+
script: "main.ts".into(),
13523+
..Default::default()
13524+
}),
13525+
require: svec!["r1.js", "./r2.js"],
13526+
code_cache_enabled: true,
13527+
..Default::default()
13528+
}
13529+
);
13530+
}
13531+
1346713532
#[test]
1346813533
fn check_with_v8_flags() {
1346913534
let flags =

cli/args/mod.rs

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ mod flags_net;
55

66
use std::borrow::Cow;
77
use std::collections::HashMap;
8+
use std::collections::HashSet;
89
use std::env;
910
use std::net::SocketAddr;
1011
use std::num::NonZeroUsize;
@@ -637,17 +638,50 @@ impl CliOptions {
637638
self.flags.env_file.as_ref()
638639
}
639640

641+
/// Returns preload/import modules and require modules
642+
pub fn all_preload_modules(&self) -> Result<Vec<ModuleSpecifier>, AnyError> {
643+
if self.flags.preload.is_empty() && self.flags.require.is_empty() {
644+
return Ok(vec![]);
645+
}
646+
647+
let mut modules = HashSet::new();
648+
for preload_specifier in self.flags.preload.iter() {
649+
modules
650+
.insert(resolve_url_or_path(preload_specifier, self.initial_cwd())?);
651+
}
652+
653+
for require_specifier in self.flags.require.iter() {
654+
modules
655+
.insert(resolve_url_or_path(require_specifier, self.initial_cwd())?);
656+
}
657+
658+
Ok(modules.into_iter().collect())
659+
}
660+
640661
pub fn preload_modules(&self) -> Result<Vec<ModuleSpecifier>, AnyError> {
641662
if self.flags.preload.is_empty() {
642663
return Ok(vec![]);
643664
}
644665

645-
let mut preload = Vec::with_capacity(self.flags.preload.len());
666+
let mut modules = Vec::with_capacity(self.flags.preload.len());
646667
for preload_specifier in self.flags.preload.iter() {
647-
preload.push(resolve_url_or_path(preload_specifier, self.initial_cwd())?);
668+
modules.push(resolve_url_or_path(preload_specifier, self.initial_cwd())?);
669+
}
670+
671+
Ok(modules)
672+
}
673+
674+
pub fn require_modules(&self) -> Result<Vec<ModuleSpecifier>, AnyError> {
675+
if self.flags.require.is_empty() {
676+
return Ok(vec![]);
677+
}
678+
679+
let mut require = Vec::with_capacity(self.flags.require.len());
680+
for require_specifier in self.flags.require.iter() {
681+
require.push(resolve_url_or_path(require_specifier, self.initial_cwd())?);
648682
}
649683

650-
Ok(preload)
684+
Ok(require)
651685
}
652686

653687
fn resolve_main_module_with_resolver_if_bare(

cli/factory.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1271,6 +1271,7 @@ impl CliFactory {
12711271
} else {
12721272
deno_resolver::loader::AllowJsonImports::WithAttribute
12731273
},
1274+
require_modules: options.require_modules().unwrap_or_default(),
12741275
},
12751276
)))
12761277
})

cli/lib/standalone/binary.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ pub struct Metadata {
8787
pub workspace_resolver: SerializedWorkspaceResolver,
8888
pub entrypoint_key: String,
8989
pub preload_modules: Vec<String>,
90+
pub require_modules: Vec<String>,
9091
pub node_modules: Option<NodeModules>,
9192
pub unstable_config: UnstableConfig,
9293
pub otel_config: OtelConfig,

cli/lsp/config.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1469,6 +1469,7 @@ impl ConfigData {
14691469
specified_import_map: None,
14701470
types_node_version_req: Some(crate::npm::get_types_node_version_req()),
14711471
unstable_sloppy_imports: false,
1472+
require_modules: vec![],
14721473
},
14731474
);
14741475
let pb = ProgressBar::new(ProgressBarStyle::TextOnly);

cli/rt/run.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -849,6 +849,11 @@ pub async fn run(
849849
node_resolution_sys,
850850
node_resolver::NodeResolverOptions::default(),
851851
));
852+
let require_modules = metadata
853+
.require_modules
854+
.iter()
855+
.map(|key| root_dir_url.join(key).unwrap())
856+
.collect::<Vec<_>>();
852857
let cjs_tracker = Arc::new(CjsTracker::new(
853858
in_npm_pkg_checker.clone(),
854859
pkg_json_resolver.clone(),
@@ -859,6 +864,7 @@ pub async fn run(
859864
} else {
860865
IsCjsResolutionMode::ExplicitTypeCommonJs
861866
},
867+
require_modules,
862868
));
863869
let npm_req_resolver = Arc::new(NpmReqResolver::new(NpmReqResolverOptions {
864870
sys: sys.clone(),
@@ -1077,12 +1083,20 @@ pub async fn run(
10771083
Err(_) => main_module,
10781084
};
10791085

1080-
let preload_modules = metadata
1086+
let mut preload_modules = metadata
10811087
.preload_modules
10821088
.iter()
10831089
.map(|key| root_dir_url.join(key).unwrap())
10841090
.collect::<Vec<_>>();
10851091

1092+
let require_modules = metadata
1093+
.require_modules
1094+
.iter()
1095+
.map(|key| root_dir_url.join(key).unwrap())
1096+
.collect::<Vec<_>>();
1097+
1098+
preload_modules.extend(require_modules);
1099+
10861100
let mut worker = worker_factory.create_main_worker(
10871101
WorkerExecutionMode::Run,
10881102
permissions,

cli/standalone/binary.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -723,6 +723,13 @@ impl<'a> DenoCompileBinaryWriter<'a> {
723723
.map(|s| root_dir_url.specifier_key(&s).into_owned())
724724
.collect::<Vec<_>>();
725725

726+
let require_modules = self
727+
.cli_options
728+
.require_modules()?
729+
.into_iter()
730+
.map(|s| root_dir_url.specifier_key(&s).into_owned())
731+
.collect::<Vec<_>>();
732+
726733
let metadata = Metadata {
727734
argv: compile_flags.args.clone(),
728735
seed: self.cli_options.seed(),
@@ -744,6 +751,7 @@ impl<'a> DenoCompileBinaryWriter<'a> {
744751
env_vars_from_env_file,
745752
entrypoint_key: root_dir_url.specifier_key(entrypoint).into_owned(),
746753
preload_modules,
754+
require_modules,
747755
workspace_resolver: SerializedWorkspaceResolver {
748756
import_map: self.workspace_resolver.maybe_import_map().map(|i| {
749757
SerializedWorkspaceResolverImportMap {

cli/tools/bench/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -498,7 +498,7 @@ pub async fn run_benchmarks(
498498
return Ok(());
499499
}
500500

501-
let preload_modules = cli_options.preload_modules()?;
501+
let preload_modules = cli_options.all_preload_modules()?;
502502
let log_level = cli_options.log_level();
503503
let worker_factory =
504504
Arc::new(factory.create_cli_main_worker_factory().await?);
@@ -636,7 +636,7 @@ pub async fn run_benchmarks_with_watch(
636636
}
637637

638638
let log_level = cli_options.log_level();
639-
let preload_modules = cli_options.preload_modules()?;
639+
let preload_modules = cli_options.all_preload_modules()?;
640640
bench_specifiers(
641641
worker_factory,
642642
cli_options,

cli/tools/compile.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,7 @@ fn get_module_roots_and_include_paths(
436436
}
437437
}
438438

439-
for preload_module in cli_options.preload_modules()? {
439+
for preload_module in cli_options.all_preload_modules()? {
440440
module_roots.push(preload_module);
441441
}
442442

cli/tools/run/mod.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ pub async fn run_script(
9090
node_resolver.clone(),
9191
),
9292
))?;
93-
let preload_modules = cli_options.preload_modules()?;
93+
let preload_modules = cli_options.all_preload_modules()?;
9494

9595
if main_module.scheme() == "npm" {
9696
set_npm_user_agent();
@@ -126,7 +126,7 @@ pub async fn run_from_stdin(
126126
let factory = CliFactory::from_flags(flags);
127127
let cli_options = factory.cli_options()?;
128128
let main_module = cli_options.resolve_main_module()?;
129-
let preload_modules = cli_options.preload_modules()?;
129+
let preload_modules = cli_options.all_preload_modules()?;
130130

131131
maybe_npm_install(&factory).await?;
132132

@@ -190,7 +190,7 @@ async fn run_with_watch(
190190
);
191191
let cli_options = factory.cli_options()?;
192192
let main_module = cli_options.resolve_main_module()?;
193-
let preload_modules = cli_options.preload_modules()?;
193+
let preload_modules = cli_options.all_preload_modules()?;
194194

195195
if main_module.scheme() == "npm" {
196196
set_npm_user_agent();
@@ -230,7 +230,7 @@ pub async fn eval_command(
230230
let cli_options = factory.cli_options()?;
231231
let file_fetcher = factory.file_fetcher()?;
232232
let main_module = cli_options.resolve_main_module()?;
233-
let preload_modules = cli_options.preload_modules()?;
233+
let preload_modules = cli_options.all_preload_modules()?;
234234

235235
maybe_npm_install(&factory).await?;
236236

@@ -307,7 +307,7 @@ pub async fn run_eszip(
307307

308308
let mode = WorkerExecutionMode::Run;
309309
let main_module = resolve_url_or_path(entrypoint, cli_options.initial_cwd())?;
310-
let preload_modules = cli_options.preload_modules()?;
310+
let preload_modules = cli_options.all_preload_modules()?;
311311

312312
let worker_factory = factory
313313
.create_cli_main_worker_factory_with_roots(roots)

0 commit comments

Comments
 (0)