Merge pull request #84 from vulcanize/improve-postgraphile-interaction

Add support for restricted graphql users
This commit is contained in:
Rob Mulholand 2019-04-18 09:51:33 -05:00 committed by GitHub
commit 13cd7126cc
12 changed files with 199 additions and 119 deletions

1
.gitignore vendored
View File

@ -15,3 +15,4 @@ vulcanizedb.log
db/migrations/20*.sql
plugins/*.so
postgraphile/*.toml
postgraphile/schema.graphql

View File

@ -9,18 +9,31 @@ 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
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]
name = "vulcanize_public"
hostname = "localhost"
port = 5432
schemas = ["public", "yourschema"]
gq_schemas = ["public", "yourschema"]
gq_user = "graphql"
gq_password = "graphql"
```
## Building
@ -29,8 +42,6 @@ By default, this build will expose only the "public" schema - to add other schem
Install dependencies with `yarn` and execute `yarn build`. The bundle produced by Webpack will be present in `build/dist/`.
This application currently uses the Postgraphile supporter plugin. This plugin is present in the `vendor/` directory and is copied to `node_modules/` after installation of packages. It is a fresh checkout of the plugin as of August 31st, 2018.
## Running
Provide the built bundle to node as a runnable script: `node ./build/dist/vulcanize-postgraphile-server.js`

View File

@ -5,7 +5,6 @@
"scripts": {
"build": "rm -rf ./build/dist && webpack --config=./webpack.config.js",
"lint": "tslint --project ./tsconfig.json --config ./tslint.json",
"postinstall": "rm -rf node_modules/@graphile && mkdir node_modules/@graphile && cp -R ./vendor/postgraphile-supporter/ ./node_modules/@graphile/plugin-supporter/",
"start": "npm run build && node ./build/dist/vulcanize-postgraphile-server.js",
"dev": "./node_modules/typescript/bin/tsc && node build/dist/src/index.js",
"test": "rm -rf ./build/spec && tsc --build ./tsconfig.test.json && jasmine --config=./spec/support/jasmine.json",
@ -28,7 +27,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 +39,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",

View File

@ -24,15 +24,15 @@ describe('buildServerConfig', () => {
databaseConfig = {
host: 'example.com',
database: 'example_database',
schemas: ['public']
schemas: ['public'],
ownerConnectionString: 'postgres://admin:admin@host'
};
postgraphileMiddleware = jasmine
.createSpyObj<PostgraphileMiddleware>(['call']),
.createSpyObj<PostgraphileMiddleware>(['call']);
serverUtilities = {
pluginHook: jasmine.createSpy('pluginHook'),
enableSubscriptions: jasmine.createSpy('enableSubscriptions'),
express: jasmine.createSpy('express'),
expressSession: jasmine.createSpy('expressSession'),
httpServerFactory: jasmine.createSpy('httpServerFactory'),
@ -66,10 +66,6 @@ describe('buildServerConfig', () => {
expect(serverConfig.options).not.toBeNull();
});
it('enables simple subscriptions', () => {
expect(serverConfig.options.simpleSubscriptions).toBe(true);
});
it('it adds the express session handler as the first middleware', () => {
expect(serverConfig.options.webSocketMiddlewares[0])
.toBe(expressSessionHandler);

View File

@ -15,7 +15,6 @@ describe('bootServer', () => {
beforeEach(() => {
serverUtilities = {
pluginHook: jasmine.createSpy('pluginHook'),
enableSubscriptions: jasmine.createSpy('enableSubscriptions'),
express: jasmine.createSpy('express'),
expressSession: jasmine.createSpy('expressSession'),
httpServerFactory: jasmine.createSpy('httpServerFactory'),
@ -26,11 +25,15 @@ describe('bootServer', () => {
serverConfig = {
middleware: jasmine.createSpyObj<PostgraphileMiddleware>(['call']),
options: {
appendPlugins: [],
disableDefaultMutations: false,
enableCors: true,
exportGqlSchemaPath: '',
graphiql: true,
ignoreRBAC: false,
ownerConnectionString: '',
pluginHook: jasmine.createSpy('pluginHook'),
watchPg: true,
enableCors: true,
simpleSubscriptions: true,
graphiql: true,
webSocketMiddlewares: [] },
port: 5678
};
@ -56,14 +59,6 @@ describe('bootServer', () => {
expect(useSpy).toHaveBeenCalledWith(serverConfig.middleware);
});
it('enahances the Node HTTP server with Postgraphile subscriptions', () => {
expect(serverUtilities.enableSubscriptions)
.toHaveBeenCalledWith(
mockHttpServer,
serverConfig.middleware,
serverConfig.options);
});
it('instructs the server to listen on the given port', () => {
const listenSpy = mockHttpServer.listen as jasmine.Spy;
expect(listenSpy).toHaveBeenCalledWith(serverConfig.port);

View File

@ -1,6 +1,6 @@
import { RequestHandler } from 'express';
import { Server } from 'http';
import { PluginHookFn } from 'postgraphile/build/postgraphile/pluginHook';
import {PluginHookFn } 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 +9,16 @@ import { PluginHookFn } from 'postgraphile/build/postgraphile/pluginHook';
export interface PostgraphileMiddleware extends RequestHandler {}
export interface PostgraphileOptions {
pluginHook: PluginHookFn;
simpleSubscriptions: boolean;
watchPg: boolean;
appendPlugins: Plugin[];
disableDefaultMutations: boolean;
enableCors: boolean;
exportGqlSchemaPath: string;
graphiql: boolean;
// NOTE: Shape of the middlewares is not
ignoreRBAC: boolean;
ownerConnectionString: string;
pluginHook: PluginHookFn;
watchPg: boolean;
// 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[];
@ -26,8 +30,3 @@ export type PostgraphileInitCallback = (
options: PostgraphileOptions
) => PostgraphileMiddleware;
export type AddSubscriptionsCallback = (
httpServer: Server,
middleware: PostgraphileMiddleware,
options: PostgraphileOptions
) => void;

View File

@ -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']['gq_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}`
};
}

View File

@ -7,11 +7,7 @@ import passport = require('passport');
import session = require('express-session');
import toml = require('toml');
const {
default: PostGraphileSupporter,
enhanceHttpServerWithSubscriptions,
} = require('@graphile/plugin-supporter');
const pluginHook = makePluginHook([PostGraphileSupporter]);
const pluginHook = makePluginHook([]);
import { ServerUtilities } from './server/interface';
import { bootServer } from './server/runtime';
@ -27,7 +23,6 @@ const configPath = process.env[CONFIG_PATH_KEY];
const serverPort = process.env[SERVER_PORT_KEY];
const serverUtilities: ServerUtilities = {
enableSubscriptions: enhanceHttpServerWithSubscriptions,
express,
expressSession: session,
httpServerFactory: createServer,

View File

@ -23,13 +23,18 @@ 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 = {
pluginHook: pluginHook,
simpleSubscriptions: true,
watchPg: true,
appendPlugins: [PgSimplifyInflectorPlugin],
disableDefaultMutations: true,
enableCors: true,
exportGqlSchemaPath: 'schema.graphql',
graphiql: true,
ignoreRBAC: false,
ownerConnectionString: databaseConfig.ownerConnectionString,
pluginHook: pluginHook,
watchPg: true,
webSocketMiddlewares: [
expressSessionHandler,
passportInitializer,

View File

@ -7,7 +7,6 @@ import {
} from '../adapters/session';
import {
AddSubscriptionsCallback,
PostgraphileInitCallback,
PostgraphileMiddleware,
PostgraphileOptions
@ -18,6 +17,7 @@ export interface DatabaseConfig {
host: string;
database: string;
schemas: string[];
ownerConnectionString: string;
}
export interface ServerConfig {
@ -27,7 +27,6 @@ export interface ServerConfig {
}
export interface ServerUtilities {
enableSubscriptions: AddSubscriptionsCallback;
express: ExpressInitCallback;
expressSession: ExpressSessionInitCallback;
httpServerFactory: CreateHttpServerCallback;

View File

@ -9,10 +9,5 @@ export function bootServer(
const httpServer = utilities.httpServerFactory(expressApp);
utilities.enableSubscriptions(
httpServer,
config.middleware,
config.options);
httpServer.listen(config.port);
}

View File

@ -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"