Skip to content

Commit 79d0b63

Browse files
hyperpolymathclaude
andcommitted
refactor: migrate Js.String2 to String across src/ (107 occurrences)
Replace deprecated Js.String2 API with modern String equivalents: - startsWith, length, includes, toLowerCase, toUpperCase Part of #28. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent e86733b commit 79d0b63

21 files changed

+92
-92
lines changed

src/app/devices/CoprocessorBridge.res

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -139,9 +139,9 @@ let formatResult = (domain: string, cmd: string, result: executionResult): strin
139139
// Returns a synchronous dispatch-confirmation string. The async result is
140140
// appended to the device's output buffer via Promise.then and collected by RECV.
141141
let handleSend = (deviceId: string, spec: string, dataArgs: array<string>): string => {
142-
if Js.String2.length(deviceId) == 0 {
142+
if String.length(deviceId) == 0 {
143143
"send: no device attached — open a terminal on a hacked device first"
144-
} else if Js.String2.length(spec) == 0 {
144+
} else if String.length(spec) == 0 {
145145
"send: usage: send <domain>:<cmd> [int ...]\n" ++
146146
" domains: crypto io maths vector neural physics quantum audio tensor graphics"
147147
} else {
@@ -153,7 +153,7 @@ let handleSend = (deviceId: string, spec: string, dataArgs: array<string>): stri
153153
} else {
154154
let domainStr = String.slice(spec, ~start=0, ~end=colonIdx)
155155
let cmdStr = String.sliceToEnd(spec, ~start=colonIdx + 1)
156-
if Js.String2.length(cmdStr) == 0 {
156+
if String.length(cmdStr) == 0 {
157157
`send: missing command after ":" in "${spec}" — e.g. "crypto:hash"`
158158
} else {
159159
switch parseDomain(domainStr) {
@@ -210,7 +210,7 @@ let handleSend = (deviceId: string, spec: string, dataArgs: array<string>): stri
210210
// as a single string separated by horizontal rules. Clears the buffer
211211
// atomically after reading. Returns a notice if no results are pending.
212212
let handleRecv = (deviceId: string): string => {
213-
if Js.String2.length(deviceId) == 0 {
213+
if String.length(deviceId) == 0 {
214214
"recv: no device attached"
215215
} else {
216216
let buf = getBuffer(deviceId)
@@ -235,7 +235,7 @@ let handleRecv = (deviceId: string): string => {
235235
// Delegates to Kernel.getDeviceReport, which reports compute / memory /
236236
// energy utilisation with percentages and raw values.
237237
let getDeviceStatus = (deviceId: string): string => {
238-
if Js.String2.length(deviceId) == 0 {
238+
if String.length(deviceId) == 0 {
239239
"coproc: no device attached"
240240
} else {
241241
Kernel.getDeviceReport(deviceId)

src/app/devices/DeviceView.res

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ let createFile = (deviceIp: string, path: string, name: string, content: string)
189189
| None =>
190190
let contentId = GlobalNetworkData.storeContent(
191191
~content,
192-
~sizeMB=Float.fromInt(Js.String2.length(content)) /. 1024.0 /. 1024.0,
192+
~sizeMB=Float.fromInt(String.length(content)) /. 1024.0 /. 1024.0,
193193
)
194194
Dict.set(
195195
contents,

src/app/devices/FirewallDevice.res

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,13 +123,13 @@ let checkPacket = (
123123
// Simplified subnet matching check prefix
124124
let sourceMatch =
125125
rule.sourceSubnet == "0.0.0.0/0" ||
126-
Js.String2.startsWith(
126+
String.startsWith(
127127
source,
128128
String.slice(rule.sourceSubnet, ~start=0, ~end=String.indexOf(rule.sourceSubnet, "/")),
129129
)
130130
let destMatch =
131131
rule.destSubnet == "0.0.0.0/0" ||
132-
Js.String2.startsWith(
132+
String.startsWith(
133133
dest,
134134
String.slice(rule.destSubnet, ~start=0, ~end=String.indexOf(rule.destSubnet, "/")),
135135
)

src/app/devices/GlobalNetworkData.res

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ let updateContent = (~oldId: string, ~newContent: string): string => {
6262
// Get size from old content
6363
let sizeMB = switch Dict.get(contentStore, oldId) {
6464
| Some(old) => old.sizeMB
65-
| None => Belt.Int.toFloat(Js.String2.length(newContent)) /. 1024.0 /. 1024.0
65+
| None => Belt.Int.toFloat(String.length(newContent)) /. 1024.0 /. 1024.0
6666
}
6767

6868
// Store new content (may reuse if hash matches existing)

src/app/devices/NetworkZones.res

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -230,14 +230,14 @@ let allZones: array<networkZone> = [
230230
// Get zone by IP address
231231
let getZoneByIp = (ip: string): option<networkZone> => {
232232
// Special handling for multi-subnet zones
233-
if Js.String2.startsWith(ip, "142.250.") {
233+
if String.startsWith(ip, "142.250.") {
234234
Belt.Array.getBy(allZones, zone => zone.id == "service-atlas")
235-
} else if Js.String2.startsWith(ip, "104.16.") {
235+
} else if String.startsWith(ip, "104.16.") {
236236
Belt.Array.getBy(allZones, zone => zone.id == "service-nexus")
237237
} else {
238238
// Standard subnet matching
239239
Belt.Array.getBy(allZones, zone => {
240-
zone.subnet != "" && Js.String2.startsWith(ip, zone.subnet)
240+
zone.subnet != "" && String.startsWith(ip, zone.subnet)
241241
})
242242
}
243243
}

src/app/devices/Terminal.res

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ let updateInputLine = (terminal: t): unit => {
8181
let listDirectory = (terminal: t, path: string, activeIp: string): string => {
8282
switch Some(activeIp) {
8383
| Some(ip) =>
84-
let fullPath = if Js.String2.startsWith(path, "C:\\") || Js.String2.startsWith(path, "/") {
84+
let fullPath = if String.startsWith(path, "C:\\") || String.startsWith(path, "/") {
8585
path
8686
} else {
8787
terminal.currentDirectory ++ "\\" ++ path
@@ -137,7 +137,7 @@ let changeDirectory = (terminal: t, path: string, activeIp: string): string => {
137137
}
138138
""
139139
} else {
140-
let newPath = if Js.String2.startsWith(path, "C:\\") {
140+
let newPath = if String.startsWith(path, "C:\\") {
141141
path
142142
} else {
143143
terminal.currentDirectory ++ "\\" ++ path
@@ -159,7 +159,7 @@ let readFile = (terminal: t, fileName: string, activeIp: string): string => {
159159
switch Some(activeIp) {
160160
| None => "cat: no device IP configured"
161161
| Some(ip) =>
162-
let fullPath = if Js.String2.startsWith(fileName, "C:\\") {
162+
let fullPath = if String.startsWith(fileName, "C:\\") {
163163
fileName
164164
} else {
165165
terminal.currentDirectory ++ "\\" ++ fileName
@@ -299,7 +299,7 @@ let handleBuiltInCommand = (terminal: t, cmd: string, args: array<string>): stri
299299
let hasForce = Belt.Array.some(args, arg => arg == "-f" || arg == "-rf" || arg == "-fr")
300300

301301
// Get filename (skip flags)
302-
let fileName = Belt.Array.getBy(args, arg => !Js.String2.startsWith(arg, "-"))
302+
let fileName = Belt.Array.getBy(args, arg => !String.startsWith(arg, "-"))
303303

304304
switch fileName {
305305
| None => "rm: missing operand"
@@ -334,7 +334,7 @@ let handleBuiltInCommand = (terminal: t, cmd: string, args: array<string>): stri
334334
switch getActiveState(terminal) {
335335
| None => "cp: no device state"
336336
| Some(activeState) =>
337-
let sourcePath = if Js.String2.startsWith(sourceName, "C:\\") {
337+
let sourcePath = if String.startsWith(sourceName, "C:\\") {
338338
sourceName
339339
} else {
340340
terminal.currentDirectory ++ "\\" ++ sourceName
@@ -782,7 +782,7 @@ Cross-VM: Use SEND to port "net:<ip>:<port>" to deliver data.`
782782
}
783783
| "chat" | "say" => {
784784
let message = Array.sliceToEnd(args, ~start=1)->Array.join(" ")
785-
if Js.String2.length(String.trim(message)) > 0 {
785+
if String.length(String.trim(message)) > 0 {
786786
MultiplayerClient.sendChat(MultiplayerGlobal.client, ~message)
787787
`[you] ${message}`
788788
} else {
@@ -930,10 +930,10 @@ let handleKeyInput = (terminal: t, key: string): unit => {
930930
terminal.currentInput = String.slice(
931931
terminal.currentInput,
932932
~start=0,
933-
~end=Js.String2.length(terminal.currentInput) - 1,
933+
~end=String.length(terminal.currentInput) - 1,
934934
)
935935
updateInputLine(terminal)
936-
} else if Js.String2.length(key) == 1 {
936+
} else if String.length(key) == 1 {
937937
terminal.currentInput = terminal.currentInput ++ key
938938
updateInputLine(terminal)
939939
}

src/app/devices/VMBridge.res

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ let checkPuzzleSolved = (): option<string> => {
338338
// Parse a VM command string into an instruction
339339
let parseVMCommand = (input: string): option<vmInstruction> => {
340340
let tokens =
341-
String.split(String.trim(input), " ")->Belt.Array.keep(t => Js.String2.length(String.trim(t)) > 0)
341+
String.split(String.trim(input), " ")->Belt.Array.keep(t => String.length(String.trim(t)) > 0)
342342
let opcode = tokens[0]->Belt.Option.map(String.toUpperCase)
343343
switch opcode {
344344
// Tier 0: Register arithmetic
@@ -508,7 +508,7 @@ let builtinPuzzles: array<puzzleData> = [
508508

509509
// Handle 'vm' command direct VM instruction execution
510510
let handleVMCommand = (args: string): string => {
511-
if Js.String2.length(String.trim(args)) == 0 {
511+
if String.length(String.trim(args)) == 0 {
512512
`vm Reversible VM Terminal
513513
Usage:
514514
vm <instruction> Execute a reversible instruction
@@ -592,11 +592,11 @@ TIER 2 Stack & Memory:
592592
Every instruction is perfectly reversible. Use 'vm undo' to reverse.`
593593
| _ =>
594594
// Check for memory display command: MEM <start> <len>
595-
if Js.String2.startsWith(upperTrimmed, "MEM") {
595+
if String.startsWith(upperTrimmed, "MEM") {
596596
switch bridge.vm {
597597
| Some(vm) => {
598598
let memTokens =
599-
String.split(String.trim(trimmed), " ")->Belt.Array.keep(t => Js.String2.length(t) > 0)
599+
String.split(String.trim(trimmed), " ")->Belt.Array.keep(t => String.length(t) > 0)
600600
let start = memTokens[1]->Option.flatMap(x => Int.fromString(x))->Belt.Option.getWithDefault(0)
601601
let length = memTokens[2]->Option.flatMap(x => Int.fromString(x))->Belt.Option.getWithDefault(16)
602602
let lines = ref([])
@@ -659,7 +659,7 @@ Every instruction is perfectly reversible. Use 'vm undo' to reverse.`
659659
// Handle 'puzzle' command load and start a puzzle
660660
let handlePuzzleCommand = (name: string): string => {
661661
let trimmedName = String.trim(String.toLowerCase(name))
662-
if Js.String2.length(trimmedName) == 0 {
662+
if String.length(trimmedName) == 0 {
663663
// List puzzles
664664
let lines = Belt.Array.map(builtinPuzzles, p => {
665665
` ${String.toLowerCase(

src/app/enemies/Distraction.res

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ let kindToString = (kind: distractionKind): string => {
133133
}
134134

135135
let kindFromString = (s: string): option<distractionKind> => {
136-
switch Js.String2.toLowerCase(s) {
136+
switch String.toLowerCase(s) {
137137
| "pizza" | "pizzadelivery" | "pizza_delivery" => Some(PizzaDelivery)
138138
| "maintenance" | "maint" => Some(FakeMaintenance)
139139
| "fire" | "firealarm" | "fire_alarm" => Some(FireAlarm)

src/app/multiplayer/VMMessageBus.res

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ let classifyPort = (port: string): messageTarget => {
106106
CoopChat
107107
} else if port == "coop:item" {
108108
CoopItem
109-
} else if Js.String2.startsWith(port, "covert:") {
109+
} else if String.startsWith(port, "covert:") {
110110
CovertLinkChannel
111111
} else {
112112
DevicePort

src/app/multiplayer/VMNetwork.res

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ let getDeviceVMByIp = (ip: string): option<deviceVM> => {
103103

104104
let routePortMessage = (sourceDeviceId: string, port: string, value: int): unit => {
105105
// Parse net:<ip>:<subport> format
106-
if Js.String2.startsWith(port, "net:") {
106+
if String.startsWith(port, "net:") {
107107
let parts = String.split(port, ":")
108108
let targetIp = parts[1]->Belt.Option.getWithDefault("")
109109
let _subPort = parts[2]->Belt.Option.getWithDefault("default")
@@ -113,7 +113,7 @@ let routePortMessage = (sourceDeviceId: string, port: string, value: int): unit
113113
}
114114
ignore(sourceDeviceId)
115115
} // Covert link channels: data passes through the covert link
116-
else if Js.String2.startsWith(port, "covert:") {
116+
else if String.startsWith(port, "covert:") {
117117
let connId = String.sliceToEnd(port, ~start=7)
118118
switch CovertLink.Registry.get(connId) {
119119
| Some(conn) =>

0 commit comments

Comments
 (0)