From 094104f063025ebf6e2ddc7f43920c9be8a0de65 Mon Sep 17 00:00:00 2001 From: tsnobip Date: Wed, 11 Jun 2025 09:44:31 +0200 Subject: [PATCH] Require rescript v12 and remove usage of Core --- .changeset/famous-planes-fetch.md | 7 ++ examples/client-rendering/package.json | 3 +- examples/client-rendering/rescript.json | 5 +- .../__generated__/Route__Root__Home_route.res | 2 +- .../Route__Root__PathParamsOnly_route.res | 2 +- ...oot__Todos__ByStatusDecodedExtra_route.res | 2 +- ...t__Todos__ByStatusDecoded__Child_route.res | 2 +- ...te__Root__Todos__ByStatusDecoded_route.res | 2 +- .../Route__Root__Todos__ByStatus_route.res | 2 +- .../Route__Root__Todos__Single_route.res | 2 +- .../Route__Root__Todos_route.res | 2 +- .../__generated__/Route__Root_route.res | 2 +- .../src/utils/NetworkUtils.res | 33 +++----- examples/express/Server.res | 2 +- examples/express/package.json | 5 +- examples/express/rescript.json | 5 +- examples/express/src/EntryServer.res | 25 +++--- .../express/src/bindings/ReactDOMServer.res | 17 ++-- examples/express/src/bindings/Vite.res | 2 +- examples/express/src/bindings/Vite.resi | 2 +- .../Route__Root__Todos__ByStatus_route.res | 2 +- .../Route__Root__Todos__Single_route.res | 2 +- .../Route__Root__Todos_route.res | 2 +- .../__generated__/Route__Root_route.res | 2 +- examples/express/src/utils/NetworkUtils.res | 35 +++----- packages/rescript-relay-router/README.md | 3 +- .../cli/RescriptRelayRouterCli__Codegen.res | 8 +- .../cli/RescriptRelayRouterCli__Commands.res | 11 +-- .../cli/RescriptRelayRouterCli__Parser.res | 16 ++-- .../cli/RescriptRelayRouterCli__Utils.res | 8 +- .../rescript-relay-router/cli/lsp/Lsp.res | 10 +-- packages/rescript-relay-router/package.json | 3 +- packages/rescript-relay-router/rescript.json | 4 +- .../rescript-relay-router/rollup.config.js | 6 +- .../rescript-relay-router/src/RelayRouter.res | 4 +- .../src/RelayRouter__AssetPreloader.res | 31 +++---- .../src/RelayRouter__Bindings.res | 2 +- .../src/RelayRouter__Bindings.resi | 2 +- .../src/RelayRouter__Internal.res | 2 +- ...yRouter__Internal__DeclarationsSupport.res | 8 +- .../src/RelayRouter__Manifest.res | 5 +- .../src/RelayRouter__NetworkUtils.res | 4 +- .../src/RelayRouter__NetworkUtils.resi | 2 +- .../src/RelayRouter__Scroll.res | 6 +- .../src/RelaySSRUtils.res | 14 +--- ...riptRelayVitePlugin__ManifestTransform.res | 11 +-- packages/test-utils/package.json | 3 +- packages/test-utils/rescript.json | 3 +- packages/test-utils/src/Vitest.res | 31 ++----- yarn.lock | 83 ++++++++++++++----- 50 files changed, 220 insertions(+), 227 deletions(-) create mode 100644 .changeset/famous-planes-fetch.md diff --git a/.changeset/famous-planes-fetch.md b/.changeset/famous-planes-fetch.md new file mode 100644 index 00000000..15583faa --- /dev/null +++ b/.changeset/famous-planes-fetch.md @@ -0,0 +1,7 @@ +--- +"@rescript-relay-router-example/client-rendering": major +"@rescript-relay-router-example/express": major +"rescript-relay-router": major +--- + +Require Rescript v12 and remove usage of Core diff --git a/examples/client-rendering/package.json b/examples/client-rendering/package.json index 9a50614c..54a3e947 100644 --- a/examples/client-rendering/package.json +++ b/examples/client-rendering/package.json @@ -44,7 +44,7 @@ "react-dom": "^18.2.0", "react-relay": "17.0.0", "relay-runtime": "17.0.0", - "rescript": "11.1.3", + "rescript": "12.0.0-alpha.13", "rescript-relay": "3.0.0", "rollup": "^2", "rollup-plugin-visualizer": "5.5.0", @@ -54,7 +54,6 @@ }, "dependencies": { "@rescript-relay-router/test-utils": "workspace:^", - "@rescript/core": "1.5.2", "history": "^5.2.0", "jsonc-parser": "^3.0.0", "rescript-relay-router": "workspace:^", diff --git a/examples/client-rendering/rescript.json b/examples/client-rendering/rescript.json index f222fe43..187c16d9 100644 --- a/examples/client-rendering/rescript.json +++ b/examples/client-rendering/rescript.json @@ -28,10 +28,9 @@ "bs-dependencies": [ "@rescript/react", "rescript-relay", - "rescript-relay-router", - "@rescript/core" + "rescript-relay-router" ], "bs-dev-dependencies": ["@rescript-relay-router/test-utils"], - "bsc-flags": ["-open RescriptCore"], + "bsc-flags": [], "pinned-dependencies": ["rescript-relay-router"] } diff --git a/examples/client-rendering/src/routes/__generated__/Route__Root__Home_route.res b/examples/client-rendering/src/routes/__generated__/Route__Root__Home_route.res index a3de66a6..bfa46b95 100644 --- a/examples/client-rendering/src/routes/__generated__/Route__Root__Home_route.res +++ b/examples/client-rendering/src/routes/__generated__/Route__Root__Home_route.res @@ -45,7 +45,7 @@ let routePattern = "/home" @live let makeLink = () => { - RelayRouter.Bindings.generatePath(routePattern, Dict.fromArray([])) + RelayRouter.Bindings.generatePath(routePattern, dict{}) } @live diff --git a/examples/client-rendering/src/routes/__generated__/Route__Root__PathParamsOnly_route.res b/examples/client-rendering/src/routes/__generated__/Route__Root__PathParamsOnly_route.res index fb5f2392..46a74f30 100644 --- a/examples/client-rendering/src/routes/__generated__/Route__Root__PathParamsOnly_route.res +++ b/examples/client-rendering/src/routes/__generated__/Route__Root__PathParamsOnly_route.res @@ -52,7 +52,7 @@ let routePattern = "/other/:pageSlug" @live let makeLink = (~pageSlug: string) => { - RelayRouter.Bindings.generatePath(routePattern, Dict.fromArray([("pageSlug", (pageSlug :> string)->encodeURIComponent)])) + RelayRouter.Bindings.generatePath(routePattern, dict{"pageSlug": (pageSlug :> string)->encodeURIComponent}) } @live diff --git a/examples/client-rendering/src/routes/__generated__/Route__Root__Todos__ByStatusDecodedExtra_route.res b/examples/client-rendering/src/routes/__generated__/Route__Root__Todos__ByStatusDecodedExtra_route.res index 9b3080a9..ebd5b575 100644 --- a/examples/client-rendering/src/routes/__generated__/Route__Root__Todos__ByStatusDecodedExtra_route.res +++ b/examples/client-rendering/src/routes/__generated__/Route__Root__Todos__ByStatusDecodedExtra_route.res @@ -139,7 +139,7 @@ let makeLink = (~byStatusDecoded: TodoStatusPathParam.t, ~statuses: option () | Some(byValue) => queryParams->QueryParams.setParam(~key="byValue", ~value=byValue) } - RelayRouter.Bindings.generatePath(routePattern, Dict.fromArray([("byStatusDecoded", (byStatusDecoded :> string)->encodeURIComponent)])) ++ queryParams->QueryParams.toString + RelayRouter.Bindings.generatePath(routePattern, dict{"byStatusDecoded": (byStatusDecoded :> string)->encodeURIComponent}) ++ queryParams->QueryParams.toString } @live let makeLinkFromQueryParams = (~byStatusDecoded: TodoStatusPathParam.t, queryParams: queryParams) => { diff --git a/examples/client-rendering/src/routes/__generated__/Route__Root__Todos__ByStatusDecoded__Child_route.res b/examples/client-rendering/src/routes/__generated__/Route__Root__Todos__ByStatusDecoded__Child_route.res index 6f8f4d89..ffbc1198 100644 --- a/examples/client-rendering/src/routes/__generated__/Route__Root__Todos__ByStatusDecoded__Child_route.res +++ b/examples/client-rendering/src/routes/__generated__/Route__Root__Todos__ByStatusDecoded__Child_route.res @@ -139,7 +139,7 @@ let makeLink = (~byStatusDecoded: TodoStatusPathParam.t, ~statuses: option () | Some(byValue) => queryParams->QueryParams.setParam(~key="byValue", ~value=byValue) } - RelayRouter.Bindings.generatePath(routePattern, Dict.fromArray([("byStatusDecoded", (byStatusDecoded :> string)->encodeURIComponent)])) ++ queryParams->QueryParams.toString + RelayRouter.Bindings.generatePath(routePattern, dict{"byStatusDecoded": (byStatusDecoded :> string)->encodeURIComponent}) ++ queryParams->QueryParams.toString } @live let makeLinkFromQueryParams = (~byStatusDecoded: TodoStatusPathParam.t, queryParams: queryParams) => { diff --git a/examples/client-rendering/src/routes/__generated__/Route__Root__Todos__ByStatusDecoded_route.res b/examples/client-rendering/src/routes/__generated__/Route__Root__Todos__ByStatusDecoded_route.res index 3def7054..fe80cc45 100644 --- a/examples/client-rendering/src/routes/__generated__/Route__Root__Todos__ByStatusDecoded_route.res +++ b/examples/client-rendering/src/routes/__generated__/Route__Root__Todos__ByStatusDecoded_route.res @@ -147,7 +147,7 @@ let makeLink = (~byStatusDecoded: TodoStatusPathParam.t, ~statuses: option () | Some(byValue) => queryParams->QueryParams.setParam(~key="byValue", ~value=byValue) } - RelayRouter.Bindings.generatePath(routePattern, Dict.fromArray([("byStatusDecoded", (byStatusDecoded :> string)->encodeURIComponent)])) ++ queryParams->QueryParams.toString + RelayRouter.Bindings.generatePath(routePattern, dict{"byStatusDecoded": (byStatusDecoded :> string)->encodeURIComponent}) ++ queryParams->QueryParams.toString } @live let makeLinkFromQueryParams = (~byStatusDecoded: TodoStatusPathParam.t, queryParams: queryParams) => { diff --git a/examples/client-rendering/src/routes/__generated__/Route__Root__Todos__ByStatus_route.res b/examples/client-rendering/src/routes/__generated__/Route__Root__Todos__ByStatus_route.res index d120403b..3f6e8991 100644 --- a/examples/client-rendering/src/routes/__generated__/Route__Root__Todos__ByStatus_route.res +++ b/examples/client-rendering/src/routes/__generated__/Route__Root__Todos__ByStatus_route.res @@ -139,7 +139,7 @@ let makeLink = (~byStatus: [#"completed" | #"not-completed"], ~statuses: option< | None => () | Some(byValue) => queryParams->QueryParams.setParam(~key="byValue", ~value=byValue) } - RelayRouter.Bindings.generatePath(routePattern, Dict.fromArray([("byStatus", (byStatus :> string)->encodeURIComponent)])) ++ queryParams->QueryParams.toString + RelayRouter.Bindings.generatePath(routePattern, dict{"byStatus": (byStatus :> string)->encodeURIComponent}) ++ queryParams->QueryParams.toString } @live let makeLinkFromQueryParams = (~byStatus: [#"completed" | #"not-completed"], queryParams: queryParams) => { diff --git a/examples/client-rendering/src/routes/__generated__/Route__Root__Todos__Single_route.res b/examples/client-rendering/src/routes/__generated__/Route__Root__Todos__Single_route.res index fb918fd0..1ed3580a 100644 --- a/examples/client-rendering/src/routes/__generated__/Route__Root__Todos__Single_route.res +++ b/examples/client-rendering/src/routes/__generated__/Route__Root__Todos__Single_route.res @@ -165,7 +165,7 @@ let makeLink = (~todoId: string, ~statuses: option>=?, ~stat | None => () | Some(showMore) => queryParams->QueryParams.setParam(~key="showMore", ~value=switch showMore { | true => "true" | false => "false" }) } - RelayRouter.Bindings.generatePath(routePattern, Dict.fromArray([("todoId", (todoId :> string)->encodeURIComponent)])) ++ queryParams->QueryParams.toString + RelayRouter.Bindings.generatePath(routePattern, dict{"todoId": (todoId :> string)->encodeURIComponent}) ++ queryParams->QueryParams.toString } @live let makeLinkFromQueryParams = (~todoId: string, queryParams: queryParams) => { diff --git a/examples/client-rendering/src/routes/__generated__/Route__Root__Todos_route.res b/examples/client-rendering/src/routes/__generated__/Route__Root__Todos_route.res index 898cc39f..c27a0526 100644 --- a/examples/client-rendering/src/routes/__generated__/Route__Root__Todos_route.res +++ b/examples/client-rendering/src/routes/__generated__/Route__Root__Todos_route.res @@ -141,7 +141,7 @@ let makeLink = (~statuses: option>=?, ~statusWithDefault: op | None => () | Some(byValue) => queryParams->QueryParams.setParam(~key="byValue", ~value=byValue) } - RelayRouter.Bindings.generatePath(routePattern, Dict.fromArray([])) ++ queryParams->QueryParams.toString + RelayRouter.Bindings.generatePath(routePattern, dict{}) ++ queryParams->QueryParams.toString } @live let makeLinkFromQueryParams = (queryParams: queryParams) => { diff --git a/examples/client-rendering/src/routes/__generated__/Route__Root_route.res b/examples/client-rendering/src/routes/__generated__/Route__Root_route.res index 00e977d3..1a96630c 100644 --- a/examples/client-rendering/src/routes/__generated__/Route__Root_route.res +++ b/examples/client-rendering/src/routes/__generated__/Route__Root_route.res @@ -55,7 +55,7 @@ let routePattern = "/" @live let makeLink = () => { - RelayRouter.Bindings.generatePath(routePattern, Dict.fromArray([])) + RelayRouter.Bindings.generatePath(routePattern, dict{}) } @live diff --git a/examples/client-rendering/src/utils/NetworkUtils.res b/examples/client-rendering/src/utils/NetworkUtils.res index dc609909..cfdea1e3 100644 --- a/examples/client-rendering/src/utils/NetworkUtils.res +++ b/examples/client-rendering/src/utils/NetworkUtils.res @@ -3,29 +3,20 @@ // (comprehensive) example application we're going to build eventually. let preloadFromResponse = (part: JSON.t, ~preloadAsset: RelayRouter__Types.preloadAssetFn) => { switch part { - | Object(obj) => - switch obj->Dict.get("extensions") { - // todo: use pattern matching on dict once we move to rescript v12 - | Some(Object(extensions)) => - let images = switch extensions->Dict.get("preloadableImages") { - | Some(Array(images)) => - images->Array.filterMap(item => - switch item { - | String(url) => Some(url) - | _ => None - } - ) - | _ => [] - } - images->Array.forEach(imgUrl => { + | Object(dict{"extensions": JSON.Object(dict{"preloadableImages": JSON.Array(images)})}) => + images->Array.forEach(item => + switch item { + | String(imgUrl) => preloadAsset(~priority=RelayRouter.Types.Default, RelayRouter.Types.Image({url: imgUrl})) - }) - | _ => () - } + | _ => () + } + ) | _ => () } } +external toOldExnUnsafe: JsExn.t => Exn.t = "%identity" + // The client and server fetch query are currently copied, but one could easily // set them up so that they use the same base, and just take whatever config // they need. @@ -37,7 +28,7 @@ let makeFetchQuery = (~preloadAsset) => "http://0.0.0.0:4000/graphql", { "method": "POST", - "headers": Dict.fromArray([("content-type", "application/json")]), + "headers": dict{"content-type": "application/json"}, "body": {"query": operation.text, "variables": variables} ->JSON.stringifyAny ->Option.getOr(""), @@ -50,14 +41,14 @@ let makeFetchQuery = (~preloadAsset) => sink.next(part) }, ~onError=err => { - sink.error(err) + err->toOldExnUnsafe->sink.error }, ~onComplete=() => { sink.complete() }, ) }) - ->ignore + ->Promise.ignore None }) diff --git a/examples/express/Server.res b/examples/express/Server.res index a8837c81..22904569 100644 --- a/examples/express/Server.res +++ b/examples/express/Server.res @@ -67,7 +67,7 @@ switch NodeJs.isProduction { }, ) } catch { - | Exn.Error(err) => { + | JsExn(err) => { vite->ssrFixStacktrace(err) Console.log("[debug] got error") Console.log(err) diff --git a/examples/express/package.json b/examples/express/package.json index ddac0d6e..e5258182 100644 --- a/examples/express/package.json +++ b/examples/express/package.json @@ -10,7 +10,7 @@ "scripts": { "build": "yarn router:generate && run-s 'build:*'", "build:relay": "rescript-relay-compiler", - "build:rescript": "rescript build -with-deps", + "build:rescript": "rescript", "build:vite": "run-s 'build:vite:*'", "build:vite:client": "vite build --outDir dist/client --ssrManifest --manifest", "build:vite:server": "vite build --outDir dist/server --ssr src/EntryServer.res.mjs", @@ -46,7 +46,7 @@ "react-dom": "^18.2.0", "react-relay": "17.0.0", "relay-runtime": "17.0.0", - "rescript": "11.1.3", + "rescript": "12.0.0-alpha.13", "rescript-relay": "3.0.0", "rollup": "^2", "rollup-plugin-visualizer": "5.5.0", @@ -54,7 +54,6 @@ "vite-plugin-html": "3.2.0" }, "dependencies": { - "@rescript/core": "1.5.2", "history": "^5.2.0", "jsonc-parser": "^3.0.0", "node-fetch": "^3.2.0", diff --git a/examples/express/rescript.json b/examples/express/rescript.json index 9d357492..2d20e17e 100644 --- a/examples/express/rescript.json +++ b/examples/express/rescript.json @@ -24,9 +24,8 @@ "bs-dependencies": [ "@rescript/react", "rescript-relay", - "rescript-relay-router", - "@rescript/core" + "rescript-relay-router" ], - "bsc-flags": ["-open RescriptCore"], + "bsc-flags": [], "pinned-dependencies": ["rescript-relay-router"] } diff --git a/examples/express/src/EntryServer.res b/examples/express/src/EntryServer.res index b426b3fe..96068eca 100644 --- a/examples/express/src/EntryServer.res +++ b/examples/express/src/EntryServer.res @@ -91,15 +91,15 @@ let handleRequest = (~request, ~response, ~manifest: RelayRouter.Manifest.t) => stream := ReactDOMServer.renderToPipeableStream( , - ReactDOMServer.renderToPipeableStreamOptions( - // This renders as React is ready to start hydrating, and ensures that - // if the client side bundle has already been downloaded, it starts - // hydrating right away. If not, it lets the client bundle know that - // React is ready to hydrate, and the client bundle starts hydration - // as soon as it loads. - ~bootstrapScriptContent="window.__READY_TO_BOOT ? window.__BOOT() : (window.__READY_TO_BOOT = true)", - ~bootstrapModules, - ~onShellReady=() => { + ~options=// This renders as React is ready to start hydrating, and ensures that + // if the client side bundle has already been downloaded, it starts + // hydrating right away. If not, it lets the client bundle know that + // React is ready to hydrate, and the client bundle starts hydration + // as soon as it loads. + { + bootstrapScriptContent: "window.__READY_TO_BOOT ? window.__BOOT() : (window.__READY_TO_BOOT = true)", + bootstrapModules, + onShellReady: () => { response->Express.Response.setHeader("Content-Type", "text/html") response->Express.Response.setStatus(didError.contents ? 500 : 200) @@ -116,17 +116,16 @@ let handleRequest = (~request, ~response, ~manifest: RelayRouter.Manifest.t) => resolve(ignore()) }, - ~onShellError=err => { + onShellError: err => { cleanup() reject(err) }, - ~onError=err => { + onError: err => { cleanup() didError := true Console.error(err) }, - (), - ), + }, )->Some }) } diff --git a/examples/express/src/bindings/ReactDOMServer.res b/examples/express/src/bindings/ReactDOMServer.res index 2bf50819..afdb8a15 100644 --- a/examples/express/src/bindings/ReactDOMServer.res +++ b/examples/express/src/bindings/ReactDOMServer.res @@ -4,16 +4,13 @@ external renderToString: React.element => string = "renderToString" @module("react-dom/server") external renderToStaticMarkup: React.element => string = "renderToStaticMarkup" -// Use deriving(abstrat) because we don't want functions to show up in the object -// if they're not used. -@deriving(abstract) type renderToPipeableStreamOptions = { - @optional bootstrapScriptContent: string, - @optional bootstrapModules: array, - @optional onShellReady: unit => unit, - @optional onShellError: Exn.t => unit, - @optional onAllReady: unit => unit, - @optional onError: Exn.t => unit, + bootstrapScriptContent?: string, + bootstrapModules?: array, + onShellReady?: unit => unit, + onShellError?: JsError.t => unit, + onAllReady?: unit => unit, + onError?: JsError.t => unit, } type renderToPipeableStreamControls = { @@ -24,5 +21,5 @@ type renderToPipeableStreamControls = { @module("react-dom/server") external renderToPipeableStream: ( React.element, - renderToPipeableStreamOptions, + ~options: renderToPipeableStreamOptions=?, ) => renderToPipeableStreamControls = "renderToPipeableStream" diff --git a/examples/express/src/bindings/Vite.res b/examples/express/src/bindings/Vite.res index 68a84a3b..f61d3a80 100644 --- a/examples/express/src/bindings/Vite.res +++ b/examples/express/src/bindings/Vite.res @@ -16,4 +16,4 @@ let make = (~middlewareMode) => make({server: {middlewareMode: middlewareMode}}) @send external transformIndexHtml: (t, string, string) => promise = "transformIndexHtml" -@send external ssrFixStacktrace: (t, Exn.t) => unit = "ssrFixStackTrace" +@send external ssrFixStacktrace: (t, JsExn.t) => unit = "ssrFixStackTrace" diff --git a/examples/express/src/bindings/Vite.resi b/examples/express/src/bindings/Vite.resi index fec05232..0bfa670b 100644 --- a/examples/express/src/bindings/Vite.resi +++ b/examples/express/src/bindings/Vite.resi @@ -9,4 +9,4 @@ let make: (~middlewareMode: middlewareMode) => Promise.t @send external transformIndexHtml: (t, string, string) => Promise.t = "transformIndexHtml" -@send external ssrFixStacktrace: (t, Exn.t) => unit = "ssrFixStackTrace" +@send external ssrFixStacktrace: (t, JsExn.t) => unit = "ssrFixStackTrace" diff --git a/examples/express/src/routes/__generated__/Route__Root__Todos__ByStatus_route.res b/examples/express/src/routes/__generated__/Route__Root__Todos__ByStatus_route.res index c9a928d5..3475a450 100644 --- a/examples/express/src/routes/__generated__/Route__Root__Todos__ByStatus_route.res +++ b/examples/express/src/routes/__generated__/Route__Root__Todos__ByStatus_route.res @@ -111,7 +111,7 @@ let makeLink = (~byStatus: [#"completed" | #"notCompleted"], ~statuses: option () | Some(statuses) => queryParams->QueryParams.setParamArray(~key="statuses", ~value=statuses->Array.map(value => value->TodoStatus.serialize)) } - RelayRouter.Bindings.generatePath(routePattern, Dict.fromArray([("byStatus", (byStatus :> string)->encodeURIComponent)])) ++ queryParams->QueryParams.toString + RelayRouter.Bindings.generatePath(routePattern, dict{"byStatus": (byStatus :> string)->encodeURIComponent}) ++ queryParams->QueryParams.toString } @live let makeLinkFromQueryParams = (~byStatus: [#"completed" | #"notCompleted"], queryParams: queryParams) => { diff --git a/examples/express/src/routes/__generated__/Route__Root__Todos__Single_route.res b/examples/express/src/routes/__generated__/Route__Root__Todos__Single_route.res index c29f8149..e856b76f 100644 --- a/examples/express/src/routes/__generated__/Route__Root__Todos__Single_route.res +++ b/examples/express/src/routes/__generated__/Route__Root__Todos__Single_route.res @@ -137,7 +137,7 @@ let makeLink = (~todoId: string, ~statuses: option>=?, ~show | None => () | Some(showMore) => queryParams->QueryParams.setParam(~key="showMore", ~value=switch showMore { | true => "true" | false => "false" }) } - RelayRouter.Bindings.generatePath(routePattern, Dict.fromArray([("todoId", (todoId :> string)->encodeURIComponent)])) ++ queryParams->QueryParams.toString + RelayRouter.Bindings.generatePath(routePattern, dict{"todoId": (todoId :> string)->encodeURIComponent}) ++ queryParams->QueryParams.toString } @live let makeLinkFromQueryParams = (~todoId: string, queryParams: queryParams) => { diff --git a/examples/express/src/routes/__generated__/Route__Root__Todos_route.res b/examples/express/src/routes/__generated__/Route__Root__Todos_route.res index dc6ecf75..53e2fa82 100644 --- a/examples/express/src/routes/__generated__/Route__Root__Todos_route.res +++ b/examples/express/src/routes/__generated__/Route__Root__Todos_route.res @@ -112,7 +112,7 @@ let makeLink = (~statuses: option>=?) => { | None => () | Some(statuses) => queryParams->QueryParams.setParamArray(~key="statuses", ~value=statuses->Array.map(value => value->TodoStatus.serialize)) } - RelayRouter.Bindings.generatePath(routePattern, Dict.fromArray([])) ++ queryParams->QueryParams.toString + RelayRouter.Bindings.generatePath(routePattern, dict{}) ++ queryParams->QueryParams.toString } @live let makeLinkFromQueryParams = (queryParams: queryParams) => { diff --git a/examples/express/src/routes/__generated__/Route__Root_route.res b/examples/express/src/routes/__generated__/Route__Root_route.res index 316cdd06..05ea7386 100644 --- a/examples/express/src/routes/__generated__/Route__Root_route.res +++ b/examples/express/src/routes/__generated__/Route__Root_route.res @@ -53,7 +53,7 @@ let routePattern = "/" @live let makeLink = () => { - RelayRouter.Bindings.generatePath(routePattern, Dict.fromArray([])) + RelayRouter.Bindings.generatePath(routePattern, dict{}) } @live diff --git a/examples/express/src/utils/NetworkUtils.res b/examples/express/src/utils/NetworkUtils.res index ac53ca80..5babd3dc 100644 --- a/examples/express/src/utils/NetworkUtils.res +++ b/examples/express/src/utils/NetworkUtils.res @@ -3,29 +3,20 @@ // (comprehensive) example application we're going to build eventually. let preloadFromResponse = (part: JSON.t, ~preloadAsset: RelayRouter__Types.preloadAssetFn) => { switch part { - | Object(obj) => - switch obj->Dict.get("extensions") { - // todo: use pattern matching on dict once we move to rescript v12 - | Some(Object(extensions)) => - let images = switch extensions->Dict.get("preloadableImages") { - | Some(Array(images)) => - images->Array.filterMap(item => - switch item { - | String(url) => Some(url) - | _ => None - } - ) - | _ => [] - } - images->Array.forEach(imgUrl => { + | Object(dict{"extensions": JSON.Object(dict{"preloadableImages": JSON.Array(images)})}) => + images->Array.forEach(item => + switch item { + | String(imgUrl) => preloadAsset(~priority=RelayRouter.Types.Default, RelayRouter.Types.Image({url: imgUrl})) - }) - | _ => () - } + | _ => () + } + ) | _ => () } } +external toOldExnUnsafe: JsExn.t => Exn.t = "%identity" + // The client and server fetch query are currently copied, but one could easily // set them up so that they use the same base, and just take whatever config // they need. @@ -37,7 +28,7 @@ let makeFetchQuery = (~preloadAsset) => "http://localhost:4000/graphql", { "method": "POST", - "headers": Dict.fromArray([("content-type", "application/json")]), + "headers": dict{"content-type": "application/json"}, "body": {"query": operation.text, "variables": variables} ->JSON.stringifyAny ->Option.getOr(""), @@ -50,7 +41,7 @@ let makeFetchQuery = (~preloadAsset) => sink.next(part) }, ~onError=err => { - sink.error(err) + err->toOldExnUnsafe->sink.error }, ~onComplete=() => { sink.complete() @@ -79,7 +70,7 @@ let makeServerFetchQuery = ( "http://localhost:4000/graphql", { "method": "POST", - "headers": Dict.fromArray([("content-type", "application/json")]), + "headers": dict{"content-type": "application/json"}, "body": {"query": operation.text, "variables": variables} ->JSON.stringifyAny ->Option.getOr(""), @@ -92,7 +83,7 @@ let makeServerFetchQuery = ( sink.next(part) }, ~onError=err => { - sink.error(err) + err->toOldExnUnsafe->sink.error }, ~onComplete=() => { sink.complete() diff --git a/packages/rescript-relay-router/README.md b/packages/rescript-relay-router/README.md index ff4966d5..00d795ed 100644 --- a/packages/rescript-relay-router/README.md +++ b/packages/rescript-relay-router/README.md @@ -19,6 +19,7 @@ A router designed for scale, performance and ergonomics. Tailored for usage with The router requires the following: +- `rescript@>=12.0.0` - `vite` for your project setup, `>2.8.0`. - [`build: { target: "esnext" }`](https://vitejs.dev/config/#build-target) in your `vite.config.js`. - `"type": "module"` in your `package.json`, meaning you need to run in es modules mode. @@ -323,7 +324,7 @@ A few notes on preloading: If your only scrolling area is the document itself, you can enable scroll restoration via the router (if you don't prefer the browser's built in scroll restoration) by simply rendering `` inside of your app, close to the router provider. -> Remember to turn off the built in browser scroll restoration if you do this: ``%%raw(`window.history.scrollRestoration = "manual"`)`` +> Remember to turn off the built in browser scroll restoration if you do this: `` %%raw(`window.history.scrollRestoration = "manual"`) `` If you have scrolling content areas that isn't scrolling on the main document itself, you'll need to tell the router about it so it can correctly help you with scroll restoration, and look at the intersection of the correct elements when detecting if links are in view yet. You tell the router about your scrolling areas this way: diff --git a/packages/rescript-relay-router/cli/RescriptRelayRouterCli__Codegen.res b/packages/rescript-relay-router/cli/RescriptRelayRouterCli__Codegen.res index 1a417589..ac419bfe 100644 --- a/packages/rescript-relay-router/cli/RescriptRelayRouterCli__Codegen.res +++ b/packages/rescript-relay-router/cli/RescriptRelayRouterCli__Codegen.res @@ -90,9 +90,9 @@ let routePattern = "${route.path->RoutePath.toPattern}" ") => {\n"->addToStr let pathParamNames = route.params->Array.map(Utils.printablePathParamToParamName) - let pathParamsAsJsDict = `Dict.fromArray([${pathParamNames - ->Array.map(paramName => `("${paramName}", (${paramName} :> string)->encodeURIComponent)`) - ->Array.join(",")}])` + let pathParamsAsDict = `dict{${pathParamNames + ->Array.map(paramName => `"${paramName}": (${paramName} :> string)->encodeURIComponent`) + ->Array.join(",")}}` if hasQueryParams { ` open RelayRouter.Bindings\n let queryParams = QueryParams.make()`->addToStr @@ -112,7 +112,7 @@ let routePattern = "${route.path->RoutePath.toPattern}" }) } - ` RelayRouter.Bindings.generatePath(routePattern, ${pathParamsAsJsDict})`->addToStr + ` RelayRouter.Bindings.generatePath(routePattern, ${pathParamsAsDict})`->addToStr if hasQueryParams { " ++ queryParams->QueryParams.toString"->addToStr diff --git a/packages/rescript-relay-router/cli/RescriptRelayRouterCli__Commands.res b/packages/rescript-relay-router/cli/RescriptRelayRouterCli__Commands.res index 9ccb6a91..1dc74caf 100644 --- a/packages/rescript-relay-router/cli/RescriptRelayRouterCli__Commands.res +++ b/packages/rescript-relay-router/cli/RescriptRelayRouterCli__Commands.res @@ -320,7 +320,7 @@ let runCli = args => { | Example: find-route /todos/123`) Done | list{"scaffold-route-renderers", ...options} => - let deleteRemoved = options->List.has("-delete-removed", \"=") + let deleteRemoved = options->List.has("-delete-removed", String.equal) let config = Utils.Config.load() Utils.ensureRouteStructure(config.routesFolderPath) @@ -334,9 +334,10 @@ let runCli = args => { } Done | list{"generate", ...options} => { - let scaffoldAfterGenerating = options->List.has("-scaffold-renderers", \"=") - let deleteRemoved = options->List.has("-delete-removed", \"=") - let shouldWatch = options->List.has("-w", \"=") || options->List.has("--watch", \"=") + let scaffoldAfterGenerating = options->List.has("-scaffold-renderers", String.equal) + let deleteRemoved = options->List.has("-delete-removed", String.equal) + let shouldWatch = + options->List.has("-w", String.equal) || options->List.has("--watch", String.equal) let config = Utils.Config.load() @@ -389,7 +390,7 @@ let runCli = args => { | list{"lsp", ...options} => let config = Utils.Config.load() - let mode = if options->List.has("-stdio", \"=") { + let mode = if options->List.has("-stdio", String.equal) { Lsp.Stdio } else { NodeRpc diff --git a/packages/rescript-relay-router/cli/RescriptRelayRouterCli__Parser.res b/packages/rescript-relay-router/cli/RescriptRelayRouterCli__Parser.res index fc08f831..de143d68 100644 --- a/packages/rescript-relay-router/cli/RescriptRelayRouterCli__Parser.res +++ b/packages/rescript-relay-router/cli/RescriptRelayRouterCli__Parser.res @@ -7,7 +7,7 @@ open RescriptRelayRouterCli__Types type parserContext = { routeFileNames: array, routeFiles: dict, - getRouteFileContents: string => result, + getRouteFileContents: string => result, } type currentFileContext = { @@ -332,7 +332,7 @@ module Path = { switch currentCtx.paramName->String.length { | 0 => - switch %re(`/[a-z]/`)->RegExp.test(char) { + switch /[a-z]/->RegExp.test(char) { | true => () | false => ctx.addDecodeError( @@ -341,7 +341,7 @@ module Path = { ) } | _ => - switch %re(`/[A-Za-z0-9_]/`)->RegExp.test(char) { + switch /[A-Za-z0-9_]/->RegExp.test(char) { | true => () | false => ctx.addDecodeError( @@ -359,7 +359,7 @@ module Path = { switch currentCtx.paramName->String.length { | 0 => - switch %re(`/[A-Z]/`)->RegExp.test(char) { + switch /[A-Z]/->RegExp.test(char) { | true => () | false => ctx.addDecodeError( @@ -368,7 +368,7 @@ module Path = { ) } | _ => - switch %re(`/[A-Za-z0-9_\.]/`)->RegExp.test(char) { + switch /[A-Za-z0-9_\.]/->RegExp.test(char) { | true => () | false => ctx.addDecodeError( @@ -386,7 +386,7 @@ module Path = { switch currentCtx.currentMatchParam->String.length { | 0 => - switch %re(`/[a-zA-Z]/`)->RegExp.test(char) { + switch /[a-zA-Z]/->RegExp.test(char) { | true => () | false => ctx.addDecodeError( @@ -395,7 +395,7 @@ module Path = { ) } | _ => - switch %re(`/[A-Za-z0-9_\-]/`)->RegExp.test(char) { + switch /[A-Za-z0-9_\-]/->RegExp.test(char) { | true => () | false => ctx.addDecodeError( @@ -618,7 +618,7 @@ module Validators = { Some({loc, name: "_"}) | routeName => switch ( - %re(`/^[A-Z][a-zA-Z0-9_]+$/`)->RegExp.test(routeName), + /^[A-Z][a-zA-Z0-9_]+$/->RegExp.test(routeName), siblings->routeWithNameAlreadyExists(~routeName), ) { | (true, false) => Some({loc, name: routeName}) diff --git a/packages/rescript-relay-router/cli/RescriptRelayRouterCli__Utils.res b/packages/rescript-relay-router/cli/RescriptRelayRouterCli__Utils.res index 06940acf..24302766 100644 --- a/packages/rescript-relay-router/cli/RescriptRelayRouterCli__Utils.res +++ b/packages/rescript-relay-router/cli/RescriptRelayRouterCli__Utils.res @@ -21,7 +21,7 @@ module Config: { let routesFolderPath = switch config->Dict.get("routesFolderPath") { | Some(routesFolderPath) => routesFolderPath->resolveFullPath | None => - raise( + throw( Invalid_config( "You must set 'routesFolderPath', a relative path to where your routing code will be located.", ), @@ -42,7 +42,7 @@ module Config: { } | _ => - raise( + throw( Invalid_config( "Could not find router config. Please make sure you've defined a router config either in 'rescriptRelayRouter' in package.json, rescriptRelayRouter.json, or in rescriptRelayRouter.config.js/rescriptRelayRouter.config.cjs", ), @@ -221,13 +221,13 @@ let readRouteStructure = (config): ( try { Ok(Fs.readFileSync(pathInRoutesFolder(~config, ~fileName))) } catch { - | Exn.Error(exn) => Error(exn) + | JsExn(exn) => Error(exn) } }, ) if errors->Array.length > 0 { - raise(Decode_error(routeStructure)) + throw(Decode_error(routeStructure)) } let printable = routeChildrenToPrintable(result) diff --git a/packages/rescript-relay-router/cli/lsp/Lsp.res b/packages/rescript-relay-router/cli/lsp/Lsp.res index 6c23e8ac..f5f531ae 100644 --- a/packages/rescript-relay-router/cli/lsp/Lsp.res +++ b/packages/rescript-relay-router/cli/lsp/Lsp.res @@ -334,7 +334,7 @@ module CurrentContext: { type t let make: ( ~config: config, - ~getRouteFileContents: string => result, + ~getRouteFileContents: string => result, ~routeRenderersCache: dict, ) => t let isValidRouteFile: (t, string) => bool @@ -396,7 +396,7 @@ let start = (~mode, ~config: config) => { try { Ok(Bindings.Fs.readFileSync(Utils.pathInRoutesFolder(~config, ~fileName))) } catch { - | Exn.Error(exn) => Error(exn) + | JsExn(exn) => Error(exn) } } } @@ -632,7 +632,7 @@ let start = (~mode, ~config: config) => { ->send } else { shutdownRequestAlreadyReceived := true - routeFilesWatcher->Bindings.Chokidar.Watcher.close->Promise.done + routeFilesWatcher->Bindings.Chokidar.Watcher.close->Promise.ignore Message.Response.make(~id=msg->Message.getId, ~result=Message.Result.null()) ->Message.Response.asMessage ->send @@ -773,7 +773,7 @@ let start = (~mode, ~config: config) => { } } }) - ->Promise.done + ->Promise.ignore } } @@ -845,7 +845,7 @@ let start = (~mode, ~config: config) => { } } }) - ->Promise.done + ->Promise.ignore } | RescriptRelayRouterRoutesMatchingUrl([url]) => let urlObj = Bindings.URL.make( diff --git a/packages/rescript-relay-router/package.json b/packages/rescript-relay-router/package.json index 79583b7a..bd2c7b69 100644 --- a/packages/rescript-relay-router/package.json +++ b/packages/rescript-relay-router/package.json @@ -44,7 +44,6 @@ "vite": ">=4.4.9" }, "dependencies": { - "@rescript/core": "1.5.2", "chalk": "^5.0.1", "chokidar": "^3.5.3", "cosmiconfig": "^7.0.1", @@ -59,7 +58,7 @@ "devDependencies": { "@rescript-relay-router/test-utils": "workspace:^", "@rollup/plugin-node-resolve": "^16.0.0", - "rescript": "11.1.3", + "rescript": "12.0.0-alpha.13", "rollup": "^4.29.1", "vitest": "^2.1.8" } diff --git a/packages/rescript-relay-router/rescript.json b/packages/rescript-relay-router/rescript.json index 8331b3b0..38778e40 100644 --- a/packages/rescript-relay-router/rescript.json +++ b/packages/rescript-relay-router/rescript.json @@ -33,7 +33,7 @@ } ], "suffix": ".res.mjs", - "bs-dependencies": ["@rescript/react", "rescript-relay", "@rescript/core"], + "bs-dependencies": ["@rescript/react", "rescript-relay"], "bs-dev-dependencies": ["@rescript-relay-router/test-utils"], - "bsc-flags": ["-open RescriptCore"] + "bsc-flags": [] } diff --git a/packages/rescript-relay-router/rollup.config.js b/packages/rescript-relay-router/rollup.config.js index 2aa0b6d1..a2cbac61 100644 --- a/packages/rescript-relay-router/rollup.config.js +++ b/packages/rescript-relay-router/rollup.config.js @@ -8,7 +8,7 @@ export default [ format: "esm", name: "RescriptRelayRouterCli", }, - plugins: [resolve({ resolveOnly: ["@rescript/core", "rescript"] })], + plugins: [resolve({ resolveOnly: ["rescript"] })], external: ["fsevents"], }, { @@ -18,7 +18,7 @@ export default [ format: "esm", name: "RescriptRelayVitePlugin", }, - plugins: [resolve({ resolveOnly: [/^@rescript\/.*$/] })], + plugins: [resolve({ resolveOnly: ["rescript"] })], external: ["fsevents"], }, { @@ -28,7 +28,7 @@ export default [ format: "esm", name: "RescriptRelayServerVitePlugin", }, - plugins: [resolve({ resolveOnly: [/^@rescript\/.*$/] })], + plugins: [resolve({ resolveOnly: ["rescript"] })], external: ["fsevents", "vite"], }, ]; diff --git a/packages/rescript-relay-router/src/RelayRouter.res b/packages/rescript-relay-router/src/RelayRouter.res index fad9fe73..78a2a8d0 100644 --- a/packages/rescript-relay-router/src/RelayRouter.res +++ b/packages/rescript-relay-router/src/RelayRouter.res @@ -84,7 +84,7 @@ module Router = { }) let nextId = ref(0) - let subscribers = Dict.make() + let subscribers = dict{} let nextNavigationIsShallow = ref(false) let cleanup = history->RelayRouter__History.listen(({location}) => { @@ -290,6 +290,6 @@ let useRegisterPreloadedAsset = asset => { asset->preloadAsset(~priority=Default) } } catch { - | Exn.Error(_) => () + | JsExn(_) => () } } diff --git a/packages/rescript-relay-router/src/RelayRouter__AssetPreloader.res b/packages/rescript-relay-router/src/RelayRouter__AssetPreloader.res index f1a6de6b..dd7971b7 100644 --- a/packages/rescript-relay-router/src/RelayRouter__AssetPreloader.res +++ b/packages/rescript-relay-router/src/RelayRouter__AssetPreloader.res @@ -1,20 +1,21 @@ type preparedAssetsMap = dict -let makeClientAssetPreloader = preparedAssetsMap => (~priority as _, asset) => { - let assetIdentifier = switch asset { - | RelayRouter__Types.Component({chunk}) => "component:" ++ chunk - | Image({url}) => "image:" ++ url - | Style({url}) => "style:" ++ url - } +let makeClientAssetPreloader = preparedAssetsMap => + (~priority as _, asset) => { + let assetIdentifier = switch asset { + | RelayRouter__Types.Component({chunk}) => "component:" ++ chunk + | Image({url}) => "image:" ++ url + | Style({url}) => "style:" ++ url + } - switch preparedAssetsMap->Dict.get(assetIdentifier) { - | Some(_) => // Already preloaded - () - | None => - preparedAssetsMap->Dict.set(assetIdentifier, true) - switch asset { - | Component({load}) => load() - | _ => // Unimplemented + switch preparedAssetsMap->Dict.get(assetIdentifier) { + | Some(_) => // Already preloaded () + | None => + preparedAssetsMap->Dict.set(assetIdentifier, true) + switch asset { + | Component({load}) => load() + | _ => // Unimplemented + () + } } } -} diff --git a/packages/rescript-relay-router/src/RelayRouter__Bindings.res b/packages/rescript-relay-router/src/RelayRouter__Bindings.res index 7eea9f6c..81102d1e 100644 --- a/packages/rescript-relay-router/src/RelayRouter__Bindings.res +++ b/packages/rescript-relay-router/src/RelayRouter__Bindings.res @@ -138,7 +138,7 @@ module RelayReplaySubject = { external complete: t => unit = "complete" @send - external error: (t, Exn.t) => unit = "error" + external error: (t, JsExn.t) => unit = "error" @send external next: (t, JSON.t) => unit = "next" diff --git a/packages/rescript-relay-router/src/RelayRouter__Bindings.resi b/packages/rescript-relay-router/src/RelayRouter__Bindings.resi index d6f7efd6..6bb84510 100644 --- a/packages/rescript-relay-router/src/RelayRouter__Bindings.resi +++ b/packages/rescript-relay-router/src/RelayRouter__Bindings.resi @@ -81,7 +81,7 @@ module RelayReplaySubject: { external complete: t => unit = "complete" @send - external error: (t, Exn.t) => unit = "error" + external error: (t, JsExn.t) => unit = "error" @send external next: (t, JSON.t) => unit = "next" diff --git a/packages/rescript-relay-router/src/RelayRouter__Internal.res b/packages/rescript-relay-router/src/RelayRouter__Internal.res index 15b63b35..f88fba82 100644 --- a/packages/rescript-relay-router/src/RelayRouter__Internal.res +++ b/packages/rescript-relay-router/src/RelayRouter__Internal.res @@ -69,7 +69,7 @@ let useSetQueryParams = ( } setQueryParamsFn({ - applyQueryParams: applyQueryParams(~newParams, ...), + applyQueryParams: queryParams => applyQueryParams(~newParams, queryParams), currentSearch: search, navigationMode_, removeNotControlledParams, diff --git a/packages/rescript-relay-router/src/RelayRouter__Internal__DeclarationsSupport.res b/packages/rescript-relay-router/src/RelayRouter__Internal__DeclarationsSupport.res index a30d3f63..9bd4a48d 100644 --- a/packages/rescript-relay-router/src/RelayRouter__Internal__DeclarationsSupport.res +++ b/packages/rescript-relay-router/src/RelayRouter__Internal__DeclarationsSupport.res @@ -85,7 +85,7 @@ let preloadCode = ( switch loadedRouteRenderers->Map.get(routeName) { | Some(Loaded(routeRenderer)) => routeRenderer->apply->Promise.resolve | _ => - raise( + throw( Route_loading_failed( "Invalid state after loading route renderer. Please report this error.", ), @@ -176,7 +176,7 @@ let makePrepareAssets = (~loadedRouteRenderers, ~prepareDisposeTimeout): prepare // the new query refs have had a chance to be used by React. let {disposables: oldDisposables} = preparedEntry - let _ = RescriptCore.setTimeout(() => { + let _ = Stdlib.setTimeout(() => { oldDisposables->Array.forEach(dispose => { dispose() }) @@ -290,7 +290,7 @@ let makePrepareAssets = (~loadedRouteRenderers, ~prepareDisposeTimeout): prepare switch loadedRouteRenderers->Map.get(routeName) { | Some(Loaded(routeRenderer)) => doPrepare(routeRenderer)->Promise.resolve | _ => - raise( + throw( Route_loading_failed( "Route renderer not in loaded state even though it should be. This should be impossible, please report this error.", ), @@ -322,7 +322,7 @@ let makePrepareAssets = (~loadedRouteRenderers, ~prepareDisposeTimeout): prepare // In short, we need this expire to run after the route renderer // has been unmounted, or Relay gives us a "using preloaded // query that was disposed" error. - let _ = RescriptCore.setTimeout( + let _ = Stdlib.setTimeout( () => { expirePrepared(~routeKey) }, diff --git a/packages/rescript-relay-router/src/RelayRouter__Manifest.res b/packages/rescript-relay-router/src/RelayRouter__Manifest.res index a5aeeb5c..4134fdcc 100644 --- a/packages/rescript-relay-router/src/RelayRouter__Manifest.res +++ b/packages/rescript-relay-router/src/RelayRouter__Manifest.res @@ -19,6 +19,5 @@ type t = { } @scope("JSON") @val external parse: string => t = "parse" -@scope("JSON") @val external stringify: t => string = "stringify" -@scope("JSON") @val external stringifyWithSpace: (t, null, int) => string = "stringify" -let stringifyWithSpace = (t, int) => stringifyWithSpace(t, Null.null, int) +@scope("JSON") @val +external stringify: (t, @as(json`null`) _, ~space: int=?) => string = "stringify" diff --git a/packages/rescript-relay-router/src/RelayRouter__NetworkUtils.res b/packages/rescript-relay-router/src/RelayRouter__NetworkUtils.res index 24fa836b..e8cfc66a 100644 --- a/packages/rescript-relay-router/src/RelayRouter__NetworkUtils.res +++ b/packages/rescript-relay-router/src/RelayRouter__NetworkUtils.res @@ -24,7 +24,7 @@ let isAsyncIterable: parts => bool = %raw(`function isAsyncIterable(input) { let decodeEachChunk: ( parts, JSON.t => unit, - Exn.t => unit, + JsExn.t => unit, ) => promise = %raw(`async function(parts, onNext, onError) { for await (const part of parts) { if (!part.json) { @@ -63,7 +63,7 @@ let getChunks = (response: response, ~onNext, ~onError, ~onComplete): promise + | JsExn(err) => onError(err) Promise.resolve() } diff --git a/packages/rescript-relay-router/src/RelayRouter__NetworkUtils.resi b/packages/rescript-relay-router/src/RelayRouter__NetworkUtils.resi index f22abc19..7409c0c0 100644 --- a/packages/rescript-relay-router/src/RelayRouter__NetworkUtils.resi +++ b/packages/rescript-relay-router/src/RelayRouter__NetworkUtils.resi @@ -9,6 +9,6 @@ external fetch: (string, 'fetchOpts) => promise = "fetch" let getChunks: ( response, ~onNext: JSON.t => unit, - ~onError: Exn.t => unit, + ~onError: JsExn.t => unit, ~onComplete: unit => unit, ) => promise diff --git a/packages/rescript-relay-router/src/RelayRouter__Scroll.res b/packages/rescript-relay-router/src/RelayRouter__Scroll.res index 9728d600..0b83641c 100644 --- a/packages/rescript-relay-router/src/RelayRouter__Scroll.res +++ b/packages/rescript-relay-router/src/RelayRouter__Scroll.res @@ -24,14 +24,14 @@ external castToPositionsShape: JSON.t => dict = "%identity" let scrollPositionsY = ref( if RelaySSRUtils.ssr { - Dict.make() + dict{} } else { try { getScrollPositions() ->Option.map(positionsRaw => positionsRaw->JSON.parseExn->castToPositionsShape) - ->Option.getOr(Dict.make()) + ->Option.getOr(dict{}) } catch { - | Exn.Error(_) => Dict.make() + | JsExn(_) => dict{} } }, ) diff --git a/packages/rescript-relay-router/src/RelaySSRUtils.res b/packages/rescript-relay-router/src/RelaySSRUtils.res index 13d7dbf5..d6197919 100644 --- a/packages/rescript-relay-router/src/RelaySSRUtils.res +++ b/packages/rescript-relay-router/src/RelaySSRUtils.res @@ -18,8 +18,8 @@ external unsafe_initialRelayData: window => option> = "__RE let deleteKey = (dict, key) => Dict.delete(Obj.magic(dict), key) -let streamedPreCache: dict> = Dict.make() -let replaySubjects: dict = Dict.make() +let streamedPreCache: dict> = dict{} +let replaySubjects: dict = dict{} let cleanupId = id => { Console.log("[debug] Cleaning up id \"" ++ id ++ "\"") @@ -201,15 +201,7 @@ let makeServerFetchFunction = ( // Relay is using is_final and haven't adapted to the spec yet // because it's not quite finalized. ~final=switch payload { - | Object(obj) => - switch obj->Dict.get("hasNext") { - | None => true - | Some(hasNext) => - switch hasNext { - | Boolean(true) => false - | _ => true - } - } + | Object(dict{"hasNext": JSON.Boolean(true)}) => false | _ => true }->Some, ) diff --git a/packages/rescript-relay-router/vite-plugins/RescriptRelayVitePlugin__ManifestTransform.res b/packages/rescript-relay-router/vite-plugins/RescriptRelayVitePlugin__ManifestTransform.res index b0712eb3..c041fe7f 100644 --- a/packages/rescript-relay-router/vite-plugins/RescriptRelayVitePlugin__ManifestTransform.res +++ b/packages/rescript-relay-router/vite-plugins/RescriptRelayVitePlugin__ManifestTransform.res @@ -1,5 +1,6 @@ @module("fs") external readFileSync: (string, string) => string = "readFileSync" -@module("fs") external writeFileSync: (string, string, string) => unit = "writeFileSync" +@module("fs") +external writeFileSync: (~path: string, string, ~encoding: string) => unit = "writeFileSync" module ViteManifest = { type chunk = { @@ -41,8 +42,8 @@ let viteManifestToRelayRouterManifest: ViteManifest.t => RelayRouter.Manifest.t ->Array.filterMap(((source, chunk)) => { open RelayRouter.Manifest // The isEntry or isDynamicEntry field is only ever present when it's `true`. - switch !(chunk.isEntry->Nullable.isNullable) || !(chunk.isDynamicEntry->Nullable.isNullable) { - | true => + switch (chunk.isEntry, chunk.isDynamicEntry) { + | (Value(_), _) | (_, Value(_)) => Some(( source->getFile, { @@ -51,7 +52,7 @@ let viteManifestToRelayRouterManifest: ViteManifest.t => RelayRouter.Manifest.t assets: chunk.assets->orEmptyArray, }, )) - | false => None + | _ => None } }) ->Dict.fromArray, @@ -66,7 +67,7 @@ let loadViteManifest = path => { } let writeRouterManifest = (path, manifest: RelayRouter.Manifest.t) => { - manifest->(RelayRouter.Manifest.stringifyWithSpace(_, 2))->(writeFileSync(path, _, "utf-8")) + manifest->RelayRouter.Manifest.stringify(~space=2)->writeFileSync(~path, ~encoding="utf-8") } let transformManifest = (inPath, outPath) => { diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 3d3a3f69..20dec8bf 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -11,7 +11,6 @@ "build": "rescript" }, "dependencies": { - "@rescript/core": "1.5.2", - "rescript": "11.1.3" + "rescript": "12.0.0-alpha.13" } } diff --git a/packages/test-utils/rescript.json b/packages/test-utils/rescript.json index e37cec07..f72507ba 100644 --- a/packages/test-utils/rescript.json +++ b/packages/test-utils/rescript.json @@ -20,6 +20,5 @@ } ], "suffix": ".res.mjs", - "bs-dependencies": ["@rescript/core"], - "bsc-flags": ["-open RescriptCore"] + "bsc-flags": [] } diff --git a/packages/test-utils/src/Vitest.res b/packages/test-utils/src/Vitest.res index eb54081b..4d252373 100644 --- a/packages/test-utils/src/Vitest.res +++ b/packages/test-utils/src/Vitest.res @@ -13,11 +13,7 @@ type expected<'a> @module("vitest") external expect: 'a => expected<'a> = "expect" -%%private( - external cast_expeceted: expected<'a> => expected<'b> = "%identity" - external unwrap: expected<'a> => 'a = "%identity" - external wrap: 'a => expected<'a> = "%identity" -) +%%private(external cast_expected: expected<'a> => expected<'b> = "%identity") type benchOptions = { time: option, @@ -784,7 +780,7 @@ module Matchers = ( @send external toBeFalsy: expected<'a> => Config.return<'a> = "toBeFalsy" - @send external toBeNull: expected> => Config.return<'a> = "toBeNull" + @send external toBeNull: expected> => Config.return<'a> = "toBeNull" // @send external toBeInstanceOf: (expected<'a>, ?) => Config.return<'a> = "toBeInstanceOf" @@ -792,7 +788,7 @@ module Matchers = ( @inline let toBeSome = (~some=?, expected: expected>) => { - expected->cast_expeceted->not->toBeUndefined->ignore + expected->cast_expected->not->toBeUndefined->ignore switch some { | Some(id) => expected->toEqual(id) | None => Config.emptyReturn @@ -801,7 +797,7 @@ module Matchers = ( @inline let toBeNone = (expected: expected>) => { - expected->cast_expeceted->toBeUndefined + expected->cast_expected->toBeUndefined } @send external toStrictEqual: (expected<'a>, 'a) => Config.return<'a> = "toStrictEqual" @@ -878,23 +874,6 @@ module Matchers = ( @send external toMatch: (expected>, array<'a>) => Config.return<'a> = "toMatchObject" } - module List = { - @inline - let toContain = (expected, item) => { - expected->unwrap->List.toArray->wrap->Array.toContain(item) - } - - @inline - let toHaveLength = (expected, length) => { - expected->unwrap->List.toArray->wrap->Array.toHaveLength(length) - } - - @inline - let toMatch = (expected, list) => { - expected->unwrap->List.toArray->wrap->Array.toMatch(list->List.toArray) - } - } - module Dict = { @send external toHaveProperty: (expected>, string, 'a) => Config.return<'a> = @@ -980,6 +959,6 @@ module Vi = { @send external restoreCurrentDate: (t, Date.t) => t = "restoreCurrentDate" @inline let restoreCurrentDate = date => vi_obj->restoreCurrentDate(date) - @send external getMockedDate: t => null = "getMockedDate" + @send external getMockedDate: t => Null.t = "getMockedDate" @inline let getMockedDate = () => vi_obj->getMockedDate->Null.toOption } diff --git a/yarn.lock b/yarn.lock index d4b69b92..704b6167 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1300,7 +1300,6 @@ __metadata: dependencies: "@remix-run/web-fetch": ^4.1.3 "@rescript-relay-router/test-utils": "workspace:^" - "@rescript/core": 1.5.2 "@rescript/react": 0.13.0 "@testing-library/dom": ^10.4.0 "@testing-library/react": ^16.1.0 @@ -1323,7 +1322,7 @@ __metadata: react-dom: ^18.2.0 react-relay: 17.0.0 relay-runtime: 17.0.0 - rescript: 11.1.3 + rescript: 12.0.0-alpha.13 rescript-relay: 3.0.0 rescript-relay-router: "workspace:^" rollup: ^2 @@ -1340,7 +1339,6 @@ __metadata: resolution: "@rescript-relay-router-example/express@workspace:examples/express" dependencies: "@remix-run/web-fetch": ^4.1.3 - "@rescript/core": 1.5.2 "@rescript/react": 0.13.0 "@vitejs/plugin-react-refresh": 1.3.3 chalk: ^5.0.1 @@ -1363,7 +1361,7 @@ __metadata: react-dom: ^18.2.0 react-relay: 17.0.0 relay-runtime: 17.0.0 - rescript: 11.1.3 + rescript: 12.0.0-alpha.13 rescript-relay: 3.0.0 rescript-relay-router: "workspace:^" rollup: ^2 @@ -1378,17 +1376,35 @@ __metadata: version: 0.0.0-use.local resolution: "@rescript-relay-router/test-utils@workspace:packages/test-utils" dependencies: - "@rescript/core": 1.5.2 - rescript: 11.1.3 + rescript: 12.0.0-alpha.13 languageName: unknown linkType: soft -"@rescript/core@npm:1.5.2": - version: 1.5.2 - resolution: "@rescript/core@npm:1.5.2" - peerDependencies: - rescript: ^11.1.0-rc.7 - checksum: 7e67a5c7a2f073bb4a84a4b7cc4ad195b0e8eb6b8719792b55e3613cafddb19102d4530e0d32e9fca092d77bdbae06f65ebbad0fa1b60d447367348eff3a0642 +"@rescript/darwin-arm64@npm:12.0.0-alpha.13": + version: 12.0.0-alpha.13 + resolution: "@rescript/darwin-arm64@npm:12.0.0-alpha.13" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rescript/darwin-x64@npm:12.0.0-alpha.13": + version: 12.0.0-alpha.13 + resolution: "@rescript/darwin-x64@npm:12.0.0-alpha.13" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rescript/linux-arm64@npm:12.0.0-alpha.13": + version: 12.0.0-alpha.13 + resolution: "@rescript/linux-arm64@npm:12.0.0-alpha.13" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@rescript/linux-x64@npm:12.0.0-alpha.13": + version: 12.0.0-alpha.13 + resolution: "@rescript/linux-x64@npm:12.0.0-alpha.13" + conditions: os=linux & cpu=x64 languageName: node linkType: hard @@ -1402,6 +1418,13 @@ __metadata: languageName: node linkType: hard +"@rescript/win32-x64@npm:12.0.0-alpha.13": + version: 12.0.0-alpha.13 + resolution: "@rescript/win32-x64@npm:12.0.0-alpha.13" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@rollup/plugin-node-resolve@npm:^16.0.0": version: 16.0.0 resolution: "@rollup/plugin-node-resolve@npm:16.0.0" @@ -6409,7 +6432,6 @@ __metadata: resolution: "rescript-relay-router@workspace:packages/rescript-relay-router" dependencies: "@rescript-relay-router/test-utils": "workspace:^" - "@rescript/core": 1.5.2 "@rollup/plugin-node-resolve": ^16.0.0 chalk: ^5.0.1 chokidar: ^3.5.3 @@ -6420,7 +6442,7 @@ __metadata: jsonc-parser: ^3.0.0 lines-and-columns: ^2.0.3 magic-string: ^0.26.2 - rescript: 11.1.3 + rescript: 12.0.0-alpha.13 rollup: ^4.29.1 vitest: ^2.1.8 vscode-jsonrpc: ^5.0.1 @@ -6451,14 +6473,33 @@ __metadata: languageName: node linkType: hard -"rescript@npm:11.1.3": - version: 11.1.3 - resolution: "rescript@npm:11.1.3" +"rescript@npm:12.0.0-alpha.13": + version: 12.0.0-alpha.13 + resolution: "rescript@npm:12.0.0-alpha.13" + dependencies: + "@rescript/darwin-arm64": 12.0.0-alpha.13 + "@rescript/darwin-x64": 12.0.0-alpha.13 + "@rescript/linux-arm64": 12.0.0-alpha.13 + "@rescript/linux-x64": 12.0.0-alpha.13 + "@rescript/win32-x64": 12.0.0-alpha.13 + dependenciesMeta: + "@rescript/darwin-arm64": + optional: true + "@rescript/darwin-x64": + optional: true + "@rescript/linux-arm64": + optional: true + "@rescript/linux-x64": + optional: true + "@rescript/win32-x64": + optional: true bin: - bsc: bsc - bstracing: lib/bstracing - rescript: rescript - checksum: 976dbcc511cca11a92fb478013407221df671d564b0f99ba9f4fbfef2f9ced8c8cc10498902e8379b836d41da3518386fc5d56a51b9caf7949b1e4ad344f55e3 + bsc: cli/bsc.js + bstracing: cli/bstracing.js + rescript: cli/rescript.js + rescript-tools: cli/rescript-tools.js + rewatch: cli/rewatch.js + checksum: 949e5c624d036d96a8e3dd961a361146de196f8f95790d00e219d98b60ced7f3f8935591f8397df1bf869c85f68a10a36b23a7072b986112cfee898c561536e1 languageName: node linkType: hard