From 3b3596d842f5d5bfba87f5f40f60d4acd9012c9e Mon Sep 17 00:00:00 2001 From: fisker Date: Fri, 22 May 2020 10:44:56 +0800 Subject: [PATCH 1/5] Add failed test --- test/override-promise.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 test/override-promise.js diff --git a/test/override-promise.js b/test/override-promise.js new file mode 100644 index 0000000000..4025c995b9 --- /dev/null +++ b/test/override-promise.js @@ -0,0 +1,17 @@ +import test from 'ava'; + +// Can't use `test.before`, maybe because `ava` need `Promise` +// Can't use `import('..')` too, unknown reason +const nativePromise = Promise; +global.Promise = class BrokenPromise { + then() { + throw new Error('error'); + } +}; +const execa = require('..'); +global.Promise = nativePromise; + +test('Should work with third party Promise', async t => { + const {stdout} = await execa('echo execa'); + t.is(stdout, 'execa'); +}); From 0d1259587299e5e0db8f8e31acc4bd09170f8166 Mon Sep 17 00:00:00 2001 From: fisker Date: Fri, 22 May 2020 10:58:21 +0800 Subject: [PATCH 2/5] Use `Native Promise` --- lib/promise.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/promise.js b/lib/promise.js index f85c43a3da..bd9d52333d 100644 --- a/lib/promise.js +++ b/lib/promise.js @@ -1,8 +1,9 @@ 'use strict'; +const nativePromisePrototype = (async () => {})().constructor.prototype; const descriptors = ['then', 'catch', 'finally'].map(property => [ property, - Reflect.getOwnPropertyDescriptor(Promise.prototype, property) + Reflect.getOwnPropertyDescriptor(nativePromisePrototype, property) ]); // The return value is a mixin of `childProcess` and `Promise` From 7fe9e0cf2188796c22b8a5d962886c48f954e958 Mon Sep 17 00:00:00 2001 From: fisker Date: Fri, 22 May 2020 11:06:14 +0800 Subject: [PATCH 3/5] Update test --- test/override-promise.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/test/override-promise.js b/test/override-promise.js index 4025c995b9..528d5acac7 100644 --- a/test/override-promise.js +++ b/test/override-promise.js @@ -1,5 +1,8 @@ +import path from 'path'; import test from 'ava'; +process.env.PATH = path.join(__dirname, 'fixtures') + path.delimiter + process.env.PATH; + // Can't use `test.before`, maybe because `ava` need `Promise` // Can't use `import('..')` too, unknown reason const nativePromise = Promise; @@ -12,6 +15,6 @@ const execa = require('..'); global.Promise = nativePromise; test('Should work with third party Promise', async t => { - const {stdout} = await execa('echo execa'); - t.is(stdout, 'execa'); + const {stdout} = await execa('noop', ['foo']); + t.is(stdout, 'foo'); }); From bc90a4995a831bc6234dd04dc46d85c3ab6e36e0 Mon Sep 17 00:00:00 2001 From: fisker Date: Fri, 22 May 2020 20:22:46 +0800 Subject: [PATCH 4/5] Update comment --- test/override-promise.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/override-promise.js b/test/override-promise.js index 528d5acac7..56db9f912d 100644 --- a/test/override-promise.js +++ b/test/override-promise.js @@ -4,7 +4,7 @@ import test from 'ava'; process.env.PATH = path.join(__dirname, 'fixtures') + path.delimiter + process.env.PATH; // Can't use `test.before`, maybe because `ava` need `Promise` -// Can't use `import('..')` too, unknown reason +// Can't use `import('..')` too, because `execa` is not ES Module const nativePromise = Promise; global.Promise = class BrokenPromise { then() { From d692e1c4ee7ee415c53de748dd0abbcb4c58005a Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Fri, 22 May 2020 21:50:02 +0800 Subject: [PATCH 5/5] Update override-promise.js --- test/override-promise.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/override-promise.js b/test/override-promise.js index 56db9f912d..30c2465c55 100644 --- a/test/override-promise.js +++ b/test/override-promise.js @@ -3,8 +3,8 @@ import test from 'ava'; process.env.PATH = path.join(__dirname, 'fixtures') + path.delimiter + process.env.PATH; -// Can't use `test.before`, maybe because `ava` need `Promise` -// Can't use `import('..')` too, because `execa` is not ES Module +// Can't use `test.before`, because `ava` needs `Promise`. +// Can't use `import(…)` either, because `execa` is not an ES Module. const nativePromise = Promise; global.Promise = class BrokenPromise { then() { @@ -14,7 +14,7 @@ global.Promise = class BrokenPromise { const execa = require('..'); global.Promise = nativePromise; -test('Should work with third party Promise', async t => { +test('should work with third-party Promise', async t => { const {stdout} = await execa('noop', ['foo']); t.is(stdout, 'foo'); });