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__/TestsUtils.res b/packages/rescript-relay/__tests__/TestsUtils.res index 0e8e5439..3c77ab6a 100644 --- a/packages/rescript-relay/__tests__/TestsUtils.res +++ b/packages/rescript-relay/__tests__/TestsUtils.res @@ -40,3 +40,19 @@ module Number = { | Some(_) => [] } } + +type s = { + a: string, + b?: string, + c?: string +} +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("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__/__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 1e7982d2..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 { @@ -274,3 +277,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..4a68a389 100644 --- a/packages/rescript-relay/__tests__/utils-tests.js +++ b/packages/rescript-relay/__tests__/utils-tests.js @@ -878,4 +878,37 @@ describe("conversion", () => { }); }); }); + + describe("multi scalar encoding", () => { + expect( + traverser( + { + os1s: [ + { + a: "a", + b: "b", + } + ], + os2: { + a: "a", + c: "c", + } + }, + { + __root: { + os2:{c:"TestsUtils.ObjectScalar2"}, + os1s:{ca:"TestsUtils.ObjectScalar1"} + }, + }, + { + "TestsUtils.ObjectScalar1": _ => "serialized1", + "TestsUtils.ObjectScalar2": _ => "serialized2", + }, + undefined + ) + ).toEqual({ + 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/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", }, 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"