From b97332ff80eaa726e78099445a7c3bdc76702ba1 Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Tue, 29 Sep 2020 12:29:45 +0100 Subject: [PATCH 1/2] Add missing `JSValueConstructible` on `JSError` The lack of this conformance makes it impossible to attach `catch` callbacks to `JSPromise`, as `catch` methods have `Failure: JSValueConstructible` constraints. --- Sources/JavaScriptKit/BasicObjects/JSError.swift | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Sources/JavaScriptKit/BasicObjects/JSError.swift b/Sources/JavaScriptKit/BasicObjects/JSError.swift index a72027c6a..b27acb1ad 100644 --- a/Sources/JavaScriptKit/BasicObjects/JSError.swift +++ b/Sources/JavaScriptKit/BasicObjects/JSError.swift @@ -43,3 +43,10 @@ extension JSError: CustomStringConvertible { /// The textual representation of this error. public var description: String { jsObject.description } } + +extension JSError: JSValueConstructible { + public static func construct(from value: JSValue) -> JSError? { + guard let object = value.object else { return nil } + return JSError(unsafelyWrapping: object) + } +} From 936030231b6e4a4b3a4a495925bf95a1d47e3f69 Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Thu, 1 Oct 2020 17:27:13 +0100 Subject: [PATCH 2/2] Add JSBridgedClass conformance on JSError, tests --- .../TestSuites/Sources/PrimaryTests/main.swift | 5 ++++- Sources/JavaScriptKit/BasicObjects/JSError.swift | 9 +-------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/IntegrationTests/TestSuites/Sources/PrimaryTests/main.swift b/IntegrationTests/TestSuites/Sources/PrimaryTests/main.swift index 75854c26f..821087b66 100644 --- a/IntegrationTests/TestSuites/Sources/PrimaryTests/main.swift +++ b/IntegrationTests/TestSuites/Sources/PrimaryTests/main.swift @@ -487,9 +487,12 @@ try test("Promise") { try test("Error") { let message = "test error" + let expectedDescription = "Error: test error" let error = JSError(message: message) try expectEqual(error.name, "Error") try expectEqual(error.message, message) - try expectEqual(error.description, "Error: test error") + try expectEqual(error.description, expectedDescription) try expectEqual(error.stack?.isEmpty, false) + try expectEqual(JSError(from: .string("error"))?.description, nil) + try expectEqual(JSError(from: .object(error.jsObject))?.description, expectedDescription) } diff --git a/Sources/JavaScriptKit/BasicObjects/JSError.swift b/Sources/JavaScriptKit/BasicObjects/JSError.swift index b27acb1ad..305f1d9d5 100644 --- a/Sources/JavaScriptKit/BasicObjects/JSError.swift +++ b/Sources/JavaScriptKit/BasicObjects/JSError.swift @@ -2,7 +2,7 @@ class](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error) that exposes its properties in a type-safe way. */ -public final class JSError: Error, JSValueConvertible { +public final class JSError: Error, JSBridgedClass { /// The constructor function used to create new JavaScript `Error` objects. public static let constructor = JSObject.global.Error.function! @@ -43,10 +43,3 @@ extension JSError: CustomStringConvertible { /// The textual representation of this error. public var description: String { jsObject.description } } - -extension JSError: JSValueConstructible { - public static func construct(from value: JSValue) -> JSError? { - guard let object = value.object else { return nil } - return JSError(unsafelyWrapping: object) - } -}