Skip to content

Commit 212db35

Browse files
committed
wip
1 parent cc5a133 commit 212db35

File tree

20 files changed

+190
-15
lines changed

20 files changed

+190
-15
lines changed

cli/args/flags.rs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -802,6 +802,7 @@ pub struct Flags {
802802
pub eszip: bool,
803803
pub node_conditions: Vec<String>,
804804
pub preload: Vec<String>,
805+
pub require: Vec<String>,
805806
pub tunnel: bool,
806807
}
807808

@@ -4016,6 +4017,7 @@ fn compile_args_without_check_args(app: Command) -> Command {
40164017
.arg(ca_file_arg())
40174018
.arg(unsafely_ignore_certificate_errors_arg())
40184019
.arg(preload_arg())
4020+
.arg(require_arg())
40194021
.arg(min_dep_age_arg())
40204022
}
40214023

@@ -4606,6 +4608,15 @@ fn preload_arg() -> Arg {
46064608
.value_hint(ValueHint::FilePath)
46074609
}
46084610

4611+
fn require_arg() -> Arg {
4612+
Arg::new("require")
4613+
.long("require")
4614+
.value_name("FILE")
4615+
.action(ArgAction::Append)
4616+
.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)")
4617+
.value_hint(ValueHint::FilePath)
4618+
}
4619+
46094620
fn min_dep_age_arg() -> Arg {
46104621
Arg::new("minimum-dependency-age")
46114622
.long("minimum-dependency-age")
@@ -6340,6 +6351,7 @@ fn compile_args_without_check_parse(
63406351
ca_file_arg_parse(flags, matches);
63416352
unsafely_ignore_certificate_errors_parse(flags, matches);
63426353
preload_arg_parse(flags, matches);
6354+
require_arg_parse(flags, matches);
63436355
min_dep_age_arg_parse(flags, matches);
63446356
Ok(())
63456357
}
@@ -6618,6 +6630,12 @@ fn preload_arg_parse(flags: &mut Flags, matches: &mut ArgMatches) {
66186630
}
66196631
}
66206632

6633+
fn require_arg_parse(flags: &mut Flags, matches: &mut ArgMatches) {
6634+
if let Some(require) = matches.remove_many::<String>("require") {
6635+
flags.require = require.collect();
6636+
}
6637+
}
6638+
66216639
fn min_dep_age_arg_parse(flags: &mut Flags, matches: &mut ArgMatches) {
66226640
flags.minimum_dependency_age = matches.remove_one("minimum-dependency-age");
66236641
}
@@ -13279,6 +13297,53 @@ Usage: deno repl [OPTIONS] [-- [ARGS]...]\n"
1327913297
);
1328013298
}
1328113299

