From f424e0c94d60a7ba1ac8ad99d39aaa700d5e5a94 Mon Sep 17 00:00:00 2001 From: Benjie Gillam Date: Wed, 1 Mar 2023 15:28:43 +0000 Subject: [PATCH 01/13] Upgrade to PostGraphile V5 and GraphQL V16 --- @app/client/package.json | 2 +- @app/lib/package.json | 4 +- @app/server/package.json | 15 +- package.json | 4 +- yarn.lock | 668 +++++++++++++++++++++++++-------------- 5 files changed, 443 insertions(+), 250 deletions(-) diff --git a/@app/client/package.json b/@app/client/package.json index 80257044..3c8b515e 100644 --- a/@app/client/package.json +++ b/@app/client/package.json @@ -20,7 +20,7 @@ "@types/react": "18.0.28", "antd": "5.2.3", "dayjs": "^1.11.7", - "graphql": "^15.8.0", + "graphql": "^16.1.0-experimental-stream-defer.6", "lodash": "^4.17.21", "net": "^1.0.2", "next": "^13.2.3", diff --git a/@app/lib/package.json b/@app/lib/package.json index 924c8c7a..c6550124 100644 --- a/@app/lib/package.json +++ b/@app/lib/package.json @@ -9,7 +9,7 @@ }, "dependencies": { "@apollo/client": "3.4.17", - "graphql": "^15.8.0", + "graphql": "^16.1.0-experimental-stream-defer.6", "graphql-ws": "^5.11.3", "next": "^13.2.3", "next-with-apollo": "^5.3.0", @@ -25,7 +25,7 @@ "cross-env": "^7.0.3", "express": "^4.18.2", "jest": "^29.4.3", - "postgraphile": "^4.13.0", + "postgraphile": "^5.0.0-0.36", "typescript": "^5.0.0-beta" } } diff --git a/@app/server/package.json b/@app/server/package.json index a9d7b90a..61802aba 100644 --- a/@app/server/package.json +++ b/@app/server/package.json @@ -13,9 +13,7 @@ "dependencies": { "@app/client": "0.0.0", "@app/config": "0.0.0", - "@graphile-contrib/pg-simplify-inflector": "^6.1.0", - "@graphile/pg-pubsub": "^4.13.0", - "@graphile/pro": "^1.0.4", + "@graphile/simplify-inflection": "^8.0.0-0.5", "@types/connect-pg-simple": "^7.0.0", "@types/csurf": "^1.11.2", "@types/express-session": "^1.17.6", @@ -32,9 +30,9 @@ "csurf": "^1.11.0", "express": "^4.18.2", "express-session": "^1.17.3", - "graphile-build": "^4.13.0", - "graphile-build-pg": "^4.13.0", - "graphile-utils": "^4.13.0", + "graphile-build": "^5.0.0-0.28", + "graphile-build-pg": "^5.0.0-0.33", + "graphile-utils": "^5.0.0-0.33", "graphile-worker": "^0.13.0", "helmet": "^6.0.1", "lodash": "^4.17.21", @@ -43,14 +41,15 @@ "passport": "^0.6.0", "passport-github2": "^0.1.12", "pg": "^8.9.0", - "postgraphile": "^4.13.0", + "postgraphile": "^5.0.0-0.36", "redis": "^4.6.5", "source-map-support": "^0.5.21", "tslib": "^2.5.0" }, "devDependencies": { "@types/node": "^18.14.2", - "graphql": "^15.8.0", + "graphile": "^5.0.0-0.7", + "graphql": "^16.1.0-experimental-stream-defer.6", "jest": "^29.4.3", "mock-req": "^0.2.0", "ts-node": "^10.9.1" diff --git a/package.json b/package.json index 8becdb5d..4bc227ed 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "abort-controller": "^3.0.0", - "graphql": "^15.8.0" + "graphql": "^16.1.0-experimental-stream-defer.6" }, "devDependencies": { "@babel/core": "^7.21.0", @@ -83,7 +83,7 @@ "update-dotenv": "^1.1.1" }, "resolutions": { - "graphql": "15.x", + "graphql": "16.1.0-experimental-stream-defer.6", "pg-connection-string": "2.x" }, "workspaces": { diff --git a/yarn.lock b/yarn.lock index 8d326ff9..c04cc679 100644 --- a/yarn.lock +++ b/yarn.lock @@ -217,7 +217,7 @@ __metadata: antd: 5.2.3 cross-env: ^7.0.3 dayjs: ^1.11.7 - graphql: ^15.8.0 + graphql: ^16.1.0-experimental-stream-defer.6 jest: ^29.4.3 lodash: ^4.17.21 net: ^1.0.2 @@ -310,12 +310,12 @@ __metadata: "@types/zxcvbn": ^4.4.1 cross-env: ^7.0.3 express: ^4.18.2 - graphql: ^15.8.0 + graphql: ^16.1.0-experimental-stream-defer.6 graphql-ws: ^5.11.3 jest: ^29.4.3 next: ^13.2.3 next-with-apollo: ^5.3.0 - postgraphile: ^4.13.0 + postgraphile: ^5.0.0-0.36 rc-field-form: ^1.27.4 react: ^18.2.0 react-dom: ^18.2.0 @@ -331,9 +331,7 @@ __metadata: dependencies: "@app/client": 0.0.0 "@app/config": 0.0.0 - "@graphile-contrib/pg-simplify-inflector": ^6.1.0 - "@graphile/pg-pubsub": ^4.13.0 - "@graphile/pro": ^1.0.4 + "@graphile/simplify-inflection": ^8.0.0-0.5 "@types/connect-pg-simple": ^7.0.0 "@types/csurf": ^1.11.2 "@types/express-session": ^1.17.6 @@ -352,11 +350,12 @@ __metadata: csurf: ^1.11.0 express: ^4.18.2 express-session: ^1.17.3 - graphile-build: ^4.13.0 - graphile-build-pg: ^4.13.0 - graphile-utils: ^4.13.0 + graphile: ^5.0.0-0.7 + graphile-build: ^5.0.0-0.28 + graphile-build-pg: ^5.0.0-0.33 + graphile-utils: ^5.0.0-0.33 graphile-worker: ^0.13.0 - graphql: ^15.8.0 + graphql: ^16.1.0-experimental-stream-defer.6 helmet: ^6.0.1 jest: ^29.4.3 lodash: ^4.17.21 @@ -366,7 +365,7 @@ __metadata: passport: ^0.6.0 passport-github2: ^0.1.12 pg: ^8.9.0 - postgraphile: ^4.13.0 + postgraphile: ^5.0.0-0.36 redis: ^4.6.5 source-map-support: ^0.5.21 ts-node: ^10.9.1 @@ -488,7 +487,7 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.14.0, @babel/generator@npm:^7.18.13, @babel/generator@npm:^7.21.0, @babel/generator@npm:^7.21.1, @babel/generator@npm:^7.7.2": +"@babel/generator@npm:^7.14.0, @babel/generator@npm:^7.16.5, @babel/generator@npm:^7.18.13, @babel/generator@npm:^7.21.0, @babel/generator@npm:^7.21.1, @babel/generator@npm:^7.7.2": version: 7.21.1 resolution: "@babel/generator@npm:7.21.1" dependencies: @@ -784,7 +783,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.16.4, @babel/parser@npm:^7.16.8, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.0, @babel/parser@npm:^7.21.2": +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.16.4, @babel/parser@npm:^7.16.6, @babel/parser@npm:^7.16.8, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.0, @babel/parser@npm:^7.21.2": version: 7.21.2 resolution: "@babel/parser@npm:7.21.2" bin: @@ -1785,7 +1784,7 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:^7.18.10, @babel/template@npm:^7.20.7, @babel/template@npm:^7.3.3": +"@babel/template@npm:^7.16.0, @babel/template@npm:^7.18.10, @babel/template@npm:^7.20.7, @babel/template@npm:^7.3.3": version: 7.20.7 resolution: "@babel/template@npm:7.20.7" dependencies: @@ -1796,7 +1795,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.12.5, @babel/traverse@npm:^7.14.0, @babel/traverse@npm:^7.16.8, @babel/traverse@npm:^7.20.5, @babel/traverse@npm:^7.20.7, @babel/traverse@npm:^7.21.0, @babel/traverse@npm:^7.21.2, @babel/traverse@npm:^7.7.2": +"@babel/traverse@npm:^7.12.5, @babel/traverse@npm:^7.14.0, @babel/traverse@npm:^7.16.0, @babel/traverse@npm:^7.16.8, @babel/traverse@npm:^7.20.5, @babel/traverse@npm:^7.20.7, @babel/traverse@npm:^7.21.0, @babel/traverse@npm:^7.21.2, @babel/traverse@npm:^7.7.2": version: 7.21.2 resolution: "@babel/traverse@npm:7.21.2" dependencies: @@ -1814,7 +1813,7 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.16.8, @babel/types@npm:^7.18.13, @babel/types@npm:^7.18.6, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.2, @babel/types@npm:^7.20.5, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.0, @babel/types@npm:^7.21.2, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.16.0, @babel/types@npm:^7.16.8, @babel/types@npm:^7.18.13, @babel/types@npm:^7.18.6, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.2, @babel/types@npm:^7.20.5, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.0, @babel/types@npm:^7.21.2, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": version: 7.21.2 resolution: "@babel/types@npm:7.21.2" dependencies: @@ -1891,6 +1890,43 @@ __metadata: languageName: node linkType: hard +"@dataplan/json@npm:^0.0.1-0.22": + version: 0.0.1-0.22 + resolution: "@dataplan/json@npm:0.0.1-0.22" + dependencies: + chalk: ^4.1.2 + tslib: ^2.4.0 + peerDependencies: + grafast: ^0.0.1-0.22 + graphql: ^16.1.0-experimental-stream-defer.6 + checksum: a9c125596e29a4bf6de44ee19c0ef210ac15a71927d90157e1995b5516617cf9c1544f762cda721f9cdaa30103bd0c31577cd8d6900ac01dd4c7c35034f2e7ee + languageName: node + linkType: hard + +"@dataplan/pg@npm:0.0.1-0.27, @dataplan/pg@npm:^0.0.1-0.27": + version: 0.0.1-0.27 + resolution: "@dataplan/pg@npm:0.0.1-0.27" + dependencies: + "@dataplan/json": ^0.0.1-0.22 + "@graphile/lru": ^5.0.0-0.1 + "@types/node": ^16.11.15 + chalk: ^4.1.2 + debug: ^4.3.3 + grafast: ^0.0.1-0.22 + pg-sql2: ^5.0.0-0.3 + postgres-array: ~2.0.0 + postgres-range: ^1.1.1 + tslib: ^2.4.0 + peerDependencies: + graphql: ^16.1.0-experimental-stream-defer.6 + pg: ^8.7.1 + peerDependenciesMeta: + pg: + optional: true + checksum: c30d62ac78542d94309bb515d9dfd0c3dc7635df4275f49e98f70769fe938e55f75c3d2af47e18a296b86b57668e1c7ccaa376de4d6d94b9fd46f08569ebcab0 + languageName: node + linkType: hard + "@emotion/hash@npm:^0.8.0": version: 0.8.0 resolution: "@emotion/hash@npm:0.8.0" @@ -1950,13 +1986,6 @@ __metadata: languageName: node linkType: hard -"@graphile-contrib/pg-simplify-inflector@npm:^6.1.0": - version: 6.1.0 - resolution: "@graphile-contrib/pg-simplify-inflector@npm:6.1.0" - checksum: cd9ca7d2769f60b77ad83368b128a6c6fd6e596442b5094a8a8473a7ad92df1496c4c278106858daafe65489f7428dfd816c23b36c6de73092af0e05c8287822 - languageName: node - linkType: hard - "@graphile/logger@npm:^0.2.0": version: 0.2.0 resolution: "@graphile/logger@npm:0.2.0" @@ -1964,43 +1993,19 @@ __metadata: languageName: node linkType: hard -"@graphile/lru@npm:4.11.0": - version: 4.11.0 - resolution: "@graphile/lru@npm:4.11.0" +"@graphile/lru@npm:^5.0.0-0.1": + version: 5.0.0-0.1 + resolution: "@graphile/lru@npm:5.0.0-0.1" dependencies: - tslib: ^2.0.1 - checksum: c92fdbcdf3d8cd75666f2d62c8afddf7cbf9b30ce3a9cee76f56553e6993aa4fe003d69b3eb2795c95fb8203670dd9dd98fc57bc3f51bf58b6bb5a6735f9213e + tslib: ^2.4.0 + checksum: 8537a8ca550594a55335951fbe65b4f36d859210230a725478e6bf7389351e8c1e49042a701c4839c2f737d0222fbb672cba82ce394dc608de349b1010a0a856 languageName: node linkType: hard -"@graphile/pg-pubsub@npm:^4.13.0": - version: 4.13.0 - resolution: "@graphile/pg-pubsub@npm:4.13.0" - dependencies: - "@types/debug": ^4.1.4 - "@types/pg": ">=6 <9" - debug: ^4.1.1 - graphql-subscriptions: ^1.1.0 - tslib: ^2.0.1 - peerDependencies: - graphile-build: 4.x - graphql: ">=0.6 <16" - postgraphile: ^4.4.0-beta.10 - checksum: 64a35d5681e530d6b196a8626f2ecadbbeb325f5d42ccd183c087398771098d634bcb7f0fe0fa4136072c9446d83cdec71940930d9c2c4f92341aaf7d95964e7 - languageName: node - linkType: hard - -"@graphile/pro@npm:^1.0.4": - version: 1.0.4 - resolution: "@graphile/pro@npm:1.0.4" - dependencies: - "@types/pg": ">=6 <9" - graphql: ">=0.9 <16" - graphql-depth-limit: ^1.1.0 - pg: ">=6.1.0 <9" - peerDependencies: - postgraphile: ^4.9.1 - checksum: 18bb39a81db05d4523ee8480fade710b5ae1989f95385b72085445faa597f00cf3f44028ca8662e0a5b29076cec71a17ca942685c313e714141be2ded1f79c76 +"@graphile/simplify-inflection@npm:^8.0.0-0.5": + version: 8.0.0-0.5 + resolution: "@graphile/simplify-inflection@npm:8.0.0-0.5" + checksum: f337db7e636fedadf27e18f816d3688506f48f13619330cf2e8926d719b348da88d192ace6882c2d8522e8253251f0c33c1cda028723fe2e896dc2731ccde8e4 languageName: node linkType: hard @@ -3678,7 +3683,7 @@ __metadata: languageName: node linkType: hard -"@types/debug@npm:^4.1.2, @types/debug@npm:^4.1.4": +"@types/debug@npm:^4.1.2": version: 4.1.7 resolution: "@types/debug@npm:4.1.7" dependencies: @@ -3778,6 +3783,15 @@ __metadata: languageName: node linkType: hard +"@types/interpret@npm:^1.1.1": + version: 1.1.1 + resolution: "@types/interpret@npm:1.1.1" + dependencies: + "@types/node": "*" + checksum: 326ae4a82edfb768b47aec4c9eb7544b13c84de729960c17d34e97e004a17245827b68d4fee3ea1a1a242eb679f82f93c03f033a87a6b3dae0486488591f87fc + languageName: node + linkType: hard + "@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": version: 2.0.4 resolution: "@types/istanbul-lib-coverage@npm:2.0.4" @@ -3848,7 +3862,7 @@ __metadata: languageName: node linkType: hard -"@types/jsonwebtoken@npm:^9.0.0, @types/jsonwebtoken@npm:^9.0.1": +"@types/jsonwebtoken@npm:^9.0.0": version: 9.0.1 resolution: "@types/jsonwebtoken@npm:9.0.1" dependencies: @@ -3924,6 +3938,13 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^16.11.15": + version: 16.18.13 + resolution: "@types/node@npm:16.18.13" + checksum: c284f97a0630d65887be0e0d7ef8e5e5022eb4916ffae142db07f22dad565a80f17b6a84f21b4521c707f642540430710a8aa5930a2cf2bcbecde0a476ff9c02 + languageName: node + linkType: hard + "@types/nodemailer@npm:^6.4.7": version: 6.4.7 resolution: "@types/nodemailer@npm:6.4.7" @@ -3987,7 +4008,7 @@ __metadata: languageName: node linkType: hard -"@types/pg@npm:*, @types/pg@npm:>=6 <9, @types/pg@npm:^8.6.5, @types/pg@npm:^8.6.6": +"@types/pg@npm:*, @types/pg@npm:>=6 <9, @types/pg@npm:^8.6.2, @types/pg@npm:^8.6.5, @types/pg@npm:^8.6.6": version: 8.6.6 resolution: "@types/pg@npm:8.6.6" dependencies: @@ -3998,6 +4019,13 @@ __metadata: languageName: node linkType: hard +"@types/pluralize@npm:^0.0.29": + version: 0.0.29 + resolution: "@types/pluralize@npm:0.0.29" + checksum: db7732b733ba1dc59f080f87364c9f985c1ae9f1e5ec5fcefb83c1327149e01ecac42766352eb7b19b117cf39defa99cf514629f3666968a3bdeb00e74f2a97e + languageName: node + linkType: hard + "@types/prettier@npm:^2.1.5": version: 2.7.2 resolution: "@types/prettier@npm:2.7.2" @@ -4053,7 +4081,7 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:^7.3.12": +"@types/semver@npm:^7.3.12, @types/semver@npm:^7.3.9": version: 7.3.13 resolution: "@types/semver@npm:7.3.13" checksum: 00c0724d54757c2f4bc60b5032fe91cda6410e48689633d5f35ece8a0a66445e3e57fa1d6e07eb780f792e82ac542948ec4d0b76eb3484297b79bd18b8cf1cb0 @@ -4100,15 +4128,6 @@ __metadata: languageName: node linkType: hard -"@types/ws@npm:^7.4.0": - version: 7.4.7 - resolution: "@types/ws@npm:7.4.7" - dependencies: - "@types/node": "*" - checksum: b4c9b8ad209620c9b21e78314ce4ff07515c0cadab9af101c1651e7bfb992d7fd933bd8b9c99d110738fd6db523ed15f82f29f50b45510288da72e964dedb1a3 - languageName: node - linkType: hard - "@types/ws@npm:^8.0.0": version: 8.5.4 resolution: "@types/ws@npm:8.5.4" @@ -4278,6 +4297,15 @@ __metadata: languageName: node linkType: hard +"@typescript/vfs@npm:^1.4.0": + version: 1.4.0 + resolution: "@typescript/vfs@npm:1.4.0" + dependencies: + debug: ^4.1.1 + checksum: 67219c9354d142ef8259da172066db043133d8b6cc0a5d862b9867d5950c5f6c9b816e8b29f8901e8cd2572003282fbbec097e53932bc6da01d0fa2e40520014 + languageName: node + linkType: hard + "@umijs/route-utils@npm:^4.0.0": version: 4.0.1 resolution: "@umijs/route-utils@npm:4.0.1" @@ -4630,7 +4658,7 @@ __metadata: eslint-plugin-simple-import-sort: ^10.0.0 eslint_d: ^12.2.1 glob: ^9.1.0 - graphql: ^15.8.0 + graphql: ^16.1.0-experimental-stream-defer.6 inquirer: ^9.1.4 jest: ^29.4.3 mock-req: ^0.2.0 @@ -5032,13 +5060,6 @@ __metadata: languageName: node linkType: hard -"arrify@npm:^1.0.1": - version: 1.0.1 - resolution: "arrify@npm:1.0.1" - checksum: 745075dd4a4624ff0225c331dacb99be501a515d39bcb7c84d24660314a6ec28e68131b137e6f7e16318170842ce97538cd298fc4cd6b2cc798e0b957f2747e7 - languageName: node - linkType: hard - "arrify@npm:^2.0.1": version: 2.0.1 resolution: "arrify@npm:2.0.1" @@ -5449,7 +5470,7 @@ __metadata: languageName: node linkType: hard -"body-parser@npm:^1.15.2, body-parser@npm:^1.20.2": +"body-parser@npm:^1.20.2": version: 1.20.2 resolution: "body-parser@npm:1.20.2" dependencies: @@ -5730,7 +5751,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^2.0.0, chalk@npm:^2.4.2": +"chalk@npm:^2.0.0": version: 2.4.2 resolution: "chalk@npm:2.4.2" dependencies: @@ -5751,7 +5772,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1": +"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -6640,7 +6661,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:>=3 <5, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.2.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.2.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -7730,6 +7751,13 @@ __metadata: languageName: node linkType: hard +"eventemitter3@npm:^4.0.0, eventemitter3@npm:^4.0.7": + version: 4.0.7 + resolution: "eventemitter3@npm:4.0.7" + checksum: 1875311c42fcfe9c707b2712c32664a245629b42bb0a5a84439762dd0fd637fc54d078155ea83c2af9e0323c9ac13687e03cfba79b03af9f40c89b4960099374 + languageName: node + linkType: hard + "events@npm:1.1.1": version: 1.1.1 resolution: "events@npm:1.1.1" @@ -8087,7 +8115,7 @@ __metadata: languageName: node linkType: hard -"finalhandler@npm:1.2.0, finalhandler@npm:^1.0.6": +"finalhandler@npm:1.2.0": version: 1.2.0 resolution: "finalhandler@npm:1.2.0" dependencies: @@ -8139,6 +8167,16 @@ __metadata: languageName: node linkType: hard +"follow-redirects@npm:^1.0.0": + version: 1.15.2 + resolution: "follow-redirects@npm:1.15.2" + peerDependenciesMeta: + debug: + optional: true + checksum: faa66059b66358ba65c234c2f2a37fcec029dc22775f35d9ad6abac56003268baf41e55f9ee645957b32c7d9f62baf1f0b906e68267276f54ec4b4c597c2b190 + languageName: node + linkType: hard + "for-each@npm:^0.3.3": version: 0.3.3 resolution: "for-each@npm:0.3.3" @@ -8573,6 +8611,48 @@ __metadata: languageName: node linkType: hard +"grafast@npm:^0.0.1-0.22": + version: 0.0.1-0.22 + resolution: "grafast@npm:0.0.1-0.22" + dependencies: + "@graphile/lru": ^5.0.0-0.1 + debug: ^4.3.3 + tamedevil: ^0.0.0-0.4 + peerDependencies: + "@envelop/core": ^3.0.4 + graphile-config: ^0.0.1-0.6 + graphql: ^16.1.0-experimental-stream-defer.6 + peerDependenciesMeta: + "@envelop/core": + optional: true + graphile-config: + optional: true + checksum: d76519db3787bc9c50eff53583ee5d48616e78d39750f1d3666c766ed256b98966cd1241e83330ae7754e95ffe28147b8e161926c6eb616e3e922944c11248d8 + languageName: node + linkType: hard + +"grafserv@npm:^0.0.1-0.24": + version: 0.0.1-0.24 + resolution: "grafserv@npm:0.0.1-0.24" + dependencies: + "@graphile/lru": ^5.0.0-0.1 + debug: ^4.1.1 + eventemitter3: ^4.0.7 + graphile-config: ^0.0.1-0.6 + graphql-ws: ^5.11.3 + ruru: ^2.0.0-0.12 + tslib: ^2.4.0 + peerDependencies: + grafast: ^0.0.1-0.22 + graphql: ^16.1.0-experimental-stream-defer.6 + ws: ^8.12.1 + peerDependenciesMeta: + ws: + optional: true + checksum: adc7b24fe5bc6fdb276c30b5fc3003970839929c4af2dd8bd554bbb449333342a932e884fe60c2d9a0024c048b46302b40ea2688dc154334aa8f1e92a4524fdb + languageName: node + linkType: hard + "grapheme-splitter@npm:^1.0.4": version: 1.0.4 resolution: "grapheme-splitter@npm:1.0.4" @@ -8580,40 +8660,82 @@ __metadata: languageName: node linkType: hard -"graphile-build-pg@npm:4.13.0, graphile-build-pg@npm:^4.13.0": - version: 4.13.0 - resolution: "graphile-build-pg@npm:4.13.0" +"graphile-build-pg@npm:5.0.0-0.33, graphile-build-pg@npm:^5.0.0-0.33": + version: 5.0.0-0.33 + resolution: "graphile-build-pg@npm:5.0.0-0.33" dependencies: - "@graphile/lru": 4.11.0 - chalk: ^2.4.2 - debug: ^4.1.1 - graphile-build: 4.13.0 - jsonwebtoken: ^9.0.0 - lodash: ">=4 <5" - lru-cache: ">=4 <5" - pg-sql2: 4.13.0 - peerDependencies: - pg: ">=6.1.0 <9" - checksum: 0eb2bc7ea7a78010b0c812562e7b01f1ad6b8bd9569f3b6c4fe3d399159f8ce382f665335265d26a618ba5cd32c4d9055cb5d5740a9596f1699b3324f132d0f6 + "@dataplan/pg": ^0.0.1-0.27 + "@types/node": ^16.11.15 + debug: ^4.3.3 + grafast: ^0.0.1-0.22 + graphile-build: 5.0.0-0.28 + graphile-config: ^0.0.1-0.6 + graphile-export: ^0.0.2-0.4 + jsonwebtoken: ^8.5.1 + pg-introspection: ^0.0.1-0.3 + pg-sql2: ^5.0.0-0.3 + tamedevil: ^0.0.0-0.4 + tslib: ^2.4.0 + checksum: b32fc45f59b08a4e62323855e807d737356fd0fad69fcb4c4de5518738604dca0960e7dac30647eba22806a3b017d1d42099759c261badccaeefe670ac02b76e languageName: node linkType: hard -"graphile-build@npm:4.13.0, graphile-build@npm:^4.13.0": - version: 4.13.0 - resolution: "graphile-build@npm:4.13.0" +"graphile-build@npm:5.0.0-0.28, graphile-build@npm:^5.0.0-0.28": + version: 5.0.0-0.28 + resolution: "graphile-build@npm:5.0.0-0.28" dependencies: - "@graphile/lru": 4.11.0 - chalk: ^2.4.2 - debug: ^4.1.1 - graphql-parse-resolve-info: 4.13.0 - iterall: ^1.2.2 - lodash: ">=4 <5" - lru-cache: ^5.0.0 + "@types/node": ^16.11.15 + "@types/pluralize": ^0.0.29 + "@types/semver": ^7.3.9 + chalk: ^4.1.2 + debug: ^4.3.3 + grafast: ^0.0.1-0.22 + graphile-config: ^0.0.1-0.6 + graphile-export: ^0.0.2-0.4 + lodash: ^4.17.21 pluralize: ^7.0.0 - semver: ^6.0.0 + semver: ^7.3.5 + tslib: ^2.4.0 + peerDependencies: + graphql: ^16.1.0-experimental-stream-defer.6 + checksum: 217877096bd5dd2823c6a2158c9c3df024e247fa7b2e3a684de3f89c53bab8af6d00b9c76528aa4404d3b384acfa95cac2b1ce46486ecd6bb3f993b0efe7b7c7 + languageName: node + linkType: hard + +"graphile-config@npm:^0.0.1-0.6": + version: 0.0.1-0.6 + resolution: "graphile-config@npm:0.0.1-0.6" + dependencies: + "@types/interpret": ^1.1.1 + "@types/node": ^16.11.15 + "@types/semver": ^7.3.9 + chalk: ^4.1.2 + debug: ^4.3.3 + interpret: ^2.2.0 + semver: ^7.3.5 + tslib: ^2.4.0 + yargs: ^17.4.1 + checksum: ee7d3a08fe76055488bde3e04f9a4ecb99ef47916e4ca0d0b4fed66cde35ce40acc5601016a364badfcca7edf46b5d18400d32863b7a0acf6c2ea358c22f95b9 + languageName: node + linkType: hard + +"graphile-export@npm:^0.0.2-0.4": + version: 0.0.2-0.4 + resolution: "graphile-export@npm:0.0.2-0.4" + dependencies: + "@babel/generator": ^7.16.5 + "@babel/parser": ^7.16.6 + "@babel/template": ^7.16.0 + "@babel/traverse": ^7.16.0 + "@babel/types": ^7.16.0 + "@types/node": ^16.11.15 + prettier: ^2.5.1 + tslib: ^2.4.0 peerDependencies: - graphql: ">=0.9 <0.14 || ^14.0.2 || ^15.4.0" - checksum: bb8554e734430b88efede33c0529b4b1edc47fc56483557828ff1e98ea1bb6af08f5b9806fcc736d7ab9fe4ea79945a52c95be174ed7aaf4f8440c2cc4ec9881 + grafast: ^0.0.1-0.4 + graphql: ^16.1.0-experimental-stream-defer.6 + pg-sql2: ^5.0.0-0.0 + checksum: 6c4dc971d45b4f939f1528cc9c52135eeed20294719dbec578ba17f39d4c022a66e30085c0438d1495194fe2432664dff96d1625cff7b80b36b38104037ad59f languageName: node linkType: hard @@ -8639,17 +8761,21 @@ __metadata: languageName: node linkType: hard -"graphile-utils@npm:^4.13.0": - version: 4.13.0 - resolution: "graphile-utils@npm:4.13.0" +"graphile-utils@npm:^5.0.0-0.33": + version: 5.0.0-0.33 + resolution: "graphile-utils@npm:5.0.0-0.33" dependencies: debug: ^4.1.1 - graphql: ">=0.9 <0.14 || ^14.0.2 || ^15.4.0" - tslib: ^2.0.1 + graphile-config: ^0.0.1-0.6 + json5: ^2.2.3 + tslib: ^2.4.0 peerDependencies: - graphile-build: ^4.5.0 - graphile-build-pg: ^4.5.0 - checksum: 6371c219ff9ac0bf8eb7ec89756e868cc91af5bf53c2160ff39df67bd48a2f92d4f933c218aafad48d8707005725b09ead93bc26ab2fd353d67710df72e8f91b + grafast: ^0.0.1-0.22 + graphile-build: ^5.0.0-0.28 + graphile-build-pg: ^5.0.0-0.33 + graphql: ^16.1.0-experimental-stream-defer.6 + pg-introspection: ^0.0.1-0.3 + checksum: d56f48acc8d2b9fef15f8134e42a2109b76b634b5a00dd51fe706cfd444f3d76970917313458c9838db2b72f1e997a639b75e70d9c0b7c6788dc0580e7abf37e languageName: node linkType: hard @@ -8672,6 +8798,21 @@ __metadata: languageName: node linkType: hard +"graphile@npm:^5.0.0-0.7": + version: 5.0.0-0.7 + resolution: "graphile@npm:5.0.0-0.7" + dependencies: + "@typescript/vfs": ^1.4.0 + chalk: ^4.1.2 + graphile-config: ^0.0.1-0.6 + tslib: ^2.4.0 + typescript: ^5.0.0-beta + bin: + graphile: dist/cli-run.js + checksum: de7ae9c0958a60e6ed5a096897af8c8ceaa522cc190e6ed5b1e855a41eb07d9cdfe6c1790505acbe7f30fd744232d543ded574de4932f51a50825ab08dab8bec + languageName: node + linkType: hard + "graphql-config@npm:^3.0.2": version: 3.4.1 resolution: "graphql-config@npm:3.4.1" @@ -8720,29 +8861,6 @@ __metadata: languageName: node linkType: hard -"graphql-depth-limit@npm:^1.1.0": - version: 1.1.0 - resolution: "graphql-depth-limit@npm:1.1.0" - dependencies: - arrify: ^1.0.1 - peerDependencies: - graphql: "*" - checksum: e43c8c0462612870797c0691e2c9488d6773eb794dda2b71c2c5659f721ec28be42e6c1f381e3b05a892c25d212d9babe08888a8ce6fd4f83ecc19a988675e56 - languageName: node - linkType: hard - -"graphql-parse-resolve-info@npm:4.13.0": - version: 4.13.0 - resolution: "graphql-parse-resolve-info@npm:4.13.0" - dependencies: - debug: ^4.1.1 - tslib: ^2.0.1 - peerDependencies: - graphql: ">=0.9 <0.14 || ^14.0.2 || ^15.4.0 || ^16.3.0" - checksum: a0ac79196d9a7b884a24ce59576a4537431db79536039f97a496dd4fcf919da0a481115b4d08d8b4e7ea646b2decbf67a1b589875ecbc437f269a7acc4dea893 - languageName: node - linkType: hard - "graphql-request@npm:^5.0.0": version: 5.1.0 resolution: "graphql-request@npm:5.1.0" @@ -8757,17 +8875,6 @@ __metadata: languageName: node linkType: hard -"graphql-subscriptions@npm:^1.1.0": - version: 1.2.1 - resolution: "graphql-subscriptions@npm:1.2.1" - dependencies: - iterall: ^1.3.0 - peerDependencies: - graphql: ^0.10.5 || ^0.11.3 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 - checksum: 2b9533c6774e7be46acd6fbee528aab06429f15dc222eabd991e82c02bf74e390b638dffa1a3fd86c1e26212c40a42a0418d7f4a7c3a1edf0534978ef128e528 - languageName: node - linkType: hard - "graphql-tag@npm:^2.11.0, graphql-tag@npm:^2.12.3": version: 2.12.6 resolution: "graphql-tag@npm:2.12.6" @@ -8779,7 +8886,7 @@ __metadata: languageName: node linkType: hard -"graphql-ws@npm:5.11.3, graphql-ws@npm:^5.11.3, graphql-ws@npm:^5.6.2": +"graphql-ws@npm:5.11.3, graphql-ws@npm:^5.11.3": version: 5.11.3 resolution: "graphql-ws@npm:5.11.3" peerDependencies: @@ -8797,10 +8904,10 @@ __metadata: languageName: node linkType: hard -"graphql@npm:15.x": - version: 15.8.0 - resolution: "graphql@npm:15.8.0" - checksum: 423325271db8858428641b9aca01699283d1fe5b40ef6d4ac622569ecca927019fce8196208b91dd1d8eb8114f00263fe661d241d0eb40c10e5bfd650f86ec5e +"graphql@npm:16.1.0-experimental-stream-defer.6": + version: 16.1.0-experimental-stream-defer.6 + resolution: "graphql@npm:16.1.0-experimental-stream-defer.6" + checksum: 55cbcde8e1fb01dcf482c5cfafa0ad18995bb92397b4e8824ae2b0cd2f10eea6a7445342979d8d28874c2bf2fea1cacbfed8cc0e8ce918a6a87e8275d764e1c4 languageName: node linkType: hard @@ -9001,19 +9108,6 @@ __metadata: languageName: node linkType: hard -"http-errors@npm:^1.5.1": - version: 1.8.1 - resolution: "http-errors@npm:1.8.1" - dependencies: - depd: ~1.1.2 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: ">= 1.5.0 < 2" - toidentifier: 1.0.1 - checksum: d3c7e7e776fd51c0a812baff570bdf06fe49a5dc448b700ab6171b1250e4cf7db8b8f4c0b133e4bfe2451022a5790c1ca6c2cae4094dedd6ac8304a1267f91d2 - languageName: node - linkType: hard - "http-errors@npm:~1.7.3": version: 1.7.3 resolution: "http-errors@npm:1.7.3" @@ -9038,6 +9132,17 @@ __metadata: languageName: node linkType: hard +"http-proxy@npm:^1.18.1": + version: 1.18.1 + resolution: "http-proxy@npm:1.18.1" + dependencies: + eventemitter3: ^4.0.0 + follow-redirects: ^1.0.0 + requires-port: ^1.0.0 + checksum: f5bd96bf83e0b1e4226633dbb51f8b056c3e6321917df402deacec31dd7fe433914fc7a2c1831cf7ae21e69c90b3a669b8f434723e9e8b71fd68afe30737b6a5 + languageName: node + linkType: hard + "http-signature@npm:~1.3.6": version: 1.3.6 resolution: "http-signature@npm:1.3.6" @@ -9289,6 +9394,13 @@ __metadata: languageName: node linkType: hard +"interpret@npm:^2.2.0": + version: 2.2.0 + resolution: "interpret@npm:2.2.0" + checksum: f51efef7cb8d02da16408ffa3504cd6053014c5aeb7bb8c223727e053e4235bf565e45d67028b0c8740d917c603807aa3c27d7bd2f21bf20b6417e2bb3e5fd6e + languageName: node + linkType: hard + "invariant@npm:2.2.4, invariant@npm:^2.2.4": version: 2.2.4 resolution: "invariant@npm:2.2.4" @@ -9827,7 +9939,7 @@ __metadata: languageName: node linkType: hard -"iterall@npm:^1.0.2, iterall@npm:^1.2.1, iterall@npm:^1.2.2, iterall@npm:^1.3.0": +"iterall@npm:^1.2.1, iterall@npm:^1.3.0": version: 1.3.0 resolution: "iterall@npm:1.3.0" checksum: c78b99678f8c99be488cca7f33e4acca9b72c1326e050afbaf023f086e55619ee466af0464af94a0cb3f292e60cb5bac53a8fd86bd4249ecad26e09f17bb158b @@ -10446,7 +10558,7 @@ __metadata: languageName: node linkType: hard -"json5@npm:^2.1.1, json5@npm:^2.1.2, json5@npm:^2.1.3, json5@npm:^2.2.2, json5@npm:^2.2.3": +"json5@npm:^2.1.2, json5@npm:^2.1.3, json5@npm:^2.2.2, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" bin: @@ -10475,6 +10587,24 @@ __metadata: languageName: node linkType: hard +"jsonwebtoken@npm:^8.5.1": + version: 8.5.1 + resolution: "jsonwebtoken@npm:8.5.1" + dependencies: + jws: ^3.2.2 + lodash.includes: ^4.3.0 + lodash.isboolean: ^3.0.3 + lodash.isinteger: ^4.0.4 + lodash.isnumber: ^3.0.3 + lodash.isplainobject: ^4.0.6 + lodash.isstring: ^4.0.1 + lodash.once: ^4.0.0 + ms: ^2.1.1 + semver: ^5.6.0 + checksum: 93c9e3f23c59b758ac88ba15f4e4753b3749dfce7a6f7c40fb86663128a1e282db085eec852d4e0cbca4cefdcd3a8275ee255dbd08fcad0df26ad9f6e4cc853a + languageName: node + linkType: hard + "jsonwebtoken@npm:^9.0.0": version: 9.0.0 resolution: "jsonwebtoken@npm:9.0.0" @@ -10694,6 +10824,48 @@ __metadata: languageName: node linkType: hard +"lodash.includes@npm:^4.3.0": + version: 4.3.0 + resolution: "lodash.includes@npm:4.3.0" + checksum: 71092c130515a67ab3bd928f57f6018434797c94def7f46aafa417771e455ce3a4834889f4267b17887d7f75297dfabd96231bf704fd2b8c5096dc4a913568b6 + languageName: node + linkType: hard + +"lodash.isboolean@npm:^3.0.3": + version: 3.0.3 + resolution: "lodash.isboolean@npm:3.0.3" + checksum: b70068b4a8b8837912b54052557b21fc4774174e3512ed3c5b94621e5aff5eb6c68089d0a386b7e801d679cd105d2e35417978a5e99071750aa2ed90bffd0250 + languageName: node + linkType: hard + +"lodash.isinteger@npm:^4.0.4": + version: 4.0.4 + resolution: "lodash.isinteger@npm:4.0.4" + checksum: 6034821b3fc61a2ffc34e7d5644bb50c5fd8f1c0121c554c21ac271911ee0c0502274852845005f8651d51e199ee2e0cfebfe40aaa49c7fe617f603a8a0b1691 + languageName: node + linkType: hard + +"lodash.isnumber@npm:^3.0.3": + version: 3.0.3 + resolution: "lodash.isnumber@npm:3.0.3" + checksum: 913784275b565346255e6ae6a6e30b760a0da70abc29f3e1f409081585875105138cda4a429ff02577e1bc0a7ae2a90e0a3079a37f3a04c3d6c5aaa532f4cab2 + languageName: node + linkType: hard + +"lodash.isplainobject@npm:^4.0.6": + version: 4.0.6 + resolution: "lodash.isplainobject@npm:4.0.6" + checksum: 29c6351f281e0d9a1d58f1a4c8f4400924b4c79f18dfc4613624d7d54784df07efaff97c1ff2659f3e085ecf4fff493300adc4837553104cef2634110b0d5337 + languageName: node + linkType: hard + +"lodash.isstring@npm:^4.0.1": + version: 4.0.1 + resolution: "lodash.isstring@npm:4.0.1" + checksum: eaac87ae9636848af08021083d796e2eea3d02e80082ab8a9955309569cb3a463ce97fd281d7dc119e402b2e7d8c54a23914b15d2fc7fff56461511dc8937ba0 + languageName: node + linkType: hard + "lodash.memoize@npm:4.x": version: 4.1.2 resolution: "lodash.memoize@npm:4.1.2" @@ -10708,7 +10880,7 @@ __metadata: languageName: node linkType: hard -"lodash.once@npm:^4.1.1": +"lodash.once@npm:^4.0.0, lodash.once@npm:^4.1.1": version: 4.1.1 resolution: "lodash.once@npm:4.1.1" checksum: d768fa9f9b4e1dc6453be99b753906f58990e0c45e7b2ca5a3b40a33111e5d17f6edf2f768786e2716af90a8e78f8f91431ab8435f761fef00f9b0c256f6d245 @@ -10722,7 +10894,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:4.17.21, lodash@npm:>=4 <5, lodash@npm:^4.17.15, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:~4.17.0": +"lodash@npm:4.17.21, lodash@npm:^4.17.15, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:~4.17.0": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 @@ -10797,7 +10969,7 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:>=4 <5, lru-cache@npm:^4.1.5": +"lru-cache@npm:^4.1.5": version: 4.1.5 resolution: "lru-cache@npm:4.1.5" dependencies: @@ -10807,7 +10979,7 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^5.0.0, lru-cache@npm:^5.1.1": +"lru-cache@npm:^5.1.1": version: 5.1.1 resolution: "lru-cache@npm:5.1.1" dependencies: @@ -12382,7 +12554,7 @@ __metadata: languageName: node linkType: hard -"parseurl@npm:^1.3.2, parseurl@npm:~1.3.3": +"parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" checksum: 407cee8e0a3a4c5cd472559bca8b6a45b82c124e9a4703302326e9ab60fc1081442ada4e02628efef1eb16197ddc7f8822f5a91fd7d7c86b51f530aedb17dfa2 @@ -12566,6 +12738,15 @@ __metadata: languageName: node linkType: hard +"pg-introspection@npm:^0.0.1-0.3": + version: 0.0.1-0.3 + resolution: "pg-introspection@npm:0.0.1-0.3" + dependencies: + tslib: ^2.4.0 + checksum: cbb391d6034776d286b44f296a3e3db770ee48b092b09296dfdb9234d820a7695e8b77b4c0a09a81ffdc25db5fb7c4a46cc772b32755af49e57621d92c50b738 + languageName: node + linkType: hard + "pg-minify@npm:^1.5.2": version: 1.6.2 resolution: "pg-minify@npm:1.6.2" @@ -12589,17 +12770,13 @@ __metadata: languageName: node linkType: hard -"pg-sql2@npm:4.13.0": - version: 4.13.0 - resolution: "pg-sql2@npm:4.13.0" +"pg-sql2@npm:^5.0.0-0.3": + version: 5.0.0-0.3 + resolution: "pg-sql2@npm:5.0.0-0.3" dependencies: - "@graphile/lru": 4.11.0 - "@types/pg": ">=6 <9" - debug: ">=3 <5" - tslib: ^2.0.1 - peerDependencies: - pg: ">=6.1.0 <9" - checksum: a9ada8a0113d9ea24e435acd627f080512c5b15248afefb0a67e4d01415c8d692b25d731cce58345b0cbef6fab334471b5cb4c5e7a07dc85ded98160aa61cbc2 + "@graphile/lru": ^5.0.0-0.1 + tslib: ^2.4.0 + checksum: ac64009fa0daec4b8981163323e250c2e4a8aad292ccd31ac37a5755e9665fa8d25944975396029c9642183de3e71bf3a49ae07df6a747ad7f4db3742ae5d7d6 languageName: node linkType: hard @@ -12616,7 +12793,7 @@ __metadata: languageName: node linkType: hard -"pg@npm:>=6.1.0 <9, pg@npm:>=6.5 <9, pg@npm:^8.8.0, pg@npm:^8.9.0": +"pg@npm:>=6.5 <9, pg@npm:^8.7.1, pg@npm:^8.8.0, pg@npm:^8.9.0": version: 8.9.0 resolution: "pg@npm:8.9.0" dependencies: @@ -12720,54 +12897,31 @@ __metadata: languageName: node linkType: hard -"postgraphile-core@npm:4.13.0": - version: 4.13.0 - resolution: "postgraphile-core@npm:4.13.0" - dependencies: - graphile-build: 4.13.0 - graphile-build-pg: 4.13.0 - tslib: ^2.0.1 - peerDependencies: - graphql: ">=0.9 <0.14 || ^14.0.2 || ^15.4.0" - pg: ">=6.1.0 <9" - checksum: 4b339843b4e2dde0b4a3076a1d019be0dab6d1c8a30ede6d67fbfba480f58017df76e2ad80c4af49c7dcc4156b41665c726961f1b5c8e4a8c6e593030174206c - languageName: node - linkType: hard - -"postgraphile@npm:^4.13.0": - version: 4.13.0 - resolution: "postgraphile@npm:4.13.0" +"postgraphile@npm:^5.0.0-0.36": + version: 5.0.0-0.36 + resolution: "postgraphile@npm:5.0.0-0.36" dependencies: - "@graphile/lru": 4.11.0 - "@types/json5": ^0.0.30 - "@types/jsonwebtoken": ^9.0.1 - "@types/pg": ">=6 <9" - "@types/ws": ^7.4.0 - body-parser: ^1.15.2 - chalk: ^2.4.2 - commander: ^2.19.0 - debug: ^4.1.1 - finalhandler: ^1.0.6 - graphile-build: 4.13.0 - graphile-build-pg: 4.13.0 - graphile-utils: ^4.13.0 - graphql: ^0.6.0 || ^0.7.0 || ^0.8.0-b || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.2 || ^15.0.0 - graphql-ws: ^5.6.2 - http-errors: ^1.5.1 - iterall: ^1.0.2 - json5: ^2.1.1 - jsonwebtoken: ^9.0.0 - parseurl: ^1.3.2 - pg: ">=6.1.0 <9" - pg-connection-string: ^2.0.0 - pg-sql2: 4.13.0 - postgraphile-core: 4.13.0 - subscriptions-transport-ws: ^0.9.18 - tslib: ^2.1.0 - ws: ^7.4.2 + "@dataplan/pg": 0.0.1-0.27 + "@graphile/lru": ^5.0.0-0.1 + "@types/node": ^16.11.15 + "@types/pg": ^8.6.2 + debug: ^4.3.3 + grafast: ^0.0.1-0.22 + grafserv: ^0.0.1-0.24 + graphile-build: 5.0.0-0.28 + graphile-build-pg: 5.0.0-0.33 + graphile-config: ^0.0.1-0.6 + graphile-export: ^0.0.2-0.4 + graphql: 16.1.0-experimental-stream-defer.6 + iterall: ^1.3.0 + jsonwebtoken: ^8.5.1 + pg: ^8.7.1 + pg-introspection: ^0.0.1-0.3 + ruru: ^2.0.0-0.12 + tslib: ^2.4.0 bin: - postgraphile: cli.js - checksum: 2462335f9518135d2417e29ae715c04c6468ad12fbc5743622e9f1d6ed5b9de5a74fd948b9ca0fe31d6a871ee63fc1b699abc0c3d92a1d9c4586dca17a0b0de8 + postgraphile: dist/cli-run.js + checksum: 777a302660fa6f02b4f3ace0d1916f785acb85ab8322d828bb57c3245109df30f589745a160b18445b907760366c05bdf2db1e25b79e7e4014ee4833446506d7 languageName: node linkType: hard @@ -12801,6 +12955,13 @@ __metadata: languageName: node linkType: hard +"postgres-range@npm:^1.1.1": + version: 1.1.3 + resolution: "postgres-range@npm:1.1.3" + checksum: bf7e194a18c490d02bda0bd02035a8da454d8fd2b22c55d3d03f185c038b2a6f52d0804417d8090864afefc2b7ed664b2d12c2454a4a0f545dcbbb86488fbdf1 + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -12817,7 +12978,7 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^2.8.4": +"prettier@npm:^2.5.1, prettier@npm:^2.8.4": version: 2.8.4 resolution: "prettier@npm:2.8.4" bin: @@ -13866,6 +14027,13 @@ __metadata: languageName: node linkType: hard +"requires-port@npm:^1.0.0": + version: 1.0.0 + resolution: "requires-port@npm:1.0.0" + checksum: eee0e303adffb69be55d1a214e415cf42b7441ae858c76dfc5353148644f6fd6e698926fc4643f510d5c126d12a705e7c8ed7e38061113bdf37547ab356797ff + languageName: node + linkType: hard + "resize-observer-polyfill@npm:^1.5.1": version: 1.5.1 resolution: "resize-observer-polyfill@npm:1.5.1" @@ -14039,6 +14207,22 @@ __metadata: languageName: node linkType: hard +"ruru@npm:^2.0.0-0.12": + version: 2.0.0-0.12 + resolution: "ruru@npm:2.0.0-0.12" + dependencies: + graphile-config: ^0.0.1-0.6 + http-proxy: ^1.18.1 + tslib: ^2.4.0 + yargs: ^17.6.2 + peerDependencies: + graphql: ^16.1.0-experimental-stream-defer.6 + bin: + ruru: dist/cli-run.js + checksum: 74cb217c068af480f8787b12ea0c0bcfa6bb6721576a9fa5d5f3c9004e48fd18da909b8e706dd9568a8db43f3636f3156d052a3a74daca0fea8cf9b24b64f5ff + languageName: node + linkType: hard + "rxjs@npm:^7.0.0, rxjs@npm:^7.5.1, rxjs@npm:^7.5.5, rxjs@npm:^7.5.7": version: 7.8.0 resolution: "rxjs@npm:7.8.0" @@ -14852,6 +15036,16 @@ __metadata: languageName: node linkType: hard +"tamedevil@npm:^0.0.0-0.4": + version: 0.0.0-0.4 + resolution: "tamedevil@npm:0.0.0-0.4" + dependencies: + "@graphile/lru": ^5.0.0-0.1 + tslib: ^2.4.0 + checksum: 919ecacbc477ade21823f7e07de947ab949a321393ceb80ec1f35f262ab42dba8b6233faf197a1d9f08d60c818594687d24caf89c91d52cb504aac83d088d0bf + languageName: node + linkType: hard + "tapable@npm:^2.1.1, tapable@npm:^2.2.0": version: 2.2.1 resolution: "tapable@npm:2.2.1" @@ -15215,7 +15409,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2, tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.4.1, tslib@npm:^2.5.0, tslib@npm:~2.5.0": +"tslib@npm:^2, tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.4.1, tslib@npm:^2.5.0, tslib@npm:~2.5.0": version: 2.5.0 resolution: "tslib@npm:2.5.0" checksum: ae3ed5f9ce29932d049908ebfdf21b3a003a85653a9a140d614da6b767a93ef94f460e52c3d787f0e4f383546981713f165037dc2274df212ea9f8a4541004e1 @@ -16034,7 +16228,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^5.2.0 || ^6.0.0 || ^7.0.0, ws@npm:^7.4.2": +"ws@npm:^5.2.0 || ^6.0.0 || ^7.0.0": version: 7.5.9 resolution: "ws@npm:7.5.9" peerDependencies: @@ -16180,7 +16374,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^17.0.0, yargs@npm:^17.3.1": +"yargs@npm:^17.0.0, yargs@npm:^17.3.1, yargs@npm:^17.4.1, yargs@npm:^17.6.2": version: 17.7.1 resolution: "yargs@npm:17.7.1" dependencies: From 93e0fb63eb3223599179ac4d8704d3ee17f29b4f Mon Sep 17 00:00:00 2001 From: Benjie Gillam Date: Wed, 1 Mar 2023 15:54:31 +0000 Subject: [PATCH 02/13] Convert postgraphile library usage from V4->V5 --- @app/lib/src/GraphileApolloLink.ts | 47 ++- @app/lib/src/withApollo.tsx | 2 +- @app/server/src/app.ts | 12 +- @app/server/src/graphile.config.ts | 391 +++++++++--------- .../src/middleware/installPostGraphile.ts | 86 ++-- 5 files changed, 291 insertions(+), 247 deletions(-) diff --git a/@app/lib/src/GraphileApolloLink.ts b/@app/lib/src/GraphileApolloLink.ts index 669a23ac..a871c304 100644 --- a/@app/lib/src/GraphileApolloLink.ts +++ b/@app/lib/src/GraphileApolloLink.ts @@ -6,8 +6,10 @@ import { Operation, } from "@apollo/client"; import { Request, Response } from "express"; -import { execute, getOperationAST } from "graphql"; -import { HttpRequestHandler } from "postgraphile"; +import { execute, hookArgs, isAsyncIterable } from "grafast"; +import type {} from "grafserv/express/v4"; +import { getOperationAST } from "graphql"; +import type { PostGraphileInstance } from "postgraphile"; export interface GraphileApolloLinkInterface { /** The request object. */ @@ -17,10 +19,7 @@ export interface GraphileApolloLinkInterface { res: Response; /** The instance of the express middleware returned by calling `postgraphile()` */ - postgraphileMiddleware: HttpRequestHandler; - - /** An optional rootValue to use inside resolvers. */ - rootValue?: any; + pgl: PostGraphileInstance; } /** @@ -36,7 +35,7 @@ export class GraphileApolloLink extends ApolloLink { operation: Operation, _forward?: NextLink ): Observable | null { - const { postgraphileMiddleware, req, res, rootValue } = this.options; + const { pgl, req, res } = this.options; return new Observable((observer) => { (async () => { try { @@ -53,22 +52,28 @@ export class GraphileApolloLink extends ApolloLink { } return; } - const schema = await postgraphileMiddleware.getGraphQLSchema(); - const data = - await postgraphileMiddleware.withPostGraphileContextFromReqRes( + const schema = await pgl.getSchema(); + const args = { + schema, + document, + variableValues, + operationName, + }; + await hookArgs(args, pgl.getResolvedPreset(), { + node: { req, res, - {}, - (context) => - execute( - schema, - document, - rootValue || {}, - context, - variableValues, - operationName - ) - ); + }, + expressv4: { + req, + res, + }, + }); + const data = await execute(args); + if (isAsyncIterable(data)) { + data.return?.(); + throw new Error("Iterable not supported by GraphileApolloLink"); + } if (!observer.closed) { observer.next(data); observer.complete(); diff --git a/@app/lib/src/withApollo.tsx b/@app/lib/src/withApollo.tsx index 1c93d144..474f1113 100644 --- a/@app/lib/src/withApollo.tsx +++ b/@app/lib/src/withApollo.tsx @@ -89,7 +89,7 @@ function makeServerSideLink(req: any, res: any) { return new GraphileApolloLink({ req, res, - postgraphileMiddleware: req.app.get("postgraphileMiddleware"), + pgl: req.app.get("pgl"), }); } diff --git a/@app/server/src/app.ts b/@app/server/src/app.ts index 10353bed..50454ed6 100644 --- a/@app/server/src/app.ts +++ b/@app/server/src/app.ts @@ -1,6 +1,5 @@ -import express, { Express } from "express"; -import { IncomingMessage, Server } from "http"; -import { Middleware } from "postgraphile"; +import express, { Express, NextFunction } from "express"; +import { IncomingMessage, Server, ServerResponse } from "http"; import { Duplex } from "stream"; import { cloudflareIps } from "./cloudflare"; @@ -36,6 +35,13 @@ export function getWebsocketMiddlewares( return app.get("websocketMiddlewares"); } +export interface Middleware< + Request extends IncomingMessage, + Response extends ServerResponse +> { + (req: Request, res: Response, next: NextFunction): void; +} + export async function makeApp({ httpServer, }: { diff --git a/@app/server/src/graphile.config.ts b/@app/server/src/graphile.config.ts index ec81bf19..cd3a536e 100644 --- a/@app/server/src/graphile.config.ts +++ b/@app/server/src/graphile.config.ts @@ -1,12 +1,14 @@ -import PgPubsub from "@graphile/pg-pubsub"; -import GraphilePro from "@graphile/pro"; // Requires license key -import PgSimplifyInflectorPlugin from "@graphile-contrib/pg-simplify-inflector"; -import { Request, Response } from "express"; +import { makePgConfig } from "@dataplan/pg/adaptors/pg"; +// TODO: import GraphilePro from "@graphile/pro"; // Requires license key +import { PgSimplifyInflectionPreset } from "@graphile/simplify-inflection"; +import { Request } from "express"; +import type {} from "grafserv/express/v4"; import { NodePlugin } from "graphile-build"; +import { makePgSmartTagsFromFilePlugin } from "graphile-utils"; import { resolve } from "path"; -import { Pool, PoolClient } from "pg"; -import { makePluginHook, Middleware, PostGraphileOptions } from "postgraphile"; -import { makePgSmartTagsFromFilePlugin } from "postgraphile/plugins"; +import { Pool } from "pg"; +import postgraphilePresetAmber from "postgraphile/presets/amber"; +import { makeV4Preset } from "postgraphile/presets/v4"; import OrdersPlugin from "./plugins/Orders"; import PassportLoginPlugin from "./plugins/PassportLoginPlugin"; @@ -15,12 +17,15 @@ import RemoveQueryQueryPlugin from "./plugins/RemoveQueryQueryPlugin"; import SubscriptionsPlugin from "./plugins/SubscriptionsPlugin"; import handleErrors from "./utils/handleErrors"; -export interface OurGraphQLContext { - pgClient: PoolClient; - sessionId: string | null; - rootPgPool: Pool; - login(user: any): Promise; - logout(): Promise; +declare global { + namespace Grafast { + interface Context { + sessionId: string | null; + rootPgPool: Pool; + login(user: any): Promise; + logout(): Promise; + } + } } declare global { @@ -58,74 +63,74 @@ function uuidOrNull(input: string | number | null | undefined): UUID | null { const isDev = process.env.NODE_ENV === "development"; //const isTest = process.env.NODE_ENV === "test"; -const pluginHook = makePluginHook([ - // Add the pub/sub realtime provider - PgPubsub, - - // If we have a Graphile Pro license, then enable the plugin - ...(process.env.GRAPHILE_LICENSE ? [GraphilePro] : []), -]); - interface IPostGraphileOptionsOptions { - websocketMiddlewares?: Middleware[]; + authPgPool: Pool; rootPgPool: Pool; } -export function getPostGraphileOptions({ - websocketMiddlewares, +export function getPreset({ + authPgPool, rootPgPool, }: IPostGraphileOptionsOptions) { - const options: PostGraphileOptions = { - // This is for PostGraphile server plugins: https://www.graphile.org/postgraphile/plugins/ - pluginHook, - - // This is so that PostGraphile installs the watch fixtures, it's also needed to enable live queries - ownerConnectionString: process.env.DATABASE_URL, - - // On production we still want to start even if the database isn't available. - // On development, we want to deal nicely with issues in the database. - // For these reasons, we're going to keep retryOnInitFail enabled for both environments. - retryOnInitFail: !isTest, - - // Add websocket support to the PostGraphile server; you still need to use a subscriptions plugin such as - // @graphile/pg-pubsub - subscriptions: true, - websocketMiddlewares, - - // enableQueryBatching: On the client side, use something like apollo-link-batch-http to make use of this - enableQueryBatching: true, - - // dynamicJson: instead of inputting/outputting JSON as strings, input/output raw JSON objects - dynamicJson: true, - - // ignoreRBAC=false: honour the permissions in your DB - don't expose what you don't GRANT - ignoreRBAC: false, - - // ignoreIndexes=false: honour your DB indexes - only expose things that are fast - ignoreIndexes: false, - - // setofFunctionsContainNulls=false: reduces the number of nulls in your schema - setofFunctionsContainNulls: false, - - // Enable GraphiQL in development - graphiql: isDev || !!process.env.ENABLE_GRAPHIQL, - // Use a fancier GraphiQL with `prettier` for formatting, and header editing. - enhanceGraphiql: true, - // Allow EXPLAIN in development (you can replace this with a callback function if you want more control) - allowExplain: isDev, - - // Disable query logging - we're using morgan - disableQueryLog: true, - - // Custom error handling - handleErrors, - /* - * To use the built in PostGraphile error handling, you can use the - * following code instead of `handleErrors` above. Using `handleErrors` - * gives you much more control (and stability) over how errors are - * output to the user. - */ - /* + const preset: GraphileConfig.Preset = { + pgConfigs: [ + makePgConfig({ + // This is so that PostGraphile installs the watch fixtures + superuserConnectionString: process.env.DATABASE_URL, + + pool: authPgPool, + + schemas: ["app_public"], + + // Enable LISTEN/NOTIFY (for subscriptions/watch mode) + pubsub: true, + }), + ], + + extends: [ + postgraphilePresetAmber, + + makeV4Preset({ + // On production we still want to start even if the database isn't available. + // On development, we want to deal nicely with issues in the database. + // For these reasons, we're going to keep retryOnInitFail enabled for both environments. + retryOnInitFail: !isTest, + + // Add websocket support to the PostGraphile server; you still need to use a subscriptions plugin such as + // @graphile/pg-pubsub + subscriptions: true, + + // dynamicJson: instead of inputting/outputting JSON as strings, input/output raw JSON objects + dynamicJson: true, + + // ignoreRBAC=false: honour the permissions in your DB - don't expose what you don't GRANT + ignoreRBAC: false, + + // ignoreIndexes=false: honour your DB indexes - only expose things that are fast + ignoreIndexes: false, + + // setofFunctionsContainNulls=false: reduces the number of nulls in your schema + setofFunctionsContainNulls: false, + + // Enable GraphiQL in development + graphiql: isDev || !!process.env.ENABLE_GRAPHIQL, + // Use a fancier GraphiQL with `prettier` for formatting, and header editing. + enhanceGraphiql: true, + // Allow EXPLAIN in development (you can replace this with a callback function if you want more control) + allowExplain: isDev, + + // Disable query logging - we're using morgan + // TODO: disableQueryLog: true, + + // Custom error handling + handleErrors, + /* + * To use the built in PostGraphile error handling, you can use the + * following code instead of `handleErrors` above. Using `handleErrors` + * gives you much more control (and stability) over how errors are + * output to the user. + */ + /* // See https://www.graphile.org/postgraphile/debugging/ extendedErrors: isDev || isTest @@ -148,137 +153,135 @@ export function getPostGraphileOptions({ showErrorStack: isDev || isTest, */ - // Automatically update GraphQL schema when database changes - watchPg: isDev, + // Automatically update GraphQL schema when database changes + watchPg: isDev, - // Keep data/schema.graphql up to date - sortExport: true, - exportGqlSchemaPath: isDev - ? `${__dirname}/../../../data/schema.graphql` - : undefined, + // Keep data/schema.graphql up to date + sortExport: true, + exportGqlSchemaPath: isDev + ? `${__dirname}/../../../data/schema.graphql` + : undefined, - /* - * Plugins to enhance the GraphQL schema, see: - * https://www.graphile.org/postgraphile/extending/ - */ - appendPlugins: [ - // PostGraphile adds a `query: Query` field to `Query` for Relay 1 - // compatibility. We don't need that. - RemoveQueryQueryPlugin, - - // Adds support for our `postgraphile.tags.json5` file - TagsFilePlugin, + /* + * Plugins to enhance the GraphQL schema, see: + * https://www.graphile.org/postgraphile/extending/ + */ + appendPlugins: [ + // PostGraphile adds a `query: Query` field to `Query` for Relay 1 + // compatibility. We don't need that. + RemoveQueryQueryPlugin, - // Simplifies the field names generated by PostGraphile. - PgSimplifyInflectorPlugin, + // Adds support for our `postgraphile.tags.json5` file + TagsFilePlugin, - // Omits by default non-primary-key constraint mutations - PrimaryKeyMutationsOnlyPlugin, + // Omits by default non-primary-key constraint mutations + PrimaryKeyMutationsOnlyPlugin, - // Adds the `login` mutation to enable users to log in - PassportLoginPlugin, + // Adds the `login` mutation to enable users to log in + PassportLoginPlugin, - // Adds realtime features to our GraphQL schema - SubscriptionsPlugin, + // Adds realtime features to our GraphQL schema + SubscriptionsPlugin, - // Adds custom orders to our GraphQL schema - OrdersPlugin, - ], + // Adds custom orders to our GraphQL schema + OrdersPlugin, + ], - /* - * Plugins we don't want in our schema - */ - skipPlugins: [ - // Disable the 'Node' interface - NodePlugin, - ], + /* + * Plugins we don't want in our schema + */ + skipPlugins: [ + // Disable the 'Node' interface + NodePlugin, + ], + + graphileBuildOptions: { + /* + * Any properties here are merged into the settings passed to each Graphile + * Engine plugin - useful for configuring how the plugins operate. + */ + + // Makes all SQL function arguments except those with defaults non-nullable + pgStrictFunctions: true, + }, - graphileBuildOptions: { - /* - * Any properties here are merged into the settings passed to each Graphile - * Engine plugin - useful for configuring how the plugins operate. - */ - - // Makes all SQL function arguments except those with defaults non-nullable - pgStrictFunctions: true, - }, - - /* - * Postgres transaction settings for each GraphQL query/mutation to - * indicate to Postgres who is attempting to access the resources. These - * will be referenced by RLS policies/triggers/etc. - * - * Settings set here will be set using the equivalent of `SET LOCAL`, so - * certain things are not allowed. You can override Postgres settings such - * as 'role' and 'search_path' here; but for settings indicating the - * current user, session id, or other privileges to be used by RLS policies - * the setting names must contain at least one and at most two period - * symbols (`.`), and the first segment must not clash with any Postgres or - * extension settings. We find `jwt.claims.*` to be a safe namespace, - * whether or not you're using JWTs. - */ - async pgSettings(req) { - const sessionId = uuidOrNull(req.user?.session_id); - if (sessionId) { - // Update the last_active timestamp (but only do it at most once every 15 seconds to avoid too much churn). - await rootPgPool.query( - "UPDATE app_private.sessions SET last_active = NOW() WHERE uuid = $1 AND last_active < NOW() - INTERVAL '15 seconds'", - [sessionId] - ); - } - return { - // Everyone uses the "visitor" role currently - role: process.env.DATABASE_VISITOR, + /* + * Postgres transaction settings for each GraphQL query/mutation to + * indicate to Postgres who is attempting to access the resources. These + * will be referenced by RLS policies/triggers/etc. + * + * Settings set here will be set using the equivalent of `SET LOCAL`, so + * certain things are not allowed. You can override Postgres settings such + * as 'role' and 'search_path' here; but for settings indicating the + * current user, session id, or other privileges to be used by RLS policies + * the setting names must contain at least one and at most two period + * symbols (`.`), and the first segment must not clash with any Postgres or + * extension settings. We find `jwt.claims.*` to be a safe namespace, + * whether or not you're using JWTs. + */ + async pgSettings(inReq) { + const req = inReq as Request; + const sessionId = uuidOrNull(req.user?.session_id); + if (sessionId) { + // Update the last_active timestamp (but only do it at most once every 15 seconds to avoid too much churn). + await rootPgPool.query( + "UPDATE app_private.sessions SET last_active = NOW() WHERE uuid = $1 AND last_active < NOW() - INTERVAL '15 seconds'", + [sessionId] + ); + } + return { + // Everyone uses the "visitor" role currently + role: process.env.DATABASE_VISITOR, + + /* + * Note, though this says "jwt" it's not actually anything to do with + * JWTs, we just know it's a safe namespace to use, and it means you + * can use JWTs too, if you like, and they'll use the same settings + * names reducing the amount of code you need to write. + */ + "jwt.claims.session_id": sessionId, + }; + }, /* - * Note, though this says "jwt" it's not actually anything to do with - * JWTs, we just know it's a safe namespace to use, and it means you - * can use JWTs too, if you like, and they'll use the same settings - * names reducing the amount of code you need to write. + * These properties are merged into context (the third argument to GraphQL + * resolvers). This is useful if you write your own plugins that need + * access to, e.g., the logged in user. */ - "jwt.claims.session_id": sessionId, - }; - }, - - /* - * These properties are merged into context (the third argument to GraphQL - * resolvers). This is useful if you write your own plugins that need - * access to, e.g., the logged in user. - */ - async additionalGraphQLContextFromRequest( - req - ): Promise> { - return { - // The current session id - sessionId: uuidOrNull(req.user?.session_id), - - // Needed so passport can write to the database - rootPgPool, - - // Use this to tell Passport.js we're logged in - login: (user: any) => - new Promise((resolve, reject) => { - req.login(user, (err) => (err ? reject(err) : resolve())); - }), - - logout: () => { - return new Promise((resolve, reject) => - req.logout((err) => (err ? reject(err) : resolve())) - ); + async additionalGraphQLContextFromRequest(inReq) { + const req = inReq as Request; + return { + // The current session id + sessionId: uuidOrNull(req.user?.session_id), + + // Needed so passport can write to the database + rootPgPool, + + // Use this to tell Passport.js we're logged in + login: (user: any) => + new Promise((resolve, reject) => { + req.login(user, (err) => (err ? reject(err) : resolve())); + }), + + logout: () => { + return new Promise((resolve, reject) => + req.logout((err) => (err ? reject(err) : resolve())) + ); + }, + }; }, - }; - }, - - // Pro plugin options (requires process.env.GRAPHILE_LICENSE) - defaultPaginationCap: - parseInt(process.env.GRAPHQL_PAGINATION_CAP || "", 10) || 50, - graphqlDepthLimit: - parseInt(process.env.GRAPHQL_DEPTH_LIMIT || "", 10) || 12, - graphqlCostLimit: - parseInt(process.env.GRAPHQL_COST_LIMIT || "", 10) || 30000, - exposeGraphQLCost: - (parseInt(process.env.HIDE_QUERY_COST || "", 10) || 0) < 1, - // readReplicaPgPool ..., + + // Pro plugin options (requires process.env.GRAPHILE_LICENSE) + // TODO: defaultPaginationCap: parseInt(process.env.GRAPHQL_PAGINATION_CAP || "", 10) || 50, + // TODO: graphqlDepthLimit: parseInt(process.env.GRAPHQL_DEPTH_LIMIT || "", 10) || 12, + // TODO: graphqlCostLimit: parseInt(process.env.GRAPHQL_COST_LIMIT || "", 10) || 30000, + // TODO: exposeGraphQLCost: (parseInt(process.env.HIDE_QUERY_COST || "", 10) || 0) < 1, + // readReplicaPgPool ..., + }), + + // Simplifies the field names generated by PostGraphile. + PgSimplifyInflectionPreset, + ], }; - return options; + return preset; } diff --git a/@app/server/src/middleware/installPostGraphile.ts b/@app/server/src/middleware/installPostGraphile.ts index 5cd253ec..98e5d27f 100644 --- a/@app/server/src/middleware/installPostGraphile.ts +++ b/@app/server/src/middleware/installPostGraphile.ts @@ -1,13 +1,15 @@ import { Express, Request, Response } from "express"; -import { createServer } from "http"; -import { enhanceHttpServerWithSubscriptions, postgraphile } from "postgraphile"; +import { grafserv } from "grafserv/express/v4"; +import { createServer , ServerResponse } from "http"; +import { OutgoingHttpHeaders } from "http2"; +import { postgraphile } from "postgraphile"; import { getHttpServer, getUpgradeHandlers, getWebsocketMiddlewares, } from "../app"; -import { getPostGraphileOptions } from "../graphile.config"; +import { getPreset } from "../graphile.config"; import { getAuthPgPool, getRootPgPool } from "./installDatabasePools"; export default async function installPostGraphile(app: Express) { @@ -15,41 +17,69 @@ export default async function installPostGraphile(app: Express) { const authPgPool = getAuthPgPool(app); const rootPgPool = getRootPgPool(app); const httpServer = getHttpServer(app); - // Forbid PostGraphile from adding websocket listeners to httpServer - (httpServer as any)["__postgraphileSubscriptionsEnabled"] = true; - const middleware = postgraphile( - authPgPool, - "app_public", - getPostGraphileOptions({ - websocketMiddlewares, + + const pgl = postgraphile( + getPreset({ + authPgPool, rootPgPool, }) ); - app.set("postgraphileMiddleware", middleware); - - app.use(middleware); + app.set("pgl", pgl); - // Extract the upgrade handler from PostGraphile so we can mix it with - // other upgrade handlers. - const fakeHttpServer = createServer(); - await enhanceHttpServerWithSubscriptions(fakeHttpServer, middleware); - const postgraphileUpgradeHandler = fakeHttpServer.listeners( - "upgrade" - )[0] as any; - // Prevent PostGraphile registering its websocket handler + const serv = pgl.createServ(grafserv); + serv.addTo(app, httpServer, false); - // Now handle websockets - if (postgraphileUpgradeHandler) { + // Handle websockets + const onUpgrade = await serv.getUpgradeHandler(); + if (onUpgrade) { const upgradeHandlers = getUpgradeHandlers(app); upgradeHandlers.push({ name: "PostGraphile", - check(req) { - return ( - (req.url === "/graphql" || req.url?.startsWith("/graphql?")) ?? false - ); + check: serv.shouldHandleUpgrade.bind(serv), + async upgrade(originalReq, socket, head) { + const req = originalReq as Request; + // Create a "dummy" response to trick our small array of middlewares into running + const dummyRes = new ServerResponse(req) as Response; + dummyRes.writeHead = (( + statusCode: number, + _statusMessage?: OutgoingHttpHeaders | string | undefined, + headers?: OutgoingHttpHeaders | undefined + ): Response => { + if (statusCode && statusCode > 200) { + // tslint:disable-next-line no-console + console.error( + `Something used 'writeHead' to write a '${statusCode}' error for websockets - check the middleware you're passing!` + ); + socket.destroy(); + } else if (headers) { + // tslint:disable-next-line no-console + console.error( + "Passing headers to 'writeHead' is not supported with websockets currently - check the middleware you're passing" + ); + socket.destroy(); + } + return dummyRes; + }) as any; + (req as any).res = dummyRes; + // Apply websocket middlewares + try { + for (const middleware of websocketMiddlewares) { + await new Promise((resolve, reject) => + middleware(req, dummyRes, (err: any) => + err ? reject(err) : resolve() + ) + ); + } + return onUpgrade(req, socket, head); + } catch (e) { + console.error( + "Error occurred whilst applying websocket middlewares", + e + ); + socket.destroy(); + } }, - upgrade: postgraphileUpgradeHandler, }); } } From 9de90c0e23b0c078c5ac7f227134613cb4585aa5 Mon Sep 17 00:00:00 2001 From: Benjie Gillam Date: Fri, 24 Feb 2023 17:10:21 +0000 Subject: [PATCH 03/13] Convert plugins to V5 --- @app/server/src/plugins/Orders.ts | 58 ++++++-- .../server/src/plugins/PassportLoginPlugin.ts | 107 ++++++++------- .../plugins/PrimaryKeyMutationsOnlyPlugin.ts | 37 ++--- .../src/plugins/RemoveQueryQueryPlugin.ts | 22 +-- .../server/src/plugins/SubscriptionsPlugin.ts | 129 +++++++----------- 5 files changed, 188 insertions(+), 165 deletions(-) diff --git a/@app/server/src/plugins/Orders.ts b/@app/server/src/plugins/Orders.ts index 0d81bab7..fc8dd78d 100644 --- a/@app/server/src/plugins/Orders.ts +++ b/@app/server/src/plugins/Orders.ts @@ -1,19 +1,59 @@ import { makeAddPgTableOrderByPlugin, orderByAscDesc } from "graphile-utils"; +import type { SQL } from "pg-sql2"; + +/* +// This is a rudimentary translation of the old V4 plugin using a subquery, +// just to show changes can be minimal: export default makeAddPgTableOrderByPlugin( - "app_public", - "organization_memberships", - ({ pgSql: sql }) => { + { schemaName: "app_public", tableName: "organization_memberships" }, + ({ sql }) => { const sqlIdentifier = sql.identifier(Symbol("member")); - return orderByAscDesc( - "MEMBER_NAME", - // @ts-ignore - ({ queryBuilder }) => sql.fragment`( + return orderByAscDesc("MEMBER_NAME", ($organizationMemberships) => ({ + fragment: sql.fragment`( select ${sqlIdentifier}.name from app_public.users as ${sqlIdentifier} - where ${sqlIdentifier}.id = ${queryBuilder.getTableAlias()}.user_id + where ${sqlIdentifier}.id = ${$organizationMemberships.alias}.user_id limit 1 - )` + )`, + codec: TYPES.text, + })); + } +); + +// But what follows is a more efficient implementation using a join: +*/ + +export default makeAddPgTableOrderByPlugin( + { schemaName: "app_public", tableName: "organization_memberships" }, + (build) => { + const { + sql, + input: { pgSources }, + } = build; + const usersSource = pgSources.find( + (s) => + !s.parameters && + s.extensions?.pg?.schemaName === "app_public" && + s.extensions.pg.name === "users" ); + if (!usersSource) { + throw new Error(`Couldn't find the source for app_public.users`); + } + const sqlIdentifier = sql.identifier(Symbol("member")); + return orderByAscDesc("MEMBER_NAME", ($organizationMemberships) => { + $organizationMemberships.join({ + type: "inner", + source: usersSource.source as SQL, + alias: sqlIdentifier, + conditions: [ + sql`${sqlIdentifier}.id = ${$organizationMemberships.alias}.user_id`, + ], + }); + return { + fragment: sql`${sqlIdentifier}.name`, + codec: usersSource.codec.columns["name"].codec, + }; + }); } ); diff --git a/@app/server/src/plugins/PassportLoginPlugin.ts b/@app/server/src/plugins/PassportLoginPlugin.ts index bca1b432..a4f42878 100644 --- a/@app/server/src/plugins/PassportLoginPlugin.ts +++ b/@app/server/src/plugins/PassportLoginPlugin.ts @@ -1,6 +1,8 @@ -import { gql, makeExtendSchemaPlugin, Resolvers } from "graphile-utils"; +import { PgClassExpressionStep } from "@dataplan/pg"; +import { access, SafeError } from "grafast"; +import { gql, makeExtendSchemaPlugin,Plans,Resolvers } from "graphile-utils"; -import { OurGraphQLContext } from "../graphile.config"; +import type {} from "../middleware/installPostGraphile"; import { ERROR_MESSAGE_OVERRIDES } from "../utils/handleErrors"; const PassportLoginPlugin = makeExtendSchemaPlugin((build) => { @@ -14,7 +16,7 @@ const PassportLoginPlugin = makeExtendSchemaPlugin((build) => { } type RegisterPayload { - user: User! @pgField + user: User! } input LoginInput { @@ -23,7 +25,7 @@ const PassportLoginPlugin = makeExtendSchemaPlugin((build) => { } type LoginPayload { - user: User! @pgField + user: User! } type LogoutPayload { @@ -85,12 +87,40 @@ const PassportLoginPlugin = makeExtendSchemaPlugin((build) => { resetPassword(input: ResetPasswordInput!): ResetPasswordPayload } `; + const userSource = build.input.pgSources.find((s) => s.name === "users"); + const currentUserIdSource = build.input.pgSources.find( + (s) => s.name === "current_user_id" + ); + if (!userSource || !currentUserIdSource) { + throw new Error( + "Couldn't find either the 'users' or 'current_user_id' source" + ); + } + const plans: Plans = { + RegisterPayload: { + user($obj) { + const $userId = access($obj, "userId"); + return userSource.get({ id: $userId }); + }, + }, + LoginPayload: { + user() { + const $userId = currentUserIdSource.execute() as PgClassExpressionStep< + any, + any, + any, + any, + any + >; + return userSource.get({ id: $userId }); + }, + }, + }; const resolvers: Resolvers = { Mutation: { - async register(_mutation, args, context: OurGraphQLContext, resolveInfo) { - const { selectGraphQLResultFromTable } = resolveInfo.graphile; + async register(_mutation, args, context: Grafast.Context) { const { username, password, email, name, avatarUrl } = args.input; - const { rootPgPool, login, pgClient } = context; + const { rootPgPool, login, pgSettings } = context; try { // Create a user and create a session for it in the proccess const { @@ -123,28 +153,15 @@ const PassportLoginPlugin = makeExtendSchemaPlugin((build) => { } if (details.session_id) { - // Store into transaction - await pgClient.query( - `select set_config('jwt.claims.session_id', $1, true)`, - [details.session_id] - ); + // Update pgSettings so future queries will use the new session + pgSettings!["jwt.claims.session_id"] = details.session_id; // Tell Passport.js we're logged in await login({ session_id: details.session_id }); } - // Fetch the data that was requested from GraphQL, and return it - const sql = build.pgSql; - const [row] = await selectGraphQLResultFromTable( - sql.fragment`app_public.users`, - (tableAlias, sqlBuilder) => { - sqlBuilder.where( - sql.fragment`${tableAlias}.id = ${sql.value(details.user_id)}` - ); - } - ); return { - data: row, + userId: details.user_id, }; } catch (e: any) { const { code } = e; @@ -155,6 +172,7 @@ const PassportLoginPlugin = makeExtendSchemaPlugin((build) => { ...Object.keys(ERROR_MESSAGE_OVERRIDES), ]; if (safeErrorCodes.includes(code)) { + // TODO: make SafeError throw e; } else { console.error( @@ -167,10 +185,9 @@ const PassportLoginPlugin = makeExtendSchemaPlugin((build) => { } } }, - async login(_mutation, args, context: OurGraphQLContext, resolveInfo) { - const { selectGraphQLResultFromTable } = resolveInfo.graphile; + async login(_mutation, args, context: Grafast.Context) { const { username, password } = args.input; - const { rootPgPool, login, pgClient } = context; + const { rootPgPool, login, pgSettings } = context; try { // Call our login function to find out if the username/password combination exists const { @@ -191,29 +208,15 @@ const PassportLoginPlugin = makeExtendSchemaPlugin((build) => { await login({ session_id: session.uuid }); } - // Get session_id from PG - await pgClient.query( - `select set_config('jwt.claims.session_id', $1, true)`, - [session.uuid] - ); + // Update pgSettings so future queries will use the new session + pgSettings!["jwt.claims.session_id"] = session.uuid; - // Fetch the data that was requested from GraphQL, and return it - const sql = build.pgSql; - const [row] = await selectGraphQLResultFromTable( - sql.fragment`app_public.users`, - (tableAlias, sqlBuilder) => { - sqlBuilder.where( - sql.fragment`${tableAlias}.id = app_public.current_user_id()` - ); - } - ); - return { - data: row, - }; + return {}; } catch (e: any) { const code = e.extensions?.code ?? e.code; const safeErrorCodes = ["LOCKD", "CREDS"]; if (safeErrorCodes.includes(code)) { + // TODO: throw SafeError throw e; } else { console.error(e); @@ -224,21 +227,18 @@ const PassportLoginPlugin = makeExtendSchemaPlugin((build) => { } }, - async logout(_mutation, _args, context: OurGraphQLContext, _resolveInfo) { - const { pgClient, logout } = context; - await pgClient.query("select app_public.logout();"); + async logout(_mutation, _args, context: Grafast.Context) { + const { pgSettings, withPgClient, logout } = context; + await withPgClient(pgSettings, (pgClient) => + pgClient.query({ text: "select app_public.logout();" }) + ); await logout(); return { success: true, }; }, - async resetPassword( - _mutation, - args, - context: OurGraphQLContext, - _resolveInfo - ) { + async resetPassword(_mutation, args, context: Grafast.Context) { const { rootPgPool } = context; const { userId, resetToken, newPassword, clientMutationId } = args.input; @@ -264,6 +264,7 @@ const PassportLoginPlugin = makeExtendSchemaPlugin((build) => { }; return { typeDefs, + plans, resolvers, }; }); diff --git a/@app/server/src/plugins/PrimaryKeyMutationsOnlyPlugin.ts b/@app/server/src/plugins/PrimaryKeyMutationsOnlyPlugin.ts index 7659a1f6..e80ea0ae 100644 --- a/@app/server/src/plugins/PrimaryKeyMutationsOnlyPlugin.ts +++ b/@app/server/src/plugins/PrimaryKeyMutationsOnlyPlugin.ts @@ -1,24 +1,27 @@ -import { Plugin } from "graphile-build"; +import type {} from "postgraphile"; -type PgConstraint = any; - -const PrimaryKeyMutationsOnlyPlugin: Plugin = (builder) => { - builder.hook( - "build", - (build) => { - build.pgIntrospectionResultsByKind.constraint.forEach( - (constraint: PgConstraint) => { - if (!constraint.tags.omit && constraint.type !== "p") { - constraint.tags.omit = ["update", "delete"]; +const PrimaryKeyMutationsOnlyPlugin: GraphileConfig.Plugin = { + name: "PrimaryKeyMutationsOnlyPlugin", + version: "0.0.0", + gather: { + hooks: { + pgIntrospection_introspection(info, event) { + const { introspection } = event; + for (const pgConstraint of introspection.constraints) { + if (pgConstraint.contype === "u") { + const tags = pgConstraint.getTags(); + const newBehavior = ["-update", "-delete"]; + if (typeof tags.behavior === "string") { + newBehavior.push(tags.behavior); + } else if (Array.isArray(tags.behavior)) { + newBehavior.push(...(tags.behavior as string[])); + } + tags.behavior = newBehavior; } } - ); - return build; + }, }, - [], - [], - ["PgIntrospection"] - ); + }, }; export default PrimaryKeyMutationsOnlyPlugin; diff --git a/@app/server/src/plugins/RemoveQueryQueryPlugin.ts b/@app/server/src/plugins/RemoveQueryQueryPlugin.ts index eee6a30a..f1b43968 100644 --- a/@app/server/src/plugins/RemoveQueryQueryPlugin.ts +++ b/@app/server/src/plugins/RemoveQueryQueryPlugin.ts @@ -1,12 +1,16 @@ -import { Plugin } from "postgraphile"; - -const RemoveQueryQueryPlugin: Plugin = (builder) => { - builder.hook("GraphQLObjectType:fields", (fields, build, context) => { - if (context.scope.isRootQuery) { - delete fields.query; - } - return fields; - }); +const RemoveQueryQueryPlugin: GraphileConfig.Plugin = { + name: "RemoveQueryQueryPlugin", + version: "0.0.0", + schema: { + hooks: { + GraphQLObjectType_fields(fields, _build, context) { + if (context.scope.isRootQuery) { + delete fields.query; + } + return fields; + }, + }, + }, }; export default RemoveQueryQueryPlugin; diff --git a/@app/server/src/plugins/SubscriptionsPlugin.ts b/@app/server/src/plugins/SubscriptionsPlugin.ts index a4c1afb7..7d723049 100644 --- a/@app/server/src/plugins/SubscriptionsPlugin.ts +++ b/@app/server/src/plugins/SubscriptionsPlugin.ts @@ -1,27 +1,7 @@ -import { Build } from "graphile-build"; -import { QueryBuilder, SQL } from "graphile-build-pg"; -import { - embed /*, AugmentedGraphQLFieldResolver */, - gql, - makeExtendSchemaPlugin, -} from "graphile-utils"; -// graphile-utils doesn't export this yet -import { GraphQLResolveInfo } from "graphql"; - -import { OurGraphQLContext } from "../graphile.config"; -type GraphileHelpers = any; -type AugmentedGraphQLFieldResolver< - TSource, - TContext, - TArgs = { [argName: string]: any } -> = ( - parent: TSource, - args: TArgs, - context: TContext, - info: GraphQLResolveInfo & { - graphile: GraphileHelpers; - } -) => any; +import { jsonParse } from "@dataplan/json"; +import { PgClassExpressionStep } from "@dataplan/pg"; +import { access, context, lambda, listen, object, SafeError } from "grafast"; +import { gql, makeExtendSchemaPlugin } from "graphile-utils"; /* * PG NOTIFY events are sent via a channel, this function helps us determine @@ -31,27 +11,13 @@ type AugmentedGraphQLFieldResolver< * NOTE: channels are limited to 63 characters in length (this is a PostgreSQL * limitation). */ -const currentUserTopicFromContext = async ( - _args: {}, - context: { [key: string]: any }, - _resolveInfo: GraphQLResolveInfo -) => { - let userId: number | null = null; - if (context.sessionId /* fail fast */) { - // We have the users session ID, but to get their actual ID we need to ask the database. - const { - rows: [user], - } = await context.pgClient.query( - "select app_public.current_user_id() as id" - ); - userId = user?.id; - } +function currentUserTopicByUserId(userId: number | null) { if (userId) { return `graphql:user:${userId}`; } else { - throw new Error("You're not logged in"); + throw new SafeError("You're not logged in"); } -}; +} /* * This plugin adds a number of custom subscriptions to our schema. By making @@ -67,10 +33,25 @@ const currentUserTopicFromContext = async ( * And see the database trigger function `app_public.tg__graphql_subscription()`. */ const SubscriptionsPlugin = makeExtendSchemaPlugin((build) => { - const { pgSql: sql } = build; + const currentUserIdSource = build.input.pgSources.find( + (s) => s.name === "current_user_id" + ); + if (!currentUserIdSource) { + throw new Error("Couldn't find current_user_id source"); + } + const usersSource = build.input.pgSources.find( + (s) => + !s.parameters && + s.extensions?.pg?.schemaName === "app_public" && + s.extensions.pg.name === "users" + ); + if (!usersSource) { + throw new Error("Couldn't find source for app_public.users"); + } + return { typeDefs: gql` - type UserSubscriptionPayload { + type UserSubscriptionPayload { user: User # Populated by our resolver below event: String # Part of the NOTIFY payload } @@ -79,14 +60,36 @@ const SubscriptionsPlugin = makeExtendSchemaPlugin((build) => { """ Triggered when the logged in user's record is updated in some way. """ - currentUserUpdated: UserSubscriptionPayload @pgSubscription(topic: ${embed( - currentUserTopicFromContext - )}) + currentUserUpdated: UserSubscriptionPayload } `, - resolvers: { + plans: { + Subscription: { + currentUserUpdated: { + subscribePlan() { + const $pgSubscriber = context().get("pgSubscriber"); + // We have the users session ID, but to get their actual ID we need to ask the database. + const $userId = + currentUserIdSource.execute() as PgClassExpressionStep< + any, + any, + any, + any, + any + >; + const $topic = lambda($userId, currentUserTopicByUserId); + return listen($pgSubscriber, $topic, (e) => e); + }, + plan($e) { + return jsonParse($e); + }, + }, + }, UserSubscriptionPayload: { - user: recordByIdFromTable(build, sql.fragment`app_public.users`), + user($obj) { + const $id = access($obj, "subject"); + return usersSource.get({ id: $id }); + }, }, }, }; @@ -96,35 +99,7 @@ const SubscriptionsPlugin = makeExtendSchemaPlugin((build) => { interface TgGraphQLSubscriptionPayload { event: string; subject: string | null; -} - -/* - * This function handles the boilerplate of fetching a record from the database - * which has the 'id' equal to the 'subject' from the PG NOTIFY event payload - * (see `tg__graphql_subscription()` trigger function in the database). - */ - -function recordByIdFromTable( - build: Build, - sqlTable: SQL -): AugmentedGraphQLFieldResolver { - const { pgSql: sql } = build; - return async ( - event: TgGraphQLSubscriptionPayload, - _args: {}, - _context: OurGraphQLContext, - { graphile: { selectGraphQLResultFromTable } } - ) => { - const rows = await selectGraphQLResultFromTable( - sqlTable, - (tableAlias: SQL, sqlBuilder: QueryBuilder) => { - sqlBuilder.where( - sql.fragment`${tableAlias}.id = ${sql.value(event.subject)}` - ); - } - ); - return rows[0]; - }; + [key: string]: string | null; } export default SubscriptionsPlugin; From 23e15dd8539b5eb17b99a8c5c3cf47d0f4497a54 Mon Sep 17 00:00:00 2001 From: Benjie Gillam Date: Mon, 27 Feb 2023 16:48:33 +0000 Subject: [PATCH 04/13] Render Ruru --- @app/server/src/middleware/installHelmet.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/@app/server/src/middleware/installHelmet.ts b/@app/server/src/middleware/installHelmet.ts index 1006cc65..9f2b49ff 100644 --- a/@app/server/src/middleware/installHelmet.ts +++ b/@app/server/src/middleware/installHelmet.ts @@ -38,9 +38,11 @@ export default async function installHelmet(app: Express) { } // Dev needs 'unsafe-eval' due to // https://github.com/vercel/next.js/issues/14221 + // Ruru needs 'unsafe-inline' options.contentSecurityPolicy.directives!["script-src"] = [ "'self'", "'unsafe-eval'", + "'unsafe-inline'", ]; } if (isDevOrTest || !!process.env.ENABLE_GRAPHIQL) { From 4fa466fe54c3c56db66aaffcd3a35425401aaebf Mon Sep 17 00:00:00 2001 From: Benjie Gillam Date: Thu, 2 Mar 2023 10:26:15 +0000 Subject: [PATCH 05/13] Fix server tests for V5 --- @app/server/__tests__/helpers.ts | 187 ++++++++++++++-------------- @app/server/__tests__/tsconfig.json | 4 + 2 files changed, 97 insertions(+), 94 deletions(-) create mode 100644 @app/server/__tests__/tsconfig.json diff --git a/@app/server/__tests__/helpers.ts b/@app/server/__tests__/helpers.ts index d0694536..f28c06db 100644 --- a/@app/server/__tests__/helpers.ts +++ b/@app/server/__tests__/helpers.ts @@ -1,18 +1,21 @@ -import { Request, Response } from "express"; -import { ExecutionResult, graphql, GraphQLSchema } from "graphql"; -import { Pool, PoolClient } from "pg"; +import { makeWithPgClientViaPgClientAlreadyInTransaction } from "@dataplan/pg/adaptors/pg"; +import { execute, hookArgs } from "grafast"; import { - createPostGraphileSchema, - PostGraphileOptions, - withPostGraphileContext, -} from "postgraphile"; + ExecutionArgs, + ExecutionResult, + GraphQLSchema, + parse, + validate, +} from "graphql"; +import { Pool, PoolClient } from "pg"; +import { postgraphile, PostGraphileInstance } from "postgraphile"; import { createSession, createUsers, poolFromUrl, } from "../../__tests__/helpers"; -import { getPostGraphileOptions } from "../src/graphile.config"; +import { getPreset } from "../src/graphile.config"; export * from "../../__tests__/helpers"; @@ -96,7 +99,7 @@ export function sanitize(json: any): any { // Contains the PostGraphile schema and rootPgPool interface ICtx { rootPgPool: Pool; - options: PostGraphileOptions; + pgl: PostGraphileInstance; schema: GraphQLSchema; } let ctx: ICtx | null = null; @@ -106,17 +109,14 @@ export const setup = async () => { connectionString: process.env.TEST_DATABASE_URL, }); - const options = getPostGraphileOptions({ rootPgPool }); - const schema = await createPostGraphileSchema( - rootPgPool, - "app_public", - options - ); + const preset = getPreset({ rootPgPool, authPgPool: rootPgPool }); + const pgl = postgraphile(preset); + const schema = await pgl.getSchema(); // Store the context ctx = { rootPgPool, - options, + pgl, schema, }; }; @@ -146,9 +146,10 @@ export const runGraphQLQuery = async function runGraphQLQuery( ) => void | ExecutionResult | Promise = () => {} // Place test assertions in this function ) { if (!ctx) throw new Error("No ctx!"); - const { schema, rootPgPool, options } = ctx; + const { schema, rootPgPool, pgl } = ctx; + const resolvedPreset = pgl.getResolvedPreset(); const req = new MockReq({ - url: options.graphqlRoute || "/graphql", + url: resolvedPreset.grafserv?.graphqlPath || "/graphql", method: "POST", headers: { Accept: "application/json", @@ -159,92 +160,90 @@ export const runGraphQLQuery = async function runGraphQLQuery( const res: any = { req }; req.res = res; - const { - pgSettings: pgSettingsGenerator, - additionalGraphQLContextFromRequest, - } = options; - const pgSettings = - (typeof pgSettingsGenerator === "function" - ? await pgSettingsGenerator(req) - : pgSettingsGenerator) || {}; + let checkResult: ExecutionResult | void; + const document = parse(query); + const errors = validate(schema, document); + if (errors.length > 0) { + throw errors[0]; + } + const args: ExecutionArgs = { + schema, + document, + contextValue: { + __TESTING: true, + }, + variableValues: variables, + }; + await hookArgs(args, resolvedPreset, { + node: { req, res }, + expressv4: { req, res }, + }); // Because we're connected as the database owner, we should manually switch to // the authenticator role - if (!pgSettings.role) { - pgSettings.role = process.env.DATABASE_AUTHENTICATOR; + const context = args.contextValue as Grafast.Context; + if (!context.pgSettings?.role) { + context.pgSettings = context.pgSettings ?? {}; + context.pgSettings.role = process.env.DATABASE_AUTHENTICATOR as string; } - await withPostGraphileContext( - { - ...options, - pgPool: rootPgPool, - pgSettings, - pgForceTransaction: true, - }, - async (context) => { - let checkResult; - const { pgClient } = context; - try { - // This runs our GraphQL query, passing the replacement client - const additionalContext = additionalGraphQLContextFromRequest - ? await additionalGraphQLContextFromRequest(req, res) - : null; - const result = await graphql( - schema, - query, - null, - { - ...context, - ...additionalContext, - __TESTING: true, - }, - variables - ); - // Expand errors - if (result.errors) { - if (options.handleErrors) { - result.errors = options.handleErrors(result.errors); - } else { - // This does a similar transform that PostGraphile does to errors. - // It's not the same. Sorry. - result.errors = result.errors.map((rawErr) => { - const e = Object.create(rawErr); - Object.defineProperty(e, "originalError", { - value: rawErr.originalError, - enumerable: false, - }); - - if (e.originalError) { - Object.keys(e.originalError).forEach((k) => { - try { - e[k] = e.originalError[k]; - } catch (err) { - // Meh. - } - }); + const pgClient = await rootPgPool.connect(); + try { + await pgClient.query("begin"); + + // Override withPgClient with a transactional version for the tests + const withPgClient = makeWithPgClientViaPgClientAlreadyInTransaction( + pgClient, + true + ); + context.withPgClient = withPgClient; + + const result = (await execute(args, resolvedPreset)) as ExecutionResult; + // Expand errors + if (result.errors) { + if (resolvedPreset.grafserv?.maskError) { + result.errors = result.errors.map(resolvedPreset.grafserv.maskError); + } else { + // This does a similar transform that PostGraphile does to errors. + // It's not the same. Sorry. + result.errors = result.errors.map((rawErr) => { + const e = Object.create(rawErr); + Object.defineProperty(e, "originalError", { + value: rawErr.originalError, + enumerable: false, + }); + + if (e.originalError) { + Object.keys(e.originalError).forEach((k) => { + try { + e[k] = e.originalError[k]; + } catch (err) { + // Meh. } - return e; }); } - } - - // This is were we call the `checker` so you can do your assertions. - // Also note that we pass the `replacementPgClient` so that you can - // query the data in the database from within the transaction before it - // gets rolled back. - checkResult = await checker(result, { - pgClient, + return e; }); + } + } - // You don't have to keep this, I just like knowing when things change! - expect(sanitize(result)).toMatchSnapshot(); + // This is were we call the `checker` so you can do your assertions. + // Also note that we pass the `replacementPgClient` so that you can + // query the data in the database from within the transaction before it + // gets rolled back. + checkResult = await checker(result, { + pgClient, + }); - return checkResult == null ? result : checkResult; - } finally { - // Rollback the transaction so no changes are written to the DB - this - // makes our tests fairly deterministic. - await pgClient.query("rollback"); - } + // You don't have to keep this, I just like knowing when things change! + expect(sanitize(result)).toMatchSnapshot(); + + return checkResult == null ? result : checkResult; + } finally { + try { + await pgClient.query("rollback"); + } finally { + pgClient.release(); } - ); + } }; diff --git a/@app/server/__tests__/tsconfig.json b/@app/server/__tests__/tsconfig.json new file mode 100644 index 00000000..379a994d --- /dev/null +++ b/@app/server/__tests__/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../tsconfig.json", + "include": ["."] +} From 05450509ec4364e4f4601307acd55e4b5475cf11 Mon Sep 17 00:00:00 2001 From: Benjie Gillam Date: Wed, 8 Mar 2023 16:41:07 +0000 Subject: [PATCH 06/13] Update GraphQL schema for V5 --- data/schema.graphql | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/data/schema.graphql b/data/schema.graphql index 862c36cd..408aa945 100644 --- a/data/schema.graphql +++ b/data/schema.graphql @@ -97,7 +97,7 @@ type CreateOrganizationPayload { """An edge for our `Organization`. May be used by Relay 1.""" organizationEdge( """The method to use when ordering `Organization`.""" - orderBy: [OrganizationsOrderBy!] = [PRIMARY_KEY_ASC] + orderBy: [OrganizationsOrderBy!]! = [PRIMARY_KEY_ASC] ): OrganizationsEdge """ @@ -140,7 +140,7 @@ type CreateUserEmailPayload { """An edge for our `UserEmail`. May be used by Relay 1.""" userEmailEdge( """The method to use when ordering `UserEmail`.""" - orderBy: [UserEmailsOrderBy!] = [PRIMARY_KEY_ASC] + orderBy: [UserEmailsOrderBy!]! = [PRIMARY_KEY_ASC] ): UserEmailsEdge } @@ -194,7 +194,6 @@ type DeleteUserAuthenticationPayload { unchanged and unused. May be used by a client to track mutations. """ clientMutationId: String - deletedUserAuthenticationNodeId: ID """ Our root query field type. Allows us to run any query from our mutation payload. @@ -225,7 +224,6 @@ type DeleteUserEmailPayload { unchanged and unused. May be used by a client to track mutations. """ clientMutationId: String - deletedUserEmailNodeId: ID """ Our root query field type. Allows us to run any query from our mutation payload. @@ -241,7 +239,7 @@ type DeleteUserEmailPayload { """An edge for our `UserEmail`. May be used by Relay 1.""" userEmailEdge( """The method to use when ordering `UserEmail`.""" - orderBy: [UserEmailsOrderBy!] = [PRIMARY_KEY_ASC] + orderBy: [UserEmailsOrderBy!]! = [PRIMARY_KEY_ASC] ): UserEmailsEdge } @@ -338,7 +336,7 @@ type MakeEmailPrimaryPayload { """An edge for our `UserEmail`. May be used by Relay 1.""" userEmailEdge( """The method to use when ordering `UserEmail`.""" - orderBy: [UserEmailsOrderBy!] = [PRIMARY_KEY_ASC] + orderBy: [UserEmailsOrderBy!]! = [PRIMARY_KEY_ASC] ): UserEmailsEdge } @@ -751,13 +749,19 @@ type PageInfo { type Query { """The currently logged in user (or null if not logged in).""" currentUser: User + + """Get a single `Organization`.""" organization(id: UUID!): Organization + + """Get a single `Organization`.""" organizationBySlug(slug: String!): Organization """ Given an invitation UUID (and, if required, the code that was emailed to you), retrieves the `Organization` that you were invited to. """ organizationForInvitation(code: String, invitationId: UUID!): Organization + + """Get a single `OrganizationMembership`.""" organizationMembership(id: UUID!): OrganizationMembership """Reads and enables pagination through a set of `Organization`.""" @@ -788,9 +792,17 @@ type Query { """The method to use when ordering `Organization`.""" orderBy: [OrganizationsOrderBy!] = [PRIMARY_KEY_ASC] ): OrganizationsConnection + + """Get a single `User`.""" user(id: UUID!): User + + """Get a single `UserAuthentication`.""" userAuthentication(id: UUID!): UserAuthentication + + """Get a single `User`.""" userByUsername(username: String!): User + + """Get a single `UserEmail`.""" userEmail(id: UUID!): UserEmail } @@ -938,7 +950,7 @@ type TransferOrganizationBillingContactPayload { """An edge for our `Organization`. May be used by Relay 1.""" organizationEdge( """The method to use when ordering `Organization`.""" - orderBy: [OrganizationsOrderBy!] = [PRIMARY_KEY_ASC] + orderBy: [OrganizationsOrderBy!]! = [PRIMARY_KEY_ASC] ): OrganizationsEdge """ @@ -970,7 +982,7 @@ type TransferOrganizationOwnershipPayload { """An edge for our `Organization`. May be used by Relay 1.""" organizationEdge( """The method to use when ordering `Organization`.""" - orderBy: [OrganizationsOrderBy!] = [PRIMARY_KEY_ASC] + orderBy: [OrganizationsOrderBy!]! = [PRIMARY_KEY_ASC] ): OrganizationsEdge """ @@ -1013,7 +1025,7 @@ type UpdateOrganizationPayload { """An edge for our `Organization`. May be used by Relay 1.""" organizationEdge( """The method to use when ordering `Organization`.""" - orderBy: [OrganizationsOrderBy!] = [PRIMARY_KEY_ASC] + orderBy: [OrganizationsOrderBy!]! = [PRIMARY_KEY_ASC] ): OrganizationsEdge """ @@ -1058,7 +1070,7 @@ type UpdateUserPayload { """An edge for our `User`. May be used by Relay 1.""" userEdge( """The method to use when ordering `User`.""" - orderBy: [UsersOrderBy!] = [PRIMARY_KEY_ASC] + orderBy: [UsersOrderBy!]! = [PRIMARY_KEY_ASC] ): UsersEdge } From 61febc63d04e87fac9cfcbe93ebaba9091ca5c98 Mon Sep 17 00:00:00 2001 From: james allain Date: Fri, 17 Mar 2023 05:57:04 -0400 Subject: [PATCH 07/13] Fix `yarn server schema:export` command via makeSchema (#357) Co-authored-by: Benjie Gillam --- @app/server/scripts/schema-export.ts | 27 ++++++++++++++++----------- @app/server/src/graphile.config.ts | 4 ++-- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/@app/server/scripts/schema-export.ts b/@app/server/scripts/schema-export.ts index 9f2bd674..ae864607 100644 --- a/@app/server/scripts/schema-export.ts +++ b/@app/server/scripts/schema-export.ts @@ -1,28 +1,33 @@ import { writeFileSync } from "fs"; import { lexicographicSortSchema, printSchema } from "graphql"; import { Pool } from "pg"; -import { createPostGraphileSchema } from "postgraphile"; +import { makeSchema } from "postgraphile"; -import { getPostGraphileOptions } from "../src/graphile.config"; +import { getPreset } from "../src/graphile.config"; async function main() { - const rootPgPool = new Pool({ - connectionString: process.env.DATABASE_URL!, + const authPgPool = new Pool({ + connectionString: process.env.AUTH_DATABASE_URL!, }); + const preset = { + extends: [getPreset({ authPgPool })], + schema: { + // Turn off built-in schema exporting + exportSchemaSDLPath: undefined, + exportSchemaIntrospectionResultPath: undefined, + }, + }; + try { - const schema = await createPostGraphileSchema( - process.env.AUTH_DATABASE_URL!, - "app_public", - getPostGraphileOptions({ rootPgPool }) - ); + const { schema } = await makeSchema(preset); const sorted = lexicographicSortSchema(schema); writeFileSync( `${__dirname}/../../../data/schema.graphql`, - printSchema(sorted) + printSchema(sorted) + "\n" ); console.log("GraphQL schema exported"); } finally { - rootPgPool.end(); + authPgPool.end(); } } diff --git a/@app/server/src/graphile.config.ts b/@app/server/src/graphile.config.ts index cd3a536e..47646b08 100644 --- a/@app/server/src/graphile.config.ts +++ b/@app/server/src/graphile.config.ts @@ -65,7 +65,7 @@ const isDev = process.env.NODE_ENV === "development"; interface IPostGraphileOptionsOptions { authPgPool: Pool; - rootPgPool: Pool; + rootPgPool?: Pool; } export function getPreset({ @@ -224,7 +224,7 @@ export function getPreset({ const sessionId = uuidOrNull(req.user?.session_id); if (sessionId) { // Update the last_active timestamp (but only do it at most once every 15 seconds to avoid too much churn). - await rootPgPool.query( + await rootPgPool?.query( "UPDATE app_private.sessions SET last_active = NOW() WHERE uuid = $1 AND last_active < NOW() - INTERVAL '15 seconds'", [sessionId] ); From f8b244535719fef4eb796afada9edb6fdd73b4d0 Mon Sep 17 00:00:00 2001 From: Benjie Gillam Date: Wed, 19 Apr 2023 11:03:14 +0100 Subject: [PATCH 08/13] Upgrade to V5-1.1 --- @app/lib/package.json | 2 +- @app/server/package.json | 12 +- yarn.lock | 340 ++++++++++++++++++++++----------------- 3 files changed, 195 insertions(+), 159 deletions(-) diff --git a/@app/lib/package.json b/@app/lib/package.json index c6550124..6570fcd5 100644 --- a/@app/lib/package.json +++ b/@app/lib/package.json @@ -25,7 +25,7 @@ "cross-env": "^7.0.3", "express": "^4.18.2", "jest": "^29.4.3", - "postgraphile": "^5.0.0-0.36", + "postgraphile": "^5.0.0-1.1", "typescript": "^5.0.0-beta" } } diff --git a/@app/server/package.json b/@app/server/package.json index 61802aba..d9b2a236 100644 --- a/@app/server/package.json +++ b/@app/server/package.json @@ -13,7 +13,7 @@ "dependencies": { "@app/client": "0.0.0", "@app/config": "0.0.0", - "@graphile/simplify-inflection": "^8.0.0-0.5", + "@graphile/simplify-inflection": "^8.0.0-1.1", "@types/connect-pg-simple": "^7.0.0", "@types/csurf": "^1.11.2", "@types/express-session": "^1.17.6", @@ -30,9 +30,9 @@ "csurf": "^1.11.0", "express": "^4.18.2", "express-session": "^1.17.3", - "graphile-build": "^5.0.0-0.28", - "graphile-build-pg": "^5.0.0-0.33", - "graphile-utils": "^5.0.0-0.33", + "graphile-build": "^5.0.0-1.1", + "graphile-build-pg": "^5.0.0-1.1", + "graphile-utils": "^5.0.0-1.1", "graphile-worker": "^0.13.0", "helmet": "^6.0.1", "lodash": "^4.17.21", @@ -41,14 +41,14 @@ "passport": "^0.6.0", "passport-github2": "^0.1.12", "pg": "^8.9.0", - "postgraphile": "^5.0.0-0.36", + "postgraphile": "^5.0.0-1.1", "redis": "^4.6.5", "source-map-support": "^0.5.21", "tslib": "^2.5.0" }, "devDependencies": { "@types/node": "^18.14.2", - "graphile": "^5.0.0-0.7", + "graphile": "^5.0.0-1.1", "graphql": "^16.1.0-experimental-stream-defer.6", "jest": "^29.4.3", "mock-req": "^0.2.0", diff --git a/yarn.lock b/yarn.lock index c04cc679..4c1c0c1a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -315,7 +315,7 @@ __metadata: jest: ^29.4.3 next: ^13.2.3 next-with-apollo: ^5.3.0 - postgraphile: ^5.0.0-0.36 + postgraphile: ^5.0.0-1.1 rc-field-form: ^1.27.4 react: ^18.2.0 react-dom: ^18.2.0 @@ -331,7 +331,7 @@ __metadata: dependencies: "@app/client": 0.0.0 "@app/config": 0.0.0 - "@graphile/simplify-inflection": ^8.0.0-0.5 + "@graphile/simplify-inflection": ^8.0.0-1.1 "@types/connect-pg-simple": ^7.0.0 "@types/csurf": ^1.11.2 "@types/express-session": ^1.17.6 @@ -350,10 +350,10 @@ __metadata: csurf: ^1.11.0 express: ^4.18.2 express-session: ^1.17.3 - graphile: ^5.0.0-0.7 - graphile-build: ^5.0.0-0.28 - graphile-build-pg: ^5.0.0-0.33 - graphile-utils: ^5.0.0-0.33 + graphile: ^5.0.0-1.1 + graphile-build: ^5.0.0-1.1 + graphile-build-pg: ^5.0.0-1.1 + graphile-utils: ^5.0.0-1.1 graphile-worker: ^0.13.0 graphql: ^16.1.0-experimental-stream-defer.6 helmet: ^6.0.1 @@ -365,7 +365,7 @@ __metadata: passport: ^0.6.0 passport-github2: ^0.1.12 pg: ^8.9.0 - postgraphile: ^5.0.0-0.36 + postgraphile: ^5.0.0-1.1 redis: ^4.6.5 source-map-support: ^0.5.21 ts-node: ^10.9.1 @@ -448,12 +448,12 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/code-frame@npm:7.18.6" +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.18.6, @babel/code-frame@npm:^7.21.4": + version: 7.21.4 + resolution: "@babel/code-frame@npm:7.21.4" dependencies: "@babel/highlight": ^7.18.6 - checksum: 195e2be3172d7684bf95cff69ae3b7a15a9841ea9d27d3c843662d50cdd7d6470fd9c8e64be84d031117e4a4083486effba39f9aef6bbb2c89f7f21bcfba33ba + checksum: e5390e6ec1ac58dcef01d4f18eaf1fd2f1325528661ff6d4a5de8979588b9f5a8e852a54a91b923846f7a5c681b217f0a45c2524eb9560553160cd963b7d592c languageName: node linkType: hard @@ -487,15 +487,15 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.14.0, @babel/generator@npm:^7.16.5, @babel/generator@npm:^7.18.13, @babel/generator@npm:^7.21.0, @babel/generator@npm:^7.21.1, @babel/generator@npm:^7.7.2": - version: 7.21.1 - resolution: "@babel/generator@npm:7.21.1" +"@babel/generator@npm:^7.14.0, @babel/generator@npm:^7.18.13, @babel/generator@npm:^7.21.0, @babel/generator@npm:^7.21.1, @babel/generator@npm:^7.21.3, @babel/generator@npm:^7.21.4, @babel/generator@npm:^7.7.2": + version: 7.21.4 + resolution: "@babel/generator@npm:7.21.4" dependencies: - "@babel/types": ^7.21.0 + "@babel/types": ^7.21.4 "@jridgewell/gen-mapping": ^0.3.2 "@jridgewell/trace-mapping": ^0.3.17 jsesc: ^2.5.1 - checksum: 69085a211ff91a7a608ee3f86e6fcb9cf5e724b756d792a713b0c328a671cd3e423e1ef1b12533f366baba0616caffe0a7ba9d328727eab484de5961badbef00 + checksum: 9ffbb526a53bb8469b5402f7b5feac93809b09b2a9f82fcbfcdc5916268a65dae746a1f2479e03ba4fb0776facd7c892191f63baa61ab69b2cfdb24f7b92424d languageName: node linkType: hard @@ -783,7 +783,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.16.4, @babel/parser@npm:^7.16.6, @babel/parser@npm:^7.16.8, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.0, @babel/parser@npm:^7.21.2": +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.16.4, @babel/parser@npm:^7.16.8, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.0, @babel/parser@npm:^7.21.2": version: 7.21.2 resolution: "@babel/parser@npm:7.21.2" bin: @@ -792,6 +792,15 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.21.3, @babel/parser@npm:^7.21.4": + version: 7.21.4 + resolution: "@babel/parser@npm:7.21.4" + bin: + parser: ./bin/babel-parser.js + checksum: de610ecd1bff331766d0c058023ca11a4f242bfafefc42caf926becccfb6756637d167c001987ca830dd4b34b93c629a4cef63f8c8c864a8564cdfde1989ac77 + languageName: node + linkType: hard + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.18.6" @@ -1784,7 +1793,7 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:^7.16.0, @babel/template@npm:^7.18.10, @babel/template@npm:^7.20.7, @babel/template@npm:^7.3.3": +"@babel/template@npm:^7.18.10, @babel/template@npm:^7.20.7, @babel/template@npm:^7.3.3": version: 7.20.7 resolution: "@babel/template@npm:7.20.7" dependencies: @@ -1795,7 +1804,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.12.5, @babel/traverse@npm:^7.14.0, @babel/traverse@npm:^7.16.0, @babel/traverse@npm:^7.16.8, @babel/traverse@npm:^7.20.5, @babel/traverse@npm:^7.20.7, @babel/traverse@npm:^7.21.0, @babel/traverse@npm:^7.21.2, @babel/traverse@npm:^7.7.2": +"@babel/traverse@npm:^7.12.5, @babel/traverse@npm:^7.14.0, @babel/traverse@npm:^7.16.8, @babel/traverse@npm:^7.20.5, @babel/traverse@npm:^7.20.7, @babel/traverse@npm:^7.21.0, @babel/traverse@npm:^7.21.2, @babel/traverse@npm:^7.7.2": version: 7.21.2 resolution: "@babel/traverse@npm:7.21.2" dependencies: @@ -1813,14 +1822,32 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.16.0, @babel/types@npm:^7.16.8, @babel/types@npm:^7.18.13, @babel/types@npm:^7.18.6, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.2, @babel/types@npm:^7.20.5, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.0, @babel/types@npm:^7.21.2, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": - version: 7.21.2 - resolution: "@babel/types@npm:7.21.2" +"@babel/traverse@npm:^7.21.3": + version: 7.21.4 + resolution: "@babel/traverse@npm:7.21.4" + dependencies: + "@babel/code-frame": ^7.21.4 + "@babel/generator": ^7.21.4 + "@babel/helper-environment-visitor": ^7.18.9 + "@babel/helper-function-name": ^7.21.0 + "@babel/helper-hoist-variables": ^7.18.6 + "@babel/helper-split-export-declaration": ^7.18.6 + "@babel/parser": ^7.21.4 + "@babel/types": ^7.21.4 + debug: ^4.1.0 + globals: ^11.1.0 + checksum: f22f067c2d9b6497abf3d4e53ea71f3aa82a21f2ed434dd69b8c5767f11f2a4c24c8d2f517d2312c9e5248e5c69395fdca1c95a2b3286122c75f5783ddb6f53c + languageName: node + linkType: hard + +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.16.8, @babel/types@npm:^7.18.13, @babel/types@npm:^7.18.6, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.2, @babel/types@npm:^7.20.5, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.0, @babel/types@npm:^7.21.2, @babel/types@npm:^7.21.3, @babel/types@npm:^7.21.4, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": + version: 7.21.4 + resolution: "@babel/types@npm:7.21.4" dependencies: "@babel/helper-string-parser": ^7.19.4 "@babel/helper-validator-identifier": ^7.19.1 to-fast-properties: ^2.0.0 - checksum: a45a52acde139e575502c6de42c994bdbe262bafcb92ae9381fb54cdf1a3672149086843fda655c7683ce9806e998fd002bbe878fa44984498d0fdc7935ce7ff + checksum: 587bc55a91ce003b0f8aa10d70070f8006560d7dc0360dc0406d306a2cb2a10154e2f9080b9c37abec76907a90b330a536406cb75e6bdc905484f37b75c73219 languageName: node linkType: hard @@ -1890,30 +1917,30 @@ __metadata: languageName: node linkType: hard -"@dataplan/json@npm:^0.0.1-0.22": - version: 0.0.1-0.22 - resolution: "@dataplan/json@npm:0.0.1-0.22" +"@dataplan/json@npm:^0.0.1-1.1": + version: 0.0.1-1.1 + resolution: "@dataplan/json@npm:0.0.1-1.1" dependencies: chalk: ^4.1.2 tslib: ^2.4.0 peerDependencies: - grafast: ^0.0.1-0.22 + grafast: ^0.0.1-1.1 graphql: ^16.1.0-experimental-stream-defer.6 - checksum: a9c125596e29a4bf6de44ee19c0ef210ac15a71927d90157e1995b5516617cf9c1544f762cda721f9cdaa30103bd0c31577cd8d6900ac01dd4c7c35034f2e7ee + checksum: 1cc79dc2c1376281411e6ceab5ad36262421fd1e02394e75ad786a987e8c880657667913fc54f433d6d8658717bdb42125557e7600d0d24be8f5abee4f856fae languageName: node linkType: hard -"@dataplan/pg@npm:0.0.1-0.27, @dataplan/pg@npm:^0.0.1-0.27": - version: 0.0.1-0.27 - resolution: "@dataplan/pg@npm:0.0.1-0.27" +"@dataplan/pg@npm:0.0.1-1.1, @dataplan/pg@npm:^0.0.1-1.1": + version: 0.0.1-1.1 + resolution: "@dataplan/pg@npm:0.0.1-1.1" dependencies: - "@dataplan/json": ^0.0.1-0.22 - "@graphile/lru": ^5.0.0-0.1 - "@types/node": ^16.11.15 + "@dataplan/json": ^0.0.1-1.1 + "@graphile/lru": ^5.0.0-1.1 + "@types/node": ^18.15.5 chalk: ^4.1.2 debug: ^4.3.3 - grafast: ^0.0.1-0.22 - pg-sql2: ^5.0.0-0.3 + grafast: ^0.0.1-1.1 + pg-sql2: ^5.0.0-1.1 postgres-array: ~2.0.0 postgres-range: ^1.1.1 tslib: ^2.4.0 @@ -1923,7 +1950,7 @@ __metadata: peerDependenciesMeta: pg: optional: true - checksum: c30d62ac78542d94309bb515d9dfd0c3dc7635df4275f49e98f70769fe938e55f75c3d2af47e18a296b86b57668e1c7ccaa376de4d6d94b9fd46f08569ebcab0 + checksum: 4b030d1250fd5b2cee4061cd07c7ce8a09e6cdf14c43609ecc1082b14c28a9e5cc37451eb5908583a1983fc60c0ba98fae549959d74dfba5ffd141e8e0c63e7a languageName: node linkType: hard @@ -1993,19 +2020,19 @@ __metadata: languageName: node linkType: hard -"@graphile/lru@npm:^5.0.0-0.1": - version: 5.0.0-0.1 - resolution: "@graphile/lru@npm:5.0.0-0.1" +"@graphile/lru@npm:^5.0.0-1.1": + version: 5.0.0-1.1 + resolution: "@graphile/lru@npm:5.0.0-1.1" dependencies: tslib: ^2.4.0 - checksum: 8537a8ca550594a55335951fbe65b4f36d859210230a725478e6bf7389351e8c1e49042a701c4839c2f737d0222fbb672cba82ce394dc608de349b1010a0a856 + checksum: f98e982ea75ba2f2faa8e84f7365e54d5af8d83ee30f614075d8fdc06da47fec4f23d3e2beab42024447dff14b0a804eceda95d73f1f17fecb978185264cfc91 languageName: node linkType: hard -"@graphile/simplify-inflection@npm:^8.0.0-0.5": - version: 8.0.0-0.5 - resolution: "@graphile/simplify-inflection@npm:8.0.0-0.5" - checksum: f337db7e636fedadf27e18f816d3688506f48f13619330cf2e8926d719b348da88d192ace6882c2d8522e8253251f0c33c1cda028723fe2e896dc2731ccde8e4 +"@graphile/simplify-inflection@npm:^8.0.0-1.1": + version: 8.0.0-1.1 + resolution: "@graphile/simplify-inflection@npm:8.0.0-1.1" + checksum: f63892ff459b5836ef600b70d499a63275d68290a7f4cc64157eaf5d491466891cb112ad9838927cf8b8626840dd390531e86cf00aee416bdc70bf0856d9c6c6 languageName: node linkType: hard @@ -3938,10 +3965,10 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^16.11.15": - version: 16.18.13 - resolution: "@types/node@npm:16.18.13" - checksum: c284f97a0630d65887be0e0d7ef8e5e5022eb4916ffae142db07f22dad565a80f17b6a84f21b4521c707f642540430710a8aa5930a2cf2bcbecde0a476ff9c02 +"@types/node@npm:^18.15.5": + version: 18.15.11 + resolution: "@types/node@npm:18.15.11" + checksum: 977b4ad04708897ff0eb049ecf82246d210939c82461922d20f7d2dcfd81bbc661582ba3af28869210f7e8b1934529dcd46bff7d448551400f9d48b9d3bddec3 languageName: node linkType: hard @@ -8611,45 +8638,45 @@ __metadata: languageName: node linkType: hard -"grafast@npm:^0.0.1-0.22": - version: 0.0.1-0.22 - resolution: "grafast@npm:0.0.1-0.22" +"grafast@npm:^0.0.1-1.1": + version: 0.0.1-1.1 + resolution: "grafast@npm:0.0.1-1.1" dependencies: - "@graphile/lru": ^5.0.0-0.1 + "@graphile/lru": ^5.0.0-1.1 debug: ^4.3.3 - tamedevil: ^0.0.0-0.4 + tamedevil: ^0.0.0-1.1 peerDependencies: "@envelop/core": ^3.0.4 - graphile-config: ^0.0.1-0.6 + graphile-config: ^0.0.1-1.1 graphql: ^16.1.0-experimental-stream-defer.6 peerDependenciesMeta: "@envelop/core": optional: true graphile-config: optional: true - checksum: d76519db3787bc9c50eff53583ee5d48616e78d39750f1d3666c766ed256b98966cd1241e83330ae7754e95ffe28147b8e161926c6eb616e3e922944c11248d8 + checksum: c99fb25b9b6874e00471781bf899d2ea32c15e5d9ee3976957cf7911b76825a9c531a1d86419b66ee43ac7e817ee63b9fa3cca6437f2566c070c160f93f8d326 languageName: node linkType: hard -"grafserv@npm:^0.0.1-0.24": - version: 0.0.1-0.24 - resolution: "grafserv@npm:0.0.1-0.24" +"grafserv@npm:^0.0.1-1.1": + version: 0.0.1-1.1 + resolution: "grafserv@npm:0.0.1-1.1" dependencies: - "@graphile/lru": ^5.0.0-0.1 + "@graphile/lru": ^5.0.0-1.1 debug: ^4.1.1 eventemitter3: ^4.0.7 - graphile-config: ^0.0.1-0.6 + graphile-config: ^0.0.1-1.1 graphql-ws: ^5.11.3 - ruru: ^2.0.0-0.12 + ruru: ^2.0.0-1.1 tslib: ^2.4.0 peerDependencies: - grafast: ^0.0.1-0.22 + grafast: ^0.0.1-1.1 graphql: ^16.1.0-experimental-stream-defer.6 ws: ^8.12.1 peerDependenciesMeta: ws: optional: true - checksum: adc7b24fe5bc6fdb276c30b5fc3003970839929c4af2dd8bd554bbb449333342a932e884fe60c2d9a0024c048b46302b40ea2688dc154334aa8f1e92a4524fdb + checksum: b31f95a1ecc4af3e7568d3a6a46979223eec63fae0ff55849c61fca524efe6abe5defc632794c16392cab767fe3e373fed51a7b520feff58889f0c43f92147c4 languageName: node linkType: hard @@ -8660,54 +8687,54 @@ __metadata: languageName: node linkType: hard -"graphile-build-pg@npm:5.0.0-0.33, graphile-build-pg@npm:^5.0.0-0.33": - version: 5.0.0-0.33 - resolution: "graphile-build-pg@npm:5.0.0-0.33" +"graphile-build-pg@npm:5.0.0-1.1, graphile-build-pg@npm:^5.0.0-1.1": + version: 5.0.0-1.1 + resolution: "graphile-build-pg@npm:5.0.0-1.1" dependencies: - "@dataplan/pg": ^0.0.1-0.27 - "@types/node": ^16.11.15 + "@dataplan/pg": ^0.0.1-1.1 + "@types/node": ^18.15.5 debug: ^4.3.3 - grafast: ^0.0.1-0.22 - graphile-build: 5.0.0-0.28 - graphile-config: ^0.0.1-0.6 - graphile-export: ^0.0.2-0.4 + grafast: ^0.0.1-1.1 + graphile-build: 5.0.0-1.1 + graphile-config: ^0.0.1-1.1 + graphile-export: ^0.0.2-1.1 jsonwebtoken: ^8.5.1 - pg-introspection: ^0.0.1-0.3 - pg-sql2: ^5.0.0-0.3 - tamedevil: ^0.0.0-0.4 + pg-introspection: ^0.0.1-1.1 + pg-sql2: ^5.0.0-1.1 + tamedevil: ^0.0.0-1.1 tslib: ^2.4.0 - checksum: b32fc45f59b08a4e62323855e807d737356fd0fad69fcb4c4de5518738604dca0960e7dac30647eba22806a3b017d1d42099759c261badccaeefe670ac02b76e + checksum: 7ccbc23e49d54eddf1f9c22f67e65761fd1771bacc0d26e0075f70e5c05a01f8cbfab8288fc5ccf5c8d98df0d49840e4f2733450df35b12f904dac3430e70198 languageName: node linkType: hard -"graphile-build@npm:5.0.0-0.28, graphile-build@npm:^5.0.0-0.28": - version: 5.0.0-0.28 - resolution: "graphile-build@npm:5.0.0-0.28" +"graphile-build@npm:5.0.0-1.1, graphile-build@npm:^5.0.0-1.1": + version: 5.0.0-1.1 + resolution: "graphile-build@npm:5.0.0-1.1" dependencies: - "@types/node": ^16.11.15 + "@types/node": ^18.15.5 "@types/pluralize": ^0.0.29 "@types/semver": ^7.3.9 chalk: ^4.1.2 debug: ^4.3.3 - grafast: ^0.0.1-0.22 - graphile-config: ^0.0.1-0.6 - graphile-export: ^0.0.2-0.4 + grafast: ^0.0.1-1.1 + graphile-config: ^0.0.1-1.1 + graphile-export: ^0.0.2-1.1 lodash: ^4.17.21 pluralize: ^7.0.0 semver: ^7.3.5 tslib: ^2.4.0 peerDependencies: graphql: ^16.1.0-experimental-stream-defer.6 - checksum: 217877096bd5dd2823c6a2158c9c3df024e247fa7b2e3a684de3f89c53bab8af6d00b9c76528aa4404d3b384acfa95cac2b1ce46486ecd6bb3f993b0efe7b7c7 + checksum: d5f09209464912c9b074ff128d7770d8d52874ec373bac3d23bc9ca37983bdec571931b8203e84f021b1dcc222dc0761fdb9e1d659c74349d95aabc1cc3d8a29 languageName: node linkType: hard -"graphile-config@npm:^0.0.1-0.6": - version: 0.0.1-0.6 - resolution: "graphile-config@npm:0.0.1-0.6" +"graphile-config@npm:^0.0.1-1.1": + version: 0.0.1-1.1 + resolution: "graphile-config@npm:0.0.1-1.1" dependencies: "@types/interpret": ^1.1.1 - "@types/node": ^16.11.15 + "@types/node": ^18.15.5 "@types/semver": ^7.3.9 chalk: ^4.1.2 debug: ^4.3.3 @@ -8715,27 +8742,27 @@ __metadata: semver: ^7.3.5 tslib: ^2.4.0 yargs: ^17.4.1 - checksum: ee7d3a08fe76055488bde3e04f9a4ecb99ef47916e4ca0d0b4fed66cde35ce40acc5601016a364badfcca7edf46b5d18400d32863b7a0acf6c2ea358c22f95b9 + checksum: 803eefdd27173c29cdd94ea8283d2f99c32af1a4aec95c46c607f28f30c835c24f3da70958e1c48da8e8f16bd01bb4e015bcf30d8e13e55d2c1aa0990a464e68 languageName: node linkType: hard -"graphile-export@npm:^0.0.2-0.4": - version: 0.0.2-0.4 - resolution: "graphile-export@npm:0.0.2-0.4" +"graphile-export@npm:^0.0.2-1.1": + version: 0.0.2-1.1 + resolution: "graphile-export@npm:0.0.2-1.1" dependencies: - "@babel/generator": ^7.16.5 - "@babel/parser": ^7.16.6 - "@babel/template": ^7.16.0 - "@babel/traverse": ^7.16.0 - "@babel/types": ^7.16.0 - "@types/node": ^16.11.15 - prettier: ^2.5.1 + "@babel/generator": ^7.21.3 + "@babel/parser": ^7.21.3 + "@babel/template": ^7.20.7 + "@babel/traverse": ^7.21.3 + "@babel/types": ^7.21.3 + "@types/node": ^18.15.5 + prettier: ^2.8.7 tslib: ^2.4.0 peerDependencies: - grafast: ^0.0.1-0.4 + grafast: ^0.0.1-1.1 graphql: ^16.1.0-experimental-stream-defer.6 - pg-sql2: ^5.0.0-0.0 - checksum: 6c4dc971d45b4f939f1528cc9c52135eeed20294719dbec578ba17f39d4c022a66e30085c0438d1495194fe2432664dff96d1625cff7b80b36b38104037ad59f + pg-sql2: ^5.0.0-1.1 + checksum: b1888b89926dd89e0d47d0715b2ce199b114da4ad0a68cde82cc98304dc4d399d10fb321803c3a12df1d2361fd68ed210f07ee28a603f4bb8c7ef31893f117e6 languageName: node linkType: hard @@ -8761,21 +8788,21 @@ __metadata: languageName: node linkType: hard -"graphile-utils@npm:^5.0.0-0.33": - version: 5.0.0-0.33 - resolution: "graphile-utils@npm:5.0.0-0.33" +"graphile-utils@npm:^5.0.0-1.1": + version: 5.0.0-1.1 + resolution: "graphile-utils@npm:5.0.0-1.1" dependencies: debug: ^4.1.1 - graphile-config: ^0.0.1-0.6 + graphile-config: ^0.0.1-1.1 json5: ^2.2.3 tslib: ^2.4.0 peerDependencies: - grafast: ^0.0.1-0.22 - graphile-build: ^5.0.0-0.28 - graphile-build-pg: ^5.0.0-0.33 + grafast: ^0.0.1-1.1 + graphile-build: ^5.0.0-1.1 + graphile-build-pg: ^5.0.0-1.1 graphql: ^16.1.0-experimental-stream-defer.6 - pg-introspection: ^0.0.1-0.3 - checksum: d56f48acc8d2b9fef15f8134e42a2109b76b634b5a00dd51fe706cfd444f3d76970917313458c9838db2b72f1e997a639b75e70d9c0b7c6788dc0580e7abf37e + pg-introspection: ^0.0.1-1.1 + checksum: 291256c0a3e6a115737cfdbe58c49e9baa4aa1a99960d6645bc125a1318523b3752e2db2f554a3936fdebb82e0d1c91cbd1a84e20528d6e987c58beed217d314 languageName: node linkType: hard @@ -8798,18 +8825,18 @@ __metadata: languageName: node linkType: hard -"graphile@npm:^5.0.0-0.7": - version: 5.0.0-0.7 - resolution: "graphile@npm:5.0.0-0.7" +"graphile@npm:^5.0.0-1.1": + version: 5.0.0-1.1 + resolution: "graphile@npm:5.0.0-1.1" dependencies: "@typescript/vfs": ^1.4.0 chalk: ^4.1.2 - graphile-config: ^0.0.1-0.6 + graphile-config: ^0.0.1-1.1 tslib: ^2.4.0 typescript: ^5.0.0-beta bin: graphile: dist/cli-run.js - checksum: de7ae9c0958a60e6ed5a096897af8c8ceaa522cc190e6ed5b1e855a41eb07d9cdfe6c1790505acbe7f30fd744232d543ded574de4932f51a50825ab08dab8bec + checksum: c035087d6cff7c27315d8e5e1bc5a47a548fcae40d28ff31fcaa2fcd3c788a8e6bbdae57ed74ebee97560cbac9fdae4b3b95307eb4fbb2440c4aafa7e117c595 languageName: node linkType: hard @@ -12738,12 +12765,12 @@ __metadata: languageName: node linkType: hard -"pg-introspection@npm:^0.0.1-0.3": - version: 0.0.1-0.3 - resolution: "pg-introspection@npm:0.0.1-0.3" +"pg-introspection@npm:^0.0.1-1.1": + version: 0.0.1-1.1 + resolution: "pg-introspection@npm:0.0.1-1.1" dependencies: tslib: ^2.4.0 - checksum: cbb391d6034776d286b44f296a3e3db770ee48b092b09296dfdb9234d820a7695e8b77b4c0a09a81ffdc25db5fb7c4a46cc772b32755af49e57621d92c50b738 + checksum: ab6391ec9ca265bb161cc2c1d9c714fd21eeeceab4f7b0494fdd4d492b8bea720d61a390d9958b2e3ae6b45b377b5baf72755b76c9e4ac3519b9c7f05093033a languageName: node linkType: hard @@ -12770,13 +12797,13 @@ __metadata: languageName: node linkType: hard -"pg-sql2@npm:^5.0.0-0.3": - version: 5.0.0-0.3 - resolution: "pg-sql2@npm:5.0.0-0.3" +"pg-sql2@npm:^5.0.0-1.1": + version: 5.0.0-1.1 + resolution: "pg-sql2@npm:5.0.0-1.1" dependencies: - "@graphile/lru": ^5.0.0-0.1 + "@graphile/lru": ^5.0.0-1.1 tslib: ^2.4.0 - checksum: ac64009fa0daec4b8981163323e250c2e4a8aad292ccd31ac37a5755e9665fa8d25944975396029c9642183de3e71bf3a49ae07df6a747ad7f4db3742ae5d7d6 + checksum: 113f31c5adfeb19c64342dcb66908ca7fd603c30133b3615933210840580ae0d5bdcbee38642e5e8dfcf84a345de98d893f5bc14489215cd1815557e6c6b24d2 languageName: node linkType: hard @@ -12897,31 +12924,31 @@ __metadata: languageName: node linkType: hard -"postgraphile@npm:^5.0.0-0.36": - version: 5.0.0-0.36 - resolution: "postgraphile@npm:5.0.0-0.36" +"postgraphile@npm:^5.0.0-1.1": + version: 5.0.0-1.1 + resolution: "postgraphile@npm:5.0.0-1.1" dependencies: - "@dataplan/pg": 0.0.1-0.27 - "@graphile/lru": ^5.0.0-0.1 - "@types/node": ^16.11.15 + "@dataplan/pg": 0.0.1-1.1 + "@graphile/lru": ^5.0.0-1.1 + "@types/node": ^18.15.5 "@types/pg": ^8.6.2 debug: ^4.3.3 - grafast: ^0.0.1-0.22 - grafserv: ^0.0.1-0.24 - graphile-build: 5.0.0-0.28 - graphile-build-pg: 5.0.0-0.33 - graphile-config: ^0.0.1-0.6 - graphile-export: ^0.0.2-0.4 + grafast: ^0.0.1-1.1 + grafserv: ^0.0.1-1.1 + graphile-build: 5.0.0-1.1 + graphile-build-pg: 5.0.0-1.1 + graphile-config: ^0.0.1-1.1 + graphile-export: ^0.0.2-1.1 graphql: 16.1.0-experimental-stream-defer.6 iterall: ^1.3.0 jsonwebtoken: ^8.5.1 pg: ^8.7.1 - pg-introspection: ^0.0.1-0.3 - ruru: ^2.0.0-0.12 + pg-introspection: ^0.0.1-1.1 + ruru: ^2.0.0-1.1 tslib: ^2.4.0 bin: postgraphile: dist/cli-run.js - checksum: 777a302660fa6f02b4f3ace0d1916f785acb85ab8322d828bb57c3245109df30f589745a160b18445b907760366c05bdf2db1e25b79e7e4014ee4833446506d7 + checksum: b62051bc2accb0031b4398e304952d91eec6dc57e4b85c7607811fbcd9466449386392b8bd5b83b1188492edf27ad7a74334baff432fb97efcda9702d4a41998 languageName: node linkType: hard @@ -12978,7 +13005,7 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^2.5.1, prettier@npm:^2.8.4": +"prettier@npm:^2.8.4": version: 2.8.4 resolution: "prettier@npm:2.8.4" bin: @@ -12987,6 +13014,15 @@ __metadata: languageName: node linkType: hard +"prettier@npm:^2.8.7": + version: 2.8.7 + resolution: "prettier@npm:2.8.7" + bin: + prettier: bin-prettier.js + checksum: fdc8f2616f099f5f0d685907f4449a70595a0fc1d081a88919604375989e0d5e9168d6121d8cc6861f21990b31665828e00472544d785d5940ea08a17660c3a6 + languageName: node + linkType: hard + "pretty-bytes@npm:^5.6.0": version: 5.6.0 resolution: "pretty-bytes@npm:5.6.0" @@ -14207,11 +14243,11 @@ __metadata: languageName: node linkType: hard -"ruru@npm:^2.0.0-0.12": - version: 2.0.0-0.12 - resolution: "ruru@npm:2.0.0-0.12" +"ruru@npm:^2.0.0-1.1": + version: 2.0.0-1.1 + resolution: "ruru@npm:2.0.0-1.1" dependencies: - graphile-config: ^0.0.1-0.6 + graphile-config: ^0.0.1-1.1 http-proxy: ^1.18.1 tslib: ^2.4.0 yargs: ^17.6.2 @@ -14219,7 +14255,7 @@ __metadata: graphql: ^16.1.0-experimental-stream-defer.6 bin: ruru: dist/cli-run.js - checksum: 74cb217c068af480f8787b12ea0c0bcfa6bb6721576a9fa5d5f3c9004e48fd18da909b8e706dd9568a8db43f3636f3156d052a3a74daca0fea8cf9b24b64f5ff + checksum: b420f3975fc38b1091c83b83ba484472924413fc3926c819581feb09c8400feea111b40b13977eb28337ce54d16afeaf90d2e8e2c3fe066e27b6fd3fa1f71f2f languageName: node linkType: hard @@ -15036,13 +15072,13 @@ __metadata: languageName: node linkType: hard -"tamedevil@npm:^0.0.0-0.4": - version: 0.0.0-0.4 - resolution: "tamedevil@npm:0.0.0-0.4" +"tamedevil@npm:^0.0.0-1.1": + version: 0.0.0-1.1 + resolution: "tamedevil@npm:0.0.0-1.1" dependencies: - "@graphile/lru": ^5.0.0-0.1 + "@graphile/lru": ^5.0.0-1.1 tslib: ^2.4.0 - checksum: 919ecacbc477ade21823f7e07de947ab949a321393ceb80ec1f35f262ab42dba8b6233faf197a1d9f08d60c818594687d24caf89c91d52cb504aac83d088d0bf + checksum: c696ce7307a304ae6b943a258884ac1b1094355511e58a7130a650dcddfa1744ae85921944bddf3d44f7f2a651f20654d6ba5ea9febe7fdb1bd947fab8d5d992 languageName: node linkType: hard From b31180c7814c95a64115b80ece478f51d8dde1ed Mon Sep 17 00:00:00 2001 From: Benjie Gillam Date: Wed, 19 Apr 2023 11:16:41 +0100 Subject: [PATCH 09/13] Migrate APIs to latest V5 APIs --- @app/server/src/graphile.config.ts | 6 ++--- @app/server/src/plugins/Orders.ts | 12 +++++---- .../server/src/plugins/PassportLoginPlugin.ts | 26 +++++++------------ .../server/src/plugins/SubscriptionsPlugin.ts | 18 +++++-------- 4 files changed, 27 insertions(+), 35 deletions(-) diff --git a/@app/server/src/graphile.config.ts b/@app/server/src/graphile.config.ts index 47646b08..4f60f35a 100644 --- a/@app/server/src/graphile.config.ts +++ b/@app/server/src/graphile.config.ts @@ -1,4 +1,4 @@ -import { makePgConfig } from "@dataplan/pg/adaptors/pg"; +import { makePgService } from "@dataplan/pg/adaptors/pg"; // TODO: import GraphilePro from "@graphile/pro"; // Requires license key import { PgSimplifyInflectionPreset } from "@graphile/simplify-inflection"; import { Request } from "express"; @@ -73,8 +73,8 @@ export function getPreset({ rootPgPool, }: IPostGraphileOptionsOptions) { const preset: GraphileConfig.Preset = { - pgConfigs: [ - makePgConfig({ + pgServices: [ + makePgService({ // This is so that PostGraphile installs the watch fixtures superuserConnectionString: process.env.DATABASE_URL, diff --git a/@app/server/src/plugins/Orders.ts b/@app/server/src/plugins/Orders.ts index fc8dd78d..65b813f6 100644 --- a/@app/server/src/plugins/Orders.ts +++ b/@app/server/src/plugins/Orders.ts @@ -29,22 +29,24 @@ export default makeAddPgTableOrderByPlugin( (build) => { const { sql, - input: { pgSources }, + input: { + pgRegistry: { pgResources }, + }, } = build; - const usersSource = pgSources.find( + const usersResource = Object.values(pgResources).find( (s) => !s.parameters && s.extensions?.pg?.schemaName === "app_public" && s.extensions.pg.name === "users" ); - if (!usersSource) { + if (!usersResource) { throw new Error(`Couldn't find the source for app_public.users`); } const sqlIdentifier = sql.identifier(Symbol("member")); return orderByAscDesc("MEMBER_NAME", ($organizationMemberships) => { $organizationMemberships.join({ type: "inner", - source: usersSource.source as SQL, + from: usersResource.from as SQL, alias: sqlIdentifier, conditions: [ sql`${sqlIdentifier}.id = ${$organizationMemberships.alias}.user_id`, @@ -52,7 +54,7 @@ export default makeAddPgTableOrderByPlugin( }); return { fragment: sql`${sqlIdentifier}.name`, - codec: usersSource.codec.columns["name"].codec, + codec: usersResource.codec.attributes!["name"].codec, }; }); } diff --git a/@app/server/src/plugins/PassportLoginPlugin.ts b/@app/server/src/plugins/PassportLoginPlugin.ts index a4f42878..47514705 100644 --- a/@app/server/src/plugins/PassportLoginPlugin.ts +++ b/@app/server/src/plugins/PassportLoginPlugin.ts @@ -1,6 +1,6 @@ import { PgClassExpressionStep } from "@dataplan/pg"; -import { access, SafeError } from "grafast"; -import { gql, makeExtendSchemaPlugin,Plans,Resolvers } from "graphile-utils"; +import { access } from "grafast"; +import { gql, makeExtendSchemaPlugin, Plans, Resolvers } from "graphile-utils"; import type {} from "../middleware/installPostGraphile"; import { ERROR_MESSAGE_OVERRIDES } from "../utils/handleErrors"; @@ -87,11 +87,10 @@ const PassportLoginPlugin = makeExtendSchemaPlugin((build) => { resetPassword(input: ResetPasswordInput!): ResetPasswordPayload } `; - const userSource = build.input.pgSources.find((s) => s.name === "users"); - const currentUserIdSource = build.input.pgSources.find( - (s) => s.name === "current_user_id" - ); - if (!userSource || !currentUserIdSource) { + const userResource = build.input.pgRegistry.pgResources.users; + const currentUserIdResource = + build.input.pgRegistry.pgResources.current_user_id; + if (!userResource || !currentUserIdResource) { throw new Error( "Couldn't find either the 'users' or 'current_user_id' source" ); @@ -100,19 +99,14 @@ const PassportLoginPlugin = makeExtendSchemaPlugin((build) => { RegisterPayload: { user($obj) { const $userId = access($obj, "userId"); - return userSource.get({ id: $userId }); + return userResource.get({ id: $userId }); }, }, LoginPayload: { user() { - const $userId = currentUserIdSource.execute() as PgClassExpressionStep< - any, - any, - any, - any, - any - >; - return userSource.get({ id: $userId }); + const $userId = + currentUserIdResource.execute() as PgClassExpressionStep; + return userResource.get({ id: $userId }); }, }, }; diff --git a/@app/server/src/plugins/SubscriptionsPlugin.ts b/@app/server/src/plugins/SubscriptionsPlugin.ts index 7d723049..fe4bf0e2 100644 --- a/@app/server/src/plugins/SubscriptionsPlugin.ts +++ b/@app/server/src/plugins/SubscriptionsPlugin.ts @@ -33,19 +33,18 @@ function currentUserTopicByUserId(userId: number | null) { * And see the database trigger function `app_public.tg__graphql_subscription()`. */ const SubscriptionsPlugin = makeExtendSchemaPlugin((build) => { - const currentUserIdSource = build.input.pgSources.find( - (s) => s.name === "current_user_id" - ); - if (!currentUserIdSource) { + const currentUserIdResource = + build.input.pgRegistry.pgResources.current_user_id; + if (!currentUserIdResource) { throw new Error("Couldn't find current_user_id source"); } - const usersSource = build.input.pgSources.find( + const usersResource = Object.values(build.input.pgRegistry.pgResources).find( (s) => !s.parameters && s.extensions?.pg?.schemaName === "app_public" && s.extensions.pg.name === "users" ); - if (!usersSource) { + if (!usersResource) { throw new Error("Couldn't find source for app_public.users"); } @@ -70,10 +69,7 @@ const SubscriptionsPlugin = makeExtendSchemaPlugin((build) => { const $pgSubscriber = context().get("pgSubscriber"); // We have the users session ID, but to get their actual ID we need to ask the database. const $userId = - currentUserIdSource.execute() as PgClassExpressionStep< - any, - any, - any, + currentUserIdResource.execute() as PgClassExpressionStep< any, any >; @@ -88,7 +84,7 @@ const SubscriptionsPlugin = makeExtendSchemaPlugin((build) => { UserSubscriptionPayload: { user($obj) { const $id = access($obj, "subject"); - return usersSource.get({ id: $id }); + return usersResource.get({ id: $id }); }, }, }, From e7cb1bb45b8e6e8721a8677200b5e401a782957f Mon Sep 17 00:00:00 2001 From: Benjie Gillam Date: Thu, 3 Aug 2023 14:38:34 +0100 Subject: [PATCH 10/13] Upgrade to beta version of V5 --- @app/lib/package.json | 2 +- @app/server/package.json | 12 +- yarn.lock | 404 +++++++++++++++++++++------------------ 3 files changed, 221 insertions(+), 197 deletions(-) diff --git a/@app/lib/package.json b/@app/lib/package.json index 6570fcd5..15ed3761 100644 --- a/@app/lib/package.json +++ b/@app/lib/package.json @@ -25,7 +25,7 @@ "cross-env": "^7.0.3", "express": "^4.18.2", "jest": "^29.4.3", - "postgraphile": "^5.0.0-1.1", + "postgraphile": "^5.0.0-beta.2", "typescript": "^5.0.0-beta" } } diff --git a/@app/server/package.json b/@app/server/package.json index d9b2a236..7774b166 100644 --- a/@app/server/package.json +++ b/@app/server/package.json @@ -13,7 +13,7 @@ "dependencies": { "@app/client": "0.0.0", "@app/config": "0.0.0", - "@graphile/simplify-inflection": "^8.0.0-1.1", + "@graphile/simplify-inflection": "^8.0.0-beta.1", "@types/connect-pg-simple": "^7.0.0", "@types/csurf": "^1.11.2", "@types/express-session": "^1.17.6", @@ -30,9 +30,9 @@ "csurf": "^1.11.0", "express": "^4.18.2", "express-session": "^1.17.3", - "graphile-build": "^5.0.0-1.1", - "graphile-build-pg": "^5.0.0-1.1", - "graphile-utils": "^5.0.0-1.1", + "graphile-build": "^5.0.0-beta.2", + "graphile-build-pg": "^5.0.0-beta.2", + "graphile-utils": "^5.0.0-beta.2", "graphile-worker": "^0.13.0", "helmet": "^6.0.1", "lodash": "^4.17.21", @@ -41,14 +41,14 @@ "passport": "^0.6.0", "passport-github2": "^0.1.12", "pg": "^8.9.0", - "postgraphile": "^5.0.0-1.1", + "postgraphile": "^5.0.0-beta.2", "redis": "^4.6.5", "source-map-support": "^0.5.21", "tslib": "^2.5.0" }, "devDependencies": { "@types/node": "^18.14.2", - "graphile": "^5.0.0-1.1", + "graphile": "^5.0.0-beta.2", "graphql": "^16.1.0-experimental-stream-defer.6", "jest": "^29.4.3", "mock-req": "^0.2.0", diff --git a/yarn.lock b/yarn.lock index 4c1c0c1a..4f5aa08e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -315,7 +315,7 @@ __metadata: jest: ^29.4.3 next: ^13.2.3 next-with-apollo: ^5.3.0 - postgraphile: ^5.0.0-1.1 + postgraphile: ^5.0.0-beta.2 rc-field-form: ^1.27.4 react: ^18.2.0 react-dom: ^18.2.0 @@ -331,7 +331,7 @@ __metadata: dependencies: "@app/client": 0.0.0 "@app/config": 0.0.0 - "@graphile/simplify-inflection": ^8.0.0-1.1 + "@graphile/simplify-inflection": ^8.0.0-beta.1 "@types/connect-pg-simple": ^7.0.0 "@types/csurf": ^1.11.2 "@types/express-session": ^1.17.6 @@ -350,10 +350,10 @@ __metadata: csurf: ^1.11.0 express: ^4.18.2 express-session: ^1.17.3 - graphile: ^5.0.0-1.1 - graphile-build: ^5.0.0-1.1 - graphile-build-pg: ^5.0.0-1.1 - graphile-utils: ^5.0.0-1.1 + graphile: ^5.0.0-beta.2 + graphile-build: ^5.0.0-beta.2 + graphile-build-pg: ^5.0.0-beta.2 + graphile-utils: ^5.0.0-beta.2 graphile-worker: ^0.13.0 graphql: ^16.1.0-experimental-stream-defer.6 helmet: ^6.0.1 @@ -365,7 +365,7 @@ __metadata: passport: ^0.6.0 passport-github2: ^0.1.12 pg: ^8.9.0 - postgraphile: ^5.0.0-1.1 + postgraphile: ^5.0.0-beta.2 redis: ^4.6.5 source-map-support: ^0.5.21 ts-node: ^10.9.1 @@ -448,7 +448,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.18.6, @babel/code-frame@npm:^7.21.4": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.18.6": version: 7.21.4 resolution: "@babel/code-frame@npm:7.21.4" dependencies: @@ -487,7 +487,7 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.14.0, @babel/generator@npm:^7.18.13, @babel/generator@npm:^7.21.0, @babel/generator@npm:^7.21.1, @babel/generator@npm:^7.21.3, @babel/generator@npm:^7.21.4, @babel/generator@npm:^7.7.2": +"@babel/generator@npm:^7.14.0, @babel/generator@npm:^7.18.13, @babel/generator@npm:^7.21.0, @babel/generator@npm:^7.21.1, @babel/generator@npm:^7.7.2": version: 7.21.4 resolution: "@babel/generator@npm:7.21.4" dependencies: @@ -792,15 +792,6 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.21.3, @babel/parser@npm:^7.21.4": - version: 7.21.4 - resolution: "@babel/parser@npm:7.21.4" - bin: - parser: ./bin/babel-parser.js - checksum: de610ecd1bff331766d0c058023ca11a4f242bfafefc42caf926becccfb6756637d167c001987ca830dd4b34b93c629a4cef63f8c8c864a8564cdfde1989ac77 - languageName: node - linkType: hard - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.18.6" @@ -1822,25 +1813,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.21.3": - version: 7.21.4 - resolution: "@babel/traverse@npm:7.21.4" - dependencies: - "@babel/code-frame": ^7.21.4 - "@babel/generator": ^7.21.4 - "@babel/helper-environment-visitor": ^7.18.9 - "@babel/helper-function-name": ^7.21.0 - "@babel/helper-hoist-variables": ^7.18.6 - "@babel/helper-split-export-declaration": ^7.18.6 - "@babel/parser": ^7.21.4 - "@babel/types": ^7.21.4 - debug: ^4.1.0 - globals: ^11.1.0 - checksum: f22f067c2d9b6497abf3d4e53ea71f3aa82a21f2ed434dd69b8c5767f11f2a4c24c8d2f517d2312c9e5248e5c69395fdca1c95a2b3286122c75f5783ddb6f53c - languageName: node - linkType: hard - -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.16.8, @babel/types@npm:^7.18.13, @babel/types@npm:^7.18.6, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.2, @babel/types@npm:^7.20.5, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.0, @babel/types@npm:^7.21.2, @babel/types@npm:^7.21.3, @babel/types@npm:^7.21.4, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.16.8, @babel/types@npm:^7.18.13, @babel/types@npm:^7.18.6, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.2, @babel/types@npm:^7.20.5, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.0, @babel/types@npm:^7.21.2, @babel/types@npm:^7.21.4, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": version: 7.21.4 resolution: "@babel/types@npm:7.21.4" dependencies: @@ -1917,40 +1890,43 @@ __metadata: languageName: node linkType: hard -"@dataplan/json@npm:^0.0.1-1.1": - version: 0.0.1-1.1 - resolution: "@dataplan/json@npm:0.0.1-1.1" +"@dataplan/json@npm:0.0.1-beta.2": + version: 0.0.1-beta.2 + resolution: "@dataplan/json@npm:0.0.1-beta.2" dependencies: chalk: ^4.1.2 - tslib: ^2.4.0 + tslib: ^2.5.0 peerDependencies: - grafast: ^0.0.1-1.1 - graphql: ^16.1.0-experimental-stream-defer.6 - checksum: 1cc79dc2c1376281411e6ceab5ad36262421fd1e02394e75ad786a987e8c880657667913fc54f433d6d8658717bdb42125557e7600d0d24be8f5abee4f856fae + grafast: ^0.0.1-beta.2 + checksum: 1e415fd8dc617772f436a82f51b51dab61b08e89ae89aaea95d5fa071aa80053f1144f525bf46f6e6c3f61e50f6fa2e00ed4b952d7f88d17169d4dec1b8f5ec2 languageName: node linkType: hard -"@dataplan/pg@npm:0.0.1-1.1, @dataplan/pg@npm:^0.0.1-1.1": - version: 0.0.1-1.1 - resolution: "@dataplan/pg@npm:0.0.1-1.1" +"@dataplan/pg@npm:0.0.1-beta.2": + version: 0.0.1-beta.2 + resolution: "@dataplan/pg@npm:0.0.1-beta.2" dependencies: - "@dataplan/json": ^0.0.1-1.1 - "@graphile/lru": ^5.0.0-1.1 + "@graphile/lru": ^5.0.0-beta.1 "@types/node": ^18.15.5 chalk: ^4.1.2 debug: ^4.3.3 - grafast: ^0.0.1-1.1 - pg-sql2: ^5.0.0-1.1 + eventemitter3: ^4.0.7 + pg-sql2: ^5.0.0-beta.1 postgres-array: ~2.0.0 postgres-range: ^1.1.1 - tslib: ^2.4.0 + tslib: ^2.5.0 peerDependencies: - graphql: ^16.1.0-experimental-stream-defer.6 + "@dataplan/json": ^0.0.1-beta.2 + grafast: ^0.0.1-beta.2 + graphile-config: ^0.0.1-beta.1 pg: ^8.7.1 + pg-sql2: ^5.0.0-beta.1 peerDependenciesMeta: + graphile-config: + optional: true pg: optional: true - checksum: 4b030d1250fd5b2cee4061cd07c7ce8a09e6cdf14c43609ecc1082b14c28a9e5cc37451eb5908583a1983fc60c0ba98fae549959d74dfba5ffd141e8e0c63e7a + checksum: 27e09e50b582d18ad917df3243804eac741dd5604cb8ddff0b35fca39144edffb431e7d0e65ca7ca474699f3359de2ce85504354c24842bdebb4e261769f49f7 languageName: node linkType: hard @@ -2020,19 +1996,19 @@ __metadata: languageName: node linkType: hard -"@graphile/lru@npm:^5.0.0-1.1": - version: 5.0.0-1.1 - resolution: "@graphile/lru@npm:5.0.0-1.1" +"@graphile/lru@npm:^5.0.0-beta.1": + version: 5.0.0-beta.1 + resolution: "@graphile/lru@npm:5.0.0-beta.1" dependencies: - tslib: ^2.4.0 - checksum: f98e982ea75ba2f2faa8e84f7365e54d5af8d83ee30f614075d8fdc06da47fec4f23d3e2beab42024447dff14b0a804eceda95d73f1f17fecb978185264cfc91 + tslib: ^2.5.0 + checksum: 482eccd1e35a3b8e3958295c305e6bfe93e58327f24045355370f2d288d41514555b1ccc246420849269331994c2d5c0b0c2cee12e7d15c96e161e9a12ab112b languageName: node linkType: hard -"@graphile/simplify-inflection@npm:^8.0.0-1.1": - version: 8.0.0-1.1 - resolution: "@graphile/simplify-inflection@npm:8.0.0-1.1" - checksum: f63892ff459b5836ef600b70d499a63275d68290a7f4cc64157eaf5d491466891cb112ad9838927cf8b8626840dd390531e86cf00aee416bdc70bf0856d9c6c6 +"@graphile/simplify-inflection@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@graphile/simplify-inflection@npm:8.0.0-beta.1" + checksum: cd465782b5fc21f90bba7df978f663320ef8a0e02e4ade079c92762ab1c78d765e7048f058d668f1759fdc785e2091dfe5fdf5bf12609af6066882b4ca07c71d languageName: node linkType: hard @@ -8638,45 +8614,48 @@ __metadata: languageName: node linkType: hard -"grafast@npm:^0.0.1-1.1": - version: 0.0.1-1.1 - resolution: "grafast@npm:0.0.1-1.1" +"grafast@npm:^0.0.1-beta.2": + version: 0.0.1-beta.2 + resolution: "grafast@npm:0.0.1-beta.2" dependencies: - "@graphile/lru": ^5.0.0-1.1 + "@graphile/lru": ^5.0.0-beta.1 debug: ^4.3.3 - tamedevil: ^0.0.0-1.1 + graphql: ^16.1.0-experimental-stream-defer.6 + tamedevil: ^0.0.0-beta.1 peerDependencies: "@envelop/core": ^3.0.4 - graphile-config: ^0.0.1-1.1 + graphile-config: ^0.0.1-beta.1 graphql: ^16.1.0-experimental-stream-defer.6 + tamedevil: ^0.0.0-beta.1 peerDependenciesMeta: "@envelop/core": optional: true graphile-config: optional: true - checksum: c99fb25b9b6874e00471781bf899d2ea32c15e5d9ee3976957cf7911b76825a9c531a1d86419b66ee43ac7e817ee63b9fa3cca6437f2566c070c160f93f8d326 + checksum: 53224867e69b906e67b5613beb2022a4bcaf9399ce1bf0a17aded73e18597b48046700836b7ed62a67c301f75d9229d6b0f0de136c238042e937d8985b34a8c4 languageName: node linkType: hard -"grafserv@npm:^0.0.1-1.1": - version: 0.0.1-1.1 - resolution: "grafserv@npm:0.0.1-1.1" +"grafserv@npm:^0.0.1-beta.2": + version: 0.0.1-beta.2 + resolution: "grafserv@npm:0.0.1-beta.2" dependencies: - "@graphile/lru": ^5.0.0-1.1 + "@graphile/lru": ^5.0.0-beta.1 debug: ^4.1.1 eventemitter3: ^4.0.7 - graphile-config: ^0.0.1-1.1 + graphile-config: ^0.0.1-beta.1 graphql-ws: ^5.11.3 - ruru: ^2.0.0-1.1 - tslib: ^2.4.0 + ruru: ^2.0.0-beta.1 + tslib: ^2.5.0 peerDependencies: - grafast: ^0.0.1-1.1 + grafast: ^0.0.1-beta.2 + graphile-config: ^0.0.1-beta.1 graphql: ^16.1.0-experimental-stream-defer.6 ws: ^8.12.1 peerDependenciesMeta: ws: optional: true - checksum: b31f95a1ecc4af3e7568d3a6a46979223eec63fae0ff55849c61fca524efe6abe5defc632794c16392cab767fe3e373fed51a7b520feff58889f0c43f92147c4 + checksum: e5cbb8d72170dffc20e47cc7374c1bd6c37445943f55d04d4f2787233fae5515e22e80566aa4bde83616b9dad53a34dc49b987afcaa039456817f6294788da03 languageName: node linkType: hard @@ -8687,51 +8666,58 @@ __metadata: languageName: node linkType: hard -"graphile-build-pg@npm:5.0.0-1.1, graphile-build-pg@npm:^5.0.0-1.1": - version: 5.0.0-1.1 - resolution: "graphile-build-pg@npm:5.0.0-1.1" +"graphile-build-pg@npm:5.0.0-beta.2, graphile-build-pg@npm:^5.0.0-beta.2": + version: 5.0.0-beta.2 + resolution: "graphile-build-pg@npm:5.0.0-beta.2" dependencies: - "@dataplan/pg": ^0.0.1-1.1 "@types/node": ^18.15.5 debug: ^4.3.3 - grafast: ^0.0.1-1.1 - graphile-build: 5.0.0-1.1 - graphile-config: ^0.0.1-1.1 - graphile-export: ^0.0.2-1.1 + graphile-config: ^0.0.1-beta.1 jsonwebtoken: ^8.5.1 - pg-introspection: ^0.0.1-1.1 - pg-sql2: ^5.0.0-1.1 - tamedevil: ^0.0.0-1.1 - tslib: ^2.4.0 - checksum: 7ccbc23e49d54eddf1f9c22f67e65761fd1771bacc0d26e0075f70e5c05a01f8cbfab8288fc5ccf5c8d98df0d49840e4f2733450df35b12f904dac3430e70198 + pg-introspection: ^0.0.1-beta.1 + tslib: ^2.5.0 + peerDependencies: + "@dataplan/pg": ^0.0.1-beta.2 + grafast: ^0.0.1-beta.2 + graphile-build: 5.0.0-beta.2 + graphile-config: ^0.0.1-beta.1 + graphql: ^16.1.0-experimental-stream-defer.6 + pg: ^8.7.1 + pg-sql2: ^5.0.0-beta.1 + tamedevil: ^0.0.0-beta.1 + peerDependenciesMeta: + pg: + optional: true + checksum: 630709c9d1c37c1ab0700f8e68b14ec3e5b504912410d6ffd52c8a8bbb93150c8962af8e53ec04b5f6f3d13ac0193ec91db78684a9e610bfed5ddd50b0d5670e languageName: node linkType: hard -"graphile-build@npm:5.0.0-1.1, graphile-build@npm:^5.0.0-1.1": - version: 5.0.0-1.1 - resolution: "graphile-build@npm:5.0.0-1.1" +"graphile-build@npm:5.0.0-beta.2, graphile-build@npm:^5.0.0-beta.2": + version: 5.0.0-beta.2 + resolution: "graphile-build@npm:5.0.0-beta.2" dependencies: "@types/node": ^18.15.5 "@types/pluralize": ^0.0.29 "@types/semver": ^7.3.9 chalk: ^4.1.2 debug: ^4.3.3 - grafast: ^0.0.1-1.1 - graphile-config: ^0.0.1-1.1 - graphile-export: ^0.0.2-1.1 + graphile-config: ^0.0.1-beta.1 + graphql: ^16.1.0-experimental-stream-defer.6 lodash: ^4.17.21 pluralize: ^7.0.0 semver: ^7.3.5 - tslib: ^2.4.0 + tslib: ^2.5.0 peerDependencies: + grafast: ^0.0.1-beta.2 + graphile-config: ^0.0.1-beta.1 graphql: ^16.1.0-experimental-stream-defer.6 - checksum: d5f09209464912c9b074ff128d7770d8d52874ec373bac3d23bc9ca37983bdec571931b8203e84f021b1dcc222dc0761fdb9e1d659c74349d95aabc1cc3d8a29 + checksum: 7ddbb939a9f7cd49caea876605770419088bd88e6d03a670efb552f781c3985a1770b5a3178a03566d5b2fc184dbe409f5c84f0a42ada238f29cf4a7428d2593 languageName: node linkType: hard -"graphile-config@npm:^0.0.1-1.1": - version: 0.0.1-1.1 - resolution: "graphile-config@npm:0.0.1-1.1" +"graphile-config@npm:^0.0.1-beta.1": + version: 0.0.1-beta.1 + resolution: "graphile-config@npm:0.0.1-beta.1" dependencies: "@types/interpret": ^1.1.1 "@types/node": ^18.15.5 @@ -8740,29 +8726,9 @@ __metadata: debug: ^4.3.3 interpret: ^2.2.0 semver: ^7.3.5 - tslib: ^2.4.0 + tslib: ^2.5.0 yargs: ^17.4.1 - checksum: 803eefdd27173c29cdd94ea8283d2f99c32af1a4aec95c46c607f28f30c835c24f3da70958e1c48da8e8f16bd01bb4e015bcf30d8e13e55d2c1aa0990a464e68 - languageName: node - linkType: hard - -"graphile-export@npm:^0.0.2-1.1": - version: 0.0.2-1.1 - resolution: "graphile-export@npm:0.0.2-1.1" - dependencies: - "@babel/generator": ^7.21.3 - "@babel/parser": ^7.21.3 - "@babel/template": ^7.20.7 - "@babel/traverse": ^7.21.3 - "@babel/types": ^7.21.3 - "@types/node": ^18.15.5 - prettier: ^2.8.7 - tslib: ^2.4.0 - peerDependencies: - grafast: ^0.0.1-1.1 - graphql: ^16.1.0-experimental-stream-defer.6 - pg-sql2: ^5.0.0-1.1 - checksum: b1888b89926dd89e0d47d0715b2ce199b114da4ad0a68cde82cc98304dc4d399d10fb321803c3a12df1d2361fd68ed210f07ee28a603f4bb8c7ef31893f117e6 + checksum: 4946b2650bb8310cb6ea7217f7ac3433d4e7463a8c2d90896563d738ae17724a1c29296d7ec3f2f44f51be65a57e3780b4783aecbbe69c4294b54b841a13b5a2 languageName: node linkType: hard @@ -8788,21 +8754,24 @@ __metadata: languageName: node linkType: hard -"graphile-utils@npm:^5.0.0-1.1": - version: 5.0.0-1.1 - resolution: "graphile-utils@npm:5.0.0-1.1" +"graphile-utils@npm:^5.0.0-beta.2": + version: 5.0.0-beta.2 + resolution: "graphile-utils@npm:5.0.0-beta.2" dependencies: debug: ^4.1.1 - graphile-config: ^0.0.1-1.1 json5: ^2.2.3 - tslib: ^2.4.0 + tslib: ^2.5.0 peerDependencies: - grafast: ^0.0.1-1.1 - graphile-build: ^5.0.0-1.1 - graphile-build-pg: ^5.0.0-1.1 + grafast: ^0.0.1-beta.2 + graphile-build: ^5.0.0-beta.2 + graphile-build-pg: ^5.0.0-beta.2 + graphile-config: ^0.0.1-beta.1 graphql: ^16.1.0-experimental-stream-defer.6 - pg-introspection: ^0.0.1-1.1 - checksum: 291256c0a3e6a115737cfdbe58c49e9baa4aa1a99960d6645bc125a1318523b3752e2db2f554a3936fdebb82e0d1c91cbd1a84e20528d6e987c58beed217d314 + tamedevil: ^0.0.0-beta.1 + peerDependenciesMeta: + graphile-build-pg: + optional: true + checksum: e0dd6f0901b2689f1de1236294a6692b17c539dd70ebeb12a860e39efe5da54a083ab5e40327acd52faeeb0235a86124b57884642cf1bb4501f77bd1169c012d languageName: node linkType: hard @@ -8825,18 +8794,27 @@ __metadata: languageName: node linkType: hard -"graphile@npm:^5.0.0-1.1": - version: 5.0.0-1.1 - resolution: "graphile@npm:5.0.0-1.1" +"graphile@npm:^5.0.0-beta.2": + version: 5.0.0-beta.2 + resolution: "graphile@npm:5.0.0-beta.2" dependencies: "@typescript/vfs": ^1.4.0 chalk: ^4.1.2 - graphile-config: ^0.0.1-1.1 - tslib: ^2.4.0 - typescript: ^5.0.0-beta + graphile-config: ^0.0.1-beta.1 + tslib: ^2.5.0 + typescript: ^5.0.4 + peerDependencies: + graphile-build: ^5.0.0-beta.2 + graphile-config: ^0.0.1-beta.1 + postgraphile: ^5.0.0-beta.2 + peerDependenciesMeta: + graphile-build: + optional: true + postgraphile: + optional: true bin: graphile: dist/cli-run.js - checksum: c035087d6cff7c27315d8e5e1bc5a47a548fcae40d28ff31fcaa2fcd3c788a8e6bbdae57ed74ebee97560cbac9fdae4b3b95307eb4fbb2440c4aafa7e117c595 + checksum: 86118f1b60c979c3ba919f776befeacd48a3859848d9ec7991d352d02675fe550768afefe3c4044997b1d41b881471786695e14655d70dbae33eb8fce2f1302e languageName: node linkType: hard @@ -12765,12 +12743,12 @@ __metadata: languageName: node linkType: hard -"pg-introspection@npm:^0.0.1-1.1": - version: 0.0.1-1.1 - resolution: "pg-introspection@npm:0.0.1-1.1" +"pg-introspection@npm:^0.0.1-beta.1": + version: 0.0.1-beta.1 + resolution: "pg-introspection@npm:0.0.1-beta.1" dependencies: - tslib: ^2.4.0 - checksum: ab6391ec9ca265bb161cc2c1d9c714fd21eeeceab4f7b0494fdd4d492b8bea720d61a390d9958b2e3ae6b45b377b5baf72755b76c9e4ac3519b9c7f05093033a + tslib: ^2.5.0 + checksum: 00ed682b1399fedb8e654453e656d8c34c3952bb41dad8fa795716ea2a93bdf48cf6fb5bfa7d0e52e05f11048fee8c0cd4e5d1505819a206f152c602b9577327 languageName: node linkType: hard @@ -12797,13 +12775,13 @@ __metadata: languageName: node linkType: hard -"pg-sql2@npm:^5.0.0-1.1": - version: 5.0.0-1.1 - resolution: "pg-sql2@npm:5.0.0-1.1" +"pg-sql2@npm:^5.0.0-beta.1": + version: 5.0.0-beta.1 + resolution: "pg-sql2@npm:5.0.0-beta.1" dependencies: - "@graphile/lru": ^5.0.0-1.1 - tslib: ^2.4.0 - checksum: 113f31c5adfeb19c64342dcb66908ca7fd603c30133b3615933210840580ae0d5bdcbee38642e5e8dfcf84a345de98d893f5bc14489215cd1815557e6c6b24d2 + "@graphile/lru": ^5.0.0-beta.1 + tslib: ^2.5.0 + checksum: 4eb38d8f8e47baff70ed1989e05b37fadaf6dc025e03881b564ce512edb6a594105ff427f163675e69316a44a81f80437a5baa3f3503c5d78b5f80b654dee0dd languageName: node linkType: hard @@ -12924,31 +12902,49 @@ __metadata: languageName: node linkType: hard -"postgraphile@npm:^5.0.0-1.1": - version: 5.0.0-1.1 - resolution: "postgraphile@npm:5.0.0-1.1" +"postgraphile@npm:^5.0.0-beta.2": + version: 5.0.0-beta.2 + resolution: "postgraphile@npm:5.0.0-beta.2" dependencies: - "@dataplan/pg": 0.0.1-1.1 - "@graphile/lru": ^5.0.0-1.1 + "@dataplan/json": 0.0.1-beta.2 + "@dataplan/pg": 0.0.1-beta.2 + "@graphile/lru": ^5.0.0-beta.1 "@types/node": ^18.15.5 "@types/pg": ^8.6.2 debug: ^4.3.3 - grafast: ^0.0.1-1.1 - grafserv: ^0.0.1-1.1 - graphile-build: 5.0.0-1.1 - graphile-build-pg: 5.0.0-1.1 - graphile-config: ^0.0.1-1.1 - graphile-export: ^0.0.2-1.1 - graphql: 16.1.0-experimental-stream-defer.6 + grafast: ^0.0.1-beta.2 + grafserv: ^0.0.1-beta.2 + graphile-build: 5.0.0-beta.2 + graphile-build-pg: 5.0.0-beta.2 + graphile-config: ^0.0.1-beta.1 + graphile-utils: ^5.0.0-beta.2 + graphql: ^16.1.0-experimental-stream-defer.6 iterall: ^1.3.0 jsonwebtoken: ^8.5.1 pg: ^8.7.1 - pg-introspection: ^0.0.1-1.1 - ruru: ^2.0.0-1.1 - tslib: ^2.4.0 + pg-sql2: ^5.0.0-beta.1 + tamedevil: ^0.0.0-beta.1 + tslib: ^2.5.0 + ws: ^8.12.1 + peerDependencies: + "@dataplan/json": 0.0.1-beta.2 + "@dataplan/pg": 0.0.1-beta.2 + "@envelop/core": ^3.0.4 + grafast: ^0.0.1-beta.2 + grafserv: ^0.0.1-beta.2 + graphile-build: 5.0.0-beta.2 + graphile-build-pg: 5.0.0-beta.2 + graphile-config: ^0.0.1-beta.1 + graphql: ^16.1.0-experimental-stream-defer.6 + pg: ^8.7.1 + pg-sql2: ^5.0.0-beta.1 + tamedevil: ^0.0.0-beta.1 + peerDependenciesMeta: + "@envelop/core": + optional: true bin: postgraphile: dist/cli-run.js - checksum: b62051bc2accb0031b4398e304952d91eec6dc57e4b85c7607811fbcd9466449386392b8bd5b83b1188492edf27ad7a74334baff432fb97efcda9702d4a41998 + checksum: 5ab34c8a4f4bf38d737e8684de499b16f7d757127b3d37e3e058df066cbdc72903cbedaddb0c4b1af8f5b80ae7326ccc427c8b9cce34c051e50039b5d11d6e53 languageName: node linkType: hard @@ -13014,15 +13010,6 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^2.8.7": - version: 2.8.7 - resolution: "prettier@npm:2.8.7" - bin: - prettier: bin-prettier.js - checksum: fdc8f2616f099f5f0d685907f4449a70595a0fc1d081a88919604375989e0d5e9168d6121d8cc6861f21990b31665828e00472544d785d5940ea08a17660c3a6 - languageName: node - linkType: hard - "pretty-bytes@npm:^5.6.0": version: 5.6.0 resolution: "pretty-bytes@npm:5.6.0" @@ -14243,19 +14230,21 @@ __metadata: languageName: node linkType: hard -"ruru@npm:^2.0.0-1.1": - version: 2.0.0-1.1 - resolution: "ruru@npm:2.0.0-1.1" +"ruru@npm:^2.0.0-beta.1": + version: 2.0.0-beta.1 + resolution: "ruru@npm:2.0.0-beta.1" dependencies: - graphile-config: ^0.0.1-1.1 + graphile-config: ^0.0.1-beta.1 + graphql: ^16.1.0-experimental-stream-defer.6 http-proxy: ^1.18.1 - tslib: ^2.4.0 + tslib: ^2.5.0 yargs: ^17.6.2 peerDependencies: + graphile-config: ^0.0.1-beta.1 graphql: ^16.1.0-experimental-stream-defer.6 bin: ruru: dist/cli-run.js - checksum: b420f3975fc38b1091c83b83ba484472924413fc3926c819581feb09c8400feea111b40b13977eb28337ce54d16afeaf90d2e8e2c3fe066e27b6fd3fa1f71f2f + checksum: 09909e5068b683bffa5398502175285f0d232631da837ef187fbf06cc66a63e6e468ff0114031c33b2381ecf2abb119c2a3840a4881c6b887c88cf9c6249d253 languageName: node linkType: hard @@ -15072,13 +15061,13 @@ __metadata: languageName: node linkType: hard -"tamedevil@npm:^0.0.0-1.1": - version: 0.0.0-1.1 - resolution: "tamedevil@npm:0.0.0-1.1" +"tamedevil@npm:^0.0.0-beta.1": + version: 0.0.0-beta.1 + resolution: "tamedevil@npm:0.0.0-beta.1" dependencies: - "@graphile/lru": ^5.0.0-1.1 - tslib: ^2.4.0 - checksum: c696ce7307a304ae6b943a258884ac1b1094355511e58a7130a650dcddfa1744ae85921944bddf3d44f7f2a651f20654d6ba5ea9febe7fdb1bd947fab8d5d992 + "@graphile/lru": ^5.0.0-beta.1 + tslib: ^2.5.0 + checksum: 7100c61df3c85560fe5d530e1bcb3e7f4fe9d569fd49393be1a5a9549402d69ccc4277aa742ecd93a338518788bea91fe4066b2fb546cfa43b9872391a00ac43 languageName: node linkType: hard @@ -15589,6 +15578,16 @@ __metadata: languageName: node linkType: hard +"typescript@npm:^5.0.4": + version: 5.1.6 + resolution: "typescript@npm:5.1.6" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: b2f2c35096035fe1f5facd1e38922ccb8558996331405eb00a5111cc948b2e733163cc22fab5db46992aba7dd520fff637f2c1df4996ff0e134e77d3249a7350 + languageName: node + linkType: hard + "typescript@patch:typescript@^5.0.0-beta#~builtin": version: 5.0.0-dev.20230226 resolution: "typescript@patch:typescript@npm%3A5.0.0-dev.20230226#~builtin::version=5.0.0-dev.20230226&hash=1f5320" @@ -15599,6 +15598,16 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@^5.0.4#~builtin": + version: 5.1.6 + resolution: "typescript@patch:typescript@npm%3A5.1.6#~builtin::version=5.1.6&hash=1f5320" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 21e88b0a0c0226f9cb9fd25b9626fb05b4c0f3fddac521844a13e1f30beb8f14e90bd409a9ac43c812c5946d714d6e0dee12d5d02dfc1c562c5aacfa1f49b606 + languageName: node + linkType: hard + "ua-parser-js@npm:^0.7.30": version: 0.7.33 resolution: "ua-parser-js@npm:0.7.33" @@ -16279,6 +16288,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:^8.12.1": + version: 8.13.0 + resolution: "ws@npm:8.13.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 53e991bbf928faf5dc6efac9b8eb9ab6497c69feeb94f963d648b7a3530a720b19ec2e0ec037344257e05a4f35bd9ad04d9de6f289615ffb133282031b18c61c + languageName: node + linkType: hard + "xml2js@npm:0.4.19": version: 0.4.19 resolution: "xml2js@npm:0.4.19" From 247b2554ff2e79181b663751681ad79a8741caed Mon Sep 17 00:00:00 2001 From: Benjie Gillam Date: Thu, 3 Aug 2023 14:40:09 +0100 Subject: [PATCH 11/13] Fix imports --- @app/lib/src/GraphileApolloLink.ts | 2 +- @app/server/src/graphile.config.ts | 8 ++++---- @app/server/src/middleware/installPostGraphile.ts | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/@app/lib/src/GraphileApolloLink.ts b/@app/lib/src/GraphileApolloLink.ts index a871c304..025d4cbc 100644 --- a/@app/lib/src/GraphileApolloLink.ts +++ b/@app/lib/src/GraphileApolloLink.ts @@ -7,7 +7,7 @@ import { } from "@apollo/client"; import { Request, Response } from "express"; import { execute, hookArgs, isAsyncIterable } from "grafast"; -import type {} from "grafserv/express/v4"; +import type {} from "postgraphile/grafserv/express/v4"; import { getOperationAST } from "graphql"; import type { PostGraphileInstance } from "postgraphile"; diff --git a/@app/server/src/graphile.config.ts b/@app/server/src/graphile.config.ts index 4f60f35a..d853e15e 100644 --- a/@app/server/src/graphile.config.ts +++ b/@app/server/src/graphile.config.ts @@ -1,10 +1,10 @@ -import { makePgService } from "@dataplan/pg/adaptors/pg"; +import { makePgService } from "postgraphile/adaptors/pg"; // TODO: import GraphilePro from "@graphile/pro"; // Requires license key import { PgSimplifyInflectionPreset } from "@graphile/simplify-inflection"; import { Request } from "express"; -import type {} from "grafserv/express/v4"; -import { NodePlugin } from "graphile-build"; -import { makePgSmartTagsFromFilePlugin } from "graphile-utils"; +import type {} from "postgraphile/grafserv/express/v4"; +import { NodePlugin } from "postgraphile/graphile-build"; +import { makePgSmartTagsFromFilePlugin } from "postgraphile/utils"; import { resolve } from "path"; import { Pool } from "pg"; import postgraphilePresetAmber from "postgraphile/presets/amber"; diff --git a/@app/server/src/middleware/installPostGraphile.ts b/@app/server/src/middleware/installPostGraphile.ts index 98e5d27f..f01b963f 100644 --- a/@app/server/src/middleware/installPostGraphile.ts +++ b/@app/server/src/middleware/installPostGraphile.ts @@ -1,6 +1,6 @@ import { Express, Request, Response } from "express"; -import { grafserv } from "grafserv/express/v4"; -import { createServer , ServerResponse } from "http"; +import { grafserv } from "postgraphile/grafserv/express/v4"; +import { createServer, ServerResponse } from "http"; import { OutgoingHttpHeaders } from "http2"; import { postgraphile } from "postgraphile"; From 014b24bb58b293078a9b88ee598adb67cb63ddaa Mon Sep 17 00:00:00 2001 From: Benjie Gillam Date: Thu, 3 Aug 2023 14:42:33 +0100 Subject: [PATCH 12/13] Update schema --- data/schema.graphql | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/data/schema.graphql b/data/schema.graphql index 408aa945..190eaba9 100644 --- a/data/schema.graphql +++ b/data/schema.graphql @@ -149,7 +149,10 @@ scalar Cursor """ A point in time as described by the [ISO -8601](https://en.wikipedia.org/wiki/ISO_8601) standard. May or may not include a timezone. +8601](https://en.wikipedia.org/wiki/ISO_8601) and, if it has a timezone, [RFC +3339](https://datatracker.ietf.org/doc/html/rfc3339) standards. Input values +that do not conform to both ISO 8601 and RFC 3339 may be coerced, which may lead +to unexpected results. """ scalar Datetime From 1b00e44d48c63906c9122ea900a029d85c128b90 Mon Sep 17 00:00:00 2001 From: Benjamin Chrobot Date: Tue, 23 Apr 2024 05:36:07 -0400 Subject: [PATCH 13/13] test(helpers): pass client instead of pool; fix typing (#379) --- @app/__tests__/helpers.ts | 2 +- @app/server/__tests__/helpers.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/@app/__tests__/helpers.ts b/@app/__tests__/helpers.ts index a73f5c1a..13d81063 100644 --- a/@app/__tests__/helpers.ts +++ b/@app/__tests__/helpers.ts @@ -1,6 +1,6 @@ import { Pool, PoolClient } from "pg"; -const pools = {}; +const pools: { [key: string]: Pool } = {}; if (!process.env.TEST_DATABASE_URL) { throw new Error("Cannot run tests without a TEST_DATABASE_URL"); diff --git a/@app/server/__tests__/helpers.ts b/@app/server/__tests__/helpers.ts index f28c06db..61c93f4f 100644 --- a/@app/server/__tests__/helpers.ts +++ b/@app/server/__tests__/helpers.ts @@ -25,8 +25,8 @@ export async function createUserAndLogIn() { const pool = poolFromUrl(process.env.TEST_DATABASE_URL!); const client = await pool.connect(); try { - const [user] = await createUsers(pool, 1, true); - const session = await createSession(pool, user.id); + const [user] = await createUsers(client, 1, true); + const session = await createSession(client, user.id); return { user, session }; } finally { client.release();