Skip to content

Make JSValue's subscript setter nonmutating #321

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Mar 27, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions Examples/ActorOnWebWorker/Sources/MyApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -120,13 +120,13 @@ final class App {
private let alert = JSObject.global.alert.function!

// UI elements
private var container: JSValue
private var urlInput: JSValue
private var indexButton: JSValue
private var searchInput: JSValue
private var searchButton: JSValue
private var statusElement: JSValue
private var resultsElement: JSValue
private let container: JSValue
private let urlInput: JSValue
private let indexButton: JSValue
private let searchInput: JSValue
private let searchButton: JSValue
private let statusElement: JSValue
private let resultsElement: JSValue

// Search service
private let service: SearchService
Expand Down Expand Up @@ -214,13 +214,13 @@ final class App {
resultsElement.innerHTML = .string("")

if results.isEmpty {
var noResults = document.createElement("p")
let noResults = document.createElement("p")
noResults.innerText = .string("No results found.")
_ = resultsElement.appendChild(noResults)
} else {
// Display up to 10 results
for (index, result) in results.prefix(10).enumerated() {
var resultItem = document.createElement("div")
let resultItem = document.createElement("div")
resultItem.style = .string(
"padding: 10px; margin: 5px 0; background: #f5f5f5; border-left: 3px solid blue;"
)
Expand Down
6 changes: 3 additions & 3 deletions Examples/Basic/Sources/main.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ import JavaScriptKit
let alert = JSObject.global.alert.function!
let document = JSObject.global.document

var divElement = document.createElement("div")
let divElement = document.createElement("div")
divElement.innerText = "Hello, world"
_ = document.body.appendChild(divElement)

var buttonElement = document.createElement("button")
let buttonElement = document.createElement("button")
buttonElement.innerText = "Alert demo"
buttonElement.onclick = .object(
JSClosure { _ in
Expand All @@ -30,7 +30,7 @@ struct Response: Decodable {
let uuid: String
}

var asyncButtonElement = document.createElement("button")
let asyncButtonElement = document.createElement("button")
asyncButtonElement.innerText = "Fetch UUID demo"
asyncButtonElement.onclick = .object(
JSClosure { _ in
Expand Down
8 changes: 4 additions & 4 deletions Examples/Embedded/Sources/EmbeddedApp/main.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ print("Hello from WASM, document title: \(document.title.string ?? "")")

var count = 0

var divElement = document.createElement("div")
let divElement = document.createElement("div")
divElement.innerText = .string("Count \(count)")
_ = document.body.appendChild(divElement)

var clickMeElement = document.createElement("button")
let clickMeElement = document.createElement("button")
clickMeElement.innerText = "Click me"
clickMeElement.onclick = JSValue.object(
JSClosure { _ in
Expand All @@ -22,8 +22,8 @@ clickMeElement.onclick = JSValue.object(
)
_ = document.body.appendChild(clickMeElement)

var encodeResultElement = document.createElement("pre")
var textInputElement = document.createElement("input")
let encodeResultElement = document.createElement("pre")
let textInputElement = document.createElement("input")
textInputElement.type = "text"
textInputElement.placeholder = "Enter text to encode to UTF-8"
textInputElement.oninput = JSValue.object(
Expand Down
4 changes: 2 additions & 2 deletions Sources/JavaScriptKit/JSValue.swift
Original file line number Diff line number Diff line change
Expand Up @@ -120,14 +120,14 @@ extension JSValue {
/// - Precondition: `self` must be a JavaScript Object.
public subscript(dynamicMember name: String) -> JSValue {
get { self.object![name] }
set { self.object![name] = newValue }
nonmutating set { self.object![name] = newValue }
}

/// An unsafe convenience method of `JSObject.subscript(_ index: Int) -> JSValue`
/// - Precondition: `self` must be a JavaScript Object.
public subscript(_ index: Int) -> JSValue {
get { object![index] }
set { object![index] = newValue }
nonmutating set { object![index] = newValue }
}
}

Expand Down
2 changes: 1 addition & 1 deletion Tests/JavaScriptKitTests/JavaScriptKitTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -494,7 +494,7 @@ class JavaScriptKitTests: XCTestCase {
}

func testJSValueAccessor() {
var globalObject1 = JSObject.global.globalObject1
let globalObject1 = JSObject.global.globalObject1
XCTAssertEqual(globalObject1.prop_1.nested_prop, .number(1))
XCTAssertEqual(globalObject1.object!.prop_1.object!.nested_prop, .number(1))

Expand Down