diff --git a/.travis.yml b/.travis.yml index 84c82905a..ed624a694 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,14 +11,15 @@ env: TEST_DATABASE_URL: postgres://localhost:5432/travis cache: - yarn: true directories: - node_modules - $NVM_DIR - - packages/graphile-build-pg/node_modules - - packages/graphql-parse-resolve-info/node_modules - - packages/postgraphile-core/node_modules - - packages/graphile-build/node_modules + - $HOME/.yarn + +before_install: + - curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 0.28.1 + - export PATH="$HOME/.yarn/bin:$PATH" + install: - yarn diff --git a/.yarnrc b/.yarnrc new file mode 100644 index 000000000..19daacaa0 --- /dev/null +++ b/.yarnrc @@ -0,0 +1 @@ +workspaces-experimental true diff --git a/package.json b/package.json index 0cc47b3bb..5ced0ee5a 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,8 @@ "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", "babel-plugin-transform-runtime": "^6.23.0", "babel-preset-flow": "^6.23.0", - "flow-bin": "^0.50.0", + "flow-bin": "^0.52.0", + "flow-copy-source": "^1.2.0", "graphql": "^0.10.5", "pg": ">=6 < 7", "sql-formatter": "^1.2.2" diff --git a/packages/graphile-build-pg/package.json b/packages/graphile-build-pg/package.json index c2c4be935..80cfb0baf 100644 --- a/packages/graphile-build-pg/package.json +++ b/packages/graphile-build-pg/package.json @@ -5,7 +5,7 @@ "main": "index.js", "scripts": { "test": "jest", - "prepublish": "mkdir -p node8plus node7minus && babel -s true --out-dir node8plus src && BABEL_ENV=node7minus babel -s true --out-dir node7minus src && flow-copy-source src node8plus", + "prepublish": "mkdir -p node8plus node7minus && babel -s true --out-dir node8plus src && BABEL_ENV=node7minus babel -s true --out-dir node7minus src && ../../node_modules/.bin/flow-copy-source src node8plus", "watch": "mkdir -p node8plus && babel -s true --watch --out-dir node8plus src" }, "repository": { @@ -43,7 +43,7 @@ "lodash": ">=4 <5", "lru-cache": "4.1.1", "pg-range-parser": "^1.0.0", - "pg-sql2": "^1.0.0-beta.1", + "pg-sql2": "^1.0.0-beta.3", "pluralize": "^5.0.0" }, "peerDependencies": { diff --git a/packages/graphile-build-pg/src/QueryBuilder.js b/packages/graphile-build-pg/src/QueryBuilder.js index 343071f63..b02d8d200 100644 --- a/packages/graphile-build-pg/src/QueryBuilder.js +++ b/packages/graphile-build-pg/src/QueryBuilder.js @@ -245,6 +245,10 @@ class QueryBuilder { this.lock("orderBy"); return this.compiledData.orderBy; } + getSelectFieldsCount() { + this.lockEverything(); + return this.compiledData.select.length; + } buildSelectFields() { this.lockEverything(); return sql.join( diff --git a/packages/graphile-build-pg/src/plugins/PageInfoStartEndCursor.js b/packages/graphile-build-pg/src/plugins/PageInfoStartEndCursor.js index ac100315f..6c233ae6a 100644 --- a/packages/graphile-build-pg/src/plugins/PageInfoStartEndCursor.js +++ b/packages/graphile-build-pg/src/plugins/PageInfoStartEndCursor.js @@ -4,20 +4,26 @@ import type { Plugin } from "graphile-build"; export default (function PageInfoStartEndCursor(builder) { builder.hook( "GraphQLObjectType:fields", - (fields, { extend, getTypeByName }, { Self }) => { + (fields, { extend, getTypeByName }, { Self, fieldWithHooks }) => { if (Self.name !== "PageInfo") { return fields; } const Cursor = getTypeByName("Cursor"); return extend(fields, { - startCursor: { - description: "When paginating backwards, the cursor to continue.", - type: Cursor, - }, - endCursor: { - description: "When paginating forwards, the cursor to continue.", - type: Cursor, - }, + startCursor: fieldWithHooks("startCursor", ({ addDataGenerator }) => { + addDataGenerator(() => ({ usesCursor: [true] })); + return { + description: "When paginating backwards, the cursor to continue.", + type: Cursor, + }; + }), + endCursor: fieldWithHooks("endCursor", ({ addDataGenerator }) => { + addDataGenerator(() => ({ usesCursor: [true] })); + return { + description: "When paginating forwards, the cursor to continue.", + type: Cursor, + }; + }), }); } ); diff --git a/packages/graphile-build-pg/src/plugins/PgScalarFunctionConnectionPlugin.js b/packages/graphile-build-pg/src/plugins/PgScalarFunctionConnectionPlugin.js index 02236505d..5fb66d4eb 100644 --- a/packages/graphile-build-pg/src/plugins/PgScalarFunctionConnectionPlugin.js +++ b/packages/graphile-build-pg/src/plugins/PgScalarFunctionConnectionPlugin.js @@ -41,15 +41,20 @@ export default (function PgTablesPlugin(builder, { pgInflection: inflection }) { proc.namespace.name ), description: `A \`${NodeType.name}\` edge in the connection.`, - fields: () => { + fields: ({ fieldWithHooks }) => { return { - cursor: { - description: "A cursor for use in pagination.", - type: Cursor, - resolve(data) { - return base64(JSON.stringify(data.__cursor)); - }, - }, + cursor: fieldWithHooks("cursor", ({ addDataGenerator }) => { + addDataGenerator(() => ({ + usesCursor: [true], + })); + return { + description: "A cursor for use in pagination.", + type: Cursor, + resolve(data) { + return base64(JSON.stringify(data.__cursor)); + }, + }; + }), node: { description: `The \`${NodeType.name}\` at the end of the edge.`, type: NodeType, diff --git a/packages/graphile-build-pg/src/plugins/PgTablesPlugin.js b/packages/graphile-build-pg/src/plugins/PgTablesPlugin.js index edd9d610a..0596af627 100644 --- a/packages/graphile-build-pg/src/plugins/PgTablesPlugin.js +++ b/packages/graphile-build-pg/src/plugins/PgTablesPlugin.js @@ -207,18 +207,23 @@ export default (function PgTablesPlugin(builder, { pgInflection: inflection }) { { description: `A \`${tableTypeName}\` edge in the connection.`, name: inflection.edge(TableType.name), - fields: ({ recurseDataGeneratorsForField }) => { + fields: ({ fieldWithHooks, recurseDataGeneratorsForField }) => { recurseDataGeneratorsForField("node"); return { - cursor: { - description: "A cursor for use in pagination.", - type: Cursor, - resolve(data) { - return ( - data.__cursor && base64(JSON.stringify(data.__cursor)) - ); - }, - }, + cursor: fieldWithHooks("cursor", ({ addDataGenerator }) => { + addDataGenerator(() => ({ + usesCursor: [true], + })); + return { + description: "A cursor for use in pagination.", + type: Cursor, + resolve(data) { + return ( + data.__cursor && base64(JSON.stringify(data.__cursor)) + ); + }, + }; + }), node: { description: `The \`${tableTypeName}\` at the end of the edge.`, type: new GraphQLNonNull(TableType), diff --git a/packages/graphile-build-pg/src/plugins/addStartEndCursor.js b/packages/graphile-build-pg/src/plugins/addStartEndCursor.js index ab0b7e811..d5fb285b0 100644 --- a/packages/graphile-build-pg/src/plugins/addStartEndCursor.js +++ b/packages/graphile-build-pg/src/plugins/addStartEndCursor.js @@ -6,7 +6,7 @@ function cursorify(val) { return val && val.__cursor ? base64(JSON.stringify(val.__cursor)) : val; } -export default (function(value) { +export default (function addStartEndCursor(value) { const data = value && value.data && value.data.length ? value.data : null; const startCursor = cursorify(data && data[0]); const endCursor = cursorify(data && data[value.data.length - 1]); diff --git a/packages/graphile-build-pg/src/plugins/viaTemporaryTable.js b/packages/graphile-build-pg/src/plugins/viaTemporaryTable.js index b49d08082..29933ad97 100644 --- a/packages/graphile-build-pg/src/plugins/viaTemporaryTable.js +++ b/packages/graphile-build-pg/src/plugins/viaTemporaryTable.js @@ -3,7 +3,7 @@ import sql from "pg-sql2"; import debugFactory from "debug"; import type { Client } from "pg"; -import type { SQL, OpaqueSQLQuery } from "pg-sql2"; +import type { SQL, SQLQuery } from "pg-sql2"; const debugSql = debugFactory("graphile-build-pg:sql"); @@ -45,7 +45,7 @@ export default async function viaTemporaryTable( sqlResultQuery: SQL, isPgClassLike: boolean = true ) { - async function performQuery(pgClient: Client, sqlQuery: OpaqueSQLQuery) { + async function performQuery(pgClient: Client, sqlQuery: SQLQuery) { const { text, values } = sql.compile(sqlQuery); if (debugSql.enabled) debugSql(text); return pgClient.query(text, values); diff --git a/packages/graphile-build-pg/src/queryFromResolveData.js b/packages/graphile-build-pg/src/queryFromResolveData.js index e906f7ef7..360aa2d03 100644 --- a/packages/graphile-build-pg/src/queryFromResolveData.js +++ b/packages/graphile-build-pg/src/queryFromResolveData.js @@ -25,7 +25,14 @@ export default ( pgCalculateTotalCount, calculateHasNextPage, calculateHasPreviousPage, + usesCursor: explicitlyUsesCursor, } = resolveData; + + const usesCursor: boolean = + (explicitlyUsesCursor && explicitlyUsesCursor.length > 0) || + (calculateHasNextPage && calculateHasNextPage.length > 0) || + (calculateHasPreviousPage && calculateHasPreviousPage.length > 0) || + false; const rawCursorPrefix = reallyRawCursorPrefix && reallyRawCursorPrefix.filter(_ => _); @@ -99,25 +106,27 @@ export default ( options.withCursor ) { // Sometimes we need a __cursor even if it's not a collection; e.g. to get the edge field on a mutation - queryBuilder.selectCursor(() => { - const orderBy = queryBuilder - .getOrderByExpressionsAndDirections() - .map(([expr]) => expr); - if (orderBy.length > 0) { - return sql.fragment`json_build_array(${sql.join( - [ - ...getPgCursorPrefix(), - sql.fragment`json_build_array(${sql.join(orderBy, ", ")})`, - ], - ", " - )})`; - } else { - return sql.fragment`json_build_array(${sql.join( - getPgCursorPrefix(), - ", " - )}, (row_number() over (partition by 1)))`; - } - }); + if (usesCursor) { + queryBuilder.selectCursor(() => { + const orderBy = queryBuilder + .getOrderByExpressionsAndDirections() + .map(([expr]) => expr); + if (orderBy.length > 0) { + return sql.fragment`json_build_array(${sql.join( + [ + ...getPgCursorPrefix(), + sql.fragment`json_build_array(${sql.join(orderBy, ", ")})`, + ], + ", " + )})`; + } else { + return sql.fragment`json_build_array(${sql.join( + getPgCursorPrefix(), + ", " + )}, (row_number() over (partition by 1)))`; + } + }); + } } if (options.withPagination || options.withPaginationAsFields) { queryBuilder.setCursorComparator((cursorValue, isAfter) => { @@ -176,6 +185,7 @@ export default ( }); const query = queryBuilder.build(options); + const haveFields = queryBuilder.getSelectFieldsCount() > 0; const sqlQueryAlias = sql.identifier(Symbol()); const sqlSummaryAlias = sql.identifier(Symbol()); const canHaveCursorInWhere = @@ -212,17 +222,26 @@ export default ( from ${queryBuilder.getTableExpression()} as ${queryBuilder.getTableAlias()} where ${queryBuilder.buildWhereClause(false, false, options)} )`; - const sqlWith = sql.fragment`with ${sqlQueryAlias} as (${query}), ${sqlSummaryAlias} as (select json_agg(to_json(${sqlQueryAlias})) as data from ${sqlQueryAlias})`; + const sqlWith = haveFields + ? sql.fragment`with ${sqlQueryAlias} as (${query}), ${sqlSummaryAlias} as (select json_agg(to_json(${sqlQueryAlias})) as data from ${sqlQueryAlias})` + : sql.fragment``; const sqlFrom = sql.fragment``; - const fields = [ - [ + const fields: Array<[SQL, string]> = []; + if (haveFields) { + fields.push([ sql.fragment`coalesce((select ${sqlSummaryAlias}.data from ${sqlSummaryAlias}), '[]'::json)`, "data", - ], - calculateHasNextPage && [hasNextPage, "hasNextPage"], - calculateHasPreviousPage && [hasPreviousPage, "hasPreviousPage"], - pgCalculateTotalCount && [totalCount, "totalCount"], - ].filter(_ => _); + ]); + if (calculateHasNextPage) { + fields.push([hasNextPage, "hasNextPage"]); + } + if (calculateHasPreviousPage) { + fields.push([hasPreviousPage, "hasPreviousPage"]); + } + } + if (pgCalculateTotalCount) { + fields.push([totalCount, "totalCount"]); + } if (options.withPaginationAsFields) { return sql.fragment`${sqlWith} select ${sql.join( fields.map( diff --git a/packages/graphile-build/__tests__/fieldData.test.js b/packages/graphile-build/__tests__/fieldData.test.js index d2390bb90..aeae503df 100644 --- a/packages/graphile-build/__tests__/fieldData.test.js +++ b/packages/graphile-build/__tests__/fieldData.test.js @@ -149,6 +149,9 @@ const DummyConnectionPlugin = async builder => { recurseDataGeneratorsForField, }) => { recurseDataGeneratorsForField("node"); + addDataGeneratorForField("cursor", () => ({ + usesCursor: [true], + })); addDataGeneratorForField( "cursor", ( diff --git a/packages/graphile-build/package.json b/packages/graphile-build/package.json index e2aff9f0f..c5869e9bb 100644 --- a/packages/graphile-build/package.json +++ b/packages/graphile-build/package.json @@ -5,7 +5,7 @@ "main": "index.js", "scripts": { "test": "jest", - "prepublish": "mkdir -p node8plus node7minus && babel -s true --out-dir node8plus src && BABEL_ENV=node7minus babel -s true --out-dir node7minus src && flow-copy-source src node8plus", + "prepublish": "mkdir -p node8plus node7minus && babel -s true --out-dir node8plus src && BABEL_ENV=node7minus babel -s true --out-dir node7minus src && ../../node_modules/.bin/flow-copy-source src node8plus", "watch": "mkdir -p node8plus && babel -s true --watch --out-dir node8plus src" }, "repository": { diff --git a/packages/graphql-parse-resolve-info/package.json b/packages/graphql-parse-resolve-info/package.json index 2d0a46802..abeb4781c 100644 --- a/packages/graphql-parse-resolve-info/package.json +++ b/packages/graphql-parse-resolve-info/package.json @@ -5,7 +5,7 @@ "main": "index.js", "scripts": { "test": "jest .", - "prepublish": "mkdir -p node8plus node7minus && babel -s true --out-dir node8plus src && BABEL_ENV=node7minus babel -s true --out-dir node7minus src && flow-copy-source src node8plus", + "prepublish": "mkdir -p node8plus node7minus && babel -s true --out-dir node8plus src && BABEL_ENV=node7minus babel -s true --out-dir node7minus src && ../../node_modules/.bin/flow-copy-source src node8plus", "watch": "mkdir -p node8plus && babel -s true --watch --out-dir node8plus src" }, "repository": { diff --git a/packages/postgraphile-core/__tests__/fixtures/queries/connections-totalCount.graphql b/packages/postgraphile-core/__tests__/fixtures/queries/connections-totalCount.graphql new file mode 100644 index 000000000..87b7dcc17 --- /dev/null +++ b/packages/postgraphile-core/__tests__/fixtures/queries/connections-totalCount.graphql @@ -0,0 +1,3 @@ +query { + a: allPeople { totalCount } +} diff --git a/packages/postgraphile-core/__tests__/integration/__snapshots__/queries.test.js.snap b/packages/postgraphile-core/__tests__/integration/__snapshots__/queries.test.js.snap index d96b26460..730d3e806 100644 --- a/packages/postgraphile-core/__tests__/integration/__snapshots__/queries.test.js.snap +++ b/packages/postgraphile-core/__tests__/integration/__snapshots__/queries.test.js.snap @@ -554,6 +554,16 @@ Object { } `; +exports[`connections-totalCount.graphql 1`] = ` +Object { + "data": Object { + "a": Object { + "totalCount": 6, + }, + }, +} +`; + exports[`dynamic-json.graphql 1`] = ` Object { "data": Object { diff --git a/packages/postgraphile-core/package.json b/packages/postgraphile-core/package.json index db5ca9a32..3736c3fce 100644 --- a/packages/postgraphile-core/package.json +++ b/packages/postgraphile-core/package.json @@ -5,7 +5,7 @@ "main": "index.js", "scripts": { "test": "scripts/test", - "prepublish": "mkdir -p node8plus node7minus && babel -s true --out-dir node8plus src && BABEL_ENV=node7minus babel -s true --out-dir node7minus src && flow-copy-source src node8plus", + "prepublish": "mkdir -p node8plus node7minus && babel -s true --out-dir node8plus src && BABEL_ENV=node7minus babel -s true --out-dir node7minus src && ../../node_modules/.bin/flow-copy-source src node8plus", "watch": "mkdir -p node8plus && babel -s true --watch --out-dir node8plus src" }, "repository": { diff --git a/yarn.lock b/yarn.lock index 08fa46fdc..abaee4257 100644 --- a/yarn.lock +++ b/yarn.lock @@ -37,7 +37,7 @@ acorn@^4.0.4: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" -acorn@^5.0.1: +acorn@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.1.tgz#53fe161111f912ab999ee887a90a0bc52822fd75" @@ -820,11 +820,11 @@ browser-resolve@^1.11.2: resolve "1.1.7" browserslist@^2.1.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.2.2.tgz#e9b4618b8a01c193f9786beea09f6fd10dbe31c3" + version "2.3.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.3.0.tgz#b2aa76415c71643fe2368f6243b43bbbb4211752" dependencies: - caniuse-lite "^1.0.30000704" - electron-to-chromium "^1.3.16" + caniuse-lite "^1.0.30000710" + electron-to-chromium "^1.3.17" bser@1.0.2: version "1.0.2" @@ -891,9 +891,9 @@ camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" -caniuse-lite@^1.0.30000704: - version "1.0.30000710" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000710.tgz#1c249bf7c6a61161c9b10906e3ad9fa5b6761af1" +caniuse-lite@^1.0.30000710: + version "1.0.30000712" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000712.tgz#b4732def2459224f3f78c6a9ba103abfcc705670" caseless@~0.12.0: version "0.12.0" @@ -927,8 +927,8 @@ chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: supports-color "^2.0.0" chalk@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.0.1.tgz#dbec49436d2ae15f536114e76d14656cdbc0f44d" + version "2.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" dependencies: ansi-styles "^3.1.0" escape-string-regexp "^1.0.5" @@ -1399,7 +1399,7 @@ ecdsa-sig-formatter@1.0.9: base64url "^2.0.0" safe-buffer "^5.0.1" -electron-to-chromium@^1.3.16: +electron-to-chromium@^1.3.17: version "1.3.17" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.17.tgz#41c13457cc7166c5c15e767ae61d86a8cacdee5d" @@ -1461,8 +1461,8 @@ eslint-scope@^3.7.1: estraverse "^4.1.1" eslint@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.3.0.tgz#fcd7c96376bbf34c85ee67ed0012a299642b108f" + version "4.4.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.4.1.tgz#99cd7eafcffca2ff99a5c8f5f2a474d6364b4bd3" dependencies: ajv "^5.2.0" babel-code-frame "^6.22.0" @@ -1472,7 +1472,7 @@ eslint@^4.0.0: debug "^2.6.8" doctrine "^2.0.0" eslint-scope "^3.7.1" - espree "^3.4.3" + espree "^3.5.0" esquery "^1.0.0" estraverse "^4.2.0" esutils "^2.0.2" @@ -1484,7 +1484,7 @@ eslint@^4.0.0: imurmurhash "^0.1.4" inquirer "^3.0.6" is-resolvable "^1.0.0" - js-yaml "^3.8.4" + js-yaml "^3.9.1" json-stable-stringify "^1.0.1" levn "^0.3.0" lodash "^4.17.4" @@ -1501,11 +1501,11 @@ eslint@^4.0.0: table "^4.0.1" text-table "~0.2.0" -espree@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.3.tgz#2910b5ccd49ce893c2ffffaab4fd8b3a31b82374" +espree@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.0.tgz#98358625bdd055861ea27e2867ea729faf463d8d" dependencies: - acorn "^5.0.1" + acorn "^5.1.1" acorn-jsx "^3.0.0" esprima@^2.7.1: @@ -1685,9 +1685,9 @@ flat-cache@^1.2.1: graceful-fs "^4.1.2" write "^0.2.1" -flow-bin@^0.50.0: - version "0.50.0" - resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.50.0.tgz#d4cdb2430dee1a3599f0eb6fe551146e3027256a" +flow-bin@^0.52.0: + version "0.52.0" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.52.0.tgz#b6d9abe8bcd1ee5c62df386451a4e2553cadc3a3" flow-copy-source@^1.2.0: version "1.2.0" @@ -2527,7 +2527,7 @@ js-tokens@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" -js-yaml@^3.7.0, js-yaml@^3.8.4: +js-yaml@^3.7.0, js-yaml@^3.9.1: version "3.9.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.9.1.tgz#08775cebdfdd359209f0d2acd383c8f86a6904a0" dependencies: @@ -2539,8 +2539,8 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" jschardet@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.5.0.tgz#a61f310306a5a71188e1b1acd08add3cfbb08b1e" + version "1.5.1" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.5.1.tgz#c519f629f86b3a5bedba58a88d311309eec097f9" jsdom@^9.12.0: version "9.12.0" @@ -3187,9 +3187,9 @@ pg-range-parser@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/pg-range-parser/-/pg-range-parser-1.0.0.tgz#561e8c4c3dee98a1caa8288c5c7e4300861819bb" -pg-sql2@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/pg-sql2/-/pg-sql2-1.0.0-beta.1.tgz#3100353e324c9c69f3ff5ccfbc3cc228f3dcbc82" +pg-sql2@^1.0.0-beta.3: + version "1.0.0-beta.3" + resolved "https://registry.yarnpkg.com/pg-sql2/-/pg-sql2-1.0.0-beta.3.tgz#0bf0f7072c6428e2971e4a25fda71f7eeef8c2f2" dependencies: debug ">=2 <3"