13300+
#[test]
13301+
fn require_flag_test() {
13302+
let flags = flags_from_vec(svec![
13303+
"deno",
13304+
"run",
13305+
"--require",
13306+
"require.js",
13307+
"main.ts"
13308+
])
13309+
.unwrap();
13310+
assert_eq!(
13311+
flags,
13312+
Flags {
13313+
subcommand: DenoSubcommand::Run(RunFlags {
13314+
script: "main.ts".into(),
13315+
..Default::default()
13316+
}),
13317+
require: svec!["require.js"],
13318+
code_cache_enabled: true,
13319+
..Default::default()
13320+
}
13321+
);
13322+
13323+
let flags = flags_from_vec(svec![
13324+
"deno",
13325+
"run",
13326+
"-r",
13327+
"r1.js",
13328+
"--require",
13329+
"./r2.js",
13330+
"main.ts"
13331+
])
13332+
.unwrap();
13333+
assert_eq!(
13334+
flags,
13335+
Flags {
13336+
subcommand: DenoSubcommand::Run(RunFlags {
13337+
script: "main.ts".into(),
13338+
..Default::default()
13339+
}),
13340+
require: svec!["r1.js", "./r2.js"],
13341+
code_cache_enabled: true,
13342+
..Default::default()
13343+
}
13344+
);
13345+
}
13346+
1328213347
#[test]
1328313348
fn check_with_v8_flags() {
1328413349
let flags =

cli/args/mod.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -650,6 +650,19 @@ impl CliOptions {
650650
Ok(preload)
651651
}
652652

653+
pub fn require_modules(&self) -> Result<Vec<ModuleSpecifier>, AnyError> {
654+
if self.flags.require.is_empty() {
655+
return Ok(vec![]);
656+
}
657+
658+
let mut require = Vec::with_capacity(self.flags.require.len());
659+
for require_specifier in self.flags.require.iter() {
660+
require.push(resolve_url_or_path(require_specifier, self.initial_cwd())?);
661+
}
662+
663+
Ok(require)
664+
}
665+
653666
fn resolve_main_module_with_resolver_if_bare(
654667
&self,
655668
raw_specifier: &str,

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/lib/worker.rs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -579,11 +579,13 @@ impl<TSys: DenoLibSys> LibMainWorkerFactory<TSys> {
579579
permissions: PermissionsContainer,
580580
main_module: Url,
581581
preload_modules: Vec<Url>,
582+
require_modules: Vec<Url>,
582583
) -> Result<LibMainWorker, CoreError> {
583584
self.create_custom_worker(
584585
mode,
585586
main_module,
586587
preload_modules,
588+
require_modules,
587589
permissions,
588590
vec![],
589591
Default::default(),
@@ -598,6 +600,7 @@ impl<TSys: DenoLibSys> LibMainWorkerFactory<TSys> {
598600
mode: WorkerExecutionMode,
599601
main_module: Url,
600602
preload_modules: Vec<Url>,
603+
require_modules: Vec<Url>,
601604
permissions: PermissionsContainer,
602605
custom_extensions: Vec<Extension>,
603606
stdio: deno_runtime::deno_io::Stdio,
@@ -716,6 +719,7 @@ impl<TSys: DenoLibSys> LibMainWorkerFactory<TSys> {
716719
Ok(LibMainWorker {
717720
main_module,
718721
preload_modules,
722+
require_modules,
719723
worker,
720724
})
721725
}
@@ -803,6 +807,7 @@ impl<TSys: DenoLibSys> LibMainWorkerFactory<TSys> {
803807
pub struct LibMainWorker {
804808
main_module: Url,
805809
preload_modules: Vec<Url>,
810+
require_modules: Vec<Url>,
806811
worker: MainWorker,
807812
}
808813

@@ -864,6 +869,16 @@ impl LibMainWorker {
864869
self.worker.evaluate_module(id).await
865870
}
866871

872+
pub async fn execute_require_modules(&mut self) -> Result<(), CoreError> {
873+
for require_module_url in self.require_modules.iter() {
874+
// Execute CommonJS modules using Node.js require
875+
let id = self.worker.preload_side_module(require_module_url).await?;
876+
self.worker.evaluate_module(id).await?;
877+
self.worker.run_event_loop(false).await?;
878+
}
879+
Ok(())
880+
}
881+
867882
pub async fn execute_preload_modules(&mut self) -> Result<(), CoreError> {
868883
for preload_module_url in self.preload_modules.iter() {
869884
let id = self.worker.preload_side_module(preload_module_url).await?;
@@ -876,7 +891,10 @@ impl LibMainWorker {
876891
pub async fn run(&mut self) -> Result<i32, CoreError> {
877892
log::debug!("main_module {}", self.main_module);
878893

879-
// Run preload modules first if they were defined
894+
// Run require modules first if they were defined (CommonJS)
895+
self.execute_require_modules().await?;
896+
897+
// Run preload modules (ES modules)
880898
self.execute_preload_modules().await?;
881899

882900
self.execute_main_module().await?;

cli/module_loader.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,7 @@ struct SharedCliModuleLoaderState {
346346
sys: CliSys,
347347
in_flight_loads_tracker: InFlightModuleLoadsTracker,
348348
maybe_eszip_loader: Option<Arc<EszipModuleLoader>>,
349+
require_modules: Arc<HashSet<ModuleSpecifier>>,
349350
}
350351

351352
struct InFlightModuleLoadsTracker {
@@ -410,6 +411,8 @@ impl CliModuleLoaderFactory {
410411
sys: CliSys,
411412
maybe_eszip_loader: Option<Arc<EszipModuleLoader>>,
412413
) -> Self {
414+
let require_modules_list = options.require_modules().unwrap_or_default();
415+
413416
Self {
414417
shared: Arc::new(SharedCliModuleLoaderState {
415418
graph_kind: options.graph_kind(),
@@ -442,6 +445,9 @@ impl CliModuleLoaderFactory {
442445
cleanup_task_handle: Arc::new(Mutex::new(None)),
443446
},
444447
maybe_eszip_loader,
448+
require_modules: Arc::new(
449+
require_modules_list.into_iter().collect::<HashSet<_>>(),
450+
),
445451
}),
446452
}
447453
}
@@ -578,9 +584,10 @@ impl<TGraphContainer: ModuleGraphContainer>
578584
specifier: &ModuleSpecifier,
579585
maybe_referrer: Option<&ModuleSpecifier>,
580586
requested_module_type: &RequestedModuleType,
587+
is_from_require: bool,
581588
) -> Result<ModuleSource, ModuleLoaderError> {
582589
let code_source = self
583-
.load_code_source(specifier, maybe_referrer, requested_module_type)
590+
.load_code_source(specifier, maybe_referrer, requested_module_type, is_from_require)
584591
.await
585592
.map_err(JsErrorBox::from_err)?;
586593

@@ -632,6 +639,7 @@ impl<TGraphContainer: ModuleGraphContainer>
632639
specifier: &ModuleSpecifier,
633640
maybe_referrer: Option<&ModuleSpecifier>,
634641
requested_module_type: &RequestedModuleType,
642+
is_from_require: bool,
635643
) -> Result<ModuleCodeStringSource, CliModuleLoaderError> {
636644
// this loader maintains npm specifiers in dynamic imports when resolving
637645
// so that they can be properly preloaded, but now we might receive them
@@ -674,6 +682,7 @@ impl<TGraphContainer: ModuleGraphContainer>
674682
&specifier,
675683
maybe_referrer,
676684
&deno_resolver_requested_module_type,
685+
is_from_require,
677686
)
678687
.await?
679688
{
@@ -1026,13 +1035,15 @@ impl<TGraphContainer: ModuleGraphContainer> ModuleLoader
10261035

10271036
let specifier = specifier.clone();
10281037
let maybe_referrer = maybe_referrer.cloned();
1038+
let is_from_require = self.0.shared.require_modules.contains(&specifier);
10291039
deno_core::ModuleLoadResponse::Async(
10301040
async move {
10311041
inner
10321042
.load_inner(
10331043
&specifier,
10341044
maybe_referrer.as_ref().map(|r| &r.specifier),
10351045
&options.requested_module_type,
1046+
is_from_require,
10361047
)
10371048
.await
10381049
.map_err(|err| {

cli/rt/run.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1082,11 +1082,18 @@ pub async fn run(
10821082
.map(|key| root_dir_url.join(key).unwrap())
10831083
.collect::<Vec<_>>();
10841084

1085+
let require_modules = metadata
1086+
.require_modules
1087+
.iter()
1088+
.map(|key| root_dir_url.join(key).unwrap())
1089+
.collect::<Vec<_>>();
1090+
10851091
let mut worker = worker_factory.create_main_worker(
10861092
WorkerExecutionMode::Run,
10871093
permissions,
10881094
main_module,
10891095
preload_modules,
1096+
require_modules,
10901097
)?;
10911098

10921099
let exit_code = worker.run().await?;

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: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ async fn bench_specifier_inner(
196196
WorkerExecutionMode::Bench,
197197
specifier.clone(),
198198
preload_modules,
199+
vec![],
199200
permissions_container,
200201
vec![ops::bench::deno_bench::init(sender.clone())],
201202
Default::default(),

cli/tools/bundle/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1367,7 +1367,7 @@ impl DenoPluginHandler {
13671367
let graph = self.module_graph_container.graph();
13681368
let module_or_asset = self
13691369
.module_loader
1370-
.load(&graph, &specifier, None, requested_type)
1370+
.load(&graph, &specifier, None, requested_type, false)
13711371
.await;
13721372
let module_or_asset = match module_or_asset {
13731373
Ok(module_or_asset) => module_or_asset,

cli/tools/deploy.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ pub async fn deploy(mut flags: Flags) -> Result<i32, AnyError> {
6161
WorkerExecutionMode::Deploy,
6262
specifier,
6363
vec![],
64+
vec![],
6465
PermissionsContainer::allow_all(
6566
factory.permission_desc_parser()?.clone(),
6667
),

0 commit comments

Comments
 (0)