From 4b84c4df3a8c07f0a992e255350eb97db36c5cf6 Mon Sep 17 00:00:00 2001 From: Yuichiro Yamashita Date: Tue, 3 Jan 2023 12:48:06 +0900 Subject: [PATCH] [fix] Improve `is_promise` handling (#8162) * correctly handle promises that are of function type * add License Co-authored-by: Vilsol --- src/runtime/internal/utils.ts | 4 +++- .../samples/await-function-promise/_config.js | 19 +++++++++++++++++++ .../await-function-promise/main.svelte | 7 +++++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 test/runtime/samples/await-function-promise/_config.js create mode 100644 test/runtime/samples/await-function-promise/main.svelte diff --git a/src/runtime/internal/utils.ts b/src/runtime/internal/utils.ts index 8868e38ee2..8adb0c279b 100644 --- a/src/runtime/internal/utils.ts +++ b/src/runtime/internal/utils.ts @@ -10,8 +10,10 @@ export function assign(tar: T, src: S): T & S { return tar as T & S; } +// Adapted from https://github.com/then/is-promise/blob/master/index.js +// Distributed under MIT License https://github.com/then/is-promise/blob/master/LICENSE export function is_promise(value: any): value is PromiseLike { - return value && typeof value === 'object' && typeof value.then === 'function'; + return !!value && (typeof value === 'object' || typeof value === 'function') && typeof value.then === 'function'; } export function add_location(element, file, line, column, char) { diff --git a/test/runtime/samples/await-function-promise/_config.js b/test/runtime/samples/await-function-promise/_config.js new file mode 100644 index 0000000000..b6a9de6856 --- /dev/null +++ b/test/runtime/samples/await-function-promise/_config.js @@ -0,0 +1,19 @@ +const realPromise = Promise.resolve(42); + +const promise = () => {}; +promise.then = realPromise.then.bind(realPromise); +promise.catch = realPromise.catch.bind(realPromise); + +export default { + props: { + promise + }, + + test({ assert, target }) { + return promise.then(() => { + assert.htmlEqual(target.innerHTML, ` +

42

+ `); + }); + } +}; diff --git a/test/runtime/samples/await-function-promise/main.svelte b/test/runtime/samples/await-function-promise/main.svelte new file mode 100644 index 0000000000..aaefc6b782 --- /dev/null +++ b/test/runtime/samples/await-function-promise/main.svelte @@ -0,0 +1,7 @@ + + +{#await promise then value} +

{JSON.stringify(value)}

+{/await}