From a1adf0e7fcd50bd835b3bf9f5d70ecb9bea1d5ba Mon Sep 17 00:00:00 2001 From: Edvard Date: Wed, 17 Apr 2019 17:20:38 +0200 Subject: [PATCH] Add support for restricted graphql user --- .gitignore | 1 + postgraphile/README.md | 18 +- postgraphile/package.json | 3 +- postgraphile/spec/server/config.spec.ts | 5 +- postgraphile/spec/server/runtime.spec.ts | 13 +- postgraphile/src/adapters/postgraphile.ts | 14 +- postgraphile/src/config/parse.ts | 20 ++- postgraphile/src/server/config.ts | 10 +- postgraphile/src/server/interface.ts | 1 + postgraphile/yarn.lock | 190 +++++++++++++++------- 10 files changed, 195 insertions(+), 80 deletions(-) diff --git a/.gitignore b/.gitignore index 78fb54c5..96f02e19 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ vulcanizedb.log db/migrations/20*.sql plugins/*.so postgraphile/*.toml +postgraphile/schema.graphql diff --git a/postgraphile/README.md b/postgraphile/README.md index cd17c7d2..4ae4ff27 100644 --- a/postgraphile/README.md +++ b/postgraphile/README.md @@ -9,11 +9,21 @@ Build the docker image in this directory. Start the `GraphiQL` frontend by: * Setting the env variables for the database connection: `DATABASE_HOST`, `DATABASE_NAME`, `DATABASE_USER`, `DATABASE_PASSWORD` (and optionally `DATABASE_PORT` if running on non-standard port). - * The specified user needs to be `superuser` on the vulcanizeDB database -* Run the container (ex. `docker run -e DATABASE_HOST=localhost -e DATABASE_NAME=vulcanize_public -e DATABASE_USER=vulcanize -e DATABASE_PASSWORD=vulcanize -d m0ar/images:postgraphile-alpine`) -* GraphiQL is available at `:3000/graphiql` + * The specified user needs to be `superuser` on the vulcanizeDB database, + so postgraphile can setup watch fixtures keeping track of live schema + changes. +* To limit the amount of available queries in GraphQL, a restricted user can be used + for postgraphile introspection by adding env variables `GQ_USER` and `GQ_PASSWORD`. + * By doing `GRANT [SELECT | EXECUTE]` on tables/functions for this user, + you can selectively assign things you want available in GraphQL. + * You still need to pass in a superuser with `DATABASE_USER` & `DATABASE_PASSWORD` for + for the postgraphile watch fixtures to work. +* By default, postgraphile publishes the `public` schema. This can be expanded with for example `GQ_SCHEMAS=public,maker` +* Run the container (ex. `docker run -e DATABASE_HOST=localhost -e DATABASE_NAME=my_database -e DATABASE_USER=superuser -e DATABASE_PASSWORD=superuser -e GQ_USER=graphql -e GQ_PASSWORD=graphql -e GQ_SCHEMAS=public,anotherSchema -d my-postgraphile-image`) +* GraphiQL frontend is available at `:3000/graphiql` + GraphQL endpoint is available at `:3000/graphql` -By default, this build will expose only the "public" schema - to add other schemas, use a config file `config.toml` and set the env var `CONFIG_PATH` to point to its location. Example `toml`: +By default, this build will expose only the "public" schema - to add other schemas, use either the env variables, or a config file `config.toml` and set the env var `CONFIG_PATH` to point to its location. Example `toml`: ``` [database] diff --git a/postgraphile/package.json b/postgraphile/package.json index c085ad20..8e5782ab 100644 --- a/postgraphile/package.json +++ b/postgraphile/package.json @@ -28,7 +28,7 @@ "passport": "0.4.0", "pg": "6.4.2", "pg-native": "3.0.0", - "postgraphile": "4.0.0-rc.4", + "postgraphile": "4.4.0-beta.11", "subscriptions-transport-ws": "0.9.14", "toml": "2.3.3" }, @@ -40,6 +40,7 @@ "@types/lodash": "4.14.116", "@types/node": "^10.12.21", "@types/passport": "0.4.6", + "@graphile-contrib/pg-simplify-inflector": "3.0.0", "awesome-typescript-loader": "5.2.0", "jasmine": "3.2.0", "jasmine-ts-console-reporter": "3.1.1", diff --git a/postgraphile/spec/server/config.spec.ts b/postgraphile/spec/server/config.spec.ts index 964bcf97..5159a83f 100644 --- a/postgraphile/spec/server/config.spec.ts +++ b/postgraphile/spec/server/config.spec.ts @@ -24,11 +24,12 @@ describe('buildServerConfig', () => { databaseConfig = { host: 'example.com', database: 'example_database', - schemas: ['public'] + schemas: ['public'], + ownerConnectionString: 'postgres://admin:admin@host' }; postgraphileMiddleware = jasmine - .createSpyObj(['call']), + .createSpyObj(['call']); serverUtilities = { pluginHook: jasmine.createSpy('pluginHook'), diff --git a/postgraphile/spec/server/runtime.spec.ts b/postgraphile/spec/server/runtime.spec.ts index 85b55b61..7f7698a1 100644 --- a/postgraphile/spec/server/runtime.spec.ts +++ b/postgraphile/spec/server/runtime.spec.ts @@ -25,12 +25,17 @@ describe('bootServer', () => { serverConfig = { middleware: jasmine.createSpyObj(['call']), - options: { - pluginHook: jasmine.createSpy('pluginHook'), - watchPg: true, + options: { + appendPlugins: [], + disableDefaultMutations: false, enableCors: true, - simpleSubscriptions: true, + exportGqlSchemaPath: '', graphiql: true, + ignoreRBAC: false, + ownerConnectionString: '', + pluginHook: jasmine.createSpy('pluginHook'), + simpleSubscriptions: true, + watchPg: true, webSocketMiddlewares: [] }, port: 5678 }; diff --git a/postgraphile/src/adapters/postgraphile.ts b/postgraphile/src/adapters/postgraphile.ts index 37a0ecfe..06c0ec39 100644 --- a/postgraphile/src/adapters/postgraphile.ts +++ b/postgraphile/src/adapters/postgraphile.ts @@ -1,6 +1,7 @@ import { RequestHandler } from 'express'; import { Server } from 'http'; -import { PluginHookFn } from 'postgraphile/build/postgraphile/pluginHook'; +import {PluginHookFn, PostGraphilePlugin} from 'postgraphile/build/postgraphile/pluginHook'; +import {Plugin} from 'postgraphile'; // NOTE: Shape of the middleware is not // currently important to this application, but if a need arises, @@ -9,12 +10,17 @@ import { PluginHookFn } from 'postgraphile/build/postgraphile/pluginHook'; export interface PostgraphileMiddleware extends RequestHandler {} export interface PostgraphileOptions { + appendPlugins: Plugin[]; + disableDefaultMutations: boolean; + enableCors: boolean; + exportGqlSchemaPath: string; + graphiql: boolean; + ignoreRBAC: boolean; + ownerConnectionString: string; pluginHook: PluginHookFn; simpleSubscriptions: boolean; watchPg: boolean; - enableCors: boolean; - graphiql: boolean; - // NOTE: Shape of the middlewares is not + // NOTE Shape of the middlewares is not // currently important to this application, but if a need arises, // any needed shape can be assigned from a custom type here. webSocketMiddlewares: object[]; diff --git a/postgraphile/src/config/parse.ts b/postgraphile/src/config/parse.ts index 30960bbc..6390e036 100644 --- a/postgraphile/src/config/parse.ts +++ b/postgraphile/src/config/parse.ts @@ -21,7 +21,9 @@ export function parseConfig( let database = ''; let user = ''; let password = ''; - let schemas = ['public']; + let gqSchemas = ['public']; + let gqUser = ''; + let gqPassword = ''; if (configPath) { const tomlContents = readCallback(`${configPath}`).toString(); @@ -32,7 +34,9 @@ export function parseConfig( database = parsedToml['database']['name']; user = parsedToml['database']['user']; password = parsedToml['database']['password']; - schemas = parsedToml['database']['schemas']; + gqSchemas = parsedToml['database']['schemas']; + gqUser = parsedToml['database']['gq_user'] || gqUser; + gqPassword = parsedToml['database']['gq_password'] || gqPassword; } // Overwrite config values with env. vars if such are set @@ -41,6 +45,11 @@ export function parseConfig( database = process.env.DATABASE_NAME || database; user = process.env.DATABASE_USER || user; password = process.env.DATABASE_PASSWORD || password; + gqSchemas = process.env.GQ_SCHEMAS + ? process.env.GQ_SCHEMAS.split(',') + : gqSchemas; + gqUser = process.env.GQ_USER || gqUser; + gqPassword = process.env.GQ_PASSWORD || gqPassword; if (!host) { throw new Error(MISSING_HOST_MESSAGE); @@ -55,8 +64,11 @@ export function parseConfig( } return { - host: `postgres://${user}:${password}@${host}:${port}`, + host: gqUser && gqPassword + ? `postgres://${gqUser}:${gqPassword}@${host}:${port}` + : `postgres://${user}:${password}@${host}:${port}`, database, - schemas + schemas: gqSchemas, + ownerConnectionString: `postgres://${user}:${password}@${host}:${port}/${database}` }; } diff --git a/postgraphile/src/server/config.ts b/postgraphile/src/server/config.ts index c2a2bace..ead85922 100644 --- a/postgraphile/src/server/config.ts +++ b/postgraphile/src/server/config.ts @@ -23,13 +23,19 @@ export function buildServerConfig( const passportInitializer = utilities.passport.initialize(); const passportSessionHandler = utilities.passport.session(); const pluginHook = utilities.pluginHook; + const PgSimplifyInflectorPlugin = require('@graphile-contrib/pg-simplify-inflector'); const options: PostgraphileOptions = { + appendPlugins: [PgSimplifyInflectorPlugin], + disableDefaultMutations: true, + enableCors: true, + exportGqlSchemaPath: 'schema.graphql', + graphiql: true, + ignoreRBAC: false, + ownerConnectionString: databaseConfig.ownerConnectionString, pluginHook: pluginHook, simpleSubscriptions: true, watchPg: true, - enableCors: true, - graphiql: true, webSocketMiddlewares: [ expressSessionHandler, passportInitializer, diff --git a/postgraphile/src/server/interface.ts b/postgraphile/src/server/interface.ts index cd534d10..f2ea99c0 100644 --- a/postgraphile/src/server/interface.ts +++ b/postgraphile/src/server/interface.ts @@ -18,6 +18,7 @@ export interface DatabaseConfig { host: string; database: string; schemas: string[]; + ownerConnectionString: string; } export interface ServerConfig { diff --git a/postgraphile/yarn.lock b/postgraphile/yarn.lock index ddbf17f8..fb85f0d3 100644 --- a/postgraphile/yarn.lock +++ b/postgraphile/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@graphile-contrib/pg-simplify-inflector@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@graphile-contrib/pg-simplify-inflector/-/pg-simplify-inflector-3.0.0.tgz#fb668befb3be0536911dba48aafd9845a8a2b2d2" + integrity sha512-/3D75/BBJLftUBkidAsqGyfJEvzQqGQNJGIhoMwd3lB6a+UW9ofAC9A0h4a7o/mch8m9XZnYjy399ikwwsNE+g== + "@types/accepts@*": version "1.3.5" resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" @@ -62,6 +67,11 @@ version "0.13.4" resolved "https://registry.yarnpkg.com/@types/graphql/-/graphql-0.13.4.tgz#55ae9c29f0fd6b85ee536f5c72b4769d5c5e06b1" +"@types/graphql@^14.0.3": + version "14.2.0" + resolved "https://registry.yarnpkg.com/@types/graphql/-/graphql-14.2.0.tgz#74e1da5f2a4a744ac6eb3ed57b48242ea9367202" + integrity sha512-lELg5m6eBOmATWyCZl8qULEOvnPIUG6B443yXKj930glXIgwQirIBPp5rthP2amJW0YSzUg2s5sfgba4mRRCNw== + "@types/http-assert@*": version "1.3.0" resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.3.0.tgz#5e932606153da28e1d04f9043f4912cf61fd55dd" @@ -84,13 +94,13 @@ version "3.2.2" resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.2.tgz#dc106e000bbf92a3ac900f756df47344887ee847" -"@types/koa@2.0.44": - version "2.0.44" - resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.0.44.tgz#4d972a3dec4d6eb89bd3c16775de26305d1c51a6" +"@types/koa@^2.0.44": + version "2.0.48" + resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.0.48.tgz#29162783029d3e5df8b58c55f6bf0d35f78fc39f" + integrity sha512-CiIUYhHlOFJhSCTmsFoFkV2t9ij1JwW26nt0W9XZoWTvmAw6zTE0+k3IAoGICtjzIfhZpZcO323NHmI1LGmdDw== dependencies: "@types/accepts" "*" "@types/cookies" "*" - "@types/events" "*" "@types/http-assert" "*" "@types/keygrip" "*" "@types/koa-compose" "*" @@ -144,6 +154,14 @@ "@types/express-serve-static-core" "*" "@types/mime" "*" +"@types/ws@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-6.0.1.tgz#ca7a3f3756aa12f62a0a62145ed14c6db25d5a28" + integrity sha512-EzH8k1gyZ4xih/MaZTXwT2xOkPiIMSrhQ9b8wrlX88L0T02eYsddatQlwVFlEPyEqV0ChpdpNnE51QPH6NVT4Q== + dependencies: + "@types/events" "*" + "@types/node" "*" + "@webassemblyjs/ast@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.5.13.tgz#81155a570bd5803a30ec31436bc2c9c0ede38f25" @@ -832,10 +850,15 @@ color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" -commander@^2.12.1, commander@^2.9.0: +commander@^2.12.1: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" +commander@^2.19.0: + version "2.20.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" + integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== + commander@~2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" @@ -1665,40 +1688,46 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" -graphile-build-pg@4.0.0-rc.9: - version "4.0.0-rc.9" - resolved "https://registry.yarnpkg.com/graphile-build-pg/-/graphile-build-pg-4.0.0-rc.9.tgz#241d3776bbb12b48cb7cbc599b80f51cf4133a00" +graphile-build-pg@4.4.0-beta.11: + version "4.4.0-beta.11" + resolved "https://registry.yarnpkg.com/graphile-build-pg/-/graphile-build-pg-4.4.0-beta.11.tgz#1510cd6f7be13b39c8784727bb28ecbcaf192493" + integrity sha512-wQ++s0m9GO7d5erj7xFGQhwqpC5saPDUJmaeD/kPleFyUODybJFa27aNym1XlRV9tWfh6RiX9KSfTsyT5r9veg== dependencies: chalk "^2.1.0" debug ">=2 <3" - graphile-build "4.0.0-rc.9" - graphql-iso-date "^3.2.0" + graphile-build "4.4.0-beta.11" + graphql-iso-date "^3.6.0" jsonwebtoken "^8.1.1" lodash ">=4 <5" lru-cache ">=4 <5" pg-sql2 "2.2.1" - postgres-interval "1.1.1" + postgres-interval "^1.1.1" -graphile-build@4.0.0-rc.9: - version "4.0.0-rc.9" - resolved "https://registry.yarnpkg.com/graphile-build/-/graphile-build-4.0.0-rc.9.tgz#8fb16994c65f21b7900c76dd6a67c037f5bb00ee" +graphile-build@4.4.0-beta.11: + version "4.4.0-beta.11" + resolved "https://registry.yarnpkg.com/graphile-build/-/graphile-build-4.4.0-beta.11.tgz#0c16f7e740636c246c0079a62a0e1b03bf513b74" + integrity sha512-KxrKgsna/gqQlEqo0dTXWhDCkJ4kmJ1x+c3iCQ8+QUNof6Vb9XFItF3HbX8heSyT83RY9z88NG6gVpYTs1g8aA== dependencies: - "@types/graphql" "^0.13.4" + "@types/graphql" "^14.0.3" + chalk "^2.1.0" debug ">=2 <3" - graphql-parse-resolve-info "4.0.0-rc.8" + graphql-parse-resolve-info "4.1.0" lodash ">=4 <5" - lru-cache ">=4 <5" - pluralize "7.0.0" + lru-cache "^5.0.0" + pluralize "^7.0.0" + semver "^5.6.0" -graphql-iso-date@^3.2.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/graphql-iso-date/-/graphql-iso-date-3.5.0.tgz#55a1be0efa8d28c1453afd2eb5ce1d052189a513" +graphql-iso-date@^3.6.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/graphql-iso-date/-/graphql-iso-date-3.6.1.tgz#bd2d0dc886e0f954cbbbc496bbf1d480b57ffa96" + integrity sha512-AwFGIuYMJQXOEAgRlJlFL4H1ncFM8n8XmoVDTNypNOZyQ8LFDG2ppMFlsS862BSTCDcSUfHp8PD3/uJhv7t59Q== -graphql-parse-resolve-info@4.0.0-rc.8: - version "4.0.0-rc.8" - resolved "https://registry.yarnpkg.com/graphql-parse-resolve-info/-/graphql-parse-resolve-info-4.0.0-rc.8.tgz#32ef7981411c72e7292fc765222127710cc088dc" +graphql-parse-resolve-info@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/graphql-parse-resolve-info/-/graphql-parse-resolve-info-4.1.0.tgz#fa52bc9d8aeec210e3ad92cca30d3c36a5e814c3" + integrity sha512-qDRgykBm1rbyGAlduPuGtKXHlZtUcNgM8Rg6C/gDVcLww9vNV6h0nmCulpYYPWzATnAVGV8ISnLUDFCU9Y+qcA== dependencies: - "@types/graphql" "^0.13.4" + "@types/graphql" "^14.0.3" debug ">=2 <3" graphql-subscriptions@0.5.8: @@ -1707,11 +1736,12 @@ graphql-subscriptions@0.5.8: dependencies: iterall "^1.2.1" -"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": - version "0.13.2" - resolved "http://registry.npmjs.org/graphql/-/graphql-0.13.2.tgz#4c740ae3c222823e7004096f832e7b93b2108270" +"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": + version "14.2.1" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-14.2.1.tgz#779529bf9a01e7207b977a54c20670b48ca6e95c" + integrity sha512-2PL1UbvKeSjy/lUeJqHk+eR9CvuErXoCNwJI4jm3oNFEeY+9ELqHNKO1ZuSxAkasPkpWbmT/iMRMFxd3cEL3tQ== dependencies: - iterall "^1.2.1" + iterall "^1.2.2" handle-thing@^2.0.0: version "2.0.0" @@ -2128,7 +2158,7 @@ isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" -iterall@^1.2.1: +iterall@^1.0.2, iterall@^1.2.1, iterall@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.2.2.tgz#92d70deb8028e0c39ff3164fdbf4d8b088130cd7" @@ -2315,7 +2345,7 @@ lodash.once@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" -"lodash@>=3.5 <5", "lodash@>=4 <5", lodash@^4.17.10, lodash@^4.17.5: +"lodash@>=4 <5", lodash@^4.17.10, lodash@^4.17.5: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" @@ -2357,6 +2387,13 @@ long@^3.2.0: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -2921,7 +2958,12 @@ parse-asn1@^5.0.0: evp_bytestokey "^1.0.0" pbkdf2 "^3.0.3" -parseurl@^1.3.1, parseurl@~1.3.2: +parseurl@^1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" @@ -3009,9 +3051,10 @@ pg-pool@1.*: generic-pool "2.4.3" object-assign "4.1.0" -pg-sql2@2.2.1: +pg-sql2@2.2.1, pg-sql2@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/pg-sql2/-/pg-sql2-2.2.1.tgz#a37612e5243887c5135a6849dec1f20b2cf00553" + integrity sha512-S4XyLvUJv/rUMNk4+4LuT7S/aWKlQifi6ekHeshNWn0FZJxq5t4qw2VzCfbTNM3mQN7c9B6rM01FcnbRI37Y2Q== dependencies: "@types/pg" "^7.4.10" debug ">=2 <3" @@ -3081,9 +3124,10 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" -pluralize@7.0.0: +pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== portfinder@^1.0.20: version "1.0.20" @@ -3098,39 +3142,43 @@ posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" -postgraphile-core@4.0.0-rc.9: - version "4.0.0-rc.9" - resolved "https://registry.yarnpkg.com/postgraphile-core/-/postgraphile-core-4.0.0-rc.9.tgz#7dc9bf1d0da3a4f81bd68b3977d27ed174a5c72f" +postgraphile-core@4.4.0-beta.11: + version "4.4.0-beta.11" + resolved "https://registry.yarnpkg.com/postgraphile-core/-/postgraphile-core-4.4.0-beta.11.tgz#44c89fe23bd17b59c0605c23c2bfd5564bfb547a" + integrity sha512-6efS40Pi9Cj83KlhCe8S2DKsOBh++hGrtA5T0QL8wUYrQJhPdcKmmec9BxWnSRpHE/H/EO0nJPDZm51ixxPu+A== dependencies: - "@types/graphql" "^0.13.4" - graphile-build "4.0.0-rc.9" - graphile-build-pg "4.0.0-rc.9" + "@types/graphql" "^14.0.3" + graphile-build "4.4.0-beta.11" + graphile-build-pg "4.4.0-beta.11" -postgraphile@4.0.0-rc.4: - version "4.0.0-rc.4" - resolved "https://registry.yarnpkg.com/postgraphile/-/postgraphile-4.0.0-rc.4.tgz#15a610c28bce2e077fc34d5b4600504c2b86cb39" +postgraphile@4.4.0-beta.11: + version "4.4.0-beta.11" + resolved "https://registry.yarnpkg.com/postgraphile/-/postgraphile-4.4.0-beta.11.tgz#19f1a81f4fb9dce92c57c3f6a92e626539f2c95b" + integrity sha512-EFPEApgbDVAT43AnW46KHfIQEQA5PxkKs5YpCsVpC5WKY/4aB0mmDjqX4wdZf1PfP6G5qZjBQZ/Jx4/z6XgScw== dependencies: - "@types/graphql" "^0.13.4" + "@types/graphql" "^14.0.3" "@types/jsonwebtoken" "<7.2.1" - "@types/koa" "2.0.44" + "@types/koa" "^2.0.44" "@types/pg" "^7.4.10" + "@types/ws" "^6.0.1" body-parser "^1.15.2" chalk "^1.1.3" - commander "^2.9.0" + commander "^2.19.0" debug "^2.3.3" finalhandler "^1.0.6" - 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" + 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" http-errors "^1.5.1" + iterall "^1.0.2" jsonwebtoken "^8.0.0" - lodash ">=3.5 <5" lru-cache ">=4 <5" - parseurl "^1.3.1" + parseurl "^1.3.2" pg ">=6.1.0 <8" pg-connection-string "^0.1.3" - pg-sql2 "2.2.1" - postgraphile-core "4.0.0-rc.9" - send "^0.16.1" + pg-sql2 "^2.2.1" + postgraphile-core "4.4.0-beta.11" + subscriptions-transport-ws "^0.9.15" tslib "^1.5.0" + ws "^6.1.3" postgres-array@~1.0.0: version "1.0.2" @@ -3144,18 +3192,19 @@ postgres-date@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.3.tgz#e2d89702efdb258ff9d9cee0fe91bd06975257a8" -postgres-interval@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.1.1.tgz#acdb0f897b4b1c6e496d9d4e0a853e1c428f06f0" - dependencies: - xtend "^4.0.0" - postgres-interval@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.1.2.tgz#bf71ff902635f21cb241a013fc421d81d1db15a9" dependencies: xtend "^4.0.0" +postgres-interval@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" + integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== + dependencies: + xtend "^4.0.0" + process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" @@ -3485,12 +3534,17 @@ semver@^5.3.0, semver@^5.5.0: version "5.5.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" +semver@^5.6.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== + semver@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.0.0.tgz#05e359ee571e5ad7ed641a6eec1e547ba52dea65" integrity sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ== -send@0.16.2, send@^0.16.1: +send@0.16.2: version "0.16.2" resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" dependencies: @@ -3829,6 +3883,17 @@ subscriptions-transport-ws@0.9.14: symbol-observable "^1.0.4" ws "^5.2.0" +subscriptions-transport-ws@^0.9.15: + version "0.9.16" + resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.16.tgz#90a422f0771d9c32069294c08608af2d47f596ec" + integrity sha512-pQdoU7nC+EpStXnCfh/+ho0zE0Z+ma+i7xvj7bkXKb1dvYHSZxgRPaU6spRP+Bjzow67c/rRDoix5RT0uU9omw== + dependencies: + backo2 "^1.0.2" + eventemitter3 "^3.1.0" + iterall "^1.2.1" + symbol-observable "^1.0.4" + ws "^5.2.0" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -4303,6 +4368,13 @@ ws@^5.2.0: dependencies: async-limiter "~1.0.0" +ws@^6.1.3: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + xregexp@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020"