From 47dee65e4ad20847108d2f7e590c001ca9b93204 Mon Sep 17 00:00:00 2001 From: Satya Rohith Date: Fri, 23 Feb 2024 22:00:29 +0530 Subject: [PATCH] fix(ext/node): set correct process.argv0 (#22555) --- cli/factory.rs | 5 +++-- cli/standalone/mod.rs | 9 ++++----- cli/worker.rs | 12 +++--------- ext/node/polyfills/process.ts | 15 +++------------ runtime/js/99_main.js | 8 ++++---- runtime/worker_bootstrap.rs | 8 ++++---- tests/unit_node/process_test.ts | 12 +++++++++++- 7 files changed, 32 insertions(+), 37 deletions(-) diff --git a/cli/factory.rs b/cli/factory.rs index 9f3719510f..22bc6cdaf0 100644 --- a/cli/factory.rs +++ b/cli/factory.rs @@ -855,9 +855,10 @@ impl CliFactory { location: self.options.location_flag().clone(), // if the user ran a binary command, we'll need to set process.argv[0] // to be the name of the binary command instead of deno - maybe_binary_npm_command_name: self + argv0: self .options - .take_binary_npm_command_name(), + .take_binary_npm_command_name() + .or(std::env::args().next()), origin_data_folder_path: Some(self.deno_dir()?.origin_data_folder_path()), seed: self.options.seed(), unsafely_ignore_certificate_errors: self diff --git a/cli/standalone/mod.rs b/cli/standalone/mod.rs index d1b90eceeb..312a1841db 100644 --- a/cli/standalone/mod.rs +++ b/cli/standalone/mod.rs @@ -536,11 +536,10 @@ pub async fn run( is_npm_main: main_module.scheme() == "npm", skip_op_registration: true, location: metadata.location, - maybe_binary_npm_command_name: NpmPackageReqReference::from_specifier( - main_module, - ) - .ok() - .map(|req_ref| npm_pkg_req_ref_to_binary_command(&req_ref)), + argv0: NpmPackageReqReference::from_specifier(main_module) + .ok() + .map(|req_ref| npm_pkg_req_ref_to_binary_command(&req_ref)) + .or(std::env::args().next()), origin_data_folder_path: None, seed: metadata.seed, unsafely_ignore_certificate_errors: metadata diff --git a/cli/worker.rs b/cli/worker.rs index 5c252e92ce..302303f286 100644 --- a/cli/worker.rs +++ b/cli/worker.rs @@ -115,7 +115,7 @@ pub struct CliMainWorkerOptions { pub is_inspecting: bool, pub is_npm_main: bool, pub location: Option, - pub maybe_binary_npm_command_name: Option, + pub argv0: Option, pub origin_data_folder_path: Option, pub seed: Option, pub unsafely_ignore_certificate_errors: Option>, @@ -608,10 +608,7 @@ impl CliMainWorkerFactory { user_agent: version::get_user_agent().to_string(), inspect: shared.options.is_inspecting, has_node_modules_dir: shared.options.has_node_modules_dir, - maybe_binary_npm_command_name: shared - .options - .maybe_binary_npm_command_name - .clone(), + argv0: shared.options.argv0.clone(), node_ipc_fd: shared.node_ipc, disable_deprecated_api_warning: shared.disable_deprecated_api_warning, verbose_deprecated_api_warning: shared.verbose_deprecated_api_warning, @@ -815,10 +812,7 @@ fn create_web_worker_callback( user_agent: version::get_user_agent().to_string(), inspect: shared.options.is_inspecting, has_node_modules_dir: shared.options.has_node_modules_dir, - maybe_binary_npm_command_name: shared - .options - .maybe_binary_npm_command_name - .clone(), + argv0: shared.options.argv0.clone(), node_ipc_fd: None, disable_deprecated_api_warning: shared.disable_deprecated_api_warning, verbose_deprecated_api_warning: shared.verbose_deprecated_api_warning, diff --git a/ext/node/polyfills/process.ts b/ext/node/polyfills/process.ts index 5187184707..c6dfe6c628 100644 --- a/ext/node/polyfills/process.ts +++ b/ext/node/polyfills/process.ts @@ -45,8 +45,7 @@ import { isWindows } from "ext:deno_node/_util/os.ts"; import * as io from "ext:deno_io/12_io.js"; import { Command } from "ext:runtime/40_process.js"; -let argv0Getter = () => ""; -export let argv0 = "deno"; +export let argv0 = ""; export let arch = ""; @@ -389,9 +388,6 @@ class Process extends EventEmitter { argv = argv; get argv0() { - if (!argv0) { - argv0 = argv0Getter(); - } return argv0; } @@ -875,19 +871,14 @@ internals.__bootstrapNodeProcess = function ( ) { // Overwrites the 1st item with getter. if (typeof argv0Val === "string") { + argv0 = argv0Val; Object.defineProperty(argv, "0", { get: () => { return argv0Val; }, }); - argv0Getter = () => argv0Val; } else { - Object.defineProperty(argv, "0", { - get: () => { - return Deno.execPath(); - }, - }); - argv0Getter = () => Deno.execPath(); + Object.defineProperty(argv, "0", { get: () => argv0 }); } // Overwrites the 2st item with getter. diff --git a/runtime/js/99_main.js b/runtime/js/99_main.js index 11c26798b0..21c74aeff1 100644 --- a/runtime/js/99_main.js +++ b/runtime/js/99_main.js @@ -644,7 +644,7 @@ function bootstrapMainRuntime(runtimeOptions) { 2: unstableFeatures, 3: inspectFlag, 5: hasNodeModulesDir, - 6: maybeBinaryNpmCommandName, + 6: argv0, 7: shouldDisableDeprecatedApiWarning, 8: shouldUseVerboseDeprecatedApiWarning, 9: future, @@ -768,7 +768,7 @@ function bootstrapMainRuntime(runtimeOptions) { ObjectDefineProperty(globalThis, "Deno", core.propReadOnly(finalDenoNs)); if (nodeBootstrap) { - nodeBootstrap(hasNodeModulesDir, maybeBinaryNpmCommandName); + nodeBootstrap(hasNodeModulesDir, argv0); } if (future) { @@ -793,7 +793,7 @@ function bootstrapWorkerRuntime( 2: unstableFeatures, 4: enableTestingFeaturesFlag, 5: hasNodeModulesDir, - 6: maybeBinaryNpmCommandName, + 6: argv0, 7: shouldDisableDeprecatedApiWarning, 8: shouldUseVerboseDeprecatedApiWarning, } = runtimeOptions; @@ -897,7 +897,7 @@ function bootstrapWorkerRuntime( ObjectDefineProperty(globalThis, "Deno", core.propReadOnly(finalDenoNs)); if (nodeBootstrap) { - nodeBootstrap(hasNodeModulesDir, maybeBinaryNpmCommandName); + nodeBootstrap(hasNodeModulesDir, argv0); } } diff --git a/runtime/worker_bootstrap.rs b/runtime/worker_bootstrap.rs index 300829630f..c019dae1ac 100644 --- a/runtime/worker_bootstrap.rs +++ b/runtime/worker_bootstrap.rs @@ -58,7 +58,7 @@ pub struct BootstrapOptions { pub user_agent: String, pub inspect: bool, pub has_node_modules_dir: bool, - pub maybe_binary_npm_command_name: Option, + pub argv0: Option, pub node_ipc_fd: Option, pub disable_deprecated_api_warning: bool, pub verbose_deprecated_api_warning: bool, @@ -89,7 +89,7 @@ impl Default for BootstrapOptions { inspect: Default::default(), args: Default::default(), has_node_modules_dir: Default::default(), - maybe_binary_npm_command_name: None, + argv0: None, node_ipc_fd: None, disable_deprecated_api_warning: false, verbose_deprecated_api_warning: false, @@ -121,7 +121,7 @@ struct BootstrapV8<'a>( bool, // has_node_modules_dir bool, - // maybe_binary_npm_command_name + // argv0 Option<&'a str>, // disable_deprecated_api_warning, bool, @@ -147,7 +147,7 @@ impl BootstrapOptions { self.inspect, self.enable_testing_features, self.has_node_modules_dir, - self.maybe_binary_npm_command_name.as_deref(), + self.argv0.as_deref(), self.disable_deprecated_api_warning, self.verbose_deprecated_api_warning, self.future, diff --git a/tests/unit_node/process_test.ts b/tests/unit_node/process_test.ts index 24ef6a3161..0bbc9981fe 100644 --- a/tests/unit_node/process_test.ts +++ b/tests/unit_node/process_test.ts @@ -287,7 +287,17 @@ Deno.test({ Deno.test({ name: "process.argv0", - fn() { + async fn() { + const { stdout } = await new Deno.Command(Deno.execPath(), { + args: [ + "eval", + `import process from "node:process";console.log(process.argv0);`, + ], + stdout: "piped", + stderr: "null", + }).output(); + assertEquals(new TextDecoder().decode(stdout).trim(), Deno.execPath()); + assertEquals(typeof process.argv0, "string"); assert( process.argv0.match(/[^/\\]*deno[^/\\]*$/),