helloadhavan/github_issues huggingface dataset:
Repository: denoland/deno
Pull request: fix: node-api get_value_string_utf8 should use utf8_length

whoops. also did a drive-by cleanup of `isolate` usage since i noticed it while using `utf8_length(isolate)`

Changed files:
filename: cli/napi/js_native_api.rs
patch: @@ -54,7 +54,7 @@ impl Reference {
     finalize_data: *mut c_void,
     finalize_hint: *mut c_void,
   ) -> Box<Self> {
-    let isolate = unsafe { &mut *(*env).isolate_ptr };
+    let isolate = unsafe { (*env).isolate() };
 
     let mut reference = Box::new(Reference {
       env,
@@ -100,7 +100,7 @@ impl Reference {
 
   fn set_strong(&mut self) {
     if let ReferenceState::Weak(w) = &self.state {
-      let isolate = unsafe { &mut *(*self.env).isolate_ptr };
+      let isolate = unsafe { (*self.env).isolate() };
       if let Some(g) = w.to_global(isolate) {
         self.state = ReferenceState::Strong(g);
       }
@@ -113,7 +113,7 @@ impl Reference {
       let cb = Box::new(move |_: &mut v8::Isolate| {
         Reference::weak_callback(reference)
       });
-      let isolate = unsafe { &mut *(*self.env).isolate_ptr };
+      let isolate = unsafe { (*self.env).isolate() };
       self.state =
         ReferenceState::Weak(v8::Weak::with_finalizer(isolate, g, cb));
     }
@@ -2105,7 +2105,7 @@ fn napi_get_value_string_utf8(
   if buf.is_null() {
     check_arg!(env, result);
     unsafe {
-      *result = value.length();
+      *result = value.utf8_length(env.isolate());
     }
   } else if bufsize != 0 {
     let buffer =
@@ -3274,10 +3274,9 @@ fn napi_resolve_deferred(
   check_arg!(env, result);
   check_arg!(env, deferred);
 
-  let isolate = unsafe { &mut *env.isolate_ptr };
   let deferred_ptr =
     unsafe { NonNull::new_unchecked(deferred as *mut v8::PromiseResolver) };
-  let global = unsafe { v8::Global::from_raw(isolate, deferred_ptr) };
+  let global = unsafe { v8::Global::from_raw(env.isolate(), deferred_ptr) };
   let resolver = v8::Local::new(&mut env.scope(), global);
 
   if !resolver
@@ -3299,10 +3298,9 @@ fn napi_reject_deferred(
   check_arg!(env, result);
   check_arg!(env, deferred);
 
-  let isolate = unsafe { &mut *env.isolate_ptr };
   let deferred_ptr =
     unsafe { NonNull::new_unchecked(deferred as *mut v8::PromiseResolver) };
-  let global = unsafe { v8::Global::from_raw(isolate, deferred_ptr) };
+  let global = unsafe { v8::Global::from_raw(env.isolate(), deferred_ptr) };
   let resolver = v8::Local::new(&mut env.scope(), global);
 
   if !resolver
@@ -3481,11 +3479,10 @@ fn napi_adjust_external_memory(
   let env = check_env!(env);
   check_arg!(env, adjusted_value);
 
-  let isolate = unsafe { &mut *env.isolate_ptr };
-
   unsafe {
-    *adjusted_value =
-      isolate.adjust_amount_of_external_allocated_memory(change_in_bytes);
+    *adjusted_value = env
+      .isolate()
+      .adjust_amount_of_external_allocated_memory(change_in_bytes);
   }
 
   napi_clear_last_error(env)
Repository: nodejs/node
Pull request: Fix duplicated test descriptions

Some unit tests had duplicate names. Please review these small changes.

Thanks
Christos

Changed files:
filename: test/es-module/test-typescript-eval.mjs
patch: @@ -98,7 +98,7 @@ test('expect fail eval TypeScript CommonJS syntax with input-type module', async
   strictEqual(result.code, 1);
 });
 
-test('expect fail eval TypeScript CommonJS syntax with input-type module', async () => {
+test('expect fail eval TypeScript ESM syntax with input-type commonjs', async () => {
   const result = await spawnPromisified(process.execPath, [
     '--experimental-strip-types',
     '--input-type=commonjs',

filename: test/es-module/test-typescript.mjs
patch: @@ -287,7 +287,7 @@ test('execute a TypeScript file with CommonJS syntax requiring .mts', async () =
   strictEqual(result.code, 0);
 });
 
-test('execute a TypeScript file with CommonJS syntax requiring .mts with require-module', async () => {
+test('execute a TypeScript file with CommonJS syntax requiring .mts using require-module', async () => {
   const result = await spawnPromisified(process.execPath, [
     '--experimental-strip-types',
     '--experimental-require-module',
@@ -299,7 +299,7 @@ test('execute a TypeScript file with CommonJS syntax requiring .mts with require
   strictEqual(result.code, 0);
 });
 
-test('execute a TypeScript file with CommonJS syntax requiring .mts with require-module', async () => {
+test('execute a TypeScript file with CommonJS syntax requiring .cts using commonjs', async () => {
   const result = await spawnPromisified(process.execPath, [
     '--experimental-strip-types',
     '--no-warnings',
Repository: huggingface/transformers
Pull request: [tests] remove cuda-only test marker 

## What does this PR do?
This PR enables this case on XPU: https://github.com/huggingface/transformers/pull/36656. So we don't need this test marker anymore. Furthermore, `AwqConfigTest` already has the `require_torch_accelerator` test marker. 

```bash
================================================================================= short test summary info =================================================================================
PASSED tests/quantization/autoawq/test_awq.py::AwqConfigTest::test_wrong_backend
==================================================================================== 1 passed in 0.10s ====================================================================================
```
@ydshieh 

Changed files:
filename: src/transformers/utils/quantization_config.py
patch: @@ -893,12 +893,13 @@ def post_init(self):
 
         if self.backend == AwqBackendPackingMethod.LLMAWQ:
             # Only cuda device can run this function
-            if not torch.cuda.is_available():
-                raise ValueError("LLM-AWQ backend is only supported on CUDA")
-            compute_capability = torch.cuda.get_device_capability()
-            major, minor = compute_capability
-            if major < 8:
-                raise ValueError("LLM-AWQ backend is only supported on GPUs with compute capability >= 8.0")
+            if not (torch.cuda.is_available() or torch.xpu.is_available()):
+                raise ValueError("LLM-AWQ backend is only supported on CUDA and XPU")
+            if torch.cuda.is_available():
+                compute_capability = torch.cuda.get_device_capability()
+                major, minor = compute_capability
+                if major < 8:
+                    raise ValueError("LLM-AWQ backend is only supported on CUDA GPUs with compute capability >= 8.0")
 
         if self.do_fuse and self.fuse_max_seq_len is None:
             raise ValueError(

filename: tests/quantization/autoawq/test_awq.py
patch: @@ -41,7 +41,6 @@
 
 @require_torch_accelerator
 class AwqConfigTest(unittest.TestCase):
-    @require_torch_gpu
     def test_wrong_backend(self):
         """
         Simple test that checks if a user passes a wrong backend an error is raised
@@ -59,13 +58,15 @@ def test_wrong_backend(self):
         with self.assertRaises(ValueError):
             AwqConfig(bits=4, backend="unexisting-backend")
 
-        # Only cuda device can run this function
+        # Only cuda and xpu devices can run this function
         support_llm_awq = False
         if torch.cuda.is_available():
             compute_capability = torch.cuda.get_device_capability()
             major, minor = compute_capability
             if major >= 8:
                 support_llm_awq = True
+        elif torch.xpu.is_available():
+            support_llm_awq = True
 
         if support_llm_awq:
             # LLMAWQ should work on an A100
Repository: facebook/react
Pull request: [useSES shim] Import prefixed native API

Until useSyncExternalStore is finalized, the shim should import the prefixed version (unstable_useSyncExternalStore), which is available in the experimental builds. That way our early testers can start using it.

Changed files:
filename: packages/use-sync-external-store/src/__tests__/useSyncExternalStoreShared-test.js
patch: @@ -46,6 +46,8 @@ describe('Shared useSyncExternalStore behavior (shim and built-in)', () => {
           startTransition: _,
           // eslint-disable-next-line no-unused-vars
           useSyncExternalStore: __,
+          // eslint-disable-next-line no-unused-vars
+          unstable_useSyncExternalStore: ___,
           ...otherExports
         } = jest.requireActual('react');
         return otherExports;

filename: packages/use-sync-external-store/src/useSyncExternalStore.js
patch: @@ -17,7 +17,8 @@ const {
   useEffect,
   useLayoutEffect,
   useDebugValue,
-  useSyncExternalStore: builtInAPI,
+  // The built-in API is still prefixed.
+  unstable_useSyncExternalStore: builtInAPI,
 } = React;
 
 // Prefer the built-in API, if it exists. If it doesn't exist, then we assume
Repository: vercel/next.js
Pull request: [ts-next-plugin] fix: use `getSourceFile` instead of `fileExists` to check file existence

### Why?

The Next.js TypeScript plugin was doing a workaround for updating the virtual file with `deleteFile()` then `createFile()` since `updateFile()` failed even though `env.sys.fileExists()` passed.

It is because the system was created based on the FS system via `createFSBackedSystem()`, which falls back to read from the actual file system if the file doesn't exist on the current virtual file system.

https://github.com/microsoft/TypeScript-Website/blob/9d447358e4fc67c881202fb40115cd8adf70daad/packages/typescript-vfs/src/index.ts#L544

![CleanShot 2025-04-05 at 17 39 35@2x](https://github.com/user-attachments/assets/96b3ec2e-3b6d-407d-877f-bdd3224b156b)

### How?

Use `getSourceFile()` to check if the file actually exists. This is what`@typescript/vfs` uses to check before running the `updateFile()`.

https://github.com/microsoft/TypeScript-Website/blob/9d447358e4fc67c881202fb40115cd8adf70daad/packages/typescript-vfs/src/index.ts#L83-L87




Changed files:
filename: packages/next/src/server/typescript/rules/metadata.ts
patch: @@ -86,12 +86,9 @@ function updateVirtualFileWithType(
     sourceText.slice(nodeEnd) +
     TYPE_IMPORT
 
-  if (virtualTsEnv.sys.fileExists(fileName)) {
+  if (virtualTsEnv.getSourceFile(fileName)) {
     log('Updating file: ' + fileName)
-    // FIXME: updateFile() breaks as the file doesn't exists, which is weird.
-    // virtualTsEnv.updateFile(fileName, newSource)
-    virtualTsEnv.deleteFile(fileName)
-    virtualTsEnv.createFile(fileName, newSource)
+    virtualTsEnv.updateFile(fileName, newSource)
   } else {
     log('Creating file: ' + fileName)
     virtualTsEnv.createFile(fileName, newSource)
Repository: facebook/react
Pull request: Fix link

Fix link (branch master was renamed to main): 

master -> main

Changed files:
filename: packages/react/index.js
patch: @@ -7,7 +7,7 @@
  * @flow
  */
 
-// Keep in sync with https://github.com/facebook/flow/blob/master/lib/react.js
+// Keep in sync with https://github.com/facebook/flow/blob/main/lib/react.js
 export type StatelessFunctionalComponent<
   P,
 > = React$StatelessFunctionalComponent<P>;
Repository: denoland/deno
Pull request: fix: don't panic when cache is not available

Fixes #22144

Changed files:
filename: ext/cache/lib.rs
patch: @@ -6,6 +6,7 @@ use std::rc::Rc;
 use std::sync::Arc;
 
 use async_trait::async_trait;
+use deno_core::error::type_error;
 use deno_core::error::AnyError;
 use deno_core::op2;
 use deno_core::serde::Deserialize;
@@ -205,11 +206,12 @@ where
   let mut state = state.borrow_mut();
   if let Some(cache) = state.try_borrow::<CA>() {
     Ok(cache.clone())
-  } else {
-    let create_cache = state.borrow::<CreateCache<CA>>().clone();
+  } else if let Some(create_cache) = state.try_borrow::<CreateCache<CA>>() {
     let cache = create_cache.0();
     state.put(cache);
     Ok(state.borrow::<CA>().clone())
+  } else {
+    Err(type_error("CacheStorage is not available in this context."))
   }
 }
Repository: huggingface/transformers
Pull request: RWKV: fix mask warning typo

`RwKvModel.forward` is supposed to warn if `attention_mask` is passed. Right now the check is `attention_mask is None` which I assume was supposed to be `attention_mask is not None`, which this PR fixes. @gante

Changed files:
filename: src/transformers/models/rwkv/modeling_rwkv.py
patch: @@ -625,7 +625,7 @@ def forward(
         use_cache = use_cache if use_cache is not None else (self.config.use_cache if not self.training else False)
         return_dict = return_dict if return_dict is not None else self.config.use_return_dict
 
-        if attention_mask is None:
+        if attention_mask is not None:
             logger.warning_once("`attention_mask` was passed, but it is unused in this model.")
 
         if self.training == self.layers_are_rescaled:
Repository: ggml-org/llama.cpp
Pull request: Fix CMake Error for Vulkan with LLVM

Repro/Error:
```
cd BUILD-release-vulkan-clang
cmake .. --preset x64-windows-llvm-release -B ..\BUILD-release-vulkan-clang -DGGML_VULKAN=1
cmake --build . --config Release

[..]
[29/199] Performing configure step for 'vulkan-shaders-gen'
FAILED: ggml/src/ggml-vulkan/vulkan-shaders-gen-prefix/src/vulkan-shaders-gen-stamp/vulkan-shaders-gen-configure D:/projects/woa/misc/llama.cpp-git/BUILD-release-clang/ggml/src/ggml-vulkan/vulkan-shaders-gen-prefix/src/vulkan-shaders-gen-stamp/vulkan-shaders-gen-configure
C:\Windows\system32\cmd.exe /C "cd /D D:\projects\woa\misc\llama.cpp-git\BUILD-release-clang\ggml\src\ggml-vulkan\vulkan-shaders-gen-prefix\src\vulkan-shaders-gen-build && "C:\Program Files\CMake\bin\cmake.exe" -DCMAKE_TOOLCHAIN_FILE=D:/projects/woa/misc/llama.cpp-git/BUILD-release-clang/host-toolchain.cmake -DCMAKE_INSTALL_PREFIX=D:/projects/woa/misc/llama.cpp-git/BUILD-release-clang -DGGML_VULKAN_COOPMAT_GLSLC_SUPPORT=OFF -DGGML_VULKAN_COOPMAT2_GLSLC_SUPPORT=OFF -DGGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT=OFF -GNinja -S D:/projects/woa/misc/llama.cpp-git/ggml/src/ggml-vulkan/vulkan-shaders -B D:/projects/woa/misc/llama.cpp-git/BUILD-release-clang/ggml/src/ggml-vulkan/vulkan-shaders-gen-prefix/src/vulkan-shaders-gen-build && "C:\Program Files\CMake\bin\cmake.exe" -E touch D:/projects/woa/misc/llama.cpp-git/BUILD-release-clang/ggml/src/ggml-vulkan/vulkan-shaders-gen-prefix/src/vulkan-shaders-gen-stamp/vulkan-shaders-gen-configure"
-- The C compiler identification is unknown
-- The CXX compiler identification is unknown
CMake Error at CMakeLists.txt:2 (project):
  The CMAKE_C_COMPILER:

    C:/Program

  is not a full path to an existing compiler tool.

  Tell CMake where to find the compiler by setting either the environment
  variable "CC" or the CMake cache entry CMAKE_C_COMPILER to the full path to
  the compiler, or to the compiler name if it is in the PATH.


CMake Error at CMakeLists.txt:2 (project):
  The CMAKE_CXX_COMPILER:

    C:/Program

  is not a full path to an existing compiler tool.

  Tell CMake where to find the compiler by setting either the environment
  variable "CXX" or the CMake cache entry CMAKE_CXX_COMPILER to the full path
  to the compiler, or to the compiler name if it is in the PATH.


-- Configuring incomplete, errors occurred!
ninja: build stopped: subcommand failed.
```

This patch adds the missing quotes and makes LLVM builds with Vulkan support for ggml compile successfully.

Changed files:
filename: ggml/src/ggml-vulkan/cmake/host-toolchain.cmake.in
patch: @@ -4,8 +4,8 @@ set(CMAKE_CXX_FLAGS -O2)
 set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
 set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER)
 set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER)
-set(CMAKE_C_COMPILER @HOST_C_COMPILER@)
-set(CMAKE_CXX_COMPILER @HOST_CXX_COMPILER@)
+set(CMAKE_C_COMPILER "@HOST_C_COMPILER@")
+set(CMAKE_CXX_COMPILER "@HOST_CXX_COMPILER@")
 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY @CMAKE_RUNTIME_OUTPUT_DIRECTORY@)
 
 if("@CMAKE_C_COMPILER_ID@" STREQUAL "MSVC")
Repository: denoland/deno
Pull request: fix(cli): Explicitly cache NPM packages during `deno install`

Fixes a regression introduced in https://github.com/denoland/deno/pull/24170, where we wouldn't actually set up the node modules dir on `deno install` if there was an up to date deno lockfile present. 

Previously we were relying on the fact that resolving pending module resolution called `cache_packages` (which sets up the node modules dir). When pending resolutions were removed, and the `resolve_pending` function with it, we also removed the `cache_packages` call needed to set up node modules.

Changed files:
filename: cli/module_loader.rs
patch: @@ -75,6 +75,9 @@ pub async fn load_top_level_deps(factory: &CliFactory) -> Result<(), AnyError> {
   let npm_resolver = factory.npm_resolver().await?;
   if let Some(npm_resolver) = npm_resolver.as_managed() {
     npm_resolver.ensure_top_level_package_json_install().await?;
+    // TODO(nathanwhit): we call `cache_packages` if the lockfile is modified,
+    // so by calling it here it's possible we end up calling it twice
+    npm_resolver.cache_packages().await?;
   }
   // cache as many entries in the import map as we can
   if let Some(import_map) = factory.maybe_import_map().await? {

filename: tests/specs/install/future_install_node_modules/__test__.jsonc
patch: @@ -25,6 +25,44 @@
         }
       ]
     },
+    "install_sets_up_node_modules_with_lockfile": {
+      "tempDir": true,
+      "envs": {
+        "DENO_FUTURE": "1"
+      },
+      "steps": [
+        {
+          "args": "install",
+          "output": "install.out"
+        },
+        {
+          // check for lockfile
+          "args": [
+            "eval",
+            "console.log(Deno.readTextFileSync('./deno.lock').trim())"
+          ],
+          "output": "deno.lock.out"
+        },
+        {
+          // remove the lockfile
+          "args": [
+            "eval",
+            "Deno.removeSync('node_modules', {recursive: true});"
+          ],
+          "output": ""
+        },
+        {
+          // install, this time should use the lockfile
+          "args": "install",
+          "output": "install_lockfile.out"
+        },
+        {
+          // make sure we created the node_modules dir
+          "args": ["eval", "Deno.statSync('node_modules')"],
+          "output": ""
+        }
+      ]
+    },
     "install_errors_corrupted_lockfile": {
       "tempDir": true,
       "envs": {

filename: tests/specs/install/future_install_node_modules/install_lockfile.out
patch: @@ -0,0 +1,2 @@
+⚠️ `deno install` behavior will change in Deno 2. To preserve the current behavior use the `-g` or `--global` flag.
+Initialize @denotest/esm-basic@1.0.0

filename: tests/specs/npm/npmrc_not_next_to_package_json/main.out
patch: @@ -4,3 +4,4 @@
 [WILDCARD]
 Download http://localhost:4260/@denotest/esm-basic/1.0.0.tgz
 Initialize @denotest/esm-basic@1.0.0
+[WILDCARD]
Repository: denoland/deno
Pull request: fix(lsp): strip .js before probing for valid import fix

Fixes #23017.

Changed files:
filename: cli/lsp/analysis.rs
patch: @@ -76,7 +76,10 @@ static PREFERRED_FIXES: Lazy<HashMap<&'static str, (u32, bool)>> =
 static IMPORT_SPECIFIER_RE: Lazy<Regex> =
   lazy_regex::lazy_regex!(r#"\sfrom\s+["']([^"']*)["']"#);
 
-const SUPPORTED_EXTENSIONS: &[&str] = &[".ts", ".tsx", ".js", ".jsx", ".mjs"];
+const SUPPORTED_EXTENSIONS: &[&str] = &[
+  ".ts", ".tsx", ".js", ".jsx", ".mjs", ".mts", ".cjs", ".cts", ".d.ts",
+  ".d.mts", ".d.cts",
+];
 
 #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
 pub struct DataQuickFixChange {
@@ -436,6 +439,7 @@ impl<'a> TsResponseImportMapper<'a> {
         return Some(specifier);
       }
     }
+    let specifier = specifier.strip_suffix(".js").unwrap_or(specifier);
     for ext in SUPPORTED_EXTENSIONS {
       let specifier_with_ext = format!("{specifier}{ext}");
       if self

filename: tests/integration/lsp_tests.rs
patch: @@ -6071,6 +6071,78 @@ export class DuckConfig {
   client.shutdown();
 }
 
+#[test]
+fn lsp_code_actions_imports_dts() {
+  let context = TestContextBuilder::new().use_temp_cwd().build();
+  let temp_dir = context.temp_dir();
+  source_file(
+    temp_dir.path().join("decl.d.ts"),
+    "export type SomeType = 1;\n",
+  );
+  let mut client = context.new_lsp_command().build();
+  client.initialize_default();
+  let diagnostics = client.did_open(json!({
+    "textDocument": {
+      "uri": temp_dir.uri().join("file.ts").unwrap(),
+      "languageId": "typescript",
+      "version": 1,
+      "text": r#"
+        const a: SomeType = 1;
+        console.log(a);
+      "#,
+    }
+  }));
+  let res = client.write_request(
+    "textDocument/codeAction",
+    json!({
+      "textDocument": {
+        "uri": temp_dir.uri().join("file.ts").unwrap(),
+      },
+      "range": {
+        "start": { "line": 1, "character": 17 },
+        "end": { "line": 1, "character": 25 },
+      },
+      "context": {
+        "diagnostics": diagnostics.all(),
+        "only": ["quickfix"],
+      },
+    }),
+  );
+  assert_eq!(
+    res,
+    json!([{
+      "title": "Add import from \"./decl.d.ts\"",
+      "kind": "quickfix",
+      "diagnostics": [{
+        "range": {
+          "start": { "line": 1, "character": 17 },
+          "end": { "line": 1, "character": 25 },
+        },
+        "severity": 1,
+        "code": 2304,
+        "source": "deno-ts",
+        "message": "Cannot find name 'SomeType'.",
+      }],
+      "edit": {
+        "documentChanges": [{
+          "textDocument": {
+            "uri": temp_dir.uri().join("file.ts").unwrap(),
+            "version": 1,
+          },
+          "edits": [{
+            "range": {
+              "start": { "line": 0, "character": 0 },
+              "end": { "line": 0, "character": 0 },
+            },
+            "newText": "import { SomeType } from \"./decl.d.ts\";\n",
+          }],
+        }],
+      },
+    }])
+  );
+  client.shutdown();
+}
+
 #[test]
 fn lsp_code_actions_refactor() {
   let context = TestContextBuilder::new().use_temp_cwd().build();
Repository: vercel/next.js
Pull request: [test] consolidate missing tag dev test

This test is flaky in headless mode but passing in browser mode. It was timeout on checking the toast. Adding an assertion for it seems resolve the issue

Changed files:
filename: test/development/app-dir/missing-required-html-tags/index.test.ts
patch: @@ -12,7 +12,7 @@ describe('app-dir - missing required html tags', () => {
 
   it('should display correct error count in dev indicator', async () => {
     const browser = await next.browser('/')
-
+    await assertHasRedbox(browser)
     retry(async () => {
       expect(await hasErrorToast(browser)).toBe(true)
     })
Repository: facebook/react
Pull request: Clean up my "hard to read" code

# Overview

Apparently this code was [hard to read](https://github.com/tc39/proposal-pipeline-operator#deep-nesting-is-hard-to-read).

Changed files:
filename: scripts/jest/jest-cli.js
patch: @@ -309,17 +309,11 @@ function main() {
   validateOptions();
   const args = getCommandArgs();
   const envars = getEnvars();
+  const env = Object.entries(envars).map(([k, v]) => `${k}=${v}`);
 
   // Print the full command we're actually running.
-  console.log(
-    chalk.dim(
-      `$ ${Object.keys(envars)
-        .map(envar => `${envar}=${envars[envar]}`)
-        .join(' ')}`,
-      'node',
-      args.join(' ')
-    )
-  );
+  const command = `$ ${env.join(' ')} node ${args.join(' ')}`;
+  console.log(chalk.dim(command));
 
   // Print the release channel and project we're running for quick confirmation.
   console.log(