diff --git a/package-lock.json b/package-lock.json index 2562373..6594a90 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,34 +9,174 @@ "version": "1.4.0", "license": "(LGPL-3.0 OR MPL-2.0)", "devDependencies": { - "rescript": "^11.0.1" + "rescript": "^12.0.0-beta.1" }, "engines": { "node": "*" } }, + "node_modules/@rescript/darwin-arm64": { + "version": "12.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@rescript/darwin-arm64/-/darwin-arm64-12.0.0-beta.1.tgz", + "integrity": "sha512-NSzlBbuGDS1D5NTw2W7lh98Ylek8cTSz/kHmkugj2ePrEyuVDEAqLiyWsj6pbvJ4LQzr8ZOCf8emnmslDgauEg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/@rescript/darwin-x64": { + "version": "12.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@rescript/darwin-x64/-/darwin-x64-12.0.0-beta.1.tgz", + "integrity": "sha512-Jr0yArQHiwxW3grALCcXDpAbK4V3Zsrg6Ekn6WixzfJR9LaXbquJFST/BOs0aO3kKj2kJrDSbvheHhPcCdNa9w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/@rescript/linux-arm64": { + "version": "12.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@rescript/linux-arm64/-/linux-arm64-12.0.0-beta.1.tgz", + "integrity": "sha512-Hj8zcFd/QlNybKrj3AklIib1kbb5LuuXcBbNuD5vaMmbKwfAO8iUA9OTFyaHWqgMKurkKYEc2oa5IE3/EQntag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/@rescript/linux-x64": { + "version": "12.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@rescript/linux-x64/-/linux-x64-12.0.0-beta.1.tgz", + "integrity": "sha512-ZDTIvFzior+KZ964firAG9Sm6WunJM8+2OIElXvGIL2P5GL9VlU71ap5IBIt5GV5jHRiYq5uJLnQSI+jtpbw/w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/@rescript/win32-x64": { + "version": "12.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@rescript/win32-x64/-/win32-x64-12.0.0-beta.1.tgz", + "integrity": "sha512-aTXZ2c8AiBmoI3gAA8CQpgKYMjj6pAzuHnl3PQLRr9h5Hz7EWN9ZrktTa2GC0soP414lsl1Yyx7g9YIacypRAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.11.0" + } + }, "node_modules/rescript": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/rescript/-/rescript-11.0.1.tgz", - "integrity": "sha512-7T4PRp/d0+CBNnY6PYKffFqo9tGZlvnZpboF/n+8SKS+JZ6VvXJO7W538VPZXf3EYx1COGAWWvkF9e/HgSAqHg==", + "version": "12.0.0-beta.1", + "resolved": "https://registry.npmjs.org/rescript/-/rescript-12.0.0-beta.1.tgz", + "integrity": "sha512-MuVs8AcHm3QU5knt5mBeGmvhz4LY4GEkF6MurzGDTcWm6TkdEC5zWfh5cOi08QKjlZDYzNBDCPXzTR7bnsCEAA==", "dev": true, - "hasInstallScript": true, + "workspaces": [ + "packages/*", + "packages/@rescript/*", + "tests/dependencies/**", + "tests/analysis_tests/**", + "tests/docstring_tests", + "tests/gentype_tests/**", + "tests/tools_tests", + "scripts/res" + ], "bin": { - "bsc": "bsc", - "bstracing": "lib/bstracing", - "rescript": "rescript" + "bsc": "cli/bsc.js", + "bstracing": "cli/bstracing.js", + "rescript": "cli/rescript.js", + "rescript-legacy": "cli/rescript-legacy.js", + "rescript-tools": "cli/rescript-tools.js" }, "engines": { - "node": ">=10" + "node": ">=20.11.0" + }, + "optionalDependencies": { + "@rescript/darwin-arm64": "12.0.0-beta.1", + "@rescript/darwin-x64": "12.0.0-beta.1", + "@rescript/linux-arm64": "12.0.0-beta.1", + "@rescript/linux-x64": "12.0.0-beta.1", + "@rescript/win32-x64": "12.0.0-beta.1" } } }, "dependencies": { + "@rescript/darwin-arm64": { + "version": "12.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@rescript/darwin-arm64/-/darwin-arm64-12.0.0-beta.1.tgz", + "integrity": "sha512-NSzlBbuGDS1D5NTw2W7lh98Ylek8cTSz/kHmkugj2ePrEyuVDEAqLiyWsj6pbvJ4LQzr8ZOCf8emnmslDgauEg==", + "dev": true, + "optional": true + }, + "@rescript/darwin-x64": { + "version": "12.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@rescript/darwin-x64/-/darwin-x64-12.0.0-beta.1.tgz", + "integrity": "sha512-Jr0yArQHiwxW3grALCcXDpAbK4V3Zsrg6Ekn6WixzfJR9LaXbquJFST/BOs0aO3kKj2kJrDSbvheHhPcCdNa9w==", + "dev": true, + "optional": true + }, + "@rescript/linux-arm64": { + "version": "12.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@rescript/linux-arm64/-/linux-arm64-12.0.0-beta.1.tgz", + "integrity": "sha512-Hj8zcFd/QlNybKrj3AklIib1kbb5LuuXcBbNuD5vaMmbKwfAO8iUA9OTFyaHWqgMKurkKYEc2oa5IE3/EQntag==", + "dev": true, + "optional": true + }, + "@rescript/linux-x64": { + "version": "12.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@rescript/linux-x64/-/linux-x64-12.0.0-beta.1.tgz", + "integrity": "sha512-ZDTIvFzior+KZ964firAG9Sm6WunJM8+2OIElXvGIL2P5GL9VlU71ap5IBIt5GV5jHRiYq5uJLnQSI+jtpbw/w==", + "dev": true, + "optional": true + }, + "@rescript/win32-x64": { + "version": "12.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@rescript/win32-x64/-/win32-x64-12.0.0-beta.1.tgz", + "integrity": "sha512-aTXZ2c8AiBmoI3gAA8CQpgKYMjj6pAzuHnl3PQLRr9h5Hz7EWN9ZrktTa2GC0soP414lsl1Yyx7g9YIacypRAQ==", + "dev": true, + "optional": true + }, "rescript": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/rescript/-/rescript-11.0.1.tgz", - "integrity": "sha512-7T4PRp/d0+CBNnY6PYKffFqo9tGZlvnZpboF/n+8SKS+JZ6VvXJO7W538VPZXf3EYx1COGAWWvkF9e/HgSAqHg==", - "dev": true + "version": "12.0.0-beta.1", + "resolved": "https://registry.npmjs.org/rescript/-/rescript-12.0.0-beta.1.tgz", + "integrity": "sha512-MuVs8AcHm3QU5knt5mBeGmvhz4LY4GEkF6MurzGDTcWm6TkdEC5zWfh5cOi08QKjlZDYzNBDCPXzTR7bnsCEAA==", + "dev": true, + "requires": { + "@rescript/darwin-arm64": "12.0.0-beta.1", + "@rescript/darwin-x64": "12.0.0-beta.1", + "@rescript/linux-arm64": "12.0.0-beta.1", + "@rescript/linux-x64": "12.0.0-beta.1", + "@rescript/win32-x64": "12.0.0-beta.1" + } } } } diff --git a/package.json b/package.json index f26af36..eae4e5d 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,8 @@ "version": "1.4.0", "description": "Combinator library for JSON decoding and encoding. ", "scripts": { - "build": "rescript build -with-deps", - "start": "rescript build -w -with-deps", + "build": "rescript legacy build -with-deps", + "start": "rescript legacy build -w -with-deps", "clean": "rescript clean", "fmt": "rescript format -all", "test": "true" @@ -28,9 +28,9 @@ "homepage": "https://github.com/glennsl/rescript-json-combinators#readme", "files": [ "src/*.res*", - "bsconfig.json" + "rescript.json" ], "devDependencies": { - "rescript": "^11.0.1" + "rescript": "^12.0.0-beta.1" } } diff --git a/bsconfig.json b/rescript.json similarity index 100% rename from bsconfig.json rename to rescript.json diff --git a/src/Json.res b/src/Json.res index 2a04671..fbfdec0 100644 --- a/src/Json.res +++ b/src/Json.res @@ -7,13 +7,16 @@ let decode = Decode.decode let parse = str => try Ok(str->Js.Json.parseExn) catch { - | Js.Exn.Error(ex) => Error(ex->Js.Exn.message->Js.Option.getWithDefault("Unknown error", _)) + | ex => + let message = ex->JsExn.fromException->Option.flatMap(JsExn.message)->Option.getOr("Unknown error") + Error(message) } let parseExn = str => try str->Js.Json.parseExn catch { - | Js.Exn.Error(ex) => - raise(ParseError(ex->Js.Exn.message->Js.Option.getWithDefault("Unknown error", _))) + | ex => + let message = ex->JsExn.fromException->Option.flatMap(JsExn.message)->Option.getOr("Unknown error") + throw(ParseError(message)) } @val external stringify: Js.Json.t => string = "JSON.stringify" diff --git a/src/Json_Decode.res b/src/Json_Decode.res index 3cf2afa..6e071d6 100644 --- a/src/Json_Decode.res +++ b/src/Json_Decode.res @@ -10,7 +10,7 @@ type fieldDecoders = { exception DecodeError(string) module Error = { - let expected = (kind, json) => raise(DecodeError(`Expected ${kind}, got ${stringify(json)}`)) + let expected = (kind, json) => throw(DecodeError(`Expected ${kind}, got ${stringify(json)}`)) } let custom = f => f @@ -66,16 +66,16 @@ let array = (decode) => (. json) => { for i in 0 to Array.length(source) - 1 { try { let value = decode(. %raw("json[i]")) - target->Array.unsafe_set(i, value) + target->Array.setUnsafe(i, value) } catch { - | DecodeError(msg) => raise(DecodeError(`${msg}\n\tin array at index ${string_of_int(i)}`)) + | DecodeError(msg) => throw(DecodeError(`${msg}\n\tin array at index ${Int.toString(i)}`)) } } target } -let list = (decode) => (. json) => array(decode)(. json)->Array.to_list +let list = (decode) => (. json) => array(decode)(. json)->List.fromArray let option = decode => (. json) => { if Obj.magic(json) == Js.null { @@ -94,15 +94,15 @@ let tuple2 = (decodeA, decodeB) => (. json) => { let arr: array = Obj.magic(json) if Array.length(arr) != 2 { - raise( + throw( DecodeError( - `Expected array of length 2, got array of length ${Array.length(arr)->string_of_int}`, + `Expected array of length 2, got array of length ${Array.length(arr)->Int.toString}`, ), ) } - try (decodeA(. arr->Array.unsafe_get(0)), decodeB(. arr->Array.unsafe_get(1))) catch { - | DecodeError(msg) => raise(DecodeError(`${msg}\n\tin pair`)) + try (decodeA(. arr->Array.getUnsafe(0)), decodeB(. arr->Array.getUnsafe(1))) catch { + | DecodeError(msg) => throw(DecodeError(`${msg}\n\tin pair`)) } } let pair = tuple2 @@ -114,19 +114,19 @@ let tuple3 = (decodeA, decodeB, decodeC) => (. json) => { let arr: array = Obj.magic(json) if Array.length(arr) != 3 { - raise( + throw( DecodeError( - `Expected array of length 3, got array of length ${Array.length(arr)->string_of_int}`, + `Expected array of length 3, got array of length ${Array.length(arr)->Int.toString}`, ), ) } try ( - decodeA(. arr->Array.unsafe_get(0)), - decodeB(. arr->Array.unsafe_get(1)), - decodeC(. arr->Array.unsafe_get(2)), + decodeA(. arr->Array.getUnsafe(0)), + decodeB(. arr->Array.getUnsafe(1)), + decodeC(. arr->Array.getUnsafe(2)), ) catch { - | DecodeError(msg) => raise(DecodeError(`${msg}\n\tin pair`)) + | DecodeError(msg) => throw(DecodeError(`${msg}\n\tin pair`)) } } @@ -137,20 +137,20 @@ let tuple4 = (decodeA, decodeB, decodeC, decodeD) => (. json) => { let arr: array = Obj.magic(json) if Array.length(arr) != 4 { - raise( + throw( DecodeError( - `Expected array of length 4, got array of length ${Array.length(arr)->string_of_int}`, + `Expected array of length 4, got array of length ${Array.length(arr)->Int.toString}`, ), ) } try ( - decodeA(. arr->Array.unsafe_get(0)), - decodeB(. arr->Array.unsafe_get(1)), - decodeC(. arr->Array.unsafe_get(2)), - decodeD(. arr->Array.unsafe_get(3)), + decodeA(. arr->Array.getUnsafe(0)), + decodeB(. arr->Array.getUnsafe(1)), + decodeC(. arr->Array.getUnsafe(2)), + decodeD(. arr->Array.getUnsafe(3)), ) catch { - | DecodeError(msg) => raise(DecodeError(`${msg}\n\tin pair`)) + | DecodeError(msg) => throw(DecodeError(`${msg}\n\tin pair`)) } } @@ -161,7 +161,7 @@ let dict = decode => (. json) => { let source: Js.Dict.t = Obj.magic(json) try Js.Dict.map(decode, source)->Obj.magic catch { - | DecodeError(msg) => raise(DecodeError(`${msg}\n\tin dict'`)) + | DecodeError(msg) => throw(DecodeError(`${msg}\n\tin dict'`)) } } @@ -171,17 +171,17 @@ let field = (key, decode) => (. json) => { } if !(%raw("key in json")) { - raise(DecodeError(`${key} required`)) + throw(DecodeError(`${key} required`)) } try decode(. %raw("json[key]")) catch { - | DecodeError(msg) => raise(DecodeError(`${msg}\n\tat field '${key}'`)) + | DecodeError(msg) => throw(DecodeError(`${msg}\n\tat field '${key}'`)) } } let object = f => (. json) => { if Js.typeof(json) != "object" || Js.Array.isArray(json) || Obj.magic(json) == Js.null { - raise(Error.expected("object", json)) + throw(Error.expected("object", json)) } let optional = (. key, decode) => { @@ -192,18 +192,18 @@ let object = f => (. json) => { let value = decode(. %raw("json[key]")) Some(value) } catch { - | DecodeError(msg) => raise(DecodeError(`${msg}\n\tat field '${key}'`)) + | DecodeError(msg) => throw(DecodeError(`${msg}\n\tat field '${key}'`)) } } } let required = (. key, decode) => { if !(%raw("key in json")) { - raise(DecodeError(`${key} required`)) + throw(DecodeError(`${key} required`)) } try decode(. %raw("json[key]")) catch { - | DecodeError(msg) => raise(DecodeError(`${msg}\n\tat field '${key}'`)) + | DecodeError(msg) => throw(DecodeError(`${msg}\n\tat field '${key}'`)) } } @@ -215,7 +215,7 @@ let oneOf = decoders => (. json) => { let rec loop = i => { if i >= Array.length(decoders) { - raise( + throw( DecodeError( `All decoders given to oneOf failed. Here are all the errors:\n- ${errors->Js.Array2.joinWith( "\n", @@ -224,7 +224,7 @@ let oneOf = decoders => (. json) => { ) } - let decode = Array.unsafe_get(decoders, i) + let decode = Array.getUnsafe(decoders, i) try decode(. json) catch { | DecodeError(err) => errors->Js.Array2.push(err)->ignore diff --git a/src/Json_Encode.res b/src/Json_Encode.res index 2229b93..6c34bf5 100644 --- a/src/Json_Encode.res +++ b/src/Json_Encode.res @@ -20,12 +20,12 @@ let list = encode => l => switch l { | list{} => jsonArray([]) | list{hd, ...tl} => - let arr = Array.make(l->List.length, hd->encode) + let arr = Array.make(~length=l->List.length, hd->encode) let rec fill = (i, l) => switch l { | list{} => arr | list{hd, ...tl} => - Array.unsafe_set(arr, i, hd->encode) + Array.setUnsafe(arr, i, hd->encode) fill(i + 1, tl) } fill(1, tl)->jsonArray