Skip to content

Commit e6637ab

Browse files
chore(internal): reland eszip changes (denoland#28294)
Co-authored-by: David Sherret <[email protected]>
1 parent 2292eb1 commit e6637ab

21 files changed

+488
-19
lines changed

Cargo.lock

+39-5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+2-1
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ deno_permissions = { version = "0.53.0", path = "./runtime/permissions" }
6666
deno_runtime = { version = "0.202.0", path = "./runtime" }
6767
deno_semver = "=0.7.1"
6868
deno_terminal = "0.2.0"
69+
eszip = "0.83.0"
6970
napi_sym = { version = "0.124.0", path = "./ext/napi/sym" }
7071
test_util = { package = "test_server", path = "./tests/util/server" }
7172

@@ -149,7 +150,7 @@ dashmap = "5.5.3"
149150
data-encoding = "2.3.3"
150151
data-url = "=0.3.1"
151152
deno_cache_dir = "=0.18.0"
152-
deno_error = "=0.5.5"
153+
deno_error = "=0.5.6"
153154
deno_native_certs = "0.3.0"
154155
deno_package_json = { version = "=0.5.1", default-features = false }
155156
deno_task_shell = "=0.20.2"

cli/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ deno_snapshots.workspace = true
8989
deno_task_shell.workspace = true
9090
deno_telemetry.workspace = true
9191
deno_terminal.workspace = true
92+
eszip.workspace = true
9293
libsui.workspace = true
9394
node_resolver.workspace = true
9495

cli/args/flags.rs

+23-2
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ pub struct CompileFlags {
127127
pub no_terminal: bool,
128128
pub icon: Option<String>,
129129
pub include: Vec<String>,
130+
pub eszip: bool,
130131
}
131132

132133
impl CompileFlags {
@@ -676,6 +677,7 @@ pub struct Flags {
676677
pub code_cache_enabled: bool,
677678
pub permissions: PermissionFlags,
678679
pub allow_scripts: PackagesAllowedScripts,
680+
pub eszip: bool,
679681
}
680682

681683
#[derive(Clone, Debug, Eq, PartialEq, Default, Serialize, Deserialize)]
@@ -3838,6 +3840,14 @@ fn runtime_misc_args(app: Command) -> Command {
38383840
.arg(seed_arg())
38393841
.arg(enable_testing_features_arg())
38403842
.arg(strace_ops_arg())
3843+
.arg(eszip_arg())
3844+
}
3845+
3846+
fn eszip_arg() -> Arg {
3847+
Arg::new("eszip-internal-do-not-use")
3848+
.hide(true)
3849+
.long("eszip-internal-do-not-use")
3850+
.action(ArgAction::SetTrue)
38413851
}
38423852

38433853
fn allow_import_arg() -> Arg {
@@ -4608,6 +4618,7 @@ fn compile_parse(
46084618
let target = matches.remove_one::<String>("target");
46094619
let icon = matches.remove_one::<String>("icon");
46104620
let no_terminal = matches.get_flag("no-terminal");
4621+
let eszip = matches.get_flag("eszip-internal-do-not-use");
46114622
let include = match matches.remove_many::<String>("include") {
46124623
Some(f) => f.collect(),
46134624
None => vec![],
@@ -4624,6 +4635,7 @@ fn compile_parse(
46244635
no_terminal,
46254636
icon,
46264637
include,
4638+
eszip,
46274639
});
46284640

46294641
Ok(())
@@ -5721,9 +5733,16 @@ fn runtime_args_parse(
57215733
enable_testing_features_arg_parse(flags, matches);
57225734
env_file_arg_parse(flags, matches);
57235735
strace_ops_parse(flags, matches);
5736+
eszip_arg_parse(flags, matches);
57245737
Ok(())
57255738
}
57265739

5740+
fn eszip_arg_parse(flags: &mut Flags, matches: &mut ArgMatches) {
5741+
if matches.get_flag("eszip-internal-do-not-use") {
5742+
flags.eszip = true;
5743+
}
5744+
}
5745+
57275746
fn inspect_arg_parse(flags: &mut Flags, matches: &mut ArgMatches) {
57285747
flags.inspect = matches.remove_one::<SocketAddr>("inspect");
57295748
flags.inspect_brk = matches.remove_one::<SocketAddr>("inspect-brk");
@@ -10308,7 +10327,8 @@ mod tests {
1030810327
target: None,
1030910328
no_terminal: false,
1031010329
icon: None,
10311-
include: vec![]
10330+
include: vec![],
10331+
eszip: false,
1031210332
}),
1031310333
type_check_mode: TypeCheckMode::Local,
1031410334
code_cache_enabled: true,
@@ -10332,7 +10352,8 @@ mod tests {
1033210352
target: None,
1033310353
no_terminal: true,
1033410354
icon: Some(String::from("favicon.ico")),
10335-
include: vec![]
10355+
include: vec![],
10356+
eszip: false
1033610357
}),
1033710358
import_map_path: Some("import_map.json".to_string()),
1033810359
no_remote: true,

cli/args/mod.rs

+4
Original file line numberDiff line numberDiff line change
@@ -599,6 +599,10 @@ impl CliOptions {
599599
}
600600
}
601601

602+
pub fn eszip(&self) -> bool {
603+
self.flags.eszip
604+
}
605+
602606
pub fn otel_config(&self) -> OtelConfig {
603607
self.flags.otel_config()
604608
}

cli/factory.rs

+65-8
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ use crate::graph_util::ModuleGraphBuilder;
7878
use crate::graph_util::ModuleGraphCreator;
7979
use crate::http_util::HttpClientProvider;
8080
use crate::module_loader::CliModuleLoaderFactory;
81+
use crate::module_loader::EszipModuleLoader;
8182
use crate::module_loader::ModuleLoadPreparer;
8283
use crate::node::CliCjsCodeAnalyzer;
8384
use crate::node::CliCjsModuleExportAnalyzer;
@@ -149,10 +150,36 @@ impl RootCertStoreProvider for CliRootCertStoreProvider {
149150
}
150151
}
151152

153+
#[derive(Debug)]
154+
struct EszipModuleLoaderProvider {
155+
cli_options: Arc<CliOptions>,
156+
deferred: once_cell::sync::OnceCell<Arc<EszipModuleLoader>>,
157+
}
158+
159+
impl EszipModuleLoaderProvider {
160+
pub async fn get(&self) -> Result<Option<&Arc<EszipModuleLoader>>, AnyError> {
161+
if self.cli_options.eszip() {
162+
if let DenoSubcommand::Run(run_flags) = self.cli_options.sub_command() {
163+
if self.deferred.get().is_none() {
164+
let eszip_loader = EszipModuleLoader::create(
165+
&run_flags.script,
166+
self.cli_options.initial_cwd(),
167+
)
168+
.await?;
169+
_ = self.deferred.set(Arc::new(eszip_loader));
170+
}
171+
return Ok(Some(self.deferred.get().unwrap()));
172+
}
173+
}
174+
Ok(None)
175+
}
176+
}
177+
152178
#[derive(Debug)]
153179
struct CliSpecifiedImportMapProvider {
154180
cli_options: Arc<CliOptions>,
155181
file_fetcher: Arc<CliFileFetcher>,
182+
eszip_module_loader_provider: Arc<EszipModuleLoaderProvider>,
156183
workspace_external_import_map_loader: Arc<WorkspaceExternalImportMapLoader>,
157184
}
158185

@@ -182,14 +209,17 @@ impl SpecifiedImportMapProvider for CliSpecifiedImportMapProvider {
182209
self.cli_options.resolve_specified_import_map_specifier()?;
183210
match maybe_import_map_specifier {
184211
Some(specifier) => {
185-
let value = resolve_import_map_value_from_specifier(
186-
&specifier,
187-
&self.file_fetcher,
188-
)
189-
.await
190-
.with_context(|| {
191-
format!("Unable to load '{}' import map", specifier)
192-
})?;
212+
let value = match self.eszip_module_loader_provider.get().await? {
213+
Some(eszip) => eszip.load_import_map_value(&specifier)?,
214+
None => resolve_import_map_value_from_specifier(
215+
&specifier,
216+
&self.file_fetcher,
217+
)
218+
.await
219+
.with_context(|| {
220+
format!("Unable to load '{}' import map", specifier)
221+
})?,
222+
};
193223
Ok(Some(deno_resolver::workspace::SpecifiedImportMap {
194224
base_url: specifier,
195225
value,
@@ -226,6 +256,12 @@ impl<T> Default for Deferred<T> {
226256
}
227257
}
228258

259+
impl<T: std::fmt::Debug> std::fmt::Debug for Deferred<T> {
260+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
261+
f.debug_tuple("Deferred").field(&self.0).finish()
262+
}
263+
}
264+
229265
impl<T> Deferred<T> {
230266
#[inline(always)]
231267
pub fn get_or_try_init(
@@ -270,6 +306,7 @@ struct CliFactoryServices {
270306
deno_dir_provider: Deferred<Arc<DenoDirProvider>>,
271307
emit_cache: Deferred<Arc<EmitCache>>,
272308
emitter: Deferred<Arc<Emitter>>,
309+
eszip_module_loader_provider: Deferred<Arc<EszipModuleLoaderProvider>>,
273310
feature_checker: Deferred<Arc<FeatureChecker>>,
274311
file_fetcher: Deferred<Arc<CliFileFetcher>>,
275312
found_pkg_json_dep_flag: Arc<FoundPackageJsonDepFlag>,
@@ -455,6 +492,20 @@ impl CliFactory {
455492
})
456493
}
457494

495+
fn eszip_module_loader_provider(
496+
&self,
497+
) -> Result<&Arc<EszipModuleLoaderProvider>, AnyError> {
498+
self
499+
.services
500+
.eszip_module_loader_provider
501+
.get_or_try_init(|| {
502+
Ok(Arc::new(EszipModuleLoaderProvider {
503+
cli_options: self.cli_options()?.clone(),
504+
deferred: Default::default(),
505+
}))
506+
})
507+
}
508+
458509
pub fn file_fetcher(&self) -> Result<&Arc<CliFileFetcher>, AnyError> {
459510
self.services.file_fetcher.get_or_try_init(|| {
460511
let cli_options = self.cli_options()?;
@@ -651,6 +702,9 @@ impl CliFactory {
651702
npm_system_info: self.flags.subcommand.npm_system_info(),
652703
specified_import_map: Some(Box::new(CliSpecifiedImportMapProvider {
653704
cli_options: self.cli_options()?.clone(),
705+
eszip_module_loader_provider: self
706+
.eszip_module_loader_provider()?
707+
.clone(),
654708
file_fetcher: self.file_fetcher()?.clone(),
655709
workspace_external_import_map_loader: self
656710
.workspace_external_import_map_loader()?
@@ -1120,6 +1174,8 @@ impl CliFactory {
11201174
Arc::new(NpmRegistryReadPermissionChecker::new(self.sys(), mode))
11211175
};
11221176

1177+
let maybe_eszip_loader =
1178+
self.eszip_module_loader_provider()?.get().await?.cloned();
11231179
let module_loader_factory = CliModuleLoaderFactory::new(
11241180
cli_options,
11251181
cjs_tracker,
@@ -1145,6 +1201,7 @@ impl CliFactory {
11451201
self.parsed_source_cache().clone(),
11461202
self.resolver().await?.clone(),
11471203
self.sys(),
1204+
maybe_eszip_loader,
11481205
);
11491206

11501207
let lib_main_worker_factory = LibMainWorkerFactory::new(

cli/main.rs

+10-3
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ async fn run_subcommand(flags: Arc<Flags>) -> Result<i32, AnyError> {
116116
}),
117117
DenoSubcommand::Bench(bench_flags) => spawn_subcommand(async {
118118
if bench_flags.watch.is_some() {
119-
tools::bench::run_benchmarks_with_watch(flags, bench_flags).await
119+
tools::bench::run_benchmarks_with_watch(flags, bench_flags).boxed_local().await
120120
} else {
121121
tools::bench::run_benchmarks(flags, bench_flags).await
122122
}
@@ -138,7 +138,11 @@ async fn run_subcommand(flags: Arc<Flags>) -> Result<i32, AnyError> {
138138
tools::clean::clean(flags)
139139
}),
140140
DenoSubcommand::Compile(compile_flags) => spawn_subcommand(async {
141-
tools::compile::compile(flags, compile_flags).await
141+
if compile_flags.eszip {
142+
tools::compile::compile_eszip(flags, compile_flags).boxed_local().await
143+
} else {
144+
tools::compile::compile(flags, compile_flags).await
145+
}
142146
}),
143147
DenoSubcommand::Coverage(coverage_flags) => spawn_subcommand(async {
144148
tools::coverage::cover_files(flags, coverage_flags)
@@ -202,7 +206,10 @@ async fn run_subcommand(flags: Arc<Flags>) -> Result<i32, AnyError> {
202206
}
203207
DenoSubcommand::Run(run_flags) => spawn_subcommand(async move {
204208
if run_flags.is_stdin() {
205-
tools::run::run_from_stdin(flags.clone()).await
209+
// these futures are boxed to prevent stack overflows on Windows
210+
tools::run::run_from_stdin(flags.clone()).boxed_local().await
211+
} else if flags.eszip {
212+
tools::run::run_eszip(flags, run_flags).boxed_local().await
206213
} else {
207214
let result = tools::run::run_script(WorkerExecutionMode::Run, flags.clone(), run_flags.watch).await;
208215
match result {

0 commit comments

Comments
 (0)