From 2f193aba134d651e53e5995be75326d182446738 Mon Sep 17 00:00:00 2001 From: Jun Matsushita Date: Tue, 14 Feb 2023 15:25:10 +0300 Subject: [PATCH 1/2] Implement graphql live query ala n1ru4l --- e2e/4-urql-live-query/.gitignore | 10 + e2e/4-urql-live-query/README.md | 3 + e2e/4-urql-live-query/package-lock.json | 1083 ++++++++++++++++++++++ e2e/4-urql-live-query/package.json | 29 + e2e/4-urql-live-query/packages.dhall | 5 + e2e/4-urql-live-query/server-fn.mjs | 51 + e2e/4-urql-live-query/server.mjs | 4 + e2e/4-urql-live-query/spago.dhall | 9 + e2e/4-urql-live-query/src/Main.purs | 63 ++ e2e/4-urql-live-query/test.mjs | 25 + e2e/4-urql-live-query/test/Main.purs | 11 + e2e/4-urql-live-query/yarn-error.log | 440 +++++++++ e2e/4-urql-live-query/yarn.lock | 430 +++++++++ src/GraphQL/Client/BaseClients/Urql.js | 117 ++- src/GraphQL/Client/BaseClients/Urql.purs | 31 +- src/GraphQL/Client/LiveQuery.purs | 59 ++ src/GraphQL/Client/Types.purs | 24 + 17 files changed, 2390 insertions(+), 4 deletions(-) create mode 100644 e2e/4-urql-live-query/.gitignore create mode 100644 e2e/4-urql-live-query/README.md create mode 100644 e2e/4-urql-live-query/package-lock.json create mode 100644 e2e/4-urql-live-query/package.json create mode 100644 e2e/4-urql-live-query/packages.dhall create mode 100644 e2e/4-urql-live-query/server-fn.mjs create mode 100644 e2e/4-urql-live-query/server.mjs create mode 100644 e2e/4-urql-live-query/spago.dhall create mode 100644 e2e/4-urql-live-query/src/Main.purs create mode 100644 e2e/4-urql-live-query/test.mjs create mode 100644 e2e/4-urql-live-query/test/Main.purs create mode 100644 e2e/4-urql-live-query/yarn-error.log create mode 100644 e2e/4-urql-live-query/yarn.lock create mode 100644 src/GraphQL/Client/LiveQuery.purs diff --git a/e2e/4-urql-live-query/.gitignore b/e2e/4-urql-live-query/.gitignore new file mode 100644 index 00000000..30efe199 --- /dev/null +++ b/e2e/4-urql-live-query/.gitignore @@ -0,0 +1,10 @@ +/bower_components/ +/node_modules/ +/.pulp-cache/ +/output/ +/generated-docs/ +/.psc-package/ +/.psc* +/.purs* +/.psa* +/.spago diff --git a/e2e/4-urql-live-query/README.md b/e2e/4-urql-live-query/README.md new file mode 100644 index 00000000..ecb6d0e4 --- /dev/null +++ b/e2e/4-urql-live-query/README.md @@ -0,0 +1,3 @@ +A simple affjax example that makes a graphql query and logs the result. + +Run `npm t` to see it in action \ No newline at end of file diff --git a/e2e/4-urql-live-query/package-lock.json b/e2e/4-urql-live-query/package-lock.json new file mode 100644 index 00000000..ef878b37 --- /dev/null +++ b/e2e/4-urql-live-query/package-lock.json @@ -0,0 +1,1083 @@ +{ + "name": "4-urql-live-query", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "4-urql-live-query", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@envelop/live-query": "5.0.4", + "@graphql-tools/utils": "9.2.1", + "@graphql-yoga/plugin-graphql-sse": "^1.2.0", + "@n1ru4l/graphql-live-query": "0.10.0", + "@n1ru4l/graphql-live-query-patch-jsondiffpatch": "^0.8.0", + "@n1ru4l/in-memory-live-query-store": "0.10.0", + "@urql/core": "^3.1.1", + "@urql/devtools": "^2.0.3", + "eventsource": "^2.0.2", + "graphql": "16.6.0", + "graphql-sse": "^2.0.0", + "graphql-yoga": "3.6.0" + } + }, + "node_modules/@envelop/core": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@envelop/core/-/core-3.0.4.tgz", + "integrity": "sha512-AybIZxQsDlFQTWHy6YtX/MSQPVuw+eOFtTW90JsHn6EbmcQnD6N3edQfSiTGjggPRHLoC0+0cuYXp2Ly2r3vrQ==", + "dependencies": { + "@envelop/types": "3.0.1", + "tslib": "2.4.0" + } + }, + "node_modules/@envelop/live-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@envelop/live-query/-/live-query-5.0.4.tgz", + "integrity": "sha512-wqw5PY91LZ3dpamIpYgqNSL5n5zyUivfjOH2SPOvi7gwa4YHASEA9XE2aCNQ9l69EaaDDPLySpyBIfZQ8TIKwg==", + "dependencies": { + "@graphql-tools/utils": "^8.8.0", + "@n1ru4l/graphql-live-query": "^0.10.0", + "@n1ru4l/graphql-live-query-patch": "^0.7.0", + "@n1ru4l/in-memory-live-query-store": "^0.10.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@envelop/core": "^3.0.4", + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@envelop/live-query/node_modules/@graphql-tools/utils": { + "version": "8.13.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.13.1.tgz", + "integrity": "sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw==", + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@envelop/types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@envelop/types/-/types-3.0.1.tgz", + "integrity": "sha512-Ok62K1K+rlS+wQw77k8Pis8+1/h7+/9Wk5Fgcc2U6M5haEWsLFAHcHsk8rYlnJdEUl2Y3yJcCSOYbt1dyTaU5w==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@envelop/validation-cache": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@envelop/validation-cache/-/validation-cache-5.1.0.tgz", + "integrity": "sha512-X0hr7lcT9Ye4Sm43JPaSawmhFl5Uf67z8OEIyphWY4DUNRlY6VClQZRMGP+8iAo9EFcRspvmszBI8b/65JwHaA==", + "dependencies": { + "fast-json-stable-stringify": "^2.1.0", + "js-sha1": "^0.6.0", + "lru-cache": "^6.0.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@envelop/core": "^3.0.4", + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@envelop/validation-cache/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@graphql-tools/executor": { + "version": "0.0.14", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-0.0.14.tgz", + "integrity": "sha512-YiBbN9NT0FgqPJ35+Eg0ty1s5scOZTgiPf+6hLVJBd5zHEURwojEMCTKJ9e0RNZHETp2lN+YaTFGTSoRk0t4Sw==", + "dependencies": { + "@graphql-tools/utils": "9.2.1", + "@graphql-typed-document-node/core": "3.1.1", + "@repeaterjs/repeater": "3.0.4", + "tslib": "^2.4.0", + "value-or-promise": "1.0.12" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/merge": { + "version": "8.3.18", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.3.18.tgz", + "integrity": "sha512-R8nBglvRWPAyLpZL/f3lxsY7wjnAeE0l056zHhcO/CgpvK76KYUt9oEkR05i8Hmt8DLRycBN0FiotJ0yDQWTVA==", + "dependencies": { + "@graphql-tools/utils": "9.2.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/schema": { + "version": "9.0.16", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-9.0.16.tgz", + "integrity": "sha512-kF+tbYPPf/6K2aHG3e1SWIbapDLQaqnIHVRG6ow3onkFoowwtKszvUyOASL6Krcv2x9bIMvd1UkvRf9OaoROQQ==", + "dependencies": { + "@graphql-tools/merge": "8.3.18", + "@graphql-tools/utils": "9.2.1", + "tslib": "^2.4.0", + "value-or-promise": "1.0.12" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/utils": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-9.2.1.tgz", + "integrity": "sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-typed-document-node/core": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.1.tgz", + "integrity": "sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg==", + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-yoga/plugin-graphql-sse": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@graphql-yoga/plugin-graphql-sse/-/plugin-graphql-sse-1.2.0.tgz", + "integrity": "sha512-yMTHWTvPda6K5IAxvDjC5jsnpzTxJ8p+MSuCDRgSBGj538cuTufRtiBA8wZNuhIM2kQMkVR/GZF5wxAB8om6EA==", + "dependencies": { + "graphql-sse": "^2.0.0" + }, + "peerDependencies": { + "graphql": "^15.2.0 || ^16.0.0", + "graphql-yoga": "^3.6.0" + } + }, + "node_modules/@graphql-yoga/subscription": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@graphql-yoga/subscription/-/subscription-3.1.0.tgz", + "integrity": "sha512-Vc9lh8KzIHyS3n4jBlCbz7zCjcbtQnOBpsymcRvHhFr2cuH+knmRn0EmzimMQ58jQ8kxoRXXC3KJS3RIxSdPIg==", + "dependencies": { + "@graphql-yoga/typed-event-target": "^1.0.0", + "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/events": "0.0.2", + "tslib": "^2.3.1" + } + }, + "node_modules/@graphql-yoga/typed-event-target": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@graphql-yoga/typed-event-target/-/typed-event-target-1.0.0.tgz", + "integrity": "sha512-Mqni6AEvl3VbpMtKw+TIjc9qS9a8hKhiAjFtqX488yq5oJtj9TkNlFTIacAVS3vnPiswNsmDiQqvwUOcJgi1DA==", + "dependencies": { + "@repeaterjs/repeater": "^3.0.4", + "tslib": "^2.3.1" + } + }, + "node_modules/@n1ru4l/graphql-live-query": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@n1ru4l/graphql-live-query/-/graphql-live-query-0.10.0.tgz", + "integrity": "sha512-qZ7OHH/NB0NcG/Xa7irzgjE63UH0CkofZT0Bw4Ko6iRFagPRHBM8RgFXwTt/6JbFGIEUS4STRtaFoc/Eq/ZtzQ==", + "peerDependencies": { + "graphql": "^15.4.0 || ^16.0.0" + } + }, + "node_modules/@n1ru4l/graphql-live-query-patch": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@n1ru4l/graphql-live-query-patch/-/graphql-live-query-patch-0.7.0.tgz", + "integrity": "sha512-1q49iNxqEIbmUp+qFAEVEn4ts344Cw72g5OtAuFeTwKtJT3V91kTPGMcRk5Pxb5FPHbvn52q+PCVKOAyVrtPwQ==", + "dependencies": { + "@repeaterjs/repeater": "^3.0.4" + }, + "peerDependencies": { + "graphql": "^15.4.0 || ^16.0.0" + } + }, + "node_modules/@n1ru4l/graphql-live-query-patch-jsondiffpatch": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@n1ru4l/graphql-live-query-patch-jsondiffpatch/-/graphql-live-query-patch-jsondiffpatch-0.8.0.tgz", + "integrity": "sha512-m5OPdEhBbqQ+pkFz2dQmPl10JW/RB1Qc2zoVn9QTEXvyeSzQmrl+qNtn3nvv87P9rQDiRD/JWlD86BFX0XloBg==", + "dependencies": { + "@n1ru4l/graphql-live-query-patch": "^0.7.0", + "@n1ru4l/json-patch-plus": "^0.2.0" + }, + "peerDependencies": { + "graphql": "^15.4.0 || ^16.0.0" + } + }, + "node_modules/@n1ru4l/in-memory-live-query-store": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@n1ru4l/in-memory-live-query-store/-/in-memory-live-query-store-0.10.0.tgz", + "integrity": "sha512-pt7bZgTPz9dk7ceoOp76KIbVFFlAPe0e5A07UiZ19fQy3JPvvoLRdjmnKbUh3VsEUUh8MyytFcFRguaeiidAYA==", + "dependencies": { + "@graphql-tools/utils": "^8.5.2", + "@n1ru4l/graphql-live-query": "0.10.0", + "@repeaterjs/repeater": "^3.0.4" + }, + "peerDependencies": { + "graphql": "^15.4.0 || ^16.0.0" + } + }, + "node_modules/@n1ru4l/in-memory-live-query-store/node_modules/@graphql-tools/utils": { + "version": "8.13.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.13.1.tgz", + "integrity": "sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw==", + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@n1ru4l/json-patch-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@n1ru4l/json-patch-plus/-/json-patch-plus-0.2.0.tgz", + "integrity": "sha512-pLkJy83/rVfDTyQgDSC8GeXAHEdXNHGNJrB1b7wAyGQu0iv7tpMXntKVSqj0+XKNVQbco40SZffNfVALzIt0SQ==" + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.3.tgz", + "integrity": "sha512-6GptMYDMyWBHTUKndHaDsRZUO/XMSgIns2krxcm2L7SEExRHwawFvSwNBhqNPR9HJwv3MruAiF1bhN0we6j6GQ==", + "dependencies": { + "asn1js": "^3.0.5", + "pvtsutils": "^1.3.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@peculiar/json-schema": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", + "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@peculiar/webcrypto": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.4.1.tgz", + "integrity": "sha512-eK4C6WTNYxoI7JOabMoZICiyqRRtJB220bh0Mbj5RwRycleZf9BPyZoxsTvpP0FpmVS2aS13NKOuh5/tN3sIRw==", + "dependencies": { + "@peculiar/asn1-schema": "^2.3.0", + "@peculiar/json-schema": "^1.1.12", + "pvtsutils": "^1.3.2", + "tslib": "^2.4.1", + "webcrypto-core": "^1.7.4" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@peculiar/webcrypto/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, + "node_modules/@repeaterjs/repeater": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.4.tgz", + "integrity": "sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA==" + }, + "node_modules/@types/node": { + "version": "18.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", + "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==", + "peer": true + }, + "node_modules/@urql/core": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@urql/core/-/core-3.1.1.tgz", + "integrity": "sha512-Mnxtq4I4QeFJsgs7Iytw+HyhiGxISR6qtyk66c9tipozLZ6QVxrCiUPF2HY4BxNIabaxcp+rivadvm8NAnXj4Q==", + "dependencies": { + "wonka": "^6.1.2" + }, + "peerDependencies": { + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@urql/devtools": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@urql/devtools/-/devtools-2.0.3.tgz", + "integrity": "sha512-TktPLiBS9LcBPHD6qcnb8wqOVcg3Bx0iCtvQ80uPpfofwwBGJmqnQTjUdEFU6kwaLOFZULQ9+Uo4831G823mQw==", + "dependencies": { + "wonka": ">= 4.0.9" + }, + "peerDependencies": { + "@urql/core": ">= 1.14.0", + "graphql": ">= 0.11.0" + } + }, + "node_modules/@whatwg-node/events": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.0.2.tgz", + "integrity": "sha512-WKj/lI4QjnLuPrim0cfO7i+HsDSXHxNv1y0CrJhdntuO3hxWZmnXCwNDnwOvry11OjRin6cgWNF+j/9Pn8TN4w==" + }, + "node_modules/@whatwg-node/fetch": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.8.1.tgz", + "integrity": "sha512-Fkd1qQHK2tAWxKlC85h9L86Lgbq3BzxMnHSnTsnzNZMMzn6Xi+HlN8/LJ90LxorhSqD54td+Q864LgwUaYDj1Q==", + "dependencies": { + "@peculiar/webcrypto": "^1.4.0", + "@whatwg-node/node-fetch": "^0.3.0", + "busboy": "^1.6.0", + "urlpattern-polyfill": "^6.0.2", + "web-streams-polyfill": "^3.2.1" + } + }, + "node_modules/@whatwg-node/node-fetch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.3.0.tgz", + "integrity": "sha512-mPM8WnuHiI/3kFxDeE0SQQXAElbz4onqmm64fEGCwYEcBes2UsvIDI8HwQIqaXCH42A9ajJUPv4WsYoN/9oG6w==", + "dependencies": { + "@whatwg-node/events": "^0.0.2", + "busboy": "^1.6.0", + "fast-querystring": "^1.1.1", + "fast-url-parser": "^1.1.3", + "tslib": "^2.3.1" + }, + "peerDependencies": { + "@types/node": "^18.0.6" + } + }, + "node_modules/@whatwg-node/server": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/@whatwg-node/server/-/server-0.6.7.tgz", + "integrity": "sha512-M4zHWdJ6M1IdcxnZBdDmiUh1bHQ4gPYRxzkH0gh8Qf6MpWJmX6I/MNftqem3GNn+qn1y47qqlGSed7T7nzsRFw==", + "dependencies": { + "@whatwg-node/fetch": "^0.8.1", + "tslib": "^2.3.1" + } + }, + "node_modules/asn1js": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.5.tgz", + "integrity": "sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==", + "dependencies": { + "pvtsutils": "^1.3.2", + "pvutils": "^1.1.3", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/dset": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.2.tgz", + "integrity": "sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/eventsource": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-querystring": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.1.tgz", + "integrity": "sha512-qR2r+e3HvhEFmpdHMv//U8FnFlnYjaC6QKDuaXALDkw2kvHO8WDjxH+f/rHGR4Me4pnk8p9JAkRNTjYHAKRn2Q==", + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "node_modules/fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", + "dependencies": { + "punycode": "^1.3.2" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/graphql": { + "version": "16.6.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz", + "integrity": "sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/graphql-sse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/graphql-sse/-/graphql-sse-2.0.0.tgz", + "integrity": "sha512-TTdFwxGM9RY68s22XWyhc+SyQn3PLbELDD2So0K6Cc6EIlBAyPuNV8VlPfNKa/la7gEf2SwHY7JoJplOmOY4LA==", + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "graphql": ">=0.11 <=16" + } + }, + "node_modules/graphql-yoga": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/graphql-yoga/-/graphql-yoga-3.6.0.tgz", + "integrity": "sha512-CY4k6/+EPwy/QXfMMkjdcHaUhWEUm7Djd+UxIoY6aJDGfxLF9D3OpBeD7pyxV4pvlRrxp9MEGKZ6kN6LTiVJ/A==", + "dependencies": { + "@envelop/core": "^3.0.4", + "@envelop/validation-cache": "^5.0.5", + "@graphql-tools/executor": "^0.0.14", + "@graphql-tools/schema": "^9.0.0", + "@graphql-tools/utils": "^9.2.1", + "@graphql-yoga/subscription": "^3.1.0", + "@whatwg-node/fetch": "^0.8.1", + "@whatwg-node/server": "^0.6.7", + "dset": "^3.1.1", + "lru-cache": "^7.14.1", + "tslib": "^2.3.1" + }, + "peerDependencies": { + "graphql": "^15.2.0 || ^16.0.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/js-sha1": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/js-sha1/-/js-sha1-0.6.0.tgz", + "integrity": "sha512-01gwBFreYydzmU9BmZxpVk6svJJHrVxEN3IOiGl6VO93bVKYETJ0sIth6DASI6mIFdt7NmfX9UiByRzsYHGU9w==" + }, + "node_modules/lru-cache": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "node_modules/pvtsutils": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.2.tgz", + "integrity": "sha512-+Ipe2iNUyrZz+8K/2IOo+kKikdtfhRKzNpQbruF2URmqPtoqAs8g3xS7TJvFF2GcPXjh7DkqMnpVveRFq4PgEQ==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/pvutils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.3.tgz", + "integrity": "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/urlpattern-polyfill": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-6.0.2.tgz", + "integrity": "sha512-5vZjFlH9ofROmuWmXM9yj2wljYKgWstGwe8YTyiqM7hVum/g9LyCizPZtb3UqsuppVwety9QJmfc42VggLpTgg==", + "dependencies": { + "braces": "^3.0.2" + } + }, + "node_modules/value-or-promise": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.12.tgz", + "integrity": "sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==", + "engines": { + "node": ">=12" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/webcrypto-core": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.7.6.tgz", + "integrity": "sha512-TBPiewB4Buw+HI3EQW+Bexm19/W4cP/qZG/02QJCXN+iN+T5sl074vZ3rJcle/ZtDBQSgjkbsQO/1eFcxnSBUA==", + "dependencies": { + "@peculiar/asn1-schema": "^2.1.6", + "@peculiar/json-schema": "^1.1.12", + "asn1js": "^3.0.1", + "pvtsutils": "^1.3.2", + "tslib": "^2.4.0" + } + }, + "node_modules/wonka": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.2.3.tgz", + "integrity": "sha512-EFOYiqDeYLXSzGYt2X3aVe9Hq1XJG+Hz/HjTRRT4dZE9q95khHl5+7pzUSXI19dbMO1/2UMrTf7JT7/7JrSQSQ==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + }, + "dependencies": { + "@envelop/core": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@envelop/core/-/core-3.0.4.tgz", + "integrity": "sha512-AybIZxQsDlFQTWHy6YtX/MSQPVuw+eOFtTW90JsHn6EbmcQnD6N3edQfSiTGjggPRHLoC0+0cuYXp2Ly2r3vrQ==", + "requires": { + "@envelop/types": "3.0.1", + "tslib": "2.4.0" + } + }, + "@envelop/live-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@envelop/live-query/-/live-query-5.0.4.tgz", + "integrity": "sha512-wqw5PY91LZ3dpamIpYgqNSL5n5zyUivfjOH2SPOvi7gwa4YHASEA9XE2aCNQ9l69EaaDDPLySpyBIfZQ8TIKwg==", + "requires": { + "@graphql-tools/utils": "^8.8.0", + "@n1ru4l/graphql-live-query": "^0.10.0", + "@n1ru4l/graphql-live-query-patch": "^0.7.0", + "@n1ru4l/in-memory-live-query-store": "^0.10.0", + "tslib": "^2.4.0" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "8.13.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.13.1.tgz", + "integrity": "sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw==", + "requires": { + "tslib": "^2.4.0" + } + } + } + }, + "@envelop/types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@envelop/types/-/types-3.0.1.tgz", + "integrity": "sha512-Ok62K1K+rlS+wQw77k8Pis8+1/h7+/9Wk5Fgcc2U6M5haEWsLFAHcHsk8rYlnJdEUl2Y3yJcCSOYbt1dyTaU5w==", + "requires": { + "tslib": "^2.4.0" + } + }, + "@envelop/validation-cache": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@envelop/validation-cache/-/validation-cache-5.1.0.tgz", + "integrity": "sha512-X0hr7lcT9Ye4Sm43JPaSawmhFl5Uf67z8OEIyphWY4DUNRlY6VClQZRMGP+8iAo9EFcRspvmszBI8b/65JwHaA==", + "requires": { + "fast-json-stable-stringify": "^2.1.0", + "js-sha1": "^0.6.0", + "lru-cache": "^6.0.0", + "tslib": "^2.4.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "@graphql-tools/executor": { + "version": "0.0.14", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-0.0.14.tgz", + "integrity": "sha512-YiBbN9NT0FgqPJ35+Eg0ty1s5scOZTgiPf+6hLVJBd5zHEURwojEMCTKJ9e0RNZHETp2lN+YaTFGTSoRk0t4Sw==", + "requires": { + "@graphql-tools/utils": "9.2.1", + "@graphql-typed-document-node/core": "3.1.1", + "@repeaterjs/repeater": "3.0.4", + "tslib": "^2.4.0", + "value-or-promise": "1.0.12" + } + }, + "@graphql-tools/merge": { + "version": "8.3.18", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.3.18.tgz", + "integrity": "sha512-R8nBglvRWPAyLpZL/f3lxsY7wjnAeE0l056zHhcO/CgpvK76KYUt9oEkR05i8Hmt8DLRycBN0FiotJ0yDQWTVA==", + "requires": { + "@graphql-tools/utils": "9.2.1", + "tslib": "^2.4.0" + } + }, + "@graphql-tools/schema": { + "version": "9.0.16", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-9.0.16.tgz", + "integrity": "sha512-kF+tbYPPf/6K2aHG3e1SWIbapDLQaqnIHVRG6ow3onkFoowwtKszvUyOASL6Krcv2x9bIMvd1UkvRf9OaoROQQ==", + "requires": { + "@graphql-tools/merge": "8.3.18", + "@graphql-tools/utils": "9.2.1", + "tslib": "^2.4.0", + "value-or-promise": "1.0.12" + } + }, + "@graphql-tools/utils": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-9.2.1.tgz", + "integrity": "sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==", + "requires": { + "@graphql-typed-document-node/core": "^3.1.1", + "tslib": "^2.4.0" + } + }, + "@graphql-typed-document-node/core": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.1.tgz", + "integrity": "sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg==", + "requires": {} + }, + "@graphql-yoga/plugin-graphql-sse": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@graphql-yoga/plugin-graphql-sse/-/plugin-graphql-sse-1.2.0.tgz", + "integrity": "sha512-yMTHWTvPda6K5IAxvDjC5jsnpzTxJ8p+MSuCDRgSBGj538cuTufRtiBA8wZNuhIM2kQMkVR/GZF5wxAB8om6EA==", + "requires": { + "graphql-sse": "^2.0.0" + } + }, + "@graphql-yoga/subscription": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@graphql-yoga/subscription/-/subscription-3.1.0.tgz", + "integrity": "sha512-Vc9lh8KzIHyS3n4jBlCbz7zCjcbtQnOBpsymcRvHhFr2cuH+knmRn0EmzimMQ58jQ8kxoRXXC3KJS3RIxSdPIg==", + "requires": { + "@graphql-yoga/typed-event-target": "^1.0.0", + "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/events": "0.0.2", + "tslib": "^2.3.1" + } + }, + "@graphql-yoga/typed-event-target": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@graphql-yoga/typed-event-target/-/typed-event-target-1.0.0.tgz", + "integrity": "sha512-Mqni6AEvl3VbpMtKw+TIjc9qS9a8hKhiAjFtqX488yq5oJtj9TkNlFTIacAVS3vnPiswNsmDiQqvwUOcJgi1DA==", + "requires": { + "@repeaterjs/repeater": "^3.0.4", + "tslib": "^2.3.1" + } + }, + "@n1ru4l/graphql-live-query": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@n1ru4l/graphql-live-query/-/graphql-live-query-0.10.0.tgz", + "integrity": "sha512-qZ7OHH/NB0NcG/Xa7irzgjE63UH0CkofZT0Bw4Ko6iRFagPRHBM8RgFXwTt/6JbFGIEUS4STRtaFoc/Eq/ZtzQ==", + "requires": {} + }, + "@n1ru4l/graphql-live-query-patch": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@n1ru4l/graphql-live-query-patch/-/graphql-live-query-patch-0.7.0.tgz", + "integrity": "sha512-1q49iNxqEIbmUp+qFAEVEn4ts344Cw72g5OtAuFeTwKtJT3V91kTPGMcRk5Pxb5FPHbvn52q+PCVKOAyVrtPwQ==", + "requires": { + "@repeaterjs/repeater": "^3.0.4" + } + }, + "@n1ru4l/graphql-live-query-patch-jsondiffpatch": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@n1ru4l/graphql-live-query-patch-jsondiffpatch/-/graphql-live-query-patch-jsondiffpatch-0.8.0.tgz", + "integrity": "sha512-m5OPdEhBbqQ+pkFz2dQmPl10JW/RB1Qc2zoVn9QTEXvyeSzQmrl+qNtn3nvv87P9rQDiRD/JWlD86BFX0XloBg==", + "requires": { + "@n1ru4l/graphql-live-query-patch": "^0.7.0", + "@n1ru4l/json-patch-plus": "^0.2.0" + } + }, + "@n1ru4l/in-memory-live-query-store": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@n1ru4l/in-memory-live-query-store/-/in-memory-live-query-store-0.10.0.tgz", + "integrity": "sha512-pt7bZgTPz9dk7ceoOp76KIbVFFlAPe0e5A07UiZ19fQy3JPvvoLRdjmnKbUh3VsEUUh8MyytFcFRguaeiidAYA==", + "requires": { + "@graphql-tools/utils": "^8.5.2", + "@n1ru4l/graphql-live-query": "0.10.0", + "@repeaterjs/repeater": "^3.0.4" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "8.13.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.13.1.tgz", + "integrity": "sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw==", + "requires": { + "tslib": "^2.4.0" + } + } + } + }, + "@n1ru4l/json-patch-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@n1ru4l/json-patch-plus/-/json-patch-plus-0.2.0.tgz", + "integrity": "sha512-pLkJy83/rVfDTyQgDSC8GeXAHEdXNHGNJrB1b7wAyGQu0iv7tpMXntKVSqj0+XKNVQbco40SZffNfVALzIt0SQ==" + }, + "@peculiar/asn1-schema": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.3.tgz", + "integrity": "sha512-6GptMYDMyWBHTUKndHaDsRZUO/XMSgIns2krxcm2L7SEExRHwawFvSwNBhqNPR9HJwv3MruAiF1bhN0we6j6GQ==", + "requires": { + "asn1js": "^3.0.5", + "pvtsutils": "^1.3.2", + "tslib": "^2.4.0" + } + }, + "@peculiar/json-schema": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", + "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@peculiar/webcrypto": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.4.1.tgz", + "integrity": "sha512-eK4C6WTNYxoI7JOabMoZICiyqRRtJB220bh0Mbj5RwRycleZf9BPyZoxsTvpP0FpmVS2aS13NKOuh5/tN3sIRw==", + "requires": { + "@peculiar/asn1-schema": "^2.3.0", + "@peculiar/json-schema": "^1.1.12", + "pvtsutils": "^1.3.2", + "tslib": "^2.4.1", + "webcrypto-core": "^1.7.4" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + } + } + }, + "@repeaterjs/repeater": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.4.tgz", + "integrity": "sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA==" + }, + "@types/node": { + "version": "18.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", + "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==", + "peer": true + }, + "@urql/core": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@urql/core/-/core-3.1.1.tgz", + "integrity": "sha512-Mnxtq4I4QeFJsgs7Iytw+HyhiGxISR6qtyk66c9tipozLZ6QVxrCiUPF2HY4BxNIabaxcp+rivadvm8NAnXj4Q==", + "requires": { + "wonka": "^6.1.2" + } + }, + "@urql/devtools": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@urql/devtools/-/devtools-2.0.3.tgz", + "integrity": "sha512-TktPLiBS9LcBPHD6qcnb8wqOVcg3Bx0iCtvQ80uPpfofwwBGJmqnQTjUdEFU6kwaLOFZULQ9+Uo4831G823mQw==", + "requires": { + "wonka": ">= 4.0.9" + } + }, + "@whatwg-node/events": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.0.2.tgz", + "integrity": "sha512-WKj/lI4QjnLuPrim0cfO7i+HsDSXHxNv1y0CrJhdntuO3hxWZmnXCwNDnwOvry11OjRin6cgWNF+j/9Pn8TN4w==" + }, + "@whatwg-node/fetch": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.8.1.tgz", + "integrity": "sha512-Fkd1qQHK2tAWxKlC85h9L86Lgbq3BzxMnHSnTsnzNZMMzn6Xi+HlN8/LJ90LxorhSqD54td+Q864LgwUaYDj1Q==", + "requires": { + "@peculiar/webcrypto": "^1.4.0", + "@whatwg-node/node-fetch": "^0.3.0", + "busboy": "^1.6.0", + "urlpattern-polyfill": "^6.0.2", + "web-streams-polyfill": "^3.2.1" + } + }, + "@whatwg-node/node-fetch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.3.0.tgz", + "integrity": "sha512-mPM8WnuHiI/3kFxDeE0SQQXAElbz4onqmm64fEGCwYEcBes2UsvIDI8HwQIqaXCH42A9ajJUPv4WsYoN/9oG6w==", + "requires": { + "@whatwg-node/events": "^0.0.2", + "busboy": "^1.6.0", + "fast-querystring": "^1.1.1", + "fast-url-parser": "^1.1.3", + "tslib": "^2.3.1" + } + }, + "@whatwg-node/server": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/@whatwg-node/server/-/server-0.6.7.tgz", + "integrity": "sha512-M4zHWdJ6M1IdcxnZBdDmiUh1bHQ4gPYRxzkH0gh8Qf6MpWJmX6I/MNftqem3GNn+qn1y47qqlGSed7T7nzsRFw==", + "requires": { + "@whatwg-node/fetch": "^0.8.1", + "tslib": "^2.3.1" + } + }, + "asn1js": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.5.tgz", + "integrity": "sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==", + "requires": { + "pvtsutils": "^1.3.2", + "pvutils": "^1.1.3", + "tslib": "^2.4.0" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "requires": { + "streamsearch": "^1.1.0" + } + }, + "dset": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.2.tgz", + "integrity": "sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q==" + }, + "eventsource": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==" + }, + "fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-querystring": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.1.tgz", + "integrity": "sha512-qR2r+e3HvhEFmpdHMv//U8FnFlnYjaC6QKDuaXALDkw2kvHO8WDjxH+f/rHGR4Me4pnk8p9JAkRNTjYHAKRn2Q==", + "requires": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", + "requires": { + "punycode": "^1.3.2" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "graphql": { + "version": "16.6.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz", + "integrity": "sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==" + }, + "graphql-sse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/graphql-sse/-/graphql-sse-2.0.0.tgz", + "integrity": "sha512-TTdFwxGM9RY68s22XWyhc+SyQn3PLbELDD2So0K6Cc6EIlBAyPuNV8VlPfNKa/la7gEf2SwHY7JoJplOmOY4LA==", + "requires": {} + }, + "graphql-yoga": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/graphql-yoga/-/graphql-yoga-3.6.0.tgz", + "integrity": "sha512-CY4k6/+EPwy/QXfMMkjdcHaUhWEUm7Djd+UxIoY6aJDGfxLF9D3OpBeD7pyxV4pvlRrxp9MEGKZ6kN6LTiVJ/A==", + "requires": { + "@envelop/core": "^3.0.4", + "@envelop/validation-cache": "^5.0.5", + "@graphql-tools/executor": "^0.0.14", + "@graphql-tools/schema": "^9.0.0", + "@graphql-tools/utils": "^9.2.1", + "@graphql-yoga/subscription": "^3.1.0", + "@whatwg-node/fetch": "^0.8.1", + "@whatwg-node/server": "^0.6.7", + "dset": "^3.1.1", + "lru-cache": "^7.14.1", + "tslib": "^2.3.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "js-sha1": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/js-sha1/-/js-sha1-0.6.0.tgz", + "integrity": "sha512-01gwBFreYydzmU9BmZxpVk6svJJHrVxEN3IOiGl6VO93bVKYETJ0sIth6DASI6mIFdt7NmfX9UiByRzsYHGU9w==" + }, + "lru-cache": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==" + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "pvtsutils": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.2.tgz", + "integrity": "sha512-+Ipe2iNUyrZz+8K/2IOo+kKikdtfhRKzNpQbruF2URmqPtoqAs8g3xS7TJvFF2GcPXjh7DkqMnpVveRFq4PgEQ==", + "requires": { + "tslib": "^2.4.0" + } + }, + "pvutils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.3.tgz", + "integrity": "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==" + }, + "streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "urlpattern-polyfill": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-6.0.2.tgz", + "integrity": "sha512-5vZjFlH9ofROmuWmXM9yj2wljYKgWstGwe8YTyiqM7hVum/g9LyCizPZtb3UqsuppVwety9QJmfc42VggLpTgg==", + "requires": { + "braces": "^3.0.2" + } + }, + "value-or-promise": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.12.tgz", + "integrity": "sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==" + }, + "web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==" + }, + "webcrypto-core": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.7.6.tgz", + "integrity": "sha512-TBPiewB4Buw+HI3EQW+Bexm19/W4cP/qZG/02QJCXN+iN+T5sl074vZ3rJcle/ZtDBQSgjkbsQO/1eFcxnSBUA==", + "requires": { + "@peculiar/asn1-schema": "^2.1.6", + "@peculiar/json-schema": "^1.1.12", + "asn1js": "^3.0.1", + "pvtsutils": "^1.3.2", + "tslib": "^2.4.0" + } + }, + "wonka": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.2.3.tgz", + "integrity": "sha512-EFOYiqDeYLXSzGYt2X3aVe9Hq1XJG+Hz/HjTRRT4dZE9q95khHl5+7pzUSXI19dbMO1/2UMrTf7JT7/7JrSQSQ==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } +} diff --git a/e2e/4-urql-live-query/package.json b/e2e/4-urql-live-query/package.json new file mode 100644 index 00000000..4dfc4a93 --- /dev/null +++ b/e2e/4-urql-live-query/package.json @@ -0,0 +1,29 @@ +{ + "name": "4-urql-live-query", + "version": "1.0.0", + "description": "", + "main": "server.js", + "directories": { + "test": "test" + }, + "scripts": { + "test": "npm i && spago install && spago build && node ./test.mjs", + "start": "node server.js" + }, + "author": "", + "license": "ISC", + "dependencies": { + "@envelop/live-query": "5.0.4", + "@graphql-tools/utils": "9.2.1", + "@graphql-yoga/plugin-graphql-sse": "^1.2.0", + "@n1ru4l/graphql-live-query": "0.10.0", + "@n1ru4l/graphql-live-query-patch-jsondiffpatch": "^0.8.0", + "@n1ru4l/in-memory-live-query-store": "0.10.0", + "@urql/core": "^3.1.1", + "@urql/devtools": "^2.0.3", + "eventsource": "^2.0.2", + "graphql": "16.6.0", + "graphql-sse": "^2.0.0", + "graphql-yoga": "3.6.0" + } +} diff --git a/e2e/4-urql-live-query/packages.dhall b/e2e/4-urql-live-query/packages.dhall new file mode 100644 index 00000000..b2656ef7 --- /dev/null +++ b/e2e/4-urql-live-query/packages.dhall @@ -0,0 +1,5 @@ + +let upstream = + ../../packages.dhall + +in upstream diff --git a/e2e/4-urql-live-query/server-fn.mjs b/e2e/4-urql-live-query/server-fn.mjs new file mode 100644 index 00000000..22c57c3f --- /dev/null +++ b/e2e/4-urql-live-query/server-fn.mjs @@ -0,0 +1,51 @@ +import { createYoga, createSchema } from 'graphql-yoga' +import { useGraphQLSSE } from '@graphql-yoga/plugin-graphql-sse' +import { createServer } from 'http' +import { useLiveQuery } from '@envelop/live-query' +import { InMemoryLiveQueryStore } from '@n1ru4l/in-memory-live-query-store' +import { GraphQLLiveDirective } from '@n1ru4l/graphql-live-query' +import { astFromDirective } from '@graphql-tools/utils' + +export default (onListening) => { + + const liveQueryStore = new InMemoryLiveQueryStore() + + setInterval(() => { + const firstElement = greetings.pop() + greetings.unshift(firstElement) + liveQueryStore.invalidate('Query.greetings') + }, 1000).unref() + + const greetings = ['Hi', 'Hello', 'Sup'] + + const yoga = createYoga({ + context: () => ({ greetings }), + schema: createSchema({ + typeDefs: [ + /* GraphQL */ ` + type Query { + greetings: [String]! + } + `, + astFromDirective(GraphQLLiveDirective), + ], + resolvers: { + Query: { + greetings: (_, __, context) => context.greetings, + }, + }, + }), + graphiql: { + defaultQuery: /* GraphQL */ ` + query @live { + greetings + } + `, + }, + plugins: [useLiveQuery({ liveQueryStore })], + }) + + const server = createServer(yoga) + + server.listen(4000, onListening) + } diff --git a/e2e/4-urql-live-query/server.mjs b/e2e/4-urql-live-query/server.mjs new file mode 100644 index 00000000..c6d8dfbb --- /dev/null +++ b/e2e/4-urql-live-query/server.mjs @@ -0,0 +1,4 @@ +import serverFn from './server-fn.mjs' +serverFn(() => { + console.info('Running a GraphQL API server at http://localhost:4000/graphql') +}) diff --git a/e2e/4-urql-live-query/spago.dhall b/e2e/4-urql-live-query/spago.dhall new file mode 100644 index 00000000..606c488d --- /dev/null +++ b/e2e/4-urql-live-query/spago.dhall @@ -0,0 +1,9 @@ +{- +Welcome to a Spago project! +You can edit this file as you like. +-} +{ name = "my-project" +, dependencies = ../../test-deps.dhall +, packages = ./packages.dhall +, sources = [ "src/**/*.purs", "test/**/*.purs", "../../src/**/*.purs" ] +} diff --git a/e2e/4-urql-live-query/src/Main.purs b/e2e/4-urql-live-query/src/Main.purs new file mode 100644 index 00000000..55a45cfd --- /dev/null +++ b/e2e/4-urql-live-query/src/Main.purs @@ -0,0 +1,63 @@ +module Main where + +import Prelude + +import Data.Argonaut.Decode (class DecodeJson, decodeJson) +import Data.Maybe (isJust) +import Data.Time.Duration (Milliseconds(..), Seconds(..)) +import Effect (Effect) +import Effect.Aff (Aff, delay, launchAff_) +import Effect.Class (liftEffect) +import Effect.Class.Console (logShow) +import Effect.Console (log) +import GraphQL.Client.Args ((=>>)) +import GraphQL.Client.BaseClients.Urql (UrqlLiveQueryClient(..), createLiveQueryClient) +import GraphQL.Client.Directive (ApplyDirective, applyDir) +import GraphQL.Client.Directive.Definition (Directive) +import GraphQL.Client.Directive.Location (QUERY(..)) +import GraphQL.Client.LiveQuery (liveQuery) +import GraphQL.Client.Operation (OpQuery) +import GraphQL.Client.Query (query, queryFullRes) +import GraphQL.Client.Types (class GqlQuery, Client(..)) +import Halogen.Subscription as HS +import Type.Data.List (type (:>), Nil') +import Type.Proxy (Proxy(..)) + +type Directives = + ( Directive "live" "" { } + (QUERY :> Nil') + :> Nil' + ) + +live :: forall q args. args -> q -> ApplyDirective "live" args q +live = applyDir (Proxy :: _ "live") + +main :: Effect Unit +main = do + + client :: Client UrqlLiveQueryClient Directives Query _ _ <- + createLiveQueryClient + { url: "http://localhost:4000/graphql" + , headers: [ ] + } + + let + event = liveQuery client "" $ live {} { greetings } + + handle <- + HS.subscribe event \e -> do + log "Live Query update received" + logShow e + + launchAff_ do + delay $ Milliseconds (3.0 * 1000.0) + liftEffect $ HS.unsubscribe handle + +-- Query +type Query + = { greetings :: Array String + } + +-- Symbols +greetings :: Proxy "greetings" +greetings = Proxy diff --git a/e2e/4-urql-live-query/test.mjs b/e2e/4-urql-live-query/test.mjs new file mode 100644 index 00000000..834f8cb3 --- /dev/null +++ b/e2e/4-urql-live-query/test.mjs @@ -0,0 +1,25 @@ +import { deepStrictEqual } from 'assert' +import serverFn from './server-fn.mjs'; +import {main} from './output/Main/index.js'; + +const logs = [] + +console.log = (log) => { + console.info(log) + logs.push(log) +} + +serverFn(main) + +setTimeout(() => { + deepStrictEqual(logs, [ + 'Live Query update received', + '(Right { greetings: ["Hi","Hello","Sup"] })', + 'Live Query update received', + '(Right { greetings: ["Sup","Hi","Hello"] })', + 'Live Query update received', + '(Right { greetings: ["Hello","Sup","Hi"] })', + ]) + console.info('tests passed') + process.exit(0) +}, 2000) diff --git a/e2e/4-urql-live-query/test/Main.purs b/e2e/4-urql-live-query/test/Main.purs new file mode 100644 index 00000000..f91f98c1 --- /dev/null +++ b/e2e/4-urql-live-query/test/Main.purs @@ -0,0 +1,11 @@ +module Test.Main where + +import Prelude + +import Effect (Effect) +import Effect.Class.Console (log) + +main :: Effect Unit +main = do + log "🍝" + log "You should add some tests." diff --git a/e2e/4-urql-live-query/yarn-error.log b/e2e/4-urql-live-query/yarn-error.log new file mode 100644 index 00000000..a761e2ea --- /dev/null +++ b/e2e/4-urql-live-query/yarn-error.log @@ -0,0 +1,440 @@ +Arguments: + /nix/store/1vnbw0jq9d3ddpdd2pf7zyvvq4rq814a-nodejs-18.2.0/bin/node /opt/homebrew/bin/yarn add @grafbase/url-exchange + +PATH: + /nix/store/3j6ii6cfwnj0kyjvv8bmnqdi4jy478ng-clang-wrapper-11.1.0/bin:/nix/store/3bqpgaas7m19j19mlm758fafrpl740dp-clang-11.1.0/bin:/nix/store/q5adnlrxq08zr1cik50mriw63jz1jpg5-coreutils-9.0/bin:/nix/store/znqi1pp0d3vx1zk4jnrf1520y4j3mkav-cctools-binutils-darwin-wrapper-949.0.1/bin:/nix/store/gff87f1lbzlsx1n0zblcgfwxhrhavblw-cctools-binutils-darwin-949.0.1/bin:/nix/store/1vnbw0jq9d3ddpdd2pf7zyvvq4rq814a-nodejs-18.2.0/bin:/nix/store/c8sqzfzjlknl5p9fqidsqbn4k28c69hz-nixpkgs-fmt-1.2.0/bin:/nix/store/0x5kpnqr2yf0qxp8vvm42km3cg17avf5-purescript-v0.15.7/bin:/nix/store/7fkys539h2zxy9d13h8djvslm81l7kwf-node_purs-tidy-0.9.0/bin:/nix/store/r38kmdx4nazp07hxfp8r28spnsy9cadn-node_psa-0.8.2/bin:/nix/store/k387g5m8rad8d79icz2wisrlqk57yglm-spago-0.20.9/bin:/nix/store/fkjqnjnj03cawpdnx1iql88aa5kr9r6p-node_purescript-language-server-0.16.6/bin:/nix/store/q5adnlrxq08zr1cik50mriw63jz1jpg5-coreutils-9.0/bin:/nix/store/m622x4majj0n8inqj1albnf9z1xdkhn8-findutils-4.8.0/bin:/nix/store/kbxymkdlf77bj0m5m3x983fn649dvc7g-diffutils-3.8/bin:/nix/store/q9jlz1pybfza7qqrpgkdqrlrh89i97h6-gnused-4.8/bin:/nix/store/mmgqx8iycqgl9ir2pw480ywwbdkj9jsq-gnugrep-3.7/bin:/nix/store/q0c4mm5zh3h50793dk1yhd0ksmy00vsp-gawk-5.1.1/bin:/nix/store/p0flrhii9qa86sy18w5a7ys83yaw992c-gnutar-1.34/bin:/nix/store/zr3azhmc5j4n15xj7figw3ld69xh6a20-gzip-1.12/bin:/nix/store/ar7j8cwqk2690awpff1sk6bqilxiniki-bzip2-1.0.6.0.2-bin/bin:/nix/store/91asvnxg9m5kcwfjl1xg2nbc7i3daasg-gnumake-4.3/bin:/nix/store/94imf0lyj4vdr19aa226bxsqnglg8940-bash-5.1-p8/bin:/nix/store/v2c7yj5v5lqipf34sp6nl41rb39wq9vr-patch-2.7.6/bin:/nix/store/4wxblyhjkd0xyirvvwg6q1syplpvlyls-xz-5.2.5-bin/bin:/Users/jun/.rbenv/shims:/Users/jun/.rbenv/bin:/opt/homebrew/bin:/usr/local/bin:/Users/jun/.rbenv/shims:/Users/jun/.nvm/versions/node/v12.22.8/bin:/Applications/Postgres.app/Contents/Versions/latest/bin:/sbin:/usr/sbin:/opt/homebrew/opt/ruby/bin:/usr/local/bin:/run/current-system/sw/bin:/Users/jun/Library/Python/3.9/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/Users/jun/.rbenv/shims:/Users/jun/.nvm/versions/node/v12.22.8/bin:/Applications/Postgres.app/Contents/Versions/latest/bin:/sbin:/usr/sbin:/opt/homebrew/opt/ruby/bin:/usr/local/bin:/run/current-system/sw/bin:/Users/jun/Library/Python/3.9/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/Users/jun/.cargo/bin:/Users/jun/.nix-profile/bin:/etc/profiles/per-user/jun/bin:/run/current-system/sw/bin:/nix/var/nix/profiles/default/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin + +Yarn version: + 1.22.17 + +Node version: + 18.2.0 + +Platform: + darwin arm64 + +Trace: + Error: https://registry.yarnpkg.com/@grafbase%2furl-exchange: Not found + at params.callback [as _callback] (/opt/homebrew/lib/node_modules/yarn/lib/cli.js:67029:18) + at self.callback (/opt/homebrew/lib/node_modules/yarn/lib/cli.js:140883:22) + at Request.emit (node:events:527:28) + at Request. (/opt/homebrew/lib/node_modules/yarn/lib/cli.js:141855:10) + at Request.emit (node:events:527:28) + at IncomingMessage. (/opt/homebrew/lib/node_modules/yarn/lib/cli.js:141777:12) + at Object.onceWrapper (node:events:641:28) + at IncomingMessage.emit (node:events:539:35) + at endReadableNT (node:internal/streams/readable:1344:12) + at process.processTicksAndRejections (node:internal/process/task_queues:82:21) + +npm manifest: + { + "name": "4-urql-live-query", + "version": "1.0.0", + "description": "", + "main": "server.js", + "directories": { + "test": "test" + }, + "scripts": { + "test": "npm i && spago install && spago build && node ./test.mjs", + "start": "node server.js" + }, + "author": "", + "license": "ISC", + "dependencies": { + "@envelop/live-query": "5.0.4", + "@n1ru4l/graphql-live-query": "0.10.0", + "@n1ru4l/in-memory-live-query-store": "0.10.0", + "@graphql-tools/utils": "9.2.1", + "@urql/core": "^1.16.2", + "graphql-yoga": "3.6.0", + "graphql": "16.6.0" + } + } + +yarn manifest: + No manifest + +Lockfile: + # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. + # yarn lockfile v1 + + + "@envelop/core@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@envelop/core/-/core-3.0.4.tgz#6801049bed24487599b4ffa0f836f70cb62714fc" + integrity sha512-AybIZxQsDlFQTWHy6YtX/MSQPVuw+eOFtTW90JsHn6EbmcQnD6N3edQfSiTGjggPRHLoC0+0cuYXp2Ly2r3vrQ== + dependencies: + "@envelop/types" "3.0.1" + tslib "2.4.0" + + "@envelop/live-query@5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@envelop/live-query/-/live-query-5.0.4.tgz#b24d40daadf84f6081ce2e2737c0c2d8448a66b3" + integrity sha512-wqw5PY91LZ3dpamIpYgqNSL5n5zyUivfjOH2SPOvi7gwa4YHASEA9XE2aCNQ9l69EaaDDPLySpyBIfZQ8TIKwg== + dependencies: + "@graphql-tools/utils" "^8.8.0" + "@n1ru4l/graphql-live-query" "^0.10.0" + "@n1ru4l/graphql-live-query-patch" "^0.7.0" + "@n1ru4l/in-memory-live-query-store" "^0.10.0" + tslib "^2.4.0" + + "@envelop/types@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@envelop/types/-/types-3.0.1.tgz#0afec3b3f1ab282bc828e6c42c5e26d76ffe363c" + integrity sha512-Ok62K1K+rlS+wQw77k8Pis8+1/h7+/9Wk5Fgcc2U6M5haEWsLFAHcHsk8rYlnJdEUl2Y3yJcCSOYbt1dyTaU5w== + dependencies: + tslib "^2.4.0" + + "@envelop/validation-cache@^5.0.5": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@envelop/validation-cache/-/validation-cache-5.1.0.tgz#95496557d6289a6eaecca44c4aa83304ba4213e8" + integrity sha512-X0hr7lcT9Ye4Sm43JPaSawmhFl5Uf67z8OEIyphWY4DUNRlY6VClQZRMGP+8iAo9EFcRspvmszBI8b/65JwHaA== + dependencies: + fast-json-stable-stringify "^2.1.0" + js-sha1 "^0.6.0" + lru-cache "^6.0.0" + tslib "^2.4.0" + + "@graphql-tools/executor@^0.0.14": + version "0.0.14" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor/-/executor-0.0.14.tgz#7c6073d75c77dd6e7fab0c835761ed09c85a3bc6" + integrity sha512-YiBbN9NT0FgqPJ35+Eg0ty1s5scOZTgiPf+6hLVJBd5zHEURwojEMCTKJ9e0RNZHETp2lN+YaTFGTSoRk0t4Sw== + dependencies: + "@graphql-tools/utils" "9.2.1" + "@graphql-typed-document-node/core" "3.1.1" + "@repeaterjs/repeater" "3.0.4" + tslib "^2.4.0" + value-or-promise "1.0.12" + + "@graphql-tools/merge@8.3.18": + version "8.3.18" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.3.18.tgz#bfbb517c68598a885809f16ce5c3bb1ebb8f04a2" + integrity sha512-R8nBglvRWPAyLpZL/f3lxsY7wjnAeE0l056zHhcO/CgpvK76KYUt9oEkR05i8Hmt8DLRycBN0FiotJ0yDQWTVA== + dependencies: + "@graphql-tools/utils" "9.2.1" + tslib "^2.4.0" + + "@graphql-tools/schema@^9.0.0": + version "9.0.16" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-9.0.16.tgz#7d340d69e6094dc01a2b9e625c7bb4fff89ea521" + integrity sha512-kF+tbYPPf/6K2aHG3e1SWIbapDLQaqnIHVRG6ow3onkFoowwtKszvUyOASL6Krcv2x9bIMvd1UkvRf9OaoROQQ== + dependencies: + "@graphql-tools/merge" "8.3.18" + "@graphql-tools/utils" "9.2.1" + tslib "^2.4.0" + value-or-promise "1.0.12" + + "@graphql-tools/utils@9.2.1", "@graphql-tools/utils@^9.2.1": + version "9.2.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-9.2.1.tgz#1b3df0ef166cfa3eae706e3518b17d5922721c57" + integrity sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A== + dependencies: + "@graphql-typed-document-node/core" "^3.1.1" + tslib "^2.4.0" + + "@graphql-tools/utils@^8.5.2", "@graphql-tools/utils@^8.8.0": + version "8.13.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.13.1.tgz#b247607e400365c2cd87ff54654d4ad25a7ac491" + integrity sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw== + dependencies: + tslib "^2.4.0" + + "@graphql-typed-document-node/core@3.1.1", "@graphql-typed-document-node/core@^3.1.0", "@graphql-typed-document-node/core@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.1.tgz#076d78ce99822258cf813ecc1e7fa460fa74d052" + integrity sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg== + + "@graphql-yoga/subscription@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@graphql-yoga/subscription/-/subscription-3.1.0.tgz#4a0bb0b9db2602d02c68f9828603e1e40329140b" + integrity sha512-Vc9lh8KzIHyS3n4jBlCbz7zCjcbtQnOBpsymcRvHhFr2cuH+knmRn0EmzimMQ58jQ8kxoRXXC3KJS3RIxSdPIg== + dependencies: + "@graphql-yoga/typed-event-target" "^1.0.0" + "@repeaterjs/repeater" "^3.0.4" + "@whatwg-node/events" "0.0.2" + tslib "^2.3.1" + + "@graphql-yoga/typed-event-target@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@graphql-yoga/typed-event-target/-/typed-event-target-1.0.0.tgz#dae3c0146f08a4dc30b5b890f8bab706c2b62199" + integrity sha512-Mqni6AEvl3VbpMtKw+TIjc9qS9a8hKhiAjFtqX488yq5oJtj9TkNlFTIacAVS3vnPiswNsmDiQqvwUOcJgi1DA== + dependencies: + "@repeaterjs/repeater" "^3.0.4" + tslib "^2.3.1" + + "@n1ru4l/graphql-live-query-patch@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@n1ru4l/graphql-live-query-patch/-/graphql-live-query-patch-0.7.0.tgz#c5b30341d218627b9ed15cea37e72ea3c15f3632" + integrity sha512-1q49iNxqEIbmUp+qFAEVEn4ts344Cw72g5OtAuFeTwKtJT3V91kTPGMcRk5Pxb5FPHbvn52q+PCVKOAyVrtPwQ== + dependencies: + "@repeaterjs/repeater" "^3.0.4" + + "@n1ru4l/graphql-live-query@0.10.0", "@n1ru4l/graphql-live-query@^0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@n1ru4l/graphql-live-query/-/graphql-live-query-0.10.0.tgz#2306151630b0e74b017cc1067ebbea351acf56f8" + integrity sha512-qZ7OHH/NB0NcG/Xa7irzgjE63UH0CkofZT0Bw4Ko6iRFagPRHBM8RgFXwTt/6JbFGIEUS4STRtaFoc/Eq/ZtzQ== + + "@n1ru4l/in-memory-live-query-store@0.10.0", "@n1ru4l/in-memory-live-query-store@^0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@n1ru4l/in-memory-live-query-store/-/in-memory-live-query-store-0.10.0.tgz#108a60ccfefb59f76eaf1600712d0d190fec0f89" + integrity sha512-pt7bZgTPz9dk7ceoOp76KIbVFFlAPe0e5A07UiZ19fQy3JPvvoLRdjmnKbUh3VsEUUh8MyytFcFRguaeiidAYA== + dependencies: + "@graphql-tools/utils" "^8.5.2" + "@n1ru4l/graphql-live-query" "0.10.0" + "@repeaterjs/repeater" "^3.0.4" + + "@peculiar/asn1-schema@^2.1.6", "@peculiar/asn1-schema@^2.3.0": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.3.3.tgz#21418e1f3819e0b353ceff0c2dad8ccb61acd777" + integrity sha512-6GptMYDMyWBHTUKndHaDsRZUO/XMSgIns2krxcm2L7SEExRHwawFvSwNBhqNPR9HJwv3MruAiF1bhN0we6j6GQ== + dependencies: + asn1js "^3.0.5" + pvtsutils "^1.3.2" + tslib "^2.4.0" + + "@peculiar/json-schema@^1.1.12": + version "1.1.12" + resolved "https://registry.yarnpkg.com/@peculiar/json-schema/-/json-schema-1.1.12.tgz#fe61e85259e3b5ba5ad566cb62ca75b3d3cd5339" + integrity sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w== + dependencies: + tslib "^2.0.0" + + "@peculiar/webcrypto@^1.4.0": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@peculiar/webcrypto/-/webcrypto-1.4.1.tgz#821493bd5ad0f05939bd5f53b28536f68158360a" + integrity sha512-eK4C6WTNYxoI7JOabMoZICiyqRRtJB220bh0Mbj5RwRycleZf9BPyZoxsTvpP0FpmVS2aS13NKOuh5/tN3sIRw== + dependencies: + "@peculiar/asn1-schema" "^2.3.0" + "@peculiar/json-schema" "^1.1.12" + pvtsutils "^1.3.2" + tslib "^2.4.1" + webcrypto-core "^1.7.4" + + "@repeaterjs/repeater@3.0.4", "@repeaterjs/repeater@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@repeaterjs/repeater/-/repeater-3.0.4.tgz#a04d63f4d1bf5540a41b01a921c9a7fddc3bd1ca" + integrity sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA== + + "@urql/core@^1.16.2": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@urql/core/-/core-1.16.2.tgz#e404b7f66c163245f44e7ef3c736707b7fb20234" + integrity sha512-Be2ekFcRovpLx6EKu/w7M3jJdC32Ev3eXJgXcJD7pVDgjv/RfUbYC4tGU87VrvQDJOg+t4gHFtIR6Vr9ws7mbg== + dependencies: + "@graphql-typed-document-node/core" "^3.1.0" + wonka "^4.0.14" + + "@whatwg-node/events@0.0.2", "@whatwg-node/events@^0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@whatwg-node/events/-/events-0.0.2.tgz#7b7107268d2982fc7b7aff5ee6803c64018f84dd" + integrity sha512-WKj/lI4QjnLuPrim0cfO7i+HsDSXHxNv1y0CrJhdntuO3hxWZmnXCwNDnwOvry11OjRin6cgWNF+j/9Pn8TN4w== + + "@whatwg-node/fetch@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@whatwg-node/fetch/-/fetch-0.8.1.tgz#ee3c94746132f217e17f78f9e073bb342043d630" + integrity sha512-Fkd1qQHK2tAWxKlC85h9L86Lgbq3BzxMnHSnTsnzNZMMzn6Xi+HlN8/LJ90LxorhSqD54td+Q864LgwUaYDj1Q== + dependencies: + "@peculiar/webcrypto" "^1.4.0" + "@whatwg-node/node-fetch" "^0.3.0" + busboy "^1.6.0" + urlpattern-polyfill "^6.0.2" + web-streams-polyfill "^3.2.1" + + "@whatwg-node/node-fetch@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@whatwg-node/node-fetch/-/node-fetch-0.3.0.tgz#7c7e90d03fa09d0ddebff29add6f16d923327d58" + integrity sha512-mPM8WnuHiI/3kFxDeE0SQQXAElbz4onqmm64fEGCwYEcBes2UsvIDI8HwQIqaXCH42A9ajJUPv4WsYoN/9oG6w== + dependencies: + "@whatwg-node/events" "^0.0.2" + busboy "^1.6.0" + fast-querystring "^1.1.1" + fast-url-parser "^1.1.3" + tslib "^2.3.1" + + "@whatwg-node/server@^0.6.7": + version "0.6.7" + resolved "https://registry.yarnpkg.com/@whatwg-node/server/-/server-0.6.7.tgz#14f5d0aca49308759d64fc7faa3cbfc20162a1ee" + integrity sha512-M4zHWdJ6M1IdcxnZBdDmiUh1bHQ4gPYRxzkH0gh8Qf6MpWJmX6I/MNftqem3GNn+qn1y47qqlGSed7T7nzsRFw== + dependencies: + "@whatwg-node/fetch" "^0.8.1" + tslib "^2.3.1" + + asn1js@^3.0.1, asn1js@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.5.tgz#5ea36820443dbefb51cc7f88a2ebb5b462114f38" + integrity sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ== + dependencies: + pvtsutils "^1.3.2" + pvutils "^1.1.3" + tslib "^2.4.0" + + braces@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + + busboy@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + + dset@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/dset/-/dset-3.1.2.tgz#89c436ca6450398396dc6538ea00abc0c54cd45a" + integrity sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q== + + fast-decode-uri-component@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz#46f8b6c22b30ff7a81357d4f59abfae938202543" + integrity sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg== + + fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + + fast-querystring@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fast-querystring/-/fast-querystring-1.1.1.tgz#f4c56ef56b1a954880cfd8c01b83f9e1a3d3fda2" + integrity sha512-qR2r+e3HvhEFmpdHMv//U8FnFlnYjaC6QKDuaXALDkw2kvHO8WDjxH+f/rHGR4Me4pnk8p9JAkRNTjYHAKRn2Q== + dependencies: + fast-decode-uri-component "^1.0.1" + + fast-url-parser@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" + integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== + dependencies: + punycode "^1.3.2" + + fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + + graphql-yoga@3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/graphql-yoga/-/graphql-yoga-3.6.0.tgz#b77df99670d0244f5969f684e6fa819fa5a625f1" + integrity sha512-CY4k6/+EPwy/QXfMMkjdcHaUhWEUm7Djd+UxIoY6aJDGfxLF9D3OpBeD7pyxV4pvlRrxp9MEGKZ6kN6LTiVJ/A== + dependencies: + "@envelop/core" "^3.0.4" + "@envelop/validation-cache" "^5.0.5" + "@graphql-tools/executor" "^0.0.14" + "@graphql-tools/schema" "^9.0.0" + "@graphql-tools/utils" "^9.2.1" + "@graphql-yoga/subscription" "^3.1.0" + "@whatwg-node/fetch" "^0.8.1" + "@whatwg-node/server" "^0.6.7" + dset "^3.1.1" + lru-cache "^7.14.1" + tslib "^2.3.1" + + graphql@16.6.0: + version "16.6.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.6.0.tgz#c2dcffa4649db149f6282af726c8c83f1c7c5fdb" + integrity sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw== + + is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + + js-sha1@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/js-sha1/-/js-sha1-0.6.0.tgz#adbee10f0e8e18aa07cdea807cf08e9183dbc7f9" + integrity sha512-01gwBFreYydzmU9BmZxpVk6svJJHrVxEN3IOiGl6VO93bVKYETJ0sIth6DASI6mIFdt7NmfX9UiByRzsYHGU9w== + + lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + + lru-cache@^7.14.1: + version "7.14.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.14.1.tgz#8da8d2f5f59827edb388e63e459ac23d6d408fea" + integrity sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA== + + punycode@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + + pvtsutils@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.2.tgz#9f8570d132cdd3c27ab7d51a2799239bf8d8d5de" + integrity sha512-+Ipe2iNUyrZz+8K/2IOo+kKikdtfhRKzNpQbruF2URmqPtoqAs8g3xS7TJvFF2GcPXjh7DkqMnpVveRFq4PgEQ== + dependencies: + tslib "^2.4.0" + + pvutils@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.3.tgz#f35fc1d27e7cd3dfbd39c0826d173e806a03f5a3" + integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ== + + streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + + to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + + tslib@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + + tslib@^2.0.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.4.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + + urlpattern-polyfill@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-6.0.2.tgz#a193fe773459865a2a5c93b246bb794b13d07256" + integrity sha512-5vZjFlH9ofROmuWmXM9yj2wljYKgWstGwe8YTyiqM7hVum/g9LyCizPZtb3UqsuppVwety9QJmfc42VggLpTgg== + dependencies: + braces "^3.0.2" + + value-or-promise@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.12.tgz#0e5abfeec70148c78460a849f6b003ea7986f15c" + integrity sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q== + + web-streams-polyfill@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" + integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== + + webcrypto-core@^1.7.4: + version "1.7.6" + resolved "https://registry.yarnpkg.com/webcrypto-core/-/webcrypto-core-1.7.6.tgz#e32c4a12a13de4251f8f9ef336a6cba7cdec9b55" + integrity sha512-TBPiewB4Buw+HI3EQW+Bexm19/W4cP/qZG/02QJCXN+iN+T5sl074vZ3rJcle/ZtDBQSgjkbsQO/1eFcxnSBUA== + dependencies: + "@peculiar/asn1-schema" "^2.1.6" + "@peculiar/json-schema" "^1.1.12" + asn1js "^3.0.1" + pvtsutils "^1.3.2" + tslib "^2.4.0" + + wonka@^4.0.14: + version "4.0.15" + resolved "https://registry.yarnpkg.com/wonka/-/wonka-4.0.15.tgz#9aa42046efa424565ab8f8f451fcca955bf80b89" + integrity sha512-U0IUQHKXXn6PFo9nqsHphVCE5m3IntqZNB9Jjn7EB1lrR7YTDY3YWgFvEvwniTzXSvOH/XMzAZaIfJF/LvHYXg== + + yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== diff --git a/e2e/4-urql-live-query/yarn.lock b/e2e/4-urql-live-query/yarn.lock new file mode 100644 index 00000000..3ff42664 --- /dev/null +++ b/e2e/4-urql-live-query/yarn.lock @@ -0,0 +1,430 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@envelop/core@^3.0.4": + "integrity" "sha512-AybIZxQsDlFQTWHy6YtX/MSQPVuw+eOFtTW90JsHn6EbmcQnD6N3edQfSiTGjggPRHLoC0+0cuYXp2Ly2r3vrQ==" + "resolved" "https://registry.npmjs.org/@envelop/core/-/core-3.0.4.tgz" + "version" "3.0.4" + dependencies: + "@envelop/types" "3.0.1" + "tslib" "2.4.0" + +"@envelop/live-query@5.0.4": + "integrity" "sha512-wqw5PY91LZ3dpamIpYgqNSL5n5zyUivfjOH2SPOvi7gwa4YHASEA9XE2aCNQ9l69EaaDDPLySpyBIfZQ8TIKwg==" + "resolved" "https://registry.npmjs.org/@envelop/live-query/-/live-query-5.0.4.tgz" + "version" "5.0.4" + dependencies: + "@graphql-tools/utils" "^8.8.0" + "@n1ru4l/graphql-live-query" "^0.10.0" + "@n1ru4l/graphql-live-query-patch" "^0.7.0" + "@n1ru4l/in-memory-live-query-store" "^0.10.0" + "tslib" "^2.4.0" + +"@envelop/types@3.0.1": + "integrity" "sha512-Ok62K1K+rlS+wQw77k8Pis8+1/h7+/9Wk5Fgcc2U6M5haEWsLFAHcHsk8rYlnJdEUl2Y3yJcCSOYbt1dyTaU5w==" + "resolved" "https://registry.npmjs.org/@envelop/types/-/types-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "tslib" "^2.4.0" + +"@envelop/validation-cache@^5.0.5": + "integrity" "sha512-X0hr7lcT9Ye4Sm43JPaSawmhFl5Uf67z8OEIyphWY4DUNRlY6VClQZRMGP+8iAo9EFcRspvmszBI8b/65JwHaA==" + "resolved" "https://registry.npmjs.org/@envelop/validation-cache/-/validation-cache-5.1.0.tgz" + "version" "5.1.0" + dependencies: + "fast-json-stable-stringify" "^2.1.0" + "js-sha1" "^0.6.0" + "lru-cache" "^6.0.0" + "tslib" "^2.4.0" + +"@graphql-tools/executor@^0.0.14": + "integrity" "sha512-YiBbN9NT0FgqPJ35+Eg0ty1s5scOZTgiPf+6hLVJBd5zHEURwojEMCTKJ9e0RNZHETp2lN+YaTFGTSoRk0t4Sw==" + "resolved" "https://registry.npmjs.org/@graphql-tools/executor/-/executor-0.0.14.tgz" + "version" "0.0.14" + dependencies: + "@graphql-tools/utils" "9.2.1" + "@graphql-typed-document-node/core" "3.1.1" + "@repeaterjs/repeater" "3.0.4" + "tslib" "^2.4.0" + "value-or-promise" "1.0.12" + +"@graphql-tools/merge@8.3.18": + "integrity" "sha512-R8nBglvRWPAyLpZL/f3lxsY7wjnAeE0l056zHhcO/CgpvK76KYUt9oEkR05i8Hmt8DLRycBN0FiotJ0yDQWTVA==" + "resolved" "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.3.18.tgz" + "version" "8.3.18" + dependencies: + "@graphql-tools/utils" "9.2.1" + "tslib" "^2.4.0" + +"@graphql-tools/schema@^9.0.0": + "integrity" "sha512-kF+tbYPPf/6K2aHG3e1SWIbapDLQaqnIHVRG6ow3onkFoowwtKszvUyOASL6Krcv2x9bIMvd1UkvRf9OaoROQQ==" + "resolved" "https://registry.npmjs.org/@graphql-tools/schema/-/schema-9.0.16.tgz" + "version" "9.0.16" + dependencies: + "@graphql-tools/merge" "8.3.18" + "@graphql-tools/utils" "9.2.1" + "tslib" "^2.4.0" + "value-or-promise" "1.0.12" + +"@graphql-tools/utils@^8.5.2": + "integrity" "sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw==" + "resolved" "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.13.1.tgz" + "version" "8.13.1" + dependencies: + "tslib" "^2.4.0" + +"@graphql-tools/utils@^8.8.0": + "integrity" "sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw==" + "resolved" "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.13.1.tgz" + "version" "8.13.1" + dependencies: + "tslib" "^2.4.0" + +"@graphql-tools/utils@^9.2.1", "@graphql-tools/utils@9.2.1": + "integrity" "sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==" + "resolved" "https://registry.npmjs.org/@graphql-tools/utils/-/utils-9.2.1.tgz" + "version" "9.2.1" + dependencies: + "@graphql-typed-document-node/core" "^3.1.1" + "tslib" "^2.4.0" + +"@graphql-typed-document-node/core@^3.1.1", "@graphql-typed-document-node/core@3.1.1": + "integrity" "sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg==" + "resolved" "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.1.tgz" + "version" "3.1.1" + +"@graphql-yoga/plugin-graphql-sse@^1.2.0": + "integrity" "sha512-yMTHWTvPda6K5IAxvDjC5jsnpzTxJ8p+MSuCDRgSBGj538cuTufRtiBA8wZNuhIM2kQMkVR/GZF5wxAB8om6EA==" + "resolved" "https://registry.npmjs.org/@graphql-yoga/plugin-graphql-sse/-/plugin-graphql-sse-1.2.0.tgz" + "version" "1.2.0" + dependencies: + "graphql-sse" "^2.0.0" + +"@graphql-yoga/subscription@^3.1.0": + "integrity" "sha512-Vc9lh8KzIHyS3n4jBlCbz7zCjcbtQnOBpsymcRvHhFr2cuH+knmRn0EmzimMQ58jQ8kxoRXXC3KJS3RIxSdPIg==" + "resolved" "https://registry.npmjs.org/@graphql-yoga/subscription/-/subscription-3.1.0.tgz" + "version" "3.1.0" + dependencies: + "@graphql-yoga/typed-event-target" "^1.0.0" + "@repeaterjs/repeater" "^3.0.4" + "@whatwg-node/events" "0.0.2" + "tslib" "^2.3.1" + +"@graphql-yoga/typed-event-target@^1.0.0": + "integrity" "sha512-Mqni6AEvl3VbpMtKw+TIjc9qS9a8hKhiAjFtqX488yq5oJtj9TkNlFTIacAVS3vnPiswNsmDiQqvwUOcJgi1DA==" + "resolved" "https://registry.npmjs.org/@graphql-yoga/typed-event-target/-/typed-event-target-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "@repeaterjs/repeater" "^3.0.4" + "tslib" "^2.3.1" + +"@n1ru4l/graphql-live-query-patch-jsondiffpatch@^0.8.0": + "integrity" "sha512-m5OPdEhBbqQ+pkFz2dQmPl10JW/RB1Qc2zoVn9QTEXvyeSzQmrl+qNtn3nvv87P9rQDiRD/JWlD86BFX0XloBg==" + "resolved" "https://registry.npmjs.org/@n1ru4l/graphql-live-query-patch-jsondiffpatch/-/graphql-live-query-patch-jsondiffpatch-0.8.0.tgz" + "version" "0.8.0" + dependencies: + "@n1ru4l/graphql-live-query-patch" "^0.7.0" + "@n1ru4l/json-patch-plus" "^0.2.0" + +"@n1ru4l/graphql-live-query-patch@^0.7.0": + "integrity" "sha512-1q49iNxqEIbmUp+qFAEVEn4ts344Cw72g5OtAuFeTwKtJT3V91kTPGMcRk5Pxb5FPHbvn52q+PCVKOAyVrtPwQ==" + "resolved" "https://registry.npmjs.org/@n1ru4l/graphql-live-query-patch/-/graphql-live-query-patch-0.7.0.tgz" + "version" "0.7.0" + dependencies: + "@repeaterjs/repeater" "^3.0.4" + +"@n1ru4l/graphql-live-query@^0.10.0", "@n1ru4l/graphql-live-query@0.10.0": + "integrity" "sha512-qZ7OHH/NB0NcG/Xa7irzgjE63UH0CkofZT0Bw4Ko6iRFagPRHBM8RgFXwTt/6JbFGIEUS4STRtaFoc/Eq/ZtzQ==" + "resolved" "https://registry.npmjs.org/@n1ru4l/graphql-live-query/-/graphql-live-query-0.10.0.tgz" + "version" "0.10.0" + +"@n1ru4l/in-memory-live-query-store@^0.10.0", "@n1ru4l/in-memory-live-query-store@0.10.0": + "integrity" "sha512-pt7bZgTPz9dk7ceoOp76KIbVFFlAPe0e5A07UiZ19fQy3JPvvoLRdjmnKbUh3VsEUUh8MyytFcFRguaeiidAYA==" + "resolved" "https://registry.npmjs.org/@n1ru4l/in-memory-live-query-store/-/in-memory-live-query-store-0.10.0.tgz" + "version" "0.10.0" + dependencies: + "@graphql-tools/utils" "^8.5.2" + "@n1ru4l/graphql-live-query" "0.10.0" + "@repeaterjs/repeater" "^3.0.4" + +"@n1ru4l/json-patch-plus@^0.2.0": + "integrity" "sha512-pLkJy83/rVfDTyQgDSC8GeXAHEdXNHGNJrB1b7wAyGQu0iv7tpMXntKVSqj0+XKNVQbco40SZffNfVALzIt0SQ==" + "resolved" "https://registry.npmjs.org/@n1ru4l/json-patch-plus/-/json-patch-plus-0.2.0.tgz" + "version" "0.2.0" + +"@peculiar/asn1-schema@^2.1.6", "@peculiar/asn1-schema@^2.3.0": + "integrity" "sha512-6GptMYDMyWBHTUKndHaDsRZUO/XMSgIns2krxcm2L7SEExRHwawFvSwNBhqNPR9HJwv3MruAiF1bhN0we6j6GQ==" + "resolved" "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.3.tgz" + "version" "2.3.3" + dependencies: + "asn1js" "^3.0.5" + "pvtsutils" "^1.3.2" + "tslib" "^2.4.0" + +"@peculiar/json-schema@^1.1.12": + "integrity" "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==" + "resolved" "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz" + "version" "1.1.12" + dependencies: + "tslib" "^2.0.0" + +"@peculiar/webcrypto@^1.4.0": + "integrity" "sha512-eK4C6WTNYxoI7JOabMoZICiyqRRtJB220bh0Mbj5RwRycleZf9BPyZoxsTvpP0FpmVS2aS13NKOuh5/tN3sIRw==" + "resolved" "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.4.1.tgz" + "version" "1.4.1" + dependencies: + "@peculiar/asn1-schema" "^2.3.0" + "@peculiar/json-schema" "^1.1.12" + "pvtsutils" "^1.3.2" + "tslib" "^2.4.1" + "webcrypto-core" "^1.7.4" + +"@repeaterjs/repeater@^3.0.4", "@repeaterjs/repeater@3.0.4": + "integrity" "sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA==" + "resolved" "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.4.tgz" + "version" "3.0.4" + +"@types/node@^18.0.6": + "integrity" "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==" + "resolved" "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz" + "version" "18.13.0" + +"@urql/core@^3.1.1", "@urql/core@>= 1.14.0": + "integrity" "sha512-Mnxtq4I4QeFJsgs7Iytw+HyhiGxISR6qtyk66c9tipozLZ6QVxrCiUPF2HY4BxNIabaxcp+rivadvm8NAnXj4Q==" + "resolved" "https://registry.npmjs.org/@urql/core/-/core-3.1.1.tgz" + "version" "3.1.1" + dependencies: + "wonka" "^6.1.2" + +"@urql/devtools@^2.0.3": + "integrity" "sha512-TktPLiBS9LcBPHD6qcnb8wqOVcg3Bx0iCtvQ80uPpfofwwBGJmqnQTjUdEFU6kwaLOFZULQ9+Uo4831G823mQw==" + "resolved" "https://registry.npmjs.org/@urql/devtools/-/devtools-2.0.3.tgz" + "version" "2.0.3" + dependencies: + "wonka" ">= 4.0.9" + +"@whatwg-node/events@^0.0.2", "@whatwg-node/events@0.0.2": + "integrity" "sha512-WKj/lI4QjnLuPrim0cfO7i+HsDSXHxNv1y0CrJhdntuO3hxWZmnXCwNDnwOvry11OjRin6cgWNF+j/9Pn8TN4w==" + "resolved" "https://registry.npmjs.org/@whatwg-node/events/-/events-0.0.2.tgz" + "version" "0.0.2" + +"@whatwg-node/fetch@^0.8.1": + "integrity" "sha512-Fkd1qQHK2tAWxKlC85h9L86Lgbq3BzxMnHSnTsnzNZMMzn6Xi+HlN8/LJ90LxorhSqD54td+Q864LgwUaYDj1Q==" + "resolved" "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.8.1.tgz" + "version" "0.8.1" + dependencies: + "@peculiar/webcrypto" "^1.4.0" + "@whatwg-node/node-fetch" "^0.3.0" + "busboy" "^1.6.0" + "urlpattern-polyfill" "^6.0.2" + "web-streams-polyfill" "^3.2.1" + +"@whatwg-node/node-fetch@^0.3.0": + "integrity" "sha512-mPM8WnuHiI/3kFxDeE0SQQXAElbz4onqmm64fEGCwYEcBes2UsvIDI8HwQIqaXCH42A9ajJUPv4WsYoN/9oG6w==" + "resolved" "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.3.0.tgz" + "version" "0.3.0" + dependencies: + "@whatwg-node/events" "^0.0.2" + "busboy" "^1.6.0" + "fast-querystring" "^1.1.1" + "fast-url-parser" "^1.1.3" + "tslib" "^2.3.1" + +"@whatwg-node/server@^0.6.7": + "integrity" "sha512-M4zHWdJ6M1IdcxnZBdDmiUh1bHQ4gPYRxzkH0gh8Qf6MpWJmX6I/MNftqem3GNn+qn1y47qqlGSed7T7nzsRFw==" + "resolved" "https://registry.npmjs.org/@whatwg-node/server/-/server-0.6.7.tgz" + "version" "0.6.7" + dependencies: + "@whatwg-node/fetch" "^0.8.1" + "tslib" "^2.3.1" + +"asn1js@^3.0.1", "asn1js@^3.0.5": + "integrity" "sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==" + "resolved" "https://registry.npmjs.org/asn1js/-/asn1js-3.0.5.tgz" + "version" "3.0.5" + dependencies: + "pvtsutils" "^1.3.2" + "pvutils" "^1.1.3" + "tslib" "^2.4.0" + +"braces@^3.0.2": + "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==" + "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + "version" "3.0.2" + dependencies: + "fill-range" "^7.0.1" + +"busboy@^1.6.0": + "integrity" "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==" + "resolved" "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" + "version" "1.6.0" + dependencies: + "streamsearch" "^1.1.0" + +"dset@^3.1.1": + "integrity" "sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q==" + "resolved" "https://registry.npmjs.org/dset/-/dset-3.1.2.tgz" + "version" "3.1.2" + +"eventsource@^2.0.2": + "integrity" "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==" + "resolved" "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz" + "version" "2.0.2" + +"fast-decode-uri-component@^1.0.1": + "integrity" "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==" + "resolved" "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz" + "version" "1.0.1" + +"fast-json-stable-stringify@^2.1.0": + "integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "resolved" "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + "version" "2.1.0" + +"fast-querystring@^1.1.1": + "integrity" "sha512-qR2r+e3HvhEFmpdHMv//U8FnFlnYjaC6QKDuaXALDkw2kvHO8WDjxH+f/rHGR4Me4pnk8p9JAkRNTjYHAKRn2Q==" + "resolved" "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.1.tgz" + "version" "1.1.1" + dependencies: + "fast-decode-uri-component" "^1.0.1" + +"fast-url-parser@^1.1.3": + "integrity" "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==" + "resolved" "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz" + "version" "1.1.3" + dependencies: + "punycode" "^1.3.2" + +"fill-range@^7.0.1": + "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==" + "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + "version" "7.0.1" + dependencies: + "to-regex-range" "^5.0.1" + +"graphql-sse@^2.0.0": + "integrity" "sha512-TTdFwxGM9RY68s22XWyhc+SyQn3PLbELDD2So0K6Cc6EIlBAyPuNV8VlPfNKa/la7gEf2SwHY7JoJplOmOY4LA==" + "resolved" "https://registry.npmjs.org/graphql-sse/-/graphql-sse-2.0.0.tgz" + "version" "2.0.0" + +"graphql-yoga@^3.6.0", "graphql-yoga@3.6.0": + "integrity" "sha512-CY4k6/+EPwy/QXfMMkjdcHaUhWEUm7Djd+UxIoY6aJDGfxLF9D3OpBeD7pyxV4pvlRrxp9MEGKZ6kN6LTiVJ/A==" + "resolved" "https://registry.npmjs.org/graphql-yoga/-/graphql-yoga-3.6.0.tgz" + "version" "3.6.0" + dependencies: + "@envelop/core" "^3.0.4" + "@envelop/validation-cache" "^5.0.5" + "@graphql-tools/executor" "^0.0.14" + "@graphql-tools/schema" "^9.0.0" + "@graphql-tools/utils" "^9.2.1" + "@graphql-yoga/subscription" "^3.1.0" + "@whatwg-node/fetch" "^0.8.1" + "@whatwg-node/server" "^0.6.7" + "dset" "^3.1.1" + "lru-cache" "^7.14.1" + "tslib" "^2.3.1" + +"graphql@^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "graphql@^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "graphql@^14.0.0 || ^15.0.0 || ^16.0.0", "graphql@^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0", "graphql@^15.2.0 || ^16.0.0", "graphql@^15.4.0 || ^16.0.0", "graphql@>= 0.11.0", "graphql@>=0.11 <=16", "graphql@16.6.0": + "integrity" "sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==" + "resolved" "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz" + "version" "16.6.0" + +"is-number@^7.0.0": + "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + "version" "7.0.0" + +"js-sha1@^0.6.0": + "integrity" "sha512-01gwBFreYydzmU9BmZxpVk6svJJHrVxEN3IOiGl6VO93bVKYETJ0sIth6DASI6mIFdt7NmfX9UiByRzsYHGU9w==" + "resolved" "https://registry.npmjs.org/js-sha1/-/js-sha1-0.6.0.tgz" + "version" "0.6.0" + +"lru-cache@^6.0.0": + "integrity" "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" + "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + "version" "6.0.0" + dependencies: + "yallist" "^4.0.0" + +"lru-cache@^7.14.1": + "integrity" "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==" + "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz" + "version" "7.14.1" + +"punycode@^1.3.2": + "integrity" "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + "resolved" "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" + "version" "1.4.1" + +"pvtsutils@^1.3.2": + "integrity" "sha512-+Ipe2iNUyrZz+8K/2IOo+kKikdtfhRKzNpQbruF2URmqPtoqAs8g3xS7TJvFF2GcPXjh7DkqMnpVveRFq4PgEQ==" + "resolved" "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.2.tgz" + "version" "1.3.2" + dependencies: + "tslib" "^2.4.0" + +"pvutils@^1.1.3": + "integrity" "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==" + "resolved" "https://registry.npmjs.org/pvutils/-/pvutils-1.1.3.tgz" + "version" "1.1.3" + +"streamsearch@^1.1.0": + "integrity" "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + "resolved" "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" + "version" "1.1.0" + +"to-regex-range@^5.0.1": + "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" + "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + "version" "5.0.1" + dependencies: + "is-number" "^7.0.0" + +"tslib@^2.0.0", "tslib@^2.3.1", "tslib@^2.4.0", "tslib@2.4.0": + "integrity" "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "resolved" "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" + "version" "2.4.0" + +"tslib@^2.4.1": + "integrity" "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "resolved" "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" + "version" "2.5.0" + +"urlpattern-polyfill@^6.0.2": + "integrity" "sha512-5vZjFlH9ofROmuWmXM9yj2wljYKgWstGwe8YTyiqM7hVum/g9LyCizPZtb3UqsuppVwety9QJmfc42VggLpTgg==" + "resolved" "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-6.0.2.tgz" + "version" "6.0.2" + dependencies: + "braces" "^3.0.2" + +"value-or-promise@1.0.12": + "integrity" "sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==" + "resolved" "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.12.tgz" + "version" "1.0.12" + +"web-streams-polyfill@^3.2.1": + "integrity" "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==" + "resolved" "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz" + "version" "3.2.1" + +"webcrypto-core@^1.7.4": + "integrity" "sha512-TBPiewB4Buw+HI3EQW+Bexm19/W4cP/qZG/02QJCXN+iN+T5sl074vZ3rJcle/ZtDBQSgjkbsQO/1eFcxnSBUA==" + "resolved" "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.7.6.tgz" + "version" "1.7.6" + dependencies: + "@peculiar/asn1-schema" "^2.1.6" + "@peculiar/json-schema" "^1.1.12" + "asn1js" "^3.0.1" + "pvtsutils" "^1.3.2" + "tslib" "^2.4.0" + +"wonka@^6.1.2", "wonka@>= 4.0.9": + "integrity" "sha512-EFOYiqDeYLXSzGYt2X3aVe9Hq1XJG+Hz/HjTRRT4dZE9q95khHl5+7pzUSXI19dbMO1/2UMrTf7JT7/7JrSQSQ==" + "resolved" "https://registry.npmjs.org/wonka/-/wonka-6.2.3.tgz" + "version" "6.2.3" + +"yallist@^4.0.0": + "integrity" "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "resolved" "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + "version" "4.0.0" diff --git a/src/GraphQL/Client/BaseClients/Urql.js b/src/GraphQL/Client/BaseClients/Urql.js index 8294e754..fed5bda3 100644 --- a/src/GraphQL/Client/BaseClients/Urql.js +++ b/src/GraphQL/Client/BaseClients/Urql.js @@ -1,6 +1,53 @@ import 'isomorphic-unfetch'; -import { createClient, defaultExchanges, subscriptionExchange } from '@urql/core'; -import {createClient as createWsClient} from 'graphql-ws'; +import { createClient as createWsClient } from 'graphql-ws'; +import { subscribe, pipe, filter, tap } from 'wonka' + +import { + Client, + subscriptionExchange, + fetchExchange, + cacheExchange, + dedupExchange, +} from "@urql/core"; + +import { getOperationAST } from "graphql"; +import { isLiveQueryOperationDefinitionNode } from "@n1ru4l/graphql-live-query"; +import { Repeater } from "@repeaterjs/repeater"; + +import { applyLiveQueryJSONDiffPatch } from "@n1ru4l/graphql-live-query-patch-jsondiffpatch"; +import { + applyAsyncIterableIteratorToSink, +} from "@n1ru4l/push-pull-async-iterable-iterator"; + +import EventSource from 'eventsource' + +function applySourceToSink( + source, + sink +) { + return applyAsyncIterableIteratorToSink( + applyLiveQueryJSONDiffPatch(source), + sink + ); +} + +function makeEventStreamSource(url) { + return new Repeater(async (push, end) => { + const eventsource = new EventSource(url); + eventsource.onmessage = function (event) { + const data = JSON.parse(event.data); + push(data); + if (eventsource.readyState === 2) { + end(); + } + }; + eventsource.onerror = function (error) { + end(error); + }; + await end; + eventsource.close(); + }); +} const createClient_ = function (opts) { @@ -60,6 +107,53 @@ export function createSubscriptionClientImpl (opts) { } } +export function createLiveQueryClientImpl (opts) { + return function () { + return new Client({ + url: opts.url, + exchanges: [ + cacheExchange, + dedupExchange, + subscriptionExchange({ + isSubscriptionOperation: ({ query, variables }) => { + const definition = getOperationAST(query); + const isSubscription = + definition?.kind === "OperationDefinition" && + definition.operation === "subscription"; + + const isLiveQuery = + !!definition && + isLiveQueryOperationDefinitionNode(definition, variables); + + return isSubscription || isLiveQuery; + }, + forwardSubscription(operation) { + const targetUrl = new URL(opts.url); + targetUrl.searchParams.append("query", operation.query); + if (operation.variables) { + targetUrl.searchParams.append( + "variables", + JSON.stringify(operation.variables) + ); + } + + return { + subscribe: (sink) => ({ + unsubscribe: applySourceToSink( + makeEventStreamSource(targetUrl.toString()), + sink + ), + }), + }; + }, + enableAllOperations: true, + }), + fetchExchange, + ], + }); + } +} + export function queryImpl (client) { return function (query) { return function (variables) { @@ -104,7 +198,6 @@ export function mutationImpl (client) { } export function subscriptionImpl (client) { - const { subscribe, pipe } = require('wonka') return function (query) { return function (variables) { @@ -122,3 +215,21 @@ export function subscriptionImpl (client) { } } } + +export function liveQueryImpl (client) { + return function (query) { + return function (variables) { + return function (callback) { + return function () { + const { unsubscribe } = pipe( + client.query(query, variables), + subscribe(function (value) { + callback(value)() + }) + ) + return unsubscribe + } + } + } + } +} diff --git a/src/GraphQL/Client/BaseClients/Urql.purs b/src/GraphQL/Client/BaseClients/Urql.purs index 416db276..8dca5e19 100644 --- a/src/GraphQL/Client/BaseClients/Urql.purs +++ b/src/GraphQL/Client/BaseClients/Urql.purs @@ -4,9 +4,11 @@ module GraphQL.Client.BaseClients.Urql , UrqlSubClientOptions , UrqlClient , UrqlSubClient + , UrqlLiveQueryClient , createClient , createGlobalClientUnsafe , createSubscriptionClient + , createLiveQueryClient ) where import Prelude @@ -21,7 +23,7 @@ import Effect.Aff.Compat (EffectFnAff, fromEffectFnAff) import Foreign (Foreign, unsafeToForeign) import Foreign.Object (Object) import Foreign.Object as Object -import GraphQL.Client.Types (class QueryClient, class SubscriptionClient, Client(..)) +import GraphQL.Client.Types (class QueryClient, class SubscriptionClient, class LiveQueryClient, Client(..)) type UrqlClientOptions = { url :: URL @@ -45,6 +47,14 @@ foreign import data UrqlClient :: Type -- | See https://github.com/enisdenjo/graphql-ws details foreign import data UrqlSubClient :: Type +-- | A client to make graphQL live queries, mutations and subscriptions. +-- | Requires an SSE capable graphQL server like GraphQL Helix or Yoga +-- | or Mesh with the https://the-guild.dev/graphql/mesh/docs/plugins/live-queries plugin . +-- | From the `@grafbase/url-exchange` npm module +-- | Could be extended to provide more transports. +-- | See https://github.com/n1ru4l/graphql-live-query#list-of-compatible-transportsservers details +foreign import data UrqlLiveQueryClient :: Type + createClient :: forall directives querySchema mutationSchema subscriptionSchema. UrqlClientOptions -> Effect (Client UrqlClient directives querySchema mutationSchema subscriptionSchema) @@ -61,6 +71,13 @@ createSubscriptionClient :: Effect (Client UrqlSubClient directives querySchema mutationSchema subscriptionSchema) createSubscriptionClient = clientOptsToForeign >>> createSubscriptionClientImpl >>> map Client +createLiveQueryClient :: + forall directives querySchema mutationSchema subscriptionSchema. + UrqlClientOptions -> + Effect (Client UrqlLiveQueryClient directives querySchema mutationSchema subscriptionSchema) +createLiveQueryClient = clientOptsToForeign >>> createLiveQueryClientImpl >>> map Client + + clientOptsToForeign :: forall r. { headers :: Array RequestHeader @@ -93,6 +110,8 @@ foreign import createGlobalClientUnsafeImpl :: UrqlClientOptionsForeign -> Effec foreign import createSubscriptionClientImpl :: UrqlSubUrqlClientOptionsForeign -> Effect UrqlSubClient +foreign import createLiveQueryClientImpl :: UrqlClientOptionsForeign -> Effect UrqlLiveQueryClient + instance queryClient :: QueryClient UrqlClient Unit Unit where clientQuery _ c = queryForeign false c clientMutation _ c = queryForeign true c @@ -130,3 +149,13 @@ foreign import subscriptionImpl :: Json -> (Json -> Effect Unit) -> Effect (Effect Unit) + +instance liveQueryClient :: LiveQueryClient UrqlLiveQueryClient Unit where + clientLiveQuery _ = liveQueryImpl + defLiveOpts _ = unit +foreign import liveQueryImpl :: + UrqlLiveQueryClient -> + String -> + Json -> + (Json -> Effect Unit) -> + Effect (Effect Unit) diff --git a/src/GraphQL/Client/LiveQuery.purs b/src/GraphQL/Client/LiveQuery.purs new file mode 100644 index 00000000..1ac975ee --- /dev/null +++ b/src/GraphQL/Client/LiveQuery.purs @@ -0,0 +1,59 @@ +module GraphQL.Client.LiveQuery where + +import Prelude + +import Data.Argonaut.Core (Json) +import Data.Argonaut.Decode (class DecodeJson, JsonDecodeError, decodeJson) +import Data.Either (Either) +import GraphQL.Client.Operation (OpQuery) +import GraphQL.Client.Query (decodeGqlRes) +import GraphQL.Client.SafeQueryName (safeQueryName) +import GraphQL.Client.ToGqlString (toGqlQueryString) +import GraphQL.Client.Types (class GqlQuery, class LiveQueryClient, Client(..), liveQueryEventOpts) +import GraphQL.Client.Variables (getVarsJson) +import Halogen.Subscription (Emitter) + +liveQueryOpts :: + forall b a returns query schema client directives opts. + LiveQueryClient client opts => + GqlQuery directives OpQuery schema query returns => + DecodeJson returns => + (opts -> opts) -> Client client directives schema a b -> String -> query -> Emitter (Either JsonDecodeError returns) +liveQueryOpts = liveQueryOptsWithDecoder decodeJson + +liveQueryOptsWithDecoder :: + forall client directives opts schema query returns a b. + LiveQueryClient client opts => + GqlQuery directives OpQuery schema query returns => + (Json -> Either JsonDecodeError returns) -> + (opts -> opts) -> + (Client client directives schema a b) -> + String -> + query -> + Emitter (Either JsonDecodeError returns) +liveQueryOptsWithDecoder decodeFn optsF (Client client) queryNameUnsafe q = + liveQueryEventOpts optsF client query (getVarsJson q) + <#> decodeGqlRes decodeFn + where + queryName = safeQueryName queryNameUnsafe + + query = "query " <> queryName <> " " <> toGqlQueryString q + +liveQuery :: + forall b a returns query schema client directives opts. + LiveQueryClient client opts => + GqlQuery directives OpQuery schema query returns => + DecodeJson returns => + Client client directives schema a b -> String -> query -> Emitter (Either JsonDecodeError returns) +liveQuery = liveQueryWithDecoder decodeJson + +liveQueryWithDecoder :: + forall client directives opts schema query returns a b. + LiveQueryClient client opts => + GqlQuery directives OpQuery schema query returns => + (Json -> Either JsonDecodeError returns) -> + (Client client directives schema a b) -> + String -> + query -> + Emitter (Either JsonDecodeError returns) +liveQueryWithDecoder decodeFn = liveQueryOptsWithDecoder decodeFn identity diff --git a/src/GraphQL/Client/Types.purs b/src/GraphQL/Client/Types.purs index c9e9e482..13fdae9f 100644 --- a/src/GraphQL/Client/Types.purs +++ b/src/GraphQL/Client/Types.purs @@ -91,6 +91,30 @@ watchQueryEventOpts optsF client query vars = makeEmitter (clientWatchQuery (opt watchQueryEvent :: forall opts c. WatchQueryClient c opts => c -> String -> Json -> Emitter Json watchQueryEvent = watchQueryEventOpts identity +-- | A type class for making graphql live queries (observable queries). +-- | If you wish to use a different underlying client, +-- | you can create your own client, +-- | make it an instance of `LiveQueryClient` +-- | and pass it to `liveQuery` +-- | TODO: This is actually exactly like WatchQueryClient +-- | but given that the implementations of watch and live queries +-- | are different, they are separate for now. +class LiveQueryClient baseClient opts | baseClient -> opts where + clientLiveQuery :: + opts -> + baseClient -> + String -> + Json -> + (Json -> Effect Unit) -> + Effect (Effect Unit) + defLiveOpts :: baseClient -> opts + +liveQueryEventOpts :: forall opts c. LiveQueryClient c opts => (opts -> opts) -> c -> String -> Json -> Emitter Json +liveQueryEventOpts optsF client query vars = makeEmitter (clientLiveQuery (optsF (defLiveOpts client)) client query vars) + +liveQueryEvent :: forall opts c. LiveQueryClient c opts => c -> String -> Json -> Emitter Json +liveQueryEvent = liveQueryEventOpts identity + -- Full response types -- Full responses -- | The full graphql query response, From a96b433a286200fff5b14c3bf9df4ceb917ac0fe Mon Sep 17 00:00:00 2001 From: Jun Matsushita Date: Tue, 14 Feb 2023 17:17:40 +0300 Subject: [PATCH 2/2] Move query_ to BaseClient to avoid dependency creep --- CHANGELOG.md | 2 + e2e/3-comments/src/Main.purs | 2 +- examples/1-simple/src/Main.purs | 2 +- examples/10-aliases/src/Main.purs | 2 +- examples/11-unions/package-lock.json | 4 +- examples/11-unions/src/Main.purs | 2 +- examples/12-directives/package-lock.json | 20 ++--- examples/12-directives/package.json | 2 +- examples/12-directives/src/Main.purs | 2 +- examples/2-codegen/src/Main.purs | 2 +- examples/3-enums/src/Main.purs | 2 +- examples/8-custom-gql-types/src/Main.purs | 2 +- examples/9-variables/src/Main.purs | 2 +- package.json | 1 + .../Client/BaseClients/Affjax/Node.purs | 86 +++++++++++++++++-- src/GraphQL/Client/BaseClients/Urql.purs | 53 ++++++++++-- src/GraphQL/Client/Query.purs | 35 +------- 17 files changed, 152 insertions(+), 69 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..10c4e5db --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,2 @@ +## 10.0.0 + diff --git a/e2e/3-comments/src/Main.purs b/e2e/3-comments/src/Main.purs index 667d9442..7d0bd448 100644 --- a/e2e/3-comments/src/Main.purs +++ b/e2e/3-comments/src/Main.purs @@ -12,7 +12,7 @@ import Generated.Gql.Schema.Admin.Enum.Colour (Colour(..)) import Generated.Gql.Symbols (colour) import GraphQL.Client.Args ((=>>)) import GraphQL.Client.Operation (OpQuery) -import GraphQL.Client.Query (query_) +import GraphQL.Client.BaseClients.Affjax.Node (query_) import GraphQL.Client.Types (class GqlQuery) import Type.Data.List (Nil') import GraphQL.Client.Union (GqlUnion(..)) diff --git a/examples/1-simple/src/Main.purs b/examples/1-simple/src/Main.purs index e9eae2c9..1b803026 100644 --- a/examples/1-simple/src/Main.purs +++ b/examples/1-simple/src/Main.purs @@ -8,7 +8,7 @@ import Effect.Aff (Aff, launchAff_) import Effect.Class.Console (logShow) import GraphQL.Client.Args ((=>>)) import GraphQL.Client.Operation (OpQuery) -import GraphQL.Client.Query (query_) +import GraphQL.Client.BaseClients.Affjax.Node (query_) import GraphQL.Client.Types (class GqlQuery) import Type.Data.List (Nil') import Type.Proxy (Proxy(..)) diff --git a/examples/10-aliases/src/Main.purs b/examples/10-aliases/src/Main.purs index efbef040..54a54e45 100644 --- a/examples/10-aliases/src/Main.purs +++ b/examples/10-aliases/src/Main.purs @@ -11,7 +11,7 @@ import GraphQL.Client.Alias ((:)) import GraphQL.Client.Alias.Dynamic (Spread(..)) import GraphQL.Client.Args ((=>>)) import GraphQL.Client.Operation (OpQuery) -import GraphQL.Client.Query (query_) +import GraphQL.Client.BaseClients.Affjax.Node (query_) import GraphQL.Client.Types (class GqlQuery) import Type.Data.List (Nil') import Type.Proxy (Proxy(..)) diff --git a/examples/11-unions/package-lock.json b/examples/11-unions/package-lock.json index 180ebd79..8112b659 100644 --- a/examples/11-unions/package-lock.json +++ b/examples/11-unions/package-lock.json @@ -1,11 +1,11 @@ { - "name": "3-comments", + "name": "11-unions", "version": "1.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "3-comments", + "name": "11-unions", "version": "1.0.0", "license": "ISC", "dependencies": { diff --git a/examples/11-unions/src/Main.purs b/examples/11-unions/src/Main.purs index 461a66fe..d1cb38bd 100644 --- a/examples/11-unions/src/Main.purs +++ b/examples/11-unions/src/Main.purs @@ -9,7 +9,7 @@ import Effect.Aff (Aff, launchAff_) import Effect.Class.Console (logShow) import Generated.Gql.Schema.Admin (Query) import GraphQL.Client.Args ((=>>)) -import GraphQL.Client.Query (query_) +import GraphQL.Client.BaseClients.Affjax.Node (query_) import GraphQL.Client.Operation (OpQuery) import GraphQL.Client.Types (class GqlQuery) import GraphQL.Client.Union (GqlUnion(..)) diff --git a/examples/12-directives/package-lock.json b/examples/12-directives/package-lock.json index e8fcd0d5..3597ee63 100644 --- a/examples/12-directives/package-lock.json +++ b/examples/12-directives/package-lock.json @@ -1,17 +1,17 @@ { - "name": "11-directives", + "name": "12-directives", "version": "1.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "11-directives", + "name": "12-directives", "version": "1.0.0", "license": "ISC", "dependencies": { "express": "^4.17.1", "express-graphql": "^0.12.0", - "graphql": "^15.4.0", + "graphql": "16.6.0", "xhr2": "^0.2.0" }, "devDependencies": { @@ -295,11 +295,11 @@ } }, "node_modules/graphql": { - "version": "15.4.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.4.0.tgz", - "integrity": "sha512-EB3zgGchcabbsU9cFe1j+yxdzKQKAbGUWRb13DsrsMN1yyfmmIq+2+L5MqVWcDCE4V89R5AyUOi7sMOGxdsYtA==", + "version": "16.6.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz", + "integrity": "sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==", "engines": { - "node": ">= 10.x" + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } }, "node_modules/http-errors": { @@ -820,9 +820,9 @@ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, "graphql": { - "version": "15.4.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.4.0.tgz", - "integrity": "sha512-EB3zgGchcabbsU9cFe1j+yxdzKQKAbGUWRb13DsrsMN1yyfmmIq+2+L5MqVWcDCE4V89R5AyUOi7sMOGxdsYtA==" + "version": "16.6.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz", + "integrity": "sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==" }, "http-errors": { "version": "1.7.2", diff --git a/examples/12-directives/package.json b/examples/12-directives/package.json index acf8ba1c..b010aa43 100644 --- a/examples/12-directives/package.json +++ b/examples/12-directives/package.json @@ -16,7 +16,7 @@ "dependencies": { "express": "^4.17.1", "express-graphql": "^0.12.0", - "graphql": "^15.4.0", + "graphql": "16.6.0", "xhr2": "^0.2.0" }, "devDependencies": { diff --git a/examples/12-directives/src/Main.purs b/examples/12-directives/src/Main.purs index 99e77aa4..121d331e 100644 --- a/examples/12-directives/src/Main.purs +++ b/examples/12-directives/src/Main.purs @@ -9,7 +9,7 @@ import Generated.Gql.Directives.Admin (Directives, cached) import Generated.Gql.Schema.Admin (Query) import GraphQL.Client.Args ((=>>)) import GraphQL.Client.Operation (OpQuery) -import GraphQL.Client.Query (query_) +import GraphQL.Client.BaseClients.Affjax.Node (query_) import GraphQL.Client.Types (class GqlQuery) import Type.Proxy (Proxy(..)) diff --git a/examples/2-codegen/src/Main.purs b/examples/2-codegen/src/Main.purs index fcd1c572..6725d42d 100644 --- a/examples/2-codegen/src/Main.purs +++ b/examples/2-codegen/src/Main.purs @@ -11,7 +11,7 @@ import Generated.Gql.Symbols (name) import GraphQL.Client.Args ((=>>)) import GraphQL.Client.ID (ID(..)) import GraphQL.Client.Operation (OpQuery(..)) -import GraphQL.Client.Query (query_) +import GraphQL.Client.BaseClients.Affjax.Node (query_) import GraphQL.Client.Types (class GqlQuery) import Type.Data.List (Nil') import Type.Proxy (Proxy(..)) diff --git a/examples/3-enums/src/Main.purs b/examples/3-enums/src/Main.purs index 8fcd64ea..ddd78b8e 100644 --- a/examples/3-enums/src/Main.purs +++ b/examples/3-enums/src/Main.purs @@ -11,7 +11,7 @@ import Generated.Gql.Schema.Admin (Query) import Generated.Gql.Symbols (colour) import GraphQL.Client.Args ((=>>)) import GraphQL.Client.Operation (OpQuery(..)) -import GraphQL.Client.Query (query_) +import GraphQL.Client.BaseClients.Affjax.Node (query_) import GraphQL.Client.Types (class GqlQuery) import Type.Data.List (Nil') import Type.Proxy (Proxy(..)) diff --git a/examples/8-custom-gql-types/src/Main.purs b/examples/8-custom-gql-types/src/Main.purs index fcd1c572..6725d42d 100644 --- a/examples/8-custom-gql-types/src/Main.purs +++ b/examples/8-custom-gql-types/src/Main.purs @@ -11,7 +11,7 @@ import Generated.Gql.Symbols (name) import GraphQL.Client.Args ((=>>)) import GraphQL.Client.ID (ID(..)) import GraphQL.Client.Operation (OpQuery(..)) -import GraphQL.Client.Query (query_) +import GraphQL.Client.BaseClients.Affjax.Node (query_) import GraphQL.Client.Types (class GqlQuery) import Type.Data.List (Nil') import Type.Proxy (Proxy(..)) diff --git a/examples/9-variables/src/Main.purs b/examples/9-variables/src/Main.purs index e64256a4..40a21994 100644 --- a/examples/9-variables/src/Main.purs +++ b/examples/9-variables/src/Main.purs @@ -11,7 +11,7 @@ import Generated.Gql.Schema.Admin (Query) import Generated.Gql.Symbols (colour) import GraphQL.Client.Args ((=>>)) import GraphQL.Client.Operation (OpQuery) -import GraphQL.Client.Query (query_) +import GraphQL.Client.BaseClients.Affjax.Node (query_) import GraphQL.Client.Types (class GqlQuery) import GraphQL.Client.Variable (Var(..)) import GraphQL.Client.Variables (withVars) diff --git a/package.json b/package.json index 5e491323..5510d6ef 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ }, "homepage": "https://github.com/OxfordAbstracts/purescript-graphql-client#readme", "dependencies": { + "@grafbase/urql-exchange": "^1.0.1", "@urql/core": "^1.16.2", "graphql": "^16.5.0", "graphql-ws": "^5.9.1", diff --git a/src/GraphQL/Client/BaseClients/Affjax/Node.purs b/src/GraphQL/Client/BaseClients/Affjax/Node.purs index 92d6defb..75ac415e 100644 --- a/src/GraphQL/Client/BaseClients/Affjax/Node.purs +++ b/src/GraphQL/Client/BaseClients/Affjax/Node.purs @@ -1,14 +1,31 @@ -module GraphQL.Client.BaseClients.Affjax.Node (AffjaxNodeClient(..)) where +module GraphQL.Client.BaseClients.Affjax.Node + (AffjaxNodeClient(..) + , query_ + ) where import Prelude import Affjax.Node (Error, Response, URL, request) import Affjax.RequestHeader (RequestHeader) -import Data.Argonaut.Core (Json) -import Data.Either (Either) -import Effect.Aff (Aff) +import Control.Monad.Error.Class (class MonadThrow) +import Effect.Aff (Error) as Aff +import Effect.Aff (Aff, error, message, throwError) +import Data.Argonaut.Core (Json, stringify) +import Data.Argonaut.Decode (JsonDecodeError, decodeJson, printJsonDecodeError) +import Data.Argonaut.Decode.Class (class DecodeJson) +import Data.Array (intercalate) +import Data.Either (Either(..)) +import Effect (Effect) +import Effect.Aff (Aff, error) +import Effect.Class (liftEffect) import GraphQL.Client.BaseClients.Affjax.Internal (makeAffjaxGqlRequest, throwLeft) -import GraphQL.Client.Types (class QueryClient) +import GraphQL.Client.Operation (OpMutation, OpQuery) +import GraphQL.Client.Query (addErrorInfo, decodeGqlRes, mutation, query) +import GraphQL.Client.SafeQueryName (safeQueryName) +import GraphQL.Client.ToGqlString (toGqlQueryString) +import GraphQL.Client.Types (class GqlQuery, class QueryClient, Client, clientQuery) +import GraphQL.Client.Variables (class VarsTypeChecked, getVarsJson, getVarsTypeNames) +import Type.Proxy (Proxy) data AffjaxNodeClient = AffjaxNodeClient URL (Array RequestHeader) @@ -22,4 +39,61 @@ instance queryClient :: QueryClient AffjaxNodeClient Unit Unit where queryPostForeign :: String -> URL -> Array RequestHeader -> String -> String -> Json -> Aff (Either Error (Response Json)) queryPostForeign opStr url headers queryName q vars = - request (makeAffjaxGqlRequest opStr url headers queryName q vars) \ No newline at end of file + request (makeAffjaxGqlRequest opStr url headers queryName q vars) + +-- | A create client and query shortcut that creates a global client and caches it for future calls. +-- | `query` is a safer option for production environments and should generally be used +query_ :: + forall directives schema query returns. + GqlQuery directives OpQuery schema query returns => + DecodeJson returns => + URL -> Proxy schema -> String -> query -> Aff returns +query_ url schema name q = runQuery decodeJson unit (AffjaxNodeClient url []) schema name q + where + runQuery :: + forall client directives schema query returns qOpts mOpts. + QueryClient client qOpts mOpts => + GqlQuery directives OpQuery schema query returns => + VarsTypeChecked query => + (Json -> Either JsonDecodeError returns) -> + qOpts -> + client -> + Proxy schema -> + String -> + query -> + Aff returns + runQuery decodeFn opts client _ queryNameUnsafe q = + addErrorInfo queryName q do + json <- clientQuery opts client queryName (getVarsTypeNames q <> toGqlQueryString q) (getVarsJson q) + decodeJsonData decodeFn json + where + queryName = safeQueryName queryNameUnsafe + + decodeJsonData :: forall m a. MonadThrow Aff.Error m => (Json -> Either JsonDecodeError a) -> Json -> m a + decodeJsonData decodeFn json = case decodeGqlRes decodeFn json of + Left err -> + throwError + $ error case decodeJson json of + Right ({ errors } :: { errors :: Array { message :: String } }) -> intercalate ", \n" $ map _.message errors + _ -> + " Response failed to decode from JSON: " + <> printJsonDecodeError err + <> "\n Full response: " + <> stringify json + Right result -> pure result + + + +-- mutation_ :: +-- forall directives schema mutation returns. +-- GqlQuery directives OpMutation schema mutation returns => +-- DecodeJson returns => +-- URL -> Proxy schema -> String -> mutation -> Aff returns +-- mutation_ url _ name q = do +-- client <- +-- liftEffect +-- $ createGlobalClientUnsafe +-- { url +-- , headers: [] +-- } +-- mutation (client :: Client AffjaxNodeClient directives _ schema _) name q diff --git a/src/GraphQL/Client/BaseClients/Urql.purs b/src/GraphQL/Client/BaseClients/Urql.purs index 8dca5e19..8b8de7b7 100644 --- a/src/GraphQL/Client/BaseClients/Urql.purs +++ b/src/GraphQL/Client/BaseClients/Urql.purs @@ -1,29 +1,37 @@ -- | Creates GraphQL clients module GraphQL.Client.BaseClients.Urql - ( UrqlClientOptions - , UrqlSubClientOptions - , UrqlClient - , UrqlSubClient + ( UrqlClient + , UrqlClientOptions , UrqlLiveQueryClient + , UrqlSubClient + , UrqlSubClientOptions , createClient , createGlobalClientUnsafe - , createSubscriptionClient , createLiveQueryClient - ) where + , createSubscriptionClient + , mutation_ + , query_ + ) + where import Prelude import Affjax (URL) import Affjax.RequestHeader (RequestHeader, name, value) import Data.Argonaut.Core (Json) +import Data.Argonaut.Decode (class DecodeJson, JsonDecodeError, decodeJson, printJsonDecodeError) import Data.Tuple (Tuple(..)) import Effect (Effect) import Effect.Aff (Aff) import Effect.Aff.Compat (EffectFnAff, fromEffectFnAff) +import Effect.Class (liftEffect) import Foreign (Foreign, unsafeToForeign) import Foreign.Object (Object) import Foreign.Object as Object -import GraphQL.Client.Types (class QueryClient, class SubscriptionClient, class LiveQueryClient, Client(..)) +import GraphQL.Client.Operation (OpMutation, OpQuery) +import GraphQL.Client.Query (query, mutation) +import GraphQL.Client.Types (class QueryClient, class SubscriptionClient, class LiveQueryClient, class GqlQuery, Client(..)) +import Type.Proxy (Proxy(..)) type UrqlClientOptions = { url :: URL @@ -159,3 +167,34 @@ foreign import liveQueryImpl :: Json -> (Json -> Effect Unit) -> Effect (Effect Unit) + + +-- | A create client and query shortcut that creates a global client and caches it for future calls. +-- | `query` is a safer option for production environments and should generally be used +query_ :: + forall directives schema query returns. + GqlQuery directives OpQuery schema query returns => + DecodeJson returns => + URL -> Proxy schema -> String -> query -> Aff returns +query_ url _ name q = do + client <- + liftEffect + $ createGlobalClientUnsafe + { url + , headers: [] + } + query (client :: Client UrqlClient directives schema _ _) name q + +mutation_ :: + forall directives schema mutation returns. + GqlQuery directives OpMutation schema mutation returns => + DecodeJson returns => + URL -> Proxy schema -> String -> mutation -> Aff returns +mutation_ url _ name q = do + client <- + liftEffect + $ createGlobalClientUnsafe + { url + , headers: [] + } + mutation (client :: Client UrqlClient directives _ schema _) name q diff --git a/src/GraphQL/Client/Query.purs b/src/GraphQL/Client/Query.purs index cce6405b..3c8f4407 100644 --- a/src/GraphQL/Client/Query.purs +++ b/src/GraphQL/Client/Query.purs @@ -1,14 +1,12 @@ module GraphQL.Client.Query -( query + ( query , queryWithDecoder , queryOptsWithDecoder , queryOpts - , query_ , mutation , mutationWithDecoder , mutationOptsWithDecoder , mutationOpts - , mutation_ , decodeGqlRes , queryFullRes , mutationFullRes @@ -34,7 +32,6 @@ import Data.Traversable (traverse) import Effect.Aff (Aff, Error, error, message, throwError) import Effect.Class (liftEffect) import Foreign.Object (Object) -import GraphQL.Client.BaseClients.Urql (UrqlClient, createGlobalClientUnsafe) import GraphQL.Client.Operation (OpMutation, OpQuery) import GraphQL.Client.SafeQueryName (safeQueryName) import GraphQL.Client.ToGqlString (class GqlQueryString, toGqlQueryString, toGqlQueryStringFormatted) @@ -96,22 +93,6 @@ query :: Aff returns query = queryWithDecoder decodeJson --- | A create client and query shortcut that creates a global client and caches it for future calls. --- | `query` is a safer option for production environments and should generally be used -query_ :: - forall directives schema query returns. - GqlQuery directives OpQuery schema query returns => - DecodeJson returns => - URL -> Proxy schema -> String -> query -> Aff returns -query_ url _ name q = do - client <- - liftEffect - $ createGlobalClientUnsafe - { url - , headers: [] - } - query (client :: Client UrqlClient directives schema _ _) name q - mutationWithDecoder :: forall client directives schema mutation returns a b queryOpts mutationOpts. QueryClient client queryOpts mutationOpts => @@ -161,20 +142,6 @@ mutationOpts :: Aff returns mutationOpts = mutationOptsWithDecoder decodeJson -mutation_ :: - forall directives schema mutation returns. - GqlQuery directives OpMutation schema mutation returns => - DecodeJson returns => - URL -> Proxy schema -> String -> mutation -> Aff returns -mutation_ url _ name q = do - client <- - liftEffect - $ createGlobalClientUnsafe - { url - , headers: [] - } - mutation (client :: Client UrqlClient directives _ schema _) name q - runQuery :: forall client directives schema query returns qOpts mOpts. QueryClient client qOpts mOpts =>