diff --git a/Example/Makefile b/Example/Makefile index 7be06db0..acfc5ead 100644 --- a/Example/Makefile +++ b/Example/Makefile @@ -7,7 +7,7 @@ JavaScriptKitExample: dist/JavaScriptKitExample.wasm: JavaScriptKitExample mkdir -p dist - cp ./JavaScriptKitExample/.build/debug/JavaScriptKitExample $@ + cp ./JavaScriptKitExample/.build/debug/JavaScriptKitExample.wasm $@ node_modules: npm ci diff --git a/Example/package-lock.json b/Example/package-lock.json index 8e41ce72..dedf0fe5 100644 --- a/Example/package-lock.json +++ b/Example/package-lock.json @@ -1673,9 +1673,9 @@ "dev": true }, "node_modules/dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", "dev": true, "dependencies": { "ip": "^1.1.0", @@ -6906,9 +6906,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "node_modules/ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", "dev": true, "dependencies": { "async-limiter": "~1.0.0" @@ -8397,9 +8397,9 @@ "dev": true }, "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", "dev": true, "requires": { "ip": "^1.1.0", @@ -12764,9 +12764,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", "dev": true, "requires": { "async-limiter": "~1.0.0" diff --git a/IntegrationTests/TestSuites/Sources/PrimaryTests/main.swift b/IntegrationTests/TestSuites/Sources/PrimaryTests/main.swift index e93dfc1b..ea12262e 100644 --- a/IntegrationTests/TestSuites/Sources/PrimaryTests/main.swift +++ b/IntegrationTests/TestSuites/Sources/PrimaryTests/main.swift @@ -186,6 +186,12 @@ try test("Function Call") { let evalClosure = JSObject.global.globalObject1.eval_closure.function! try test("Closure Lifetime") { + func expectCrashByCall(ofClosure c: JSClosureProtocol) throws { + print("======= BEGIN OF EXPECTED FATAL ERROR =====") + _ = try expectThrow(try evalClosure.throws(c)) + print("======= END OF EXPECTED FATAL ERROR =======") + } + do { let c1 = JSClosure { arguments in return arguments[0] @@ -200,7 +206,7 @@ try test("Closure Lifetime") { } c1.release() // Call a released closure - _ = try expectThrow(try evalClosure.throws(c1)) + try expectCrashByCall(ofClosure: c1) } do { @@ -209,7 +215,7 @@ try test("Closure Lifetime") { _ = JSClosure { _ in .undefined } return .undefined } - _ = try expectThrow(try evalClosure.throws(c1)) + try expectCrashByCall(ofClosure: c1) c1.release() } @@ -219,7 +225,7 @@ try test("Closure Lifetime") { } try expectEqual(evalClosure(c1), .boolean(true)) // second call will cause `fatalError` that can be caught as a JavaScript exception - _ = try expectThrow(try evalClosure.throws(c1)) + try expectCrashByCall(ofClosure: c1) // OneshotClosure won't call fatalError even if it's deallocated before `release` } } @@ -617,12 +623,25 @@ try test("Error") { } try test("JSValue accessor") { - let globalObject1 = JSObject.global.globalObject1 + var globalObject1 = JSObject.global.globalObject1 try expectEqual(globalObject1.prop_1.nested_prop, .number(1)) try expectEqual(globalObject1.object!.prop_1.object!.nested_prop, .number(1)) try expectEqual(globalObject1.prop_4[0], .number(3)) try expectEqual(globalObject1.prop_4[1], .number(4)) + + globalObject1.prop_1.nested_prop = "bar" + try expectEqual(globalObject1.prop_1.nested_prop, .string("bar")) + + /* TODO: Fix https://github.com/swiftwasm/JavaScriptKit/issues/132 and un-comment this test + `nested` should not be set again to `target.nested` by `target.nested.prop = .number(1)` + + let observableObj = globalObject1.observable_obj.object! + observableObj.set_called = .boolean(false) + observableObj.target.nested.prop = .number(1) + try expectEqual(observableObj.set_called, .boolean(false)) + + */ } try test("Exception") { diff --git a/IntegrationTests/bin/primary-tests.js b/IntegrationTests/bin/primary-tests.js index 6cb3aea3..79c62776 100644 --- a/IntegrationTests/bin/primary-tests.js +++ b/IntegrationTests/bin/primary-tests.js @@ -47,9 +47,21 @@ global.globalObject1 = { throw 3.0 }, }, - eval_closure: function(fn) { + eval_closure: function (fn) { return fn(arguments[1]) - } + }, + observable_obj: { + set_called: false, + target: new Proxy({ + nested: {} + }, { + set(target, key, value) { + global.globalObject1.observable_obj.set_called = true; + target[key] = value; + return true; + } + }) + }, }; global.Animal = function (name, age, isCat) { diff --git a/IntegrationTests/package-lock.json b/IntegrationTests/package-lock.json index 3c01ae5a..50727e50 100644 --- a/IntegrationTests/package-lock.json +++ b/IntegrationTests/package-lock.json @@ -12,7 +12,7 @@ }, "..": { "name": "javascript-kit-swift", - "version": "0.9.0", + "version": "0.10.1", "license": "MIT", "devDependencies": { "prettier": "2.1.2", @@ -22,12 +22,14 @@ "../node_modules/prettier": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", - "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==" + "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", + "dev": true }, "../node_modules/typescript": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", - "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==" + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true }, "node_modules/@wasmer/wasi": { "version": "0.12.0", @@ -310,12 +312,14 @@ "prettier": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", - "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==" + "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", + "dev": true }, "typescript": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", - "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==" + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true } } },