Commit f8bb1c7

Ivraj <ivraj@airr.io>
2022-02-16 18:06:30
Fix bug where running script without extension removes existing `.mjs` files (#276)
* Adds test to verify no-ext doesn't overwrite similarly named files * Changes importPath to use tmpFilename for no-ext case * Changes tmpFilename in importPath to be more readable Co-authored-by: Anton Medvedev <anton@medv.io>
1 parent 5db11c6
tests/no-extension.mjs
@@ -0,0 +1,1 @@
+// Test file to verify no-extension didn't overwrite similarly name .mjs file.
test.mjs
@@ -80,8 +80,9 @@ import {strict as assert} from 'assert'
   }
 }
 
-{ // Scripts with no extension are working
+{ // Scripts with no extension work and do not overwrite similarly named files.
   await $`node zx.mjs tests/no-extension`
+  assert.match((await fs.readFile('tests/no-extension.mjs')).toString(), /Test file to verify no-extension didn't overwrite similarly name .mjs file./);
 }
 
 { // require() is working from stdin
zx.mjs
@@ -101,10 +101,15 @@ async function writeAndImport(script, filepath, origin = filepath) {
 
 async function importPath(filepath, origin = filepath) {
   let ext = extname(filepath)
+
   if (ext === '') {
+  let tmpFilename = fs.existsSync(`${filepath}.mjs`) ? 
+    `${basename(filepath)}-${Math.random().toString(36).substr(2)}.mjs` : 
+    `${basename(filepath)}.mjs`
+
     return await writeAndImport(
       await fs.readFile(filepath),
-      join(dirname(filepath), basename(filepath) + '.mjs'),
+      join(dirname(filepath), tmpFilename),
       origin,
     )
   }