From 49bac67d02b921342804881e6722c43ddc97144d Mon Sep 17 00:00:00 2001 From: Valdemar Grange Date: Thu, 30 Oct 2025 18:03:24 +0100 Subject: [PATCH 1/4] test attempt --- .../rescript-relay/__tests__/TestsUtils.res | 11 ++++++ .../rescript-relay/__tests__/schema.graphql | 8 +++++ .../rescript-relay/__tests__/utils-tests.js | 36 +++++++++++++++++++ packages/rescript-relay/relay.config.js | 2 ++ 4 files changed, 57 insertions(+) diff --git a/packages/rescript-relay/__tests__/TestsUtils.res b/packages/rescript-relay/__tests__/TestsUtils.res index 0e8e5439..77789dae 100644 --- a/packages/rescript-relay/__tests__/TestsUtils.res +++ b/packages/rescript-relay/__tests__/TestsUtils.res @@ -40,3 +40,14 @@ module Number = { | Some(_) => [] } } + +type s = { + a: string, + b: ?string, + c: ?string +} +module Number = { + type t = s + let serialize = _ => Json.Encode.string("serialized") + let parse = _ => {a: "a", b: None, c: None} +} diff --git a/packages/rescript-relay/__tests__/schema.graphql b/packages/rescript-relay/__tests__/schema.graphql index 1e7982d2..7c927769 100644 --- a/packages/rescript-relay/__tests__/schema.graphql +++ b/packages/rescript-relay/__tests__/schema.graphql @@ -274,3 +274,11 @@ input Location @oneOf { byLoc: ByLoc byId: ID } + +scalar ObjectScalar1 +scalar ObjectScalar2 + +input SerializeMultipleCustomScalars { + os1s: [ObjectScalar1!]! + os2: ObjectScalar2 +} diff --git a/packages/rescript-relay/__tests__/utils-tests.js b/packages/rescript-relay/__tests__/utils-tests.js index 9b5e6413..a9e35b58 100644 --- a/packages/rescript-relay/__tests__/utils-tests.js +++ b/packages/rescript-relay/__tests__/utils-tests.js @@ -878,4 +878,40 @@ describe("conversion", () => { }); }); }); + + describe("multi scalar encoding", () => { + expect( + traverser( + { + input: { + os1s: [ + { + a: "a", + b: "b", + } + ], + os2: { + a: "a", + c: "c", + } + }, + }, + { + __root: { + // TODO + }, + }, + { + "TestsUtils.ObjectScalar1": _ => "serialized", + "TestsUtils.ObjectScalar2": _ => "serialized", + }, + undefined + ) + ).toEqual({ + input: { + os1s: ["serialized"], + os2: "serialized", + }, + }); + }); }); diff --git a/packages/rescript-relay/relay.config.js b/packages/rescript-relay/relay.config.js index 5ea5fc86..1a1f30aa 100644 --- a/packages/rescript-relay/relay.config.js +++ b/packages/rescript-relay/relay.config.js @@ -10,6 +10,8 @@ module.exports = { customScalarTypes: { Datetime: "TestsUtils.Datetime", IntString: "TestsUtils.IntString", + ObjectScalar1: "TestsUtils.ObjectScalar1", + ObjectScalar2: "TestsUtils.ObjectScalar2", JSON: "JSON.t", Number: "TestsUtils.Number", }, From c8c6882bf4d55a0fe0da3caf483c4cd65e62c209 Mon Sep 17 00:00:00 2001 From: Valdemar Grange Date: Thu, 30 Oct 2025 18:31:31 +0100 Subject: [PATCH 2/4] testcase --- .../rescript-relay/__tests__/TestsUtils.res | 15 +++-- .../RelaySchemaAssets_graphql.res | 12 ++++ .../rescript-relay/__tests__/utils-tests.js | 8 +-- packages/rescript-relay/flake.lock | 60 +++++++++++++++++++ packages/rescript-relay/flake.nix | 30 ++++++++++ packages/rescript-relay/package.json | 14 +++-- packages/rescript-relay/rescript.json | 4 +- packages/rescript-relay/yarn.lock | 7 +++ 8 files changed, 132 insertions(+), 18 deletions(-) create mode 100644 packages/rescript-relay/flake.lock create mode 100644 packages/rescript-relay/flake.nix diff --git a/packages/rescript-relay/__tests__/TestsUtils.res b/packages/rescript-relay/__tests__/TestsUtils.res index 77789dae..3c77ab6a 100644 --- a/packages/rescript-relay/__tests__/TestsUtils.res +++ b/packages/rescript-relay/__tests__/TestsUtils.res @@ -43,11 +43,16 @@ module Number = { type s = { a: string, - b: ?string, - c: ?string + b?: string, + c?: string } -module Number = { +module ObjectScalar1 = { + type t = s + let serialize = _ => JSON.Encode.string("serialized1") + let parse = _ => {a: "a"} +} +module ObjectScalar2 = { type t = s - let serialize = _ => Json.Encode.string("serialized") - let parse = _ => {a: "a", b: None, c: None} + let serialize = _ => JSON.Encode.string("serialized2") + let parse = _ => {a: "a"} } diff --git a/packages/rescript-relay/__tests__/__generated__/RelaySchemaAssets_graphql.res b/packages/rescript-relay/__tests__/__generated__/RelaySchemaAssets_graphql.res index 9ff703c1..fa68111d 100644 --- a/packages/rescript-relay/__tests__/__generated__/RelaySchemaAssets_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/RelaySchemaAssets_graphql.res @@ -248,3 +248,15 @@ and input_Location_nullable = | @as("byAddress") ByAddress(input_ByAddress_nullable) | @as("byLoc") ByLoc(input_ByLoc_nullable) | @as("byId") ById(string) + +@live +and input_SerializeMultipleCustomScalars = { + os1s: array, + os2?: TestsUtils.ObjectScalar2.t, +} + +@live +and input_SerializeMultipleCustomScalars_nullable = { + os1s: array, + os2?: Null.t, +} diff --git a/packages/rescript-relay/__tests__/utils-tests.js b/packages/rescript-relay/__tests__/utils-tests.js index a9e35b58..0704baea 100644 --- a/packages/rescript-relay/__tests__/utils-tests.js +++ b/packages/rescript-relay/__tests__/utils-tests.js @@ -902,15 +902,15 @@ describe("conversion", () => { }, }, { - "TestsUtils.ObjectScalar1": _ => "serialized", - "TestsUtils.ObjectScalar2": _ => "serialized", + "TestsUtils.ObjectScalar1": _ => "serialized1", + "TestsUtils.ObjectScalar2": _ => "serialized2", }, undefined ) ).toEqual({ input: { - os1s: ["serialized"], - os2: "serialized", + os1s: ["serialized1"], + os2: "serialized2", }, }); }); diff --git a/packages/rescript-relay/flake.lock b/packages/rescript-relay/flake.lock new file mode 100644 index 00000000..161d2491 --- /dev/null +++ b/packages/rescript-relay/flake.lock @@ -0,0 +1,60 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1761672384, + "narHash": "sha256-o9KF3DJL7g7iYMZq9SWgfS1BFlNbsm6xplRjVlOCkXI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "08dacfca559e1d7da38f3cf05f1f45ee9bfd213c", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixos-unstable", + "type": "indirect" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/packages/rescript-relay/flake.nix b/packages/rescript-relay/flake.nix new file mode 100644 index 00000000..a6c25e0e --- /dev/null +++ b/packages/rescript-relay/flake.nix @@ -0,0 +1,30 @@ +{ + description = "UI shell env"; + + inputs = { + nixpkgs.url = "nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { flake-utils, self, nixpkgs, ... }: + let + system = flake-utils.lib.system.x86_64-linux; + pkgs = nixpkgs.legacyPackages.${system}; + in + { + devShells.${system}.default = (pkgs.buildFHSEnv { + name = "rescript-env"; + targetPkgs = pkgs: [ + pkgs.busybox + pkgs.yarn + pkgs.nodejs + pkgs.gnat + pkgs.gnumake + pkgs.watchman + pkgs.zsh + pkgs.opam + ]; + runScript = "zsh"; + }).env; + }; +} diff --git a/packages/rescript-relay/package.json b/packages/rescript-relay/package.json index 98f60206..b26923cf 100644 --- a/packages/rescript-relay/package.json +++ b/packages/rescript-relay/package.json @@ -33,23 +33,24 @@ }, "scripts": { "build": "rescript", + "relay-compile": "rescript-relay-compiler && ENABLE_PERSISTING=true rescript-relay-compiler && rm ./__tests_preloaded__/__generated__/RelaySchemaAssets_graphql.res", "build:test": "./build-compiler-dev.sh && ./rescript-relay-compiler && ENABLE_PERSISTING=true ./rescript-relay-compiler && rm ./__tests_preloaded__/__generated__/RelaySchemaAssets_graphql.res", "postinstall": "node postinstall.js", "test": "jest", "test:ci": "jest --ci --runInBand" }, "devDependencies": { + "@babel/core": "^7.24.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/preset-env": "^7.24.0", "@glennsl/rescript-fetch": "^0.2.0", "@rescript/react": "0.14.0", "@testing-library/jest-dom": "^5.16.3", "@testing-library/react": "^13.0.0-alpha.6", - "graphql-query-test-mock": "^0.12.1", - "jest": "^27.2.4", - "@babel/core": "^7.24.0", - "@babel/preset-env": "^7.24.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", "babel-jest": "^27.2.4", "babel-plugin-dynamic-import-node": "^2.3.3", + "graphql-query-test-mock": "^0.12.1", + "jest": "^27.2.4", "nock": "^11.7.0", "node-fetch": "^2.6.0", "react": "18.2.0", @@ -65,6 +66,7 @@ "rescript": "^12.0.0-0" }, "dependencies": { - "detect-libc": "^2.0.1" + "detect-libc": "^2.0.1", + "rescript-relay": "^4.0.0" } } diff --git a/packages/rescript-relay/rescript.json b/packages/rescript-relay/rescript.json index 34eeb855..9b029563 100755 --- a/packages/rescript-relay/rescript.json +++ b/packages/rescript-relay/rescript.json @@ -26,10 +26,8 @@ "module": "commonjs", "in-source": true }, - "compiler-flags": [ - "-ppx ../../rescript-relay-ppx/_build/default/bin/RescriptRelayPpxApp.exe" - ], "dependencies": ["@rescript/react"], "dev-dependencies": ["@glennsl/rescript-fetch"], + "ppx-flags": [["rescript-relay/ppx", "-uncurried"]], "suffix": ".bs.js" } diff --git a/packages/rescript-relay/yarn.lock b/packages/rescript-relay/yarn.lock index 7ed00c03..0762dcc5 100644 --- a/packages/rescript-relay/yarn.lock +++ b/packages/rescript-relay/yarn.lock @@ -3775,6 +3775,13 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= +rescript-relay@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/rescript-relay/-/rescript-relay-4.0.0.tgz#bce190a7917c705de2e0837a8daa558931828380" + integrity sha512-neNFCSK/+oGJ9EKDkpWNZZNYFENC2rptAjQHpU+QC0pDhlMo7eBWiPTEFwGt4S9xuGCSclx70QNKtETYGJQywQ== + dependencies: + detect-libc "^2.0.1" + rescript@12.0.0-rc.3: version "12.0.0-rc.3" resolved "https://registry.yarnpkg.com/rescript/-/rescript-12.0.0-rc.3.tgz#69eff1a8ac02445169737d3c83d6a8e03def1bf5" From 4e9cfdd0ba2873286dbd6104211476978a16e892 Mon Sep 17 00:00:00 2001 From: Valdemar Grange Date: Thu, 30 Oct 2025 18:37:45 +0100 Subject: [PATCH 3/4] display bug --- .../rescript-relay/__tests__/utils-tests.js | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/packages/rescript-relay/__tests__/utils-tests.js b/packages/rescript-relay/__tests__/utils-tests.js index 0704baea..fbcf44ab 100644 --- a/packages/rescript-relay/__tests__/utils-tests.js +++ b/packages/rescript-relay/__tests__/utils-tests.js @@ -883,22 +883,21 @@ describe("conversion", () => { expect( traverser( { - input: { - os1s: [ - { - a: "a", - b: "b", - } - ], - os2: { + os1s: [ + { a: "a", - c: "c", + b: "b", } - }, + ], + os2: { + a: "a", + c: "c", + } }, { __root: { - // TODO + os1s: { c: "TestsUtils.ObjectScalar1" }, + os2: { c: "TestsUtils.ObjectScalar2" } }, }, { @@ -908,10 +907,8 @@ describe("conversion", () => { undefined ) ).toEqual({ - input: { - os1s: ["serialized1"], - os2: "serialized2", - }, + os1s: ["serialized1"], + os2: "serialized2", }); }); }); From c9bc3b90e42789dc67878de6edd640128e3a893c Mon Sep 17 00:00:00 2001 From: Valdemar Grange Date: Thu, 30 Oct 2025 19:34:07 +0100 Subject: [PATCH 4/4] generate code for test case --- .../__tests__/TestObjectScalar.res | 5 + .../TestObjectScalarMutation_graphql.res | 131 ++++++++++++++++++ .../rescript-relay/__tests__/schema.graphql | 3 + .../rescript-relay/__tests__/utils-tests.js | 4 +- 4 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 packages/rescript-relay/__tests__/TestObjectScalar.res create mode 100644 packages/rescript-relay/__tests__/__generated__/TestObjectScalarMutation_graphql.res diff --git a/packages/rescript-relay/__tests__/TestObjectScalar.res b/packages/rescript-relay/__tests__/TestObjectScalar.res new file mode 100644 index 00000000..419a1ec2 --- /dev/null +++ b/packages/rescript-relay/__tests__/TestObjectScalar.res @@ -0,0 +1,5 @@ +module Mutation = %relay(` + mutation TestObjectScalarMutation($input: SerializeMultipleCustomScalars!) { + serializeMultipleCustomScalars(input: $input) + } +`) diff --git a/packages/rescript-relay/__tests__/__generated__/TestObjectScalarMutation_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestObjectScalarMutation_graphql.res new file mode 100644 index 00000000..bcf2c157 --- /dev/null +++ b/packages/rescript-relay/__tests__/__generated__/TestObjectScalarMutation_graphql.res @@ -0,0 +1,131 @@ +/* @sourceLoc TestObjectScalar.res */ +/* @generated */ +%%raw("/* @generated */") +module Types = { + @@warning("-30") + + @live type serializeMultipleCustomScalars = RelaySchemaAssets_graphql.input_SerializeMultipleCustomScalars + @live + type response = { + serializeMultipleCustomScalars: option, + } + @live + type rawResponse = response + @live + type variables = { + input: serializeMultipleCustomScalars, + } +} + +module Internal = { + @live + let variablesConverter: dict>> = %raw( + json`{"serializeMultipleCustomScalars":{"os2":{"c":"TestsUtils.ObjectScalar2"},"os1s":{"ca":"TestsUtils.ObjectScalar1"}},"__root":{"input":{"r":"serializeMultipleCustomScalars"}}}` + ) + @live + let variablesConverterMap = { + "TestsUtils.ObjectScalar1": TestsUtils.ObjectScalar1.serialize, + "TestsUtils.ObjectScalar2": TestsUtils.ObjectScalar2.serialize, + } + @live + let convertVariables = v => v->RescriptRelay.convertObj( + variablesConverter, + variablesConverterMap, + None + ) + @live + type wrapResponseRaw + @live + let wrapResponseConverter: dict>> = %raw( + json`{}` + ) + @live + let wrapResponseConverterMap = () + @live + let convertWrapResponse = v => v->RescriptRelay.convertObj( + wrapResponseConverter, + wrapResponseConverterMap, + null + ) + @live + type responseRaw + @live + let responseConverter: dict>> = %raw( + json`{}` + ) + @live + let responseConverterMap = () + @live + let convertResponse = v => v->RescriptRelay.convertObj( + responseConverter, + responseConverterMap, + None + ) + type wrapRawResponseRaw = wrapResponseRaw + @live + let convertWrapRawResponse = convertWrapResponse + type rawResponseRaw = responseRaw + @live + let convertRawResponse = convertResponse +} +module Utils = { + @@warning("-33") + open Types +} + +type relayOperationNode +type operationType = RescriptRelay.mutationNode + + +let node: operationType = %raw(json` (function(){ +var v0 = [ + { + "defaultValue": null, + "kind": "LocalArgument", + "name": "input" + } +], +v1 = [ + { + "alias": null, + "args": [ + { + "kind": "Variable", + "name": "input", + "variableName": "input" + } + ], + "kind": "ScalarField", + "name": "serializeMultipleCustomScalars", + "storageKey": null + } +]; +return { + "fragment": { + "argumentDefinitions": (v0/*: any*/), + "kind": "Fragment", + "metadata": null, + "name": "TestObjectScalarMutation", + "selections": (v1/*: any*/), + "type": "Mutation", + "abstractKey": null + }, + "kind": "Request", + "operation": { + "argumentDefinitions": (v0/*: any*/), + "kind": "Operation", + "name": "TestObjectScalarMutation", + "selections": (v1/*: any*/) + }, + "params": { + "cacheID": "86fd315903804ce86d1fea1df28f4b4a", + "id": null, + "metadata": {}, + "name": "TestObjectScalarMutation", + "operationKind": "mutation", + "text": "mutation TestObjectScalarMutation(\n $input: SerializeMultipleCustomScalars!\n) {\n serializeMultipleCustomScalars(input: $input)\n}\n" + } +}; +})() `) + + diff --git a/packages/rescript-relay/__tests__/schema.graphql b/packages/rescript-relay/__tests__/schema.graphql index 7c927769..208cd0c0 100644 --- a/packages/rescript-relay/__tests__/schema.graphql +++ b/packages/rescript-relay/__tests__/schema.graphql @@ -255,6 +255,9 @@ type Mutation { serializeCustomScalarArray( input: [IntString!]! ): SerializeCustomScalarArrayPayload + serializeMultipleCustomScalars( + input: SerializeMultipleCustomScalars! + ): Boolean } type Subscription { diff --git a/packages/rescript-relay/__tests__/utils-tests.js b/packages/rescript-relay/__tests__/utils-tests.js index fbcf44ab..4a68a389 100644 --- a/packages/rescript-relay/__tests__/utils-tests.js +++ b/packages/rescript-relay/__tests__/utils-tests.js @@ -896,8 +896,8 @@ describe("conversion", () => { }, { __root: { - os1s: { c: "TestsUtils.ObjectScalar1" }, - os2: { c: "TestsUtils.ObjectScalar2" } + os2:{c:"TestsUtils.ObjectScalar2"}, + os1s:{ca:"TestsUtils.ObjectScalar1"} }, }, {