From f8bb1c7aaf0ffe578348f1d1f0442385c8caf453 Mon Sep 17 00:00:00 2001 From: Ivraj Date: Wed, 16 Feb 2022 09:06:30 -0800 Subject: [PATCH] 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 --- test.mjs | 3 ++- tests/no-extension.mjs | 1 + zx.mjs | 7 ++++++- 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100755 tests/no-extension.mjs diff --git a/test.mjs b/test.mjs index c2ddf69fce..ac69ba5511 100755 --- a/test.mjs +++ b/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 diff --git a/tests/no-extension.mjs b/tests/no-extension.mjs new file mode 100755 index 0000000000..da10c2b26f --- /dev/null +++ b/tests/no-extension.mjs @@ -0,0 +1 @@ +// Test file to verify no-extension didn't overwrite similarly name .mjs file. diff --git a/zx.mjs b/zx.mjs index f4cb6d4d5a..a47d30e7dd 100755 --- a/zx.mjs +++ b/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, ) }