nebius/SWE-rebench-V2-PRs huggingface dataset:
Repository: wix/Detox
Pull request #1341 (2019-04-27 09:30:48)

code: print a warning instead of an error if artifact files are not found
- [x] This is a small change 

---

**Description:**

Instead of red error lines in the log, Detox will be printing warnings — to not confuse the users who might attribute the "errors" to a cause of why their tests are failing.

<img width="640" alt="image" src="https://user-images.githubusercontent.com/1962469/56847764-12e1cc80-68e8-11e9-9788-5efe6be9986e.png">



Patch:
diff --git a/detox/src/artifacts/templates/artifact/Artifact.js b/detox/src/artifacts/templates/artifact/Artifact.js
index ace87db75..868b9beca 100644
--- a/detox/src/artifacts/templates/artifact/Artifact.js
+++ b/detox/src/artifacts/templates/artifact/Artifact.js
@@ -107,7 +107,7 @@ class Artifact {
       logger.debug({ event: 'MOVE_FILE' }, `moving "${source}" to ${destination}`);
       await fs.move(source, destination);
     } else {
-      logger.error({ event: 'MOVE_FILE_ERROR'} , `did not find temporary file: ${source}`);
+      logger.warn({ event: 'MOVE_FILE_MISSING'} , `did not find temporary file: ${source}`);
     }
   }
 }


Test patch:
diff --git a/detox/src/artifacts/templates/artifact/Artifact.test.js b/detox/src/artifacts/templates/artifact/Artifact.test.js
index e9624b23e..607eae2cc 100644
--- a/detox/src/artifacts/templates/artifact/Artifact.test.js
+++ b/detox/src/artifacts/templates/artifact/Artifact.test.js
@@ -502,7 +502,7 @@ describe(Artifact.name, () => {
       it('should log error if source file does not exist', async () => {
         await Artifact.moveTemporaryFile(logger, source, destination = tempfile('.dest'));
         expect(await fs.exists(destination)).toBe(false);
-        expect(logger.error).toHaveBeenCalledWith({ event: 'MOVE_FILE_ERROR' }, expect.any(String));
+        expect(logger.warn).toHaveBeenCalledWith({ event: 'MOVE_FILE_MISSING' }, expect.any(String));
       });
     });
   });
Repository: wix/Detox
Pull request #1739 (2019-11-06 13:10:36)

encapsulate the path in "adb.EXE devices" call
- [x] This is a small change 
- [x] This change has been reported in issue #1737



noomorph: Please update unit tests.
forki: @noomorph I'm a newcomer could you please point me to the ones that I broke?
noomorph: I reckon, in ADB.test.js

בתאריך יום ד׳, 6 בנוב׳ 2019, 20:35, מאת Steffen Forkmann ‏<
notifications@github.com>:

> @noomorph <https://github.com/noomorph> I'm a newcomer could you please
> point me to the ones that I broke?
>
> —
> You are receiving this because you were mentioned.
> Reply to this email directly, view it on GitHub
> <https://github.com/wix/Detox/pull/1739?email_source=notifications&email_token=AAO7DZJJUTVX4SM4P5PELJDQSME5JA5CNFSM4JJUVRJ2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEDHROEY#issuecomment-550442771>,
> or unsubscribe
> <https://github.com/notifications/unsubscribe-auth/AAO7DZIVZN773GVMMGDYMX3QSME5JANCNFSM4JJUVRJQ>
> .
>

forki: I think the unittests are now fixed

Patch:
diff --git a/detox/src/devices/android/ADB.js b/detox/src/devices/android/ADB.js
index be9be26ff..6429ec93a 100644
--- a/detox/src/devices/android/ADB.js
+++ b/detox/src/devices/android/ADB.js
@@ -258,7 +258,7 @@ class ADB {
 
   async adbCmd(deviceId, params, options) {
     const serial = `${deviceId ? `-s ${deviceId}` : ''}`;
-    const cmd = `${this.adbBin} ${serial} ${params}`;
+    const cmd = `"${this.adbBin}" ${serial} ${params}`;
     const retries = _.get(options, 'retries', 1);
     _.unset(options, 'retries');
 


Test patch:
diff --git a/detox/src/devices/android/ADB.test.js b/detox/src/devices/android/ADB.test.js
index 1e23ae0c3..fd6e1878a 100644
--- a/detox/src/devices/android/ADB.test.js
+++ b/detox/src/devices/android/ADB.test.js
@@ -44,7 +44,7 @@ describe('ADB', () => {
   describe('devices', () => {
     it(`should invoke ADB`, async () => {
       await adb.devices();
-      expect(exec).toHaveBeenCalledWith(`${adbBinPath}  devices`, { verbosity: 'high' }, undefined, 1);
+      expect(exec).toHaveBeenCalledWith(`"${adbBinPath}"  devices`, { verbosity: 'high' }, undefined, 1);
       expect(exec).toHaveBeenCalledTimes(1);
     });
 
@@ -137,11 +137,11 @@ describe('ADB', () => {
     await adb.install('emulator-5556', 'path inside "quotes" to/app');
 
     expect(exec).toHaveBeenCalledWith(
-      expect.stringContaining('adb -s emulator-5556 shell "getprop ro.build.version.sdk"'),
+      expect.stringContaining('adb" -s emulator-5556 shell "getprop ro.build.version.sdk"'),
       {}, undefined, 5);
 
     expect(exec).toHaveBeenCalledWith(
-      expect.stringContaining('adb -s emulator-5556 install -rg "path inside \\"quotes\\" to/app"'),
+      expect.stringContaining('adb" -s emulator-5556 install -rg "path inside \\"quotes\\" to/app"'),
       undefined, undefined, 1);
   });
Repository: wix/Detox
Pull request #1877 (2020-01-26 12:48:58)

Changed log stream predicate from processImagePath to process==
**Description:**
Changed `log stream` predicate from processImagePath to process==. This predicate suites detox much more since it is constant between installs, unlike processImagePath which changes on every reinstallation.


rotemmiz: This fixes some of the issues presented in https://github.com/wix/Detox/issues/1445
LeoNatan: Just a note: #1445 refers to the internal predicate, rather than the hint predicate.

Patch:
diff --git a/detox/src/devices/ios/AppleSimUtils.js b/detox/src/devices/ios/AppleSimUtils.js
index 5df2488e5..0146df16e 100644
--- a/detox/src/devices/ios/AppleSimUtils.js
+++ b/detox/src/devices/ios/AppleSimUtils.js
@@ -1,4 +1,5 @@
 const _ = require('lodash');
+const path = require('path');
 const {joinArgs} = require('../../utils/argparse');
 const exec = require('../../utils/exec');
 const log = require('../../utils/logger').child({ __filename });
@@ -299,7 +300,8 @@ class AppleSimUtils {
 
   async _printLoggingHint(udid, bundleId) {
     const appContainer = await this.getAppContainer(udid, bundleId);
-    const predicate = `processImagePath beginsWith "${appContainer}"`;
+    const CFBundleExecutable = await exec.execAsync(`/usr/libexec/PlistBuddy -c "Print CFBundleExecutable" "${path.join(appContainer, 'Info.plist')}"`);
+    const predicate = `process == ${CFBundleExecutable}`;
     const command = `/usr/bin/xcrun simctl spawn ${udid} log stream --level debug --style compact --predicate '${predicate}'`;
 
     log.info(`${bundleId} launched. To watch simulator logs, run:\n        ${command}`);
diff --git a/detox/src/utils/exec.js b/detox/src/utils/exec.js
index 3e05d1eae..d57270312 100644
--- a/detox/src/utils/exec.js
+++ b/detox/src/utils/exec.js
@@ -158,9 +158,13 @@ async function interruptProcess(childProcessPromise, signal = 'SIGINT') {
   });
 }
 
+async function execAsync(command) {
+  const result = await exec(command);
+  return _.trim(result.stdout);
+}
 module.exports = {
   execWithRetriesAndLogs,
   spawnAndLog,
   interruptProcess,
+  execAsync
 };
-
diff --git a/detox/wallaby.js b/detox/wallaby.js
index e307256fc..ee2b3f62f 100644
--- a/detox/wallaby.js
+++ b/detox/wallaby.js
@@ -15,6 +15,7 @@ module.exports = function(wallaby) {
       'src/**/*.js',
       'src/**/*.mock.*',
       '!src/**/*.test.js',
+      '__tests__/setupJest.js'
     ],
 
     tests: [


Test patch:
diff --git a/detox/src/utils/exec.test.js b/detox/src/utils/exec.test.js
index 987ac1822..a3f4cd3eb 100644
--- a/detox/src/utils/exec.test.js
+++ b/detox/src/utils/exec.test.js
@@ -277,6 +277,12 @@ describe('spawn', () => {
     expect(log.error).toBeCalledWith(expect.objectContaining({ event: 'SPAWN_ERROR' }), 'command failed with code = -2');
     expect(log.error).toBeCalledWith(expect.objectContaining({ event: 'SPAWN_STDERR', stderr: true }), 'Command `command` not found.');
   });
+
+  it(`execAsync command with no arguments successfully`, async () => {
+    mockCppSuccessful(cpp);
+    await exec.execAsync('bin');
+    expect(cpp.exec).toHaveBeenCalledWith(`bin`);
+  });
 });
 
 function nextCycle() {
Repository: wix/Detox
Pull request #1997 (2020-04-06 06:46:07)

fix(artifacts): by default take appNotReady screenshot
- [x] This is a small change 

---

**Description:**

This fixes the thing I forgot when merging both #1971 and #1980.
I think that the right thing to do even if the user supplies this as a configuration:

```js
{
  "takeWhen": {
    "testStart": true,
    // "appNotReady": undefined,
  }
}
```

is still set `appNotReady = true` by default, unless it is explicitly forbidden, which is doubtful, to be honest.



Patch:
diff --git a/detox/src/artifacts/screenshot/ScreenshotArtifactPlugin.js b/detox/src/artifacts/screenshot/ScreenshotArtifactPlugin.js
index c35a1cc30..49ee3cd41 100644
--- a/detox/src/artifacts/screenshot/ScreenshotArtifactPlugin.js
+++ b/detox/src/artifacts/screenshot/ScreenshotArtifactPlugin.js
@@ -1,3 +1,4 @@
+const _ = require('lodash');
 const TwoSnapshotsPerTestPlugin = require('../templates/plugin/TwoSnapshotsPerTestPlugin');
 
 /***
@@ -6,6 +7,10 @@ const TwoSnapshotsPerTestPlugin = require('../templates/plugin/TwoSnapshotsPerTe
 class ScreenshotArtifactPlugin extends TwoSnapshotsPerTestPlugin {
   constructor({ api }) {
     super({ api });
+
+    _.defaults(this.takeAutomaticSnapshots, {
+      appNotReady: true,
+    })
   }
 
   async preparePathForSnapshot(testSummary, name) {


Test patch:
diff --git a/detox/src/artifacts/screenshot/ScreenshotArtifactPlugin.test.js b/detox/src/artifacts/screenshot/ScreenshotArtifactPlugin.test.js
index b515c2bcc..8b387caf6 100644
--- a/detox/src/artifacts/screenshot/ScreenshotArtifactPlugin.test.js
+++ b/detox/src/artifacts/screenshot/ScreenshotArtifactPlugin.test.js
@@ -1,6 +1,34 @@
 const ScreenshotArtifactPlugin = require('./ScreenshotArtifactPlugin');
 
 describe('ScreenshotArtifactPlugin', () => {
+  describe('default options', () => {
+    it('should have takeAutomaticSnapshots.appReady = true', () => {
+      const plugin = new ScreenshotArtifactPlugin({
+        api: {
+          userConfig: {
+            takeWhen: {},
+          },
+        }
+      });
+
+      expect(plugin.takeAutomaticSnapshots.appNotReady).toBe(true);
+    });
+
+    it('should allow to set takeAutomaticSnapshots.appReady to false', () => {
+      const plugin = new ScreenshotArtifactPlugin({
+        api: {
+          userConfig: {
+            takeWhen: {
+              appNotReady: false,
+            },
+          },
+        }
+      });
+
+      expect(plugin.takeAutomaticSnapshots.appNotReady).toBe(false);
+    });
+  });
+
   describe('static parseConfig(config)', () => {
     const parseConfig = ScreenshotArtifactPlugin.parseConfig;
Repository: wix/Detox
Pull request #2322 (2020-09-09 22:42:24)

iOS: fix default scroll and ability to override params
**Description:**
iOS: fix default scroll and ability to override params (NaN and null params were being deleted, they aren't anymore)


Patch:
diff --git a/detox/ios/Detox/Actions/UIScrollView+DetoxActions.m b/detox/ios/Detox/Actions/UIScrollView+DetoxActions.m
index 3127235aa..e35eea030 100644
--- a/detox/ios/Detox/Actions/UIScrollView+DetoxActions.m
+++ b/detox/ios/Detox/Actions/UIScrollView+DetoxActions.m
@@ -218,7 +218,7 @@ if(isnan(normalizedStartingPoint.other) || normalizedStartingPoint.other < 0 ||
 } \
 if(isnan(normalizedStartingPoint.main) || normalizedStartingPoint.main < 0 || normalizedStartingPoint.main > 1) \
 { \
-	normalizedStartingPoint.main = offset < 0 ? 0.97 : 0.03; \
+	normalizedStartingPoint.main = offset < 0 ? 0.95 : 0.05; \
 }
 
 - (void)dtx_scrollWithOffset:(CGPoint)offset normalizedStartingPoint:(CGPoint)normalizedStartingPoint
diff --git a/detox/src/ios/expectTwo.js b/detox/src/ios/expectTwo.js
index cc5b9d3ee..70c668192 100644
--- a/detox/src/ios/expectTwo.js
+++ b/detox/src/ios/expectTwo.js
@@ -72,7 +72,7 @@ class Expect {
       ...(this.element.index !== undefined && { atIndex: this.element.index }),
       ...(this.modifiers.length !== 0 && {modifiers: this.modifiers}),
       expectation,
-      ...(params.length !== 0 && { params: _.without(params, NaN, null, undefined) })
+      ...(params.length !== 0 && { params: _.without(params, undefined) })
     };
   }
 
@@ -206,11 +206,12 @@ class Element {
   }
 
   createInvocation(action, ...params) {
+    params = _.map(params, (param) => _.isNaN(param) ? null : param);
     return ({
       type: 'action',
       action,
       ...(this.index !== undefined && { atIndex: this.index }),
-      ...(_.without(params, NaN, null, undefined).length !== 0 && { params: _.without(params, NaN, null, undefined) }),
+      ...(_.without(params, undefined).length !== 0 && { params: _.without(params, undefined) }),
       predicate: this.matcher.predicate
     });
   }


Test patch:
diff --git a/detox/src/ios/expectTwo.test.js b/detox/src/ios/expectTwo.test.js
index 2dd87623c..a7fd6e0e7 100644
--- a/detox/src/ios/expectTwo.test.js
+++ b/detox/src/ios/expectTwo.test.js
@@ -306,7 +306,7 @@ describe('expectTwo', () => {
       invocation: {
         type: 'action',
         action: 'scroll',
-        params: [50, 'down'],
+        params: [50, 'down', null, null],
         predicate: {
           type: 'id',
           value: 'ScrollView630'
Repository: wix/Detox
Pull request #2323 (2020-09-10 09:59:19)

hotfix(cli): backward compatible path handling
- [x] This is a small change 

---

**Description:**

In case if users call `detox test` in a direct way, i.e.: `node_modules/.bin/detox test ...`, it fixes errors like:

```
/bin/sh: mocha: command not found
```




Patch:
diff --git a/detox/local-cli/utils/misc.js b/detox/local-cli/utils/misc.js
index e61cf1ca4..3d23e2b56 100644
--- a/detox/local-cli/utils/misc.js
+++ b/detox/local-cli/utils/misc.js
@@ -1,3 +1,5 @@
+const path = require('path');
+
 function getPlatformSpecificString(platform) {
   switch (platform) {
     case 'ios': return ':android:';
@@ -16,7 +18,20 @@ function printEnvironmentVariables(envObject) {
   }, '');
 }
 
+function prependNodeModulesBinToPATH(env) {
+  const PATH = Object.keys(env).find(key => `${key.toUpperCase()}` === 'PATH');
+  if (!PATH) {
+    return;
+  }
+
+  const nodeBinariesPath = path.dirname(process.argv[1]) + path.delimiter;
+  if (!env[PATH].startsWith(nodeBinariesPath)) {
+    env[PATH] = nodeBinariesPath + env[PATH];
+  }
+}
+
 module.exports = {
   getPlatformSpecificString,
   printEnvironmentVariables,
+  prependNodeModulesBinToPATH,
 };


Test patch:
diff --git a/detox/local-cli/test.js b/detox/local-cli/test.js
index 6efca8168..d92f05eef 100644
--- a/detox/local-cli/test.js
+++ b/detox/local-cli/test.js
@@ -10,6 +10,7 @@ const log = require('../src/utils/logger').child({ __filename });
 const shellQuote = require('./utils/shellQuote');
 const splitArgv = require('./utils/splitArgv');
 const { getPlatformSpecificString, printEnvironmentVariables } = require('./utils/misc');
+const { prependNodeModulesBinToPATH } = require('./utils/misc');
 
 module.exports.command = 'test';
 module.exports.desc = 'Run your test suite with the test runner specified in package.json';
@@ -195,10 +196,12 @@ function launchTestRunner({ argv, env, specs, rerunIndex }) {
 
   cp.execSync(fullCommand, {
     stdio: 'inherit',
-    env: _.omitBy({
-      ...process.env,
-      ...env,
-    }, _.isUndefined),
+    env: _({})
+      .assign(process.env)
+      .assign(env)
+      .omitBy(_.isUndefined)
+      .tap(prependNodeModulesBinToPATH)
+      .value()
   });
 }
Repository: wix/Detox
Pull request #2470 (2020-11-18 08:46:04)

Make instance names more concise with jest
## Description

Apply the suggestion by @noomorph as to utilize `JEST_WORKER_ID` for naming genycloud instances more clearly



Patch:
diff --git a/detox/src/devices/drivers/android/genycloud/services/GenyInstanceNaming.js b/detox/src/devices/drivers/android/genycloud/services/GenyInstanceNaming.js
index 2d7c05b4d..96edd2975 100644
--- a/detox/src/devices/drivers/android/genycloud/services/GenyInstanceNaming.js
+++ b/detox/src/devices/drivers/android/genycloud/services/GenyInstanceNaming.js
@@ -5,7 +5,7 @@ class GenyInstanceNaming {
   }
 
   generateName() {
-    const uniqueDeviceId = this.nowProvider() - this.uniqueSessionId;
+    const uniqueDeviceId = process.env.JEST_WORKER_ID || (this.nowProvider() - this.uniqueSessionId);
     return `Detox-${this.uniqueSessionId}.${uniqueDeviceId}`;
   }
 


Test patch:
diff --git a/detox/src/devices/drivers/android/genycloud/services/GenyInstanceNaming.test.js b/detox/src/devices/drivers/android/genycloud/services/GenyInstanceNaming.test.js
index dc8442e9e..a81ca38fb 100644
--- a/detox/src/devices/drivers/android/genycloud/services/GenyInstanceNaming.test.js
+++ b/detox/src/devices/drivers/android/genycloud/services/GenyInstanceNaming.test.js
@@ -1,4 +1,6 @@
 describe('Genymotion-Cloud instance unique-name strategy', () => {
+  let JEST_WORKER_ID = process.env.JEST_WORKER_ID;
+
   let now;
   let uut;
   beforeEach(() => {
@@ -13,12 +15,26 @@ describe('Genymotion-Cloud instance unique-name strategy', () => {
 
   afterAll(() => {
     delete process.env.DETOX_START_TIMESTAMP;
+    process.env.JEST_WORKER_ID = JEST_WORKER_ID;
   })
 
-  it('should generate a session-scope unique name', () =>
-    expect(uut.generateName()).toEqual('Detox-123456.78'));
+  it('should generate a session-scope unique name', () => {
+    expect(uut.generateName().startsWith('Detox-123456.')).toEqual(true);
+  });
+
+  it('should generate an instance-scope unique name based on jest-worker IDs', () => {
+    process.env.JEST_WORKER_ID = '777';
+    expect(uut.generateName()).toEqual('Detox-123456.777');
+  });
+
+  it('should generate an instance-scope unique name based on time delta, as a fallback', () => {
+    process.env.JEST_WORKER_ID = '';
+    expect(uut.generateName()).toEqual('Detox-123456.78');
+  });
 
   it('should generate an instance-scope unique name', () => {
+    process.env.JEST_WORKER_ID = '';
+
     const name1 = uut.generateName();
     now = now + 1;
     const name2 = uut.generateName();
Repository: railwayapp/nixpacks
Pull request #67 (2022-05-06 03:46:58)

Cache deno deps
Download all Deno dependencies at build time instead of installing at runtime.

Closes https://github.com/railwayapp/nixpacks/issues/33


Patch:
diff --git a/src/providers/deno.rs b/src/providers/deno.rs
index 8065b05..259fba8 100644
--- a/src/providers/deno.rs
+++ b/src/providers/deno.rs
@@ -3,7 +3,7 @@ use crate::nixpacks::{
     app::App,
     environment::Environment,
     nix::Pkg,
-    phase::{SetupPhase, StartPhase},
+    phase::{BuildPhase, SetupPhase, StartPhase},
 };
 use anyhow::Result;
 use regex::Regex;
@@ -17,14 +17,36 @@ impl Provider for DenoProvider {
 
     fn detect(&self, app: &App, _env: &Environment) -> Result<bool> {
         let re = Regex::new(r##"(?m)^import .+ from "https://deno.land/[^"]+\.ts";?$"##).unwrap();
-        app.find_match(&re, "**/*.ts")
+        Ok(app.includes_file("deno.json")
+            || app.includes_file("deno.jsonc")
+            || app.find_match(&re, "**/*.ts")?)
     }
 
     fn setup(&self, _app: &App, _env: &Environment) -> Result<Option<SetupPhase>> {
         Ok(Some(SetupPhase::new(vec![Pkg::new("deno")])))
     }
 
+    fn build(&self, app: &App, _env: &Environment) -> Result<Option<BuildPhase>> {
+        match DenoProvider::get_start_file(app)? {
+            Some(start_file) => Ok(Some(BuildPhase::new(format!("deno cache {}", start_file)))),
+            None => Ok(None),
+        }
+    }
+
     fn start(&self, app: &App, _env: &Environment) -> Result<Option<StartPhase>> {
+        match DenoProvider::get_start_file(app)? {
+            Some(start_file) => Ok(Some(StartPhase::new(format!(
+                "deno run --allow-all {}",
+                start_file
+            )))),
+            None => Ok(None),
+        }
+    }
+}
+
+impl DenoProvider {
+    // Find the first index.ts or index.js file to run
+    fn get_start_file(app: &App) -> Result<Option<String>> {
         // Find the first index.ts or index.js file to run
         let matches = app.find_files("**/index.[tj]s")?;
         let path_to_index = match matches.first() {
@@ -33,9 +55,6 @@ impl Provider for DenoProvider {
         };
 
         let relative_path_to_index = app.strip_source_path(&path_to_index)?;
-        return Ok(Some(StartPhase::new(format!(
-            "deno run --allow-all {}",
-            relative_path_to_index
-        ))));
+        Ok(Some(relative_path_to_index))
     }
 }


Test patch:
diff --git a/tests/generate_plan_tests.rs b/tests/generate_plan_tests.rs
index b36c89d..8cd496e 100644
--- a/tests/generate_plan_tests.rs
+++ b/tests/generate_plan_tests.rs
@@ -127,7 +127,10 @@ fn test_go_mod() -> Result<()> {
 #[test]
 fn test_deno() -> Result<()> {
     let plan = gen_plan("./examples/deno", Vec::new(), None, None, Vec::new(), false)?;
-    assert_eq!(plan.build.unwrap().cmd, None);
+    assert_eq!(
+        plan.build.unwrap().cmd,
+        Some("deno cache src/index.ts".to_string())
+    );
     assert_eq!(
         plan.start.unwrap().cmd,
         Some("deno run --allow-all src/index.ts".to_string())
Repository: railwayapp/nixpacks
Pull request #149 (2022-05-30 19:42:32)

Support Node 18
- Update the node version supported
  + Add 18
  + Drop 17
- Remove unneeded println statement



Patch:
diff --git a/examples/node-custom-version/package.json b/examples/node-custom-version/package.json
index 5bc313c..7c6c881 100644
--- a/examples/node-custom-version/package.json
+++ b/examples/node-custom-version/package.json
@@ -6,6 +6,6 @@
     "start": "./start.sh"
   },
   "engines": {
-    "node": ">=14 <16"
+    "node": "18.x"
   }
 }
diff --git a/src/nixpacks/mod.rs b/src/nixpacks/mod.rs
index 31050d4..fdbe958 100644
--- a/src/nixpacks/mod.rs
+++ b/src/nixpacks/mod.rs
@@ -183,8 +183,6 @@ impl<'a> AppBuilder<'a> {
                 docker_build_cmd.arg("--label").arg(l);
             }
 
-            println!("{:?}", docker_build_cmd);
-
             let build_result = docker_build_cmd.spawn()?.wait().context("Building image")?;
 
             if !build_result.success() {
diff --git a/src/providers/node.rs b/src/providers/node.rs
index 7967a9e..d900aa7 100644
--- a/src/providers/node.rs
+++ b/src/providers/node.rs
@@ -11,7 +11,7 @@ use anyhow::{bail, Result};
 use regex::Regex;
 use serde::{Deserialize, Serialize};
 
-const AVAILABLE_NODE_VERSIONS: &[u32] = &[10, 12, 14, 16, 17];
+const AVAILABLE_NODE_VERSIONS: &[u32] = &[10, 12, 14, 16, 18];
 pub const DEFAULT_NODE_PKG_NAME: &'static &str = &"nodejs";
 
 #[derive(Serialize, Deserialize, Default, Debug)]


Test patch:
diff --git a/tests/docker_run_tests.rs b/tests/docker_run_tests.rs
index 7103f40..6fd13e3 100644
--- a/tests/docker_run_tests.rs
+++ b/tests/docker_run_tests.rs
@@ -118,7 +118,7 @@ fn test_node() {
 fn test_node_custom_version() {
     let name = simple_build("./examples/node-custom-version");
     let output = run_image(name);
-    assert!(output.contains("Node version: v14"));
+    assert!(output.contains("Node version: v18"));
 }
 
 #[test]
diff --git a/tests/generate_plan_tests.rs b/tests/generate_plan_tests.rs
index 064a844..a13ce91 100644
--- a/tests/generate_plan_tests.rs
+++ b/tests/generate_plan_tests.rs
@@ -71,7 +71,7 @@ fn test_node_custom_version() -> Result<()> {
         Vec::new(),
         false,
     )?;
-    assert_eq!(plan.setup.unwrap().pkgs, vec![Pkg::new("nodejs-14_x")]);
+    assert_eq!(plan.setup.unwrap().pkgs, vec![Pkg::new("nodejs-18_x")]);
 
     Ok(())
 }