From 88aafd73fa02c35b7469bb6e38f6bef59d03825e Mon Sep 17 00:00:00 2001 From: Blaine Bublitz Date: Sat, 5 Jul 2014 16:22:20 -0700 Subject: [PATCH 01/33] Initial commit --- .gitignore | 25 +++++++++++++++++++++++++ LICENSE | 21 +++++++++++++++++++++ README.md | 4 ++++ 3 files changed, 50 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..da23d0d4b --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# Deployed apps should consider commenting this line out: +# see https://npmjs.org/doc/faq.html#Should-I-check-my-node_modules-folder-into-git +node_modules diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..b068a6cb2 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Iced Development + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 000000000..46afa27de --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +pg-connection-string +==================== + +Functions for dealing with a PostgresSQL connection string From 92c1fede8e7e3582b7040557cf2cb30705f59ad6 Mon Sep 17 00:00:00 2001 From: Blaine Bublitz Date: Sat, 5 Jul 2014 16:43:58 -0700 Subject: [PATCH 02/33] initial commit --- .travis.yml | 3 ++ README.md | 14 ++++++++ index.js | 54 +++++++++++++++++++++++++++++++ package.json | 29 +++++++++++++++++ test/parse.js | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 189 insertions(+) create mode 100644 .travis.yml create mode 100644 index.js create mode 100644 package.json create mode 100644 test/parse.js diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..244b7e88e --- /dev/null +++ b/.travis.yml @@ -0,0 +1,3 @@ +language: node_js +node_js: + - '0.10' diff --git a/README.md b/README.md index 46afa27de..49862702b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,18 @@ pg-connection-string ==================== +[![Build Status](https://travis-ci.org/iceddev/pg-connection-string.svg?branch=master)](https://travis-ci.org/iceddev/pg-connection-string) + Functions for dealing with a PostgresSQL connection string + +`parse` method taken from [node-postgres](https://github.com/brianc/node-postgres.git) +Copyright (c) 2010-2014 Brian Carlson (brian.m.carlson@gmail.com) +MIT License + +## Usage + +```js +var parse = require('pg-connection-string').parse; + +var config = parse('postgres://someuser:somepassword@somehost:381/sometable') +``` diff --git a/index.js b/index.js new file mode 100644 index 000000000..6c8fb68dc --- /dev/null +++ b/index.js @@ -0,0 +1,54 @@ +'use strict'; + +var url = require('url'); + +//Parse method copied from https://github.com/brianc/node-postgres +//Copyright (c) 2010-2014 Brian Carlson (brian.m.carlson@gmail.com) +//MIT License + +//parses a connection string +function parse(str) { + var config; + //unix socket + if(str.charAt(0) === '/') { + config = str.split(' '); + return { host: config[0], database: config[1] }; + } + // url parse expects spaces encoded as %20 + if(/ |%[^a-f0-9]|%[a-f0-9][^a-f0-9]/i.test(str)) { + str = encodeURI(str).replace(/\%25(\d\d)/g, "%$1"); + } + var result = url.parse(str, true); + config = {}; + + if (result.query.application_name) { + config.application_name = result.query.application_name; + } + if (result.query.fallback_application_name) { + config.fallback_application_name = result.query.fallback_application_name; + } + + if(result.protocol == 'socket:') { + config.host = decodeURI(result.pathname); + config.database = result.query.db; + config.client_encoding = result.query.encoding; + return config; + } + config.host = result.hostname; + config.database = result.pathname ? decodeURI(result.pathname.slice(1)) : null; + var auth = (result.auth || ':').split(':'); + config.user = auth[0]; + config.password = auth[1]; + config.port = result.port; + + var ssl = result.query.ssl; + if (ssl === 'true' || ssl === '1') { + config.ssl = true; + } + + return config; +} + +module.exports = { + parse: parse +}; diff --git a/package.json b/package.json new file mode 100644 index 000000000..56f535dd2 --- /dev/null +++ b/package.json @@ -0,0 +1,29 @@ +{ + "name": "pg-connection-string", + "version": "0.1.0", + "description": "Functions for dealing with a PostgresSQL connection string", + "main": "index.js", + "scripts": { + "test": "tap ./test" + }, + "repository": { + "type": "git", + "url": "https://github.com/iceddev/pg-connection-string" + }, + "keywords": [ + "pg", + "connection", + "string", + "parse" + ], + "author": "Blaine Bublitz (http://iceddev.com/)", + "license": "MIT", + "bugs": { + "url": "https://github.com/iceddev/pg-connection-string/issues" + }, + "homepage": "https://github.com/iceddev/pg-connection-string", + "dependencies": {}, + "devDependencies": { + "tap": "^0.4.11" + } +} diff --git a/test/parse.js b/test/parse.js new file mode 100644 index 000000000..1b9b203c9 --- /dev/null +++ b/test/parse.js @@ -0,0 +1,89 @@ +'use strict'; + +var test = require('tap').test; + +var parse = require('../').parse; + +test('using connection string in client constructor', function(t){ + var subject = parse('postgres://brian:pw@boom:381/lala'); + t.equal(subject.user,'brian'); + t.equal(subject.password, 'pw'); + t.equal(subject.host, 'boom'); + t.equal(subject.port, '381'); + t.equal(subject.database, 'lala'); + t.end(); +}); + +test('escape spaces if present', function(t){ + var subject = parse('postgres://localhost/post gres'); + t.equal(subject.database, 'post gres'); + t.end(); +}); + +test('do not double escape spaces', function(t){ + var subject = parse('postgres://localhost/post%20gres'); + t.equal(subject.database, 'post gres'); + t.end(); +}); + +test('initializing with unix domain socket', function(t){ + var subject = parse('/var/run/'); + t.equal(subject.host, '/var/run/'); + t.end(); +}); + +test('initializing with unix domain socket and a specific database, the simple way', function(t){ + var subject = parse('/var/run/ mydb'); + t.equal(subject.host, '/var/run/'); + t.equal(subject.database, 'mydb'); + t.end(); +}); + +test('initializing with unix domain socket, the health way', function(t){ + var subject = parse('socket:/some path/?db=my[db]&encoding=utf8'); + t.equal(subject.host, '/some path/'); + t.equal(subject.database, 'my[db]', 'must to be escaped and unescaped trough "my%5Bdb%5D"'); + t.equal(subject.client_encoding, 'utf8'); + t.end(); +}); + +test('initializing with unix domain socket, the escaped health way', function(t){ + var subject = parse('socket:/some%20path/?db=my%2Bdb&encoding=utf8'); + t.equal(subject.host, '/some path/'); + t.equal(subject.database, 'my+db'); + t.equal(subject.client_encoding, 'utf8'); + t.end(); +}); + +test('password contains < and/or > characters', function(t){ + var sourceConfig = { + user:'brian', + password: 'helloe', + port: 5432, + host: 'localhost', + database: 'postgres' + }; + var connectionString = 'postgres://' + sourceConfig.user + ':' + sourceConfig.password + '@' + sourceConfig.host + ':' + sourceConfig.port + '/' + sourceConfig.database; + var subject = parse(connectionString); + t.equal(subject.password, sourceConfig.password); + t.end(); +}); + +test('username or password contains weird characters', function(t){ + var strang = 'pg://my f%irst name:is&%awesome!@localhost:9000'; + var subject = parse(strang); + t.equal(subject.user, 'my f%irst name'); + t.equal(subject.password, 'is&%awesome!'); + t.equal(subject.host, 'localhost'); + t.end(); +}); + +test('url is properly encoded', function(t){ + var encoded = 'pg://bi%25na%25%25ry%20:s%40f%23@localhost/%20u%2520rl'; + var subject = parse(encoded); + t.equal(subject.user, 'bi%na%%ry '); + t.equal(subject.password, 's@f#'); + t.equal(subject.host, 'localhost'); + t.equal(subject.database, ' u%20rl'); + t.end(); +}); From df2a24c55550d48afe9d6b57dff7b7c027ba124e Mon Sep 17 00:00:00 2001 From: Blaine Bublitz Date: Sun, 6 Jul 2014 16:33:53 -0700 Subject: [PATCH 03/33] attach port always - ref brianc/node-postgres#604 --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 6c8fb68dc..afb369960 100644 --- a/index.js +++ b/index.js @@ -28,6 +28,7 @@ function parse(str) { config.fallback_application_name = result.query.fallback_application_name; } + config.port = result.port; if(result.protocol == 'socket:') { config.host = decodeURI(result.pathname); config.database = result.query.db; @@ -39,7 +40,6 @@ function parse(str) { var auth = (result.auth || ':').split(':'); config.user = auth[0]; config.password = auth[1]; - config.port = result.port; var ssl = result.query.ssl; if (ssl === 'true' || ssl === '1') { From cb9bee1bc9d65366d516fd2808726f285c9ad72f Mon Sep 17 00:00:00 2001 From: Blaine Bublitz Date: Sun, 6 Jul 2014 16:34:14 -0700 Subject: [PATCH 04/33] 0.1.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 56f535dd2..2cb8d962e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pg-connection-string", - "version": "0.1.0", + "version": "0.1.1", "description": "Functions for dealing with a PostgresSQL connection string", "main": "index.js", "scripts": { From ba511f7803dd159447ca7801177dd9008b9958b3 Mon Sep 17 00:00:00 2001 From: "matthew.blasius" Date: Fri, 12 Sep 2014 11:21:33 -0400 Subject: [PATCH 05/33] Support usage of relative urls to set database on the default host --- index.js | 10 +++++++++- test/parse.js | 23 +++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index afb369960..b041a2081 100644 --- a/index.js +++ b/index.js @@ -36,7 +36,15 @@ function parse(str) { return config; } config.host = result.hostname; - config.database = result.pathname ? decodeURI(result.pathname.slice(1)) : null; + + // result.pathname is not always guaranteed to have a '/' prefix (e.g. relative urls) + // only strip the slash if it is present. + var pathname = result.pathname; + if (pathname && pathname.charAt(0) === '/') { + pathname = result.pathname.slice(1) || null; + } + config.database = pathname && decodeURI(pathname); + var auth = (result.auth || ':').split(':'); config.user = auth[0]; config.password = auth[1]; diff --git a/test/parse.js b/test/parse.js index 1b9b203c9..892694290 100644 --- a/test/parse.js +++ b/test/parse.js @@ -87,3 +87,26 @@ test('url is properly encoded', function(t){ t.equal(subject.database, ' u%20rl'); t.end(); }); + +test('relative url sets database', function(t){ + var relative = 'different_db_on_default_host'; + var subject = parse(relative); + t.equal(subject.database, 'different_db_on_default_host'); + t.end(); +}); + +test('no pathname returns null database', function (t) { + var subject = parse('pg://myhost'); + t.equal(subject.host, 'myhost'); + t.type(subject.database, 'null'); + + t.end(); +}); + +test('pathname of "/" returns null database', function (t) { + var subject = parse('pg://myhost/'); + t.equal(subject.host, 'myhost'); + t.type(subject.database, 'null'); + + t.end(); +}); From 245abd6daf838d6d2e0424debcfffc2e8b3e3508 Mon Sep 17 00:00:00 2001 From: Blaine Bublitz Date: Sat, 13 Sep 2014 09:20:28 -0700 Subject: [PATCH 06/33] 0.1.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2cb8d962e..ebac6ca4e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pg-connection-string", - "version": "0.1.1", + "version": "0.1.2", "description": "Functions for dealing with a PostgresSQL connection string", "main": "index.js", "scripts": { From fbdd033d6c90cf5f9c2f6f258bc77a2184345f20 Mon Sep 17 00:00:00 2001 From: Ivan Sorokin Date: Fri, 26 Sep 2014 15:59:57 +0300 Subject: [PATCH 07/33] Add supporting password with colon --- index.js | 2 +- test/parse.js | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index b041a2081..ac2fd64c1 100644 --- a/index.js +++ b/index.js @@ -47,7 +47,7 @@ function parse(str) { var auth = (result.auth || ':').split(':'); config.user = auth[0]; - config.password = auth[1]; + config.password = auth.splice(1).join(':'); var ssl = result.query.ssl; if (ssl === 'true' || ssl === '1') { diff --git a/test/parse.js b/test/parse.js index 892694290..c1494c31e 100644 --- a/test/parse.js +++ b/test/parse.js @@ -69,6 +69,20 @@ test('password contains < and/or > characters', function(t){ t.end(); }); +test('password contains colons', function(t){ + var sourceConfig = { + user:'brian', + password: 'hello:pass:world', + port: 5432, + host: 'localhost', + database: 'postgres' + }; + var connectionString = 'postgres://' + sourceConfig.user + ':' + sourceConfig.password + '@' + sourceConfig.host + ':' + sourceConfig.port + '/' + sourceConfig.database; + var subject = parse(connectionString); + t.equal(subject.password, sourceConfig.password); + t.end(); +}); + test('username or password contains weird characters', function(t){ var strang = 'pg://my f%irst name:is&%awesome!@localhost:9000'; var subject = parse(strang); From 4c151b9403420c1c9a9682facef1fcdbb9b79b3b Mon Sep 17 00:00:00 2001 From: Blaine Bublitz Date: Fri, 26 Sep 2014 14:22:46 -0700 Subject: [PATCH 08/33] 0.1.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ebac6ca4e..c6d4512d9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pg-connection-string", - "version": "0.1.2", + "version": "0.1.3", "description": "Functions for dealing with a PostgresSQL connection string", "main": "index.js", "scripts": { From c612dfabd58071e9896b1e9ba0b5e5bcbb0c2f6b Mon Sep 17 00:00:00 2001 From: Mike He Date: Tue, 13 Oct 2015 09:19:26 +1100 Subject: [PATCH 09/33] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 49862702b..ddf9bfcb3 100644 --- a/README.md +++ b/README.md @@ -14,5 +14,5 @@ MIT License ```js var parse = require('pg-connection-string').parse; -var config = parse('postgres://someuser:somepassword@somehost:381/sometable') +var config = parse('postgres://someuser:somepassword@somehost:381/somedatabase') ``` From cdf06edd14d7b4b1df4c7e3cf438e8d9eeeaf271 Mon Sep 17 00:00:00 2001 From: Moti Zilberman Date: Wed, 30 Dec 2015 15:16:38 +0200 Subject: [PATCH 10/33] Copy all but special-cased params from URL query string to config --- index.js | 19 +++++++++------ test/parse.js | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 7 deletions(-) diff --git a/index.js b/index.js index ac2fd64c1..b2863ddef 100644 --- a/index.js +++ b/index.js @@ -21,13 +21,6 @@ function parse(str) { var result = url.parse(str, true); config = {}; - if (result.query.application_name) { - config.application_name = result.query.application_name; - } - if (result.query.fallback_application_name) { - config.fallback_application_name = result.query.fallback_application_name; - } - config.port = result.port; if(result.protocol == 'socket:') { config.host = decodeURI(result.pathname); @@ -54,6 +47,18 @@ function parse(str) { config.ssl = true; } + ['db', 'database', 'encoding', 'client_encoding', 'host', 'port', 'user', 'password', 'ssl'] + .forEach(function(key) { + delete result.query[key]; + }); + + Object.getOwnPropertyNames(result.query).forEach(function(key) { + var value = result.query[key]; + if (Array.isArray(value)) + value = value[value.length-1]; + config[key] = value; + }); + return config; } diff --git a/test/parse.js b/test/parse.js index c1494c31e..bd1171ba7 100644 --- a/test/parse.js +++ b/test/parse.js @@ -124,3 +124,67 @@ test('pathname of "/" returns null database', function (t) { t.end(); }); + +test('configuration parameter application_name', function(t){ + var connectionString = 'pg:///?application_name=TheApp'; + var subject = parse(connectionString); + t.equal(subject.application_name, 'TheApp'); + t.end(); +}); + +test('configuration parameter fallback_application_name', function(t){ + var connectionString = 'pg:///?fallback_application_name=TheAppFallback'; + var subject = parse(connectionString); + t.equal(subject.fallback_application_name, 'TheAppFallback'); + t.end(); +}); + +test('configuration parameter fallback_application_name', function(t){ + var connectionString = 'pg:///?fallback_application_name=TheAppFallback'; + var subject = parse(connectionString); + t.equal(subject.fallback_application_name, 'TheAppFallback'); + t.end(); +}); + +test('configuration parameter ssl=true', function(t){ + var connectionString = 'pg:///?ssl=true'; + var subject = parse(connectionString); + t.equal(subject.ssl, true); + t.end(); +}); + +test('configuration parameter ssl=1', function(t){ + var connectionString = 'pg:///?ssl=1'; + var subject = parse(connectionString); + t.equal(subject.ssl, true); + t.end(); +}); + +test('configuration parameter keepalives', function(t){ + var connectionString = 'pg:///?keepalives=1'; + var subject = parse(connectionString); + t.equal(subject.keepalives, '1'); + t.end(); +}); + +test('unknown configuration parameter is passed into client', function(t){ + var connectionString = 'pg:///?ThereIsNoSuchPostgresParameter=1234'; + var subject = parse(connectionString); + t.equal(subject.ThereIsNoSuchPostgresParameter, '1234'); + t.end(); +}); + +test('do not override a config field with value from query string', function(t){ + var subject = parse('socket:/some path/?db=my[db]&encoding=utf8&client_encoding=bogus'); + t.equal(subject.host, '/some path/'); + t.equal(subject.database, 'my[db]', 'must to be escaped and unescaped trough "my%5Bdb%5D"'); + t.equal(subject.client_encoding, 'utf8'); + t.end(); +}); + +test('return last value of repeated parameter', function(t){ + var connectionString = 'pg:///?keepalives=1&keepalives=0'; + var subject = parse(connectionString); + t.equal(subject.keepalives, '0'); + t.end(); +}); \ No newline at end of file From 54c204441629b65754dade6cb58a443566fefb22 Mon Sep 17 00:00:00 2001 From: Attila Olah Date: Thu, 27 Apr 2017 12:41:30 +0200 Subject: [PATCH 11/33] feat: add basic typings To make this app consumable by Typescript apps a typings file must be present. --- index.d.ts | 14 ++++++++++++++ package.json | 3 ++- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 index.d.ts diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 000000000..556375110 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,14 @@ +export function parse(connectionString: string): ConnectionOptions; + +export interface ConnectionOptions { + host: string | null; + password: string | null; + user: string | null; + port: number | null; + database: string | null; + client_encoding: string | null; + ssl: boolean | null; + + application_name: string | null; + fallback_application_name: string | null; +} diff --git a/package.json b/package.json index c6d4512d9..f3b14c907 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,8 @@ "name": "pg-connection-string", "version": "0.1.3", "description": "Functions for dealing with a PostgresSQL connection string", - "main": "index.js", + "main": "./index.js", + "types": "./index.d.ts", "scripts": { "test": "tap ./test" }, From 9ab62ff9f3050bc8d1096cd6f1258cd288be75fd Mon Sep 17 00:00:00 2001 From: caub Date: Sat, 1 Jul 2017 11:32:37 +0200 Subject: [PATCH 12/33] allow min/max params for pg-pool --- .gitignore | 1 + .travis.yml | 2 ++ index.js | 36 +++++++++++++----------------------- package.json | 2 +- test/parse.js | 18 +++++++++++++++++- 5 files changed, 34 insertions(+), 25 deletions(-) diff --git a/.gitignore b/.gitignore index da23d0d4b..f28f01f78 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,4 @@ build/Release # Deployed apps should consider commenting this line out: # see https://npmjs.org/doc/faq.html#Should-I-check-my-node_modules-folder-into-git node_modules +package-lock.json \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 244b7e88e..202c30781 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,5 @@ language: node_js node_js: - '0.10' + - '6.9' + - '8' diff --git a/index.js b/index.js index b2863ddef..0042faec0 100644 --- a/index.js +++ b/index.js @@ -8,18 +8,20 @@ var url = require('url'); //parses a connection string function parse(str) { - var config; //unix socket if(str.charAt(0) === '/') { - config = str.split(' '); + var config = str.split(' '); return { host: config[0], database: config[1] }; } + // url parse expects spaces encoded as %20 - if(/ |%[^a-f0-9]|%[a-f0-9][^a-f0-9]/i.test(str)) { - str = encodeURI(str).replace(/\%25(\d\d)/g, "%$1"); + var result = url.parse(/ |%[^a-f0-9]|%[a-f0-9][^a-f0-9]/i.test(str) ? encodeURI(str).replace(/\%25(\d\d)/g, "%$1") : str, true); + var config = result.query; + for (var k in config) { + if (Array.isArray(config[k])) { + config[k] = config[k][config[k].length-1]; + } } - var result = url.parse(str, true); - config = {}; config.port = result.port; if(result.protocol == 'socket:') { @@ -42,26 +44,14 @@ function parse(str) { config.user = auth[0]; config.password = auth.splice(1).join(':'); - var ssl = result.query.ssl; - if (ssl === 'true' || ssl === '1') { + if (config.ssl === 'true' || config.ssl === '1') { config.ssl = true; } - ['db', 'database', 'encoding', 'client_encoding', 'host', 'port', 'user', 'password', 'ssl'] - .forEach(function(key) { - delete result.query[key]; - }); - - Object.getOwnPropertyNames(result.query).forEach(function(key) { - var value = result.query[key]; - if (Array.isArray(value)) - value = value[value.length-1]; - config[key] = value; - }); - return config; } -module.exports = { - parse: parse -}; + +module.exports = parse; + +parse.parse = parse; diff --git a/package.json b/package.json index f3b14c907..9b0e62ec4 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,6 @@ "homepage": "https://github.com/iceddev/pg-connection-string", "dependencies": {}, "devDependencies": { - "tap": "^0.4.11" + "tap": "^10.3.3" } } diff --git a/test/parse.js b/test/parse.js index bd1171ba7..8f4bcb43a 100644 --- a/test/parse.js +++ b/test/parse.js @@ -160,6 +160,20 @@ test('configuration parameter ssl=1', function(t){ t.end(); }); +test('set ssl', function (t) { + var subject = parse('pg://myhost/db?ssl=1'); + t.equal(subject.ssl, true); + t.end(); + }); + + test('allow other params like max, ...', function (t) { + var subject = parse('pg://myhost/db?max=18&min=4'); + t.equal(subject.max, '18'); + t.equal(subject.min, '4'); + t.end(); + }); + + test('configuration parameter keepalives', function(t){ var connectionString = 'pg:///?keepalives=1'; var subject = parse(connectionString); @@ -182,9 +196,11 @@ test('do not override a config field with value from query string', function(t){ t.end(); }); + test('return last value of repeated parameter', function(t){ var connectionString = 'pg:///?keepalives=1&keepalives=0'; var subject = parse(connectionString); t.equal(subject.keepalives, '0'); t.end(); -}); \ No newline at end of file +}); + From 13687353c9ecc4b2ea736ee0784a6a158a40a951 Mon Sep 17 00:00:00 2001 From: Luis Montes Date: Wed, 30 Aug 2017 13:58:52 -0700 Subject: [PATCH 13/33] Use mocha, istanbul, and coveralls (#16) * some tests * coveralls and mocha * coveralls post test hook * remove done calls --- .coveralls.yml | 2 + .travis.yml | 1 + README.md | 3 + package.json | 8 +- test/parse.js | 376 +++++++++++++++++++++++-------------------------- 5 files changed, 188 insertions(+), 202 deletions(-) create mode 100644 .coveralls.yml diff --git a/.coveralls.yml b/.coveralls.yml new file mode 100644 index 000000000..0709f6e03 --- /dev/null +++ b/.coveralls.yml @@ -0,0 +1,2 @@ +service_name: travis-pro +repo_token: 5F6dODinz9L9uFR6HatKmtsYDoV1A5S2N diff --git a/.travis.yml b/.travis.yml index 202c30781..daf50ba6d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,3 +3,4 @@ node_js: - '0.10' - '6.9' - '8' +after_success: 'npm run coveralls' diff --git a/README.md b/README.md index ddf9bfcb3..2228b80e1 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,10 @@ pg-connection-string ==================== +[![NPM](https://nodei.co/npm/pg-connection-string.png?compact=true)](https://nodei.co/npm/pg-connection-string/) + [![Build Status](https://travis-ci.org/iceddev/pg-connection-string.svg?branch=master)](https://travis-ci.org/iceddev/pg-connection-string) +[![Coverage Status](https://coveralls.io/repos/iceddev/pg-connection-string/badge.svg?branch=master)](https://coveralls.io/r/iceddev/pg-connection-string?branch=master) Functions for dealing with a PostgresSQL connection string diff --git a/package.json b/package.json index 9b0e62ec4..f6ff6e511 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,9 @@ "main": "./index.js", "types": "./index.d.ts", "scripts": { - "test": "tap ./test" + "test": "istanbul cover _mocha && npm run check-coverage", + "check-coverage": "istanbul check-coverage --statements 100 --branches 100 --lines 100 --functions 100", + "coveralls": "cat ./coverage/lcov.info | ./node_modules/.bin/coveralls" }, "repository": { "type": "git", @@ -25,6 +27,8 @@ "homepage": "https://github.com/iceddev/pg-connection-string", "dependencies": {}, "devDependencies": { - "tap": "^10.3.3" + "chai": "^4.1.1", + "istanbul": "^0.4.5", + "mocha": "^3.5.0" } } diff --git a/test/parse.js b/test/parse.js index 8f4bcb43a..8ff3ee81d 100644 --- a/test/parse.js +++ b/test/parse.js @@ -1,206 +1,182 @@ 'use strict'; -var test = require('tap').test; +var chai = require('chai'); +var expect = chai.expect; +chai.should(); var parse = require('../').parse; -test('using connection string in client constructor', function(t){ - var subject = parse('postgres://brian:pw@boom:381/lala'); - t.equal(subject.user,'brian'); - t.equal(subject.password, 'pw'); - t.equal(subject.host, 'boom'); - t.equal(subject.port, '381'); - t.equal(subject.database, 'lala'); - t.end(); +describe('parse', function(){ + + it('using connection string in client constructor', function(){ + var subject = parse('postgres://brian:pw@boom:381/lala'); + subject.user.should.equal('brian'); + subject.password.should.equal( 'pw'); + subject.host.should.equal( 'boom'); + subject.port.should.equal( '381'); + subject.database.should.equal( 'lala'); + }); + + it('escape spaces if present', function(){ + var subject = parse('postgres://localhost/post gres'); + subject.database.should.equal('post gres'); + }); + + it('do not double escape spaces', function(){ + var subject = parse('postgres://localhost/post%20gres'); + subject.database.should.equal('post gres'); + }); + + it('initializing with unix domain socket', function(){ + var subject = parse('/var/run/'); + subject.host.should.equal('/var/run/'); + }); + + it('initializing with unix domain socket and a specific database, the simple way', function(){ + var subject = parse('/var/run/ mydb'); + subject.host.should.equal('/var/run/'); + subject.database.should.equal('mydb'); + }); + + it('initializing with unix domain socket, the health way', function(){ + var subject = parse('socket:/some path/?db=my[db]&encoding=utf8'); + subject.host.should.equal('/some path/'); + subject.database.should.equal('my[db]', 'must to be escaped and unescaped trough "my%5Bdb%5D"'); + subject.client_encoding.should.equal('utf8'); + }); + + it('initializing with unix domain socket, the escaped health way', function(){ + var subject = parse('socket:/some%20path/?db=my%2Bdb&encoding=utf8'); + subject.host.should.equal('/some path/'); + subject.database.should.equal('my+db'); + subject.client_encoding.should.equal('utf8'); + }); + + it('password contains < and/or > characters', function(){ + var sourceConfig = { + user:'brian', + password: 'helloe', + port: 5432, + host: 'localhost', + database: 'postgres' + }; + var connectionString = 'postgres://' + sourceConfig.user + ':' + sourceConfig.password + '@' + sourceConfig.host + ':' + sourceConfig.port + '/' + sourceConfig.database; + var subject = parse(connectionString); + subject.password.should.equal(sourceConfig.password); + }); + + it('password contains colons', function(){ + var sourceConfig = { + user:'brian', + password: 'hello:pass:world', + port: 5432, + host: 'localhost', + database: 'postgres' + }; + var connectionString = 'postgres://' + sourceConfig.user + ':' + sourceConfig.password + '@' + sourceConfig.host + ':' + sourceConfig.port + '/' + sourceConfig.database; + var subject = parse(connectionString); + subject.password.should.equal(sourceConfig.password); + }); + + it('username or password contains weird characters', function(){ + var strang = 'pg://my f%irst name:is&%awesome!@localhost:9000'; + var subject = parse(strang); + subject.user.should.equal('my f%irst name'); + subject.password.should.equal('is&%awesome!'); + subject.host.should.equal('localhost'); + }); + + it('url is properly encoded', function(){ + var encoded = 'pg://bi%25na%25%25ry%20:s%40f%23@localhost/%20u%2520rl'; + var subject = parse(encoded); + subject.user.should.equal('bi%na%%ry '); + subject.password.should.equal('s@f#'); + subject.host.should.equal('localhost'); + subject.database.should.equal(' u%20rl'); + }); + + it('relative url sets database', function(){ + var relative = 'different_db_on_default_host'; + var subject = parse(relative); + subject.database.should.equal('different_db_on_default_host'); + }); + + it('no pathname returns null database', function () { + var subject = parse('pg://myhost'); + (subject.database === null).should.equal(true); + }); + + it('pathname of "/" returns null database', function () { + var subject = parse('pg://myhost/'); + subject.host.should.equal('myhost'); + (subject.database === null).should.equal(true); + }); + + it('configuration parameter application_name', function(){ + var connectionString = 'pg:///?application_name=TheApp'; + var subject = parse(connectionString); + subject.application_name.should.equal('TheApp'); + }); + + it('configuration parameter fallback_application_name', function(){ + var connectionString = 'pg:///?fallback_application_name=TheAppFallback'; + var subject = parse(connectionString); + subject.fallback_application_name.should.equal('TheAppFallback'); + }); + + it('configuration parameter fallback_application_name', function(){ + var connectionString = 'pg:///?fallback_application_name=TheAppFallback'; + var subject = parse(connectionString); + subject.fallback_application_name.should.equal('TheAppFallback'); + }); + + it('configuration parameter ssl=true', function(){ + var connectionString = 'pg:///?ssl=true'; + var subject = parse(connectionString); + subject.ssl.should.equal(true); + }); + + it('configuration parameter ssl=1', function(){ + var connectionString = 'pg:///?ssl=1'; + var subject = parse(connectionString); + subject.ssl.should.equal(true); + }); + + it('set ssl', function () { + var subject = parse('pg://myhost/db?ssl=1'); + subject.ssl.should.equal(true); + }); + + it('allow other params like max, ...', function () { + var subject = parse('pg://myhost/db?max=18&min=4'); + subject.max.should.equal('18'); + subject.min.should.equal('4'); + }); + + + it('configuration parameter keepalives', function(){ + var connectionString = 'pg:///?keepalives=1'; + var subject = parse(connectionString); + subject.keepalives.should.equal('1'); + }); + + it('unknown configuration parameter is passed into client', function(){ + var connectionString = 'pg:///?ThereIsNoSuchPostgresParameter=1234'; + var subject = parse(connectionString); + subject.ThereIsNoSuchPostgresParameter.should.equal('1234'); + }); + + it('do not override a config field with value from query string', function(){ + var subject = parse('socket:/some path/?db=my[db]&encoding=utf8&client_encoding=bogus'); + subject.host.should.equal('/some path/'); + subject.database.should.equal('my[db]', 'must to be escaped and unescaped through "my%5Bdb%5D"'); + subject.client_encoding.should.equal('utf8'); + }); + + + it('return last value of repeated parameter', function(){ + var connectionString = 'pg:///?keepalives=1&keepalives=0'; + var subject = parse(connectionString); + subject.keepalives.should.equal('0'); + }); }); - -test('escape spaces if present', function(t){ - var subject = parse('postgres://localhost/post gres'); - t.equal(subject.database, 'post gres'); - t.end(); -}); - -test('do not double escape spaces', function(t){ - var subject = parse('postgres://localhost/post%20gres'); - t.equal(subject.database, 'post gres'); - t.end(); -}); - -test('initializing with unix domain socket', function(t){ - var subject = parse('/var/run/'); - t.equal(subject.host, '/var/run/'); - t.end(); -}); - -test('initializing with unix domain socket and a specific database, the simple way', function(t){ - var subject = parse('/var/run/ mydb'); - t.equal(subject.host, '/var/run/'); - t.equal(subject.database, 'mydb'); - t.end(); -}); - -test('initializing with unix domain socket, the health way', function(t){ - var subject = parse('socket:/some path/?db=my[db]&encoding=utf8'); - t.equal(subject.host, '/some path/'); - t.equal(subject.database, 'my[db]', 'must to be escaped and unescaped trough "my%5Bdb%5D"'); - t.equal(subject.client_encoding, 'utf8'); - t.end(); -}); - -test('initializing with unix domain socket, the escaped health way', function(t){ - var subject = parse('socket:/some%20path/?db=my%2Bdb&encoding=utf8'); - t.equal(subject.host, '/some path/'); - t.equal(subject.database, 'my+db'); - t.equal(subject.client_encoding, 'utf8'); - t.end(); -}); - -test('password contains < and/or > characters', function(t){ - var sourceConfig = { - user:'brian', - password: 'helloe', - port: 5432, - host: 'localhost', - database: 'postgres' - }; - var connectionString = 'postgres://' + sourceConfig.user + ':' + sourceConfig.password + '@' + sourceConfig.host + ':' + sourceConfig.port + '/' + sourceConfig.database; - var subject = parse(connectionString); - t.equal(subject.password, sourceConfig.password); - t.end(); -}); - -test('password contains colons', function(t){ - var sourceConfig = { - user:'brian', - password: 'hello:pass:world', - port: 5432, - host: 'localhost', - database: 'postgres' - }; - var connectionString = 'postgres://' + sourceConfig.user + ':' + sourceConfig.password + '@' + sourceConfig.host + ':' + sourceConfig.port + '/' + sourceConfig.database; - var subject = parse(connectionString); - t.equal(subject.password, sourceConfig.password); - t.end(); -}); - -test('username or password contains weird characters', function(t){ - var strang = 'pg://my f%irst name:is&%awesome!@localhost:9000'; - var subject = parse(strang); - t.equal(subject.user, 'my f%irst name'); - t.equal(subject.password, 'is&%awesome!'); - t.equal(subject.host, 'localhost'); - t.end(); -}); - -test('url is properly encoded', function(t){ - var encoded = 'pg://bi%25na%25%25ry%20:s%40f%23@localhost/%20u%2520rl'; - var subject = parse(encoded); - t.equal(subject.user, 'bi%na%%ry '); - t.equal(subject.password, 's@f#'); - t.equal(subject.host, 'localhost'); - t.equal(subject.database, ' u%20rl'); - t.end(); -}); - -test('relative url sets database', function(t){ - var relative = 'different_db_on_default_host'; - var subject = parse(relative); - t.equal(subject.database, 'different_db_on_default_host'); - t.end(); -}); - -test('no pathname returns null database', function (t) { - var subject = parse('pg://myhost'); - t.equal(subject.host, 'myhost'); - t.type(subject.database, 'null'); - - t.end(); -}); - -test('pathname of "/" returns null database', function (t) { - var subject = parse('pg://myhost/'); - t.equal(subject.host, 'myhost'); - t.type(subject.database, 'null'); - - t.end(); -}); - -test('configuration parameter application_name', function(t){ - var connectionString = 'pg:///?application_name=TheApp'; - var subject = parse(connectionString); - t.equal(subject.application_name, 'TheApp'); - t.end(); -}); - -test('configuration parameter fallback_application_name', function(t){ - var connectionString = 'pg:///?fallback_application_name=TheAppFallback'; - var subject = parse(connectionString); - t.equal(subject.fallback_application_name, 'TheAppFallback'); - t.end(); -}); - -test('configuration parameter fallback_application_name', function(t){ - var connectionString = 'pg:///?fallback_application_name=TheAppFallback'; - var subject = parse(connectionString); - t.equal(subject.fallback_application_name, 'TheAppFallback'); - t.end(); -}); - -test('configuration parameter ssl=true', function(t){ - var connectionString = 'pg:///?ssl=true'; - var subject = parse(connectionString); - t.equal(subject.ssl, true); - t.end(); -}); - -test('configuration parameter ssl=1', function(t){ - var connectionString = 'pg:///?ssl=1'; - var subject = parse(connectionString); - t.equal(subject.ssl, true); - t.end(); -}); - -test('set ssl', function (t) { - var subject = parse('pg://myhost/db?ssl=1'); - t.equal(subject.ssl, true); - t.end(); - }); - - test('allow other params like max, ...', function (t) { - var subject = parse('pg://myhost/db?max=18&min=4'); - t.equal(subject.max, '18'); - t.equal(subject.min, '4'); - t.end(); - }); - - -test('configuration parameter keepalives', function(t){ - var connectionString = 'pg:///?keepalives=1'; - var subject = parse(connectionString); - t.equal(subject.keepalives, '1'); - t.end(); -}); - -test('unknown configuration parameter is passed into client', function(t){ - var connectionString = 'pg:///?ThereIsNoSuchPostgresParameter=1234'; - var subject = parse(connectionString); - t.equal(subject.ThereIsNoSuchPostgresParameter, '1234'); - t.end(); -}); - -test('do not override a config field with value from query string', function(t){ - var subject = parse('socket:/some path/?db=my[db]&encoding=utf8&client_encoding=bogus'); - t.equal(subject.host, '/some path/'); - t.equal(subject.database, 'my[db]', 'must to be escaped and unescaped trough "my%5Bdb%5D"'); - t.equal(subject.client_encoding, 'utf8'); - t.end(); -}); - - -test('return last value of repeated parameter', function(t){ - var connectionString = 'pg:///?keepalives=1&keepalives=0'; - var subject = parse(connectionString); - t.equal(subject.keepalives, '0'); - t.end(); -}); - From eafb7acd951b4ee606d41c0d1ba66b34e72119a3 Mon Sep 17 00:00:00 2001 From: Luis Montes Date: Wed, 30 Aug 2017 14:25:59 -0700 Subject: [PATCH 14/33] 2.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f6ff6e511..5b75ea37a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pg-connection-string", - "version": "0.1.3", + "version": "2.0.0", "description": "Functions for dealing with a PostgresSQL connection string", "main": "./index.js", "types": "./index.d.ts", From 279fdeae2fdd331197d74d6f31a201bba1bdf7cf Mon Sep 17 00:00:00 2001 From: Youngwook Kim Date: Wed, 22 Nov 2017 10:17:22 +0900 Subject: [PATCH 15/33] Add supporting username and password for socket connections This fix adds the ability to use username and password even when using a socket. --- index.js | 8 ++++---- test/parse.js | 8 ++++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/index.js b/index.js index 0042faec0..3e04f5475 100644 --- a/index.js +++ b/index.js @@ -23,6 +23,10 @@ function parse(str) { } } + var auth = (result.auth || ':').split(':'); + config.user = auth[0]; + config.password = auth.splice(1).join(':'); + config.port = result.port; if(result.protocol == 'socket:') { config.host = decodeURI(result.pathname); @@ -40,10 +44,6 @@ function parse(str) { } config.database = pathname && decodeURI(pathname); - var auth = (result.auth || ':').split(':'); - config.user = auth[0]; - config.password = auth.splice(1).join(':'); - if (config.ssl === 'true' || config.ssl === '1') { config.ssl = true; } diff --git a/test/parse.js b/test/parse.js index 8ff3ee81d..429367330 100644 --- a/test/parse.js +++ b/test/parse.js @@ -52,6 +52,14 @@ describe('parse', function(){ subject.client_encoding.should.equal('utf8'); }); + it('initializing with unix domain socket, username and password', function(){ + var subject = parse('socket://brian:pw@/var/run/?db=mydb'); + subject.user.should.equal('brian'); + subject.password.should.equal('pw'); + subject.host.should.equal('/var/run/'); + subject.database.should.equal('mydb'); + }); + it('password contains < and/or > characters', function(){ var sourceConfig = { user:'brian', From 929fcb73c3f5128e2d1d50eb5d62a6481d098754 Mon Sep 17 00:00:00 2001 From: benny-medflyt Date: Wed, 13 Dec 2017 11:20:29 +0200 Subject: [PATCH 16/33] Fix typings --- index.d.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/index.d.ts b/index.d.ts index 556375110..d0fc72149 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,14 +1,14 @@ export function parse(connectionString: string): ConnectionOptions; export interface ConnectionOptions { - host: string | null; - password: string | null; - user: string | null; - port: number | null; - database: string | null; - client_encoding: string | null; - ssl: boolean | null; + host: string; + password?: string; + user?: string; + port: string | null; + database: string | null | undefined; + client_encoding?: string | undefined; + ssl?: boolean; - application_name: string | null; - fallback_application_name: string | null; + application_name?: string; + fallback_application_name?: string; } From ece764518774690ea8ee58360ae0b6ca7b248d4d Mon Sep 17 00:00:00 2001 From: benny-medflyt Date: Wed, 13 Dec 2017 11:23:28 +0200 Subject: [PATCH 17/33] typings: turns out "host" can actually be `null` --- index.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.d.ts b/index.d.ts index d0fc72149..2a6574600 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,7 +1,7 @@ export function parse(connectionString: string): ConnectionOptions; export interface ConnectionOptions { - host: string; + host: string | null; password?: string; user?: string; port: string | null; From c11dbb1c2b3409964372721666d3a2898dd2097e Mon Sep 17 00:00:00 2001 From: Benjie Gillam Date: Thu, 18 Apr 2019 14:46:36 +0100 Subject: [PATCH 18/33] Only publish the required files Details: https://docs.npmjs.com/files/package.json#files --- package.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 5b75ea37a..b625a16d7 100644 --- a/package.json +++ b/package.json @@ -30,5 +30,9 @@ "chai": "^4.1.1", "istanbul": "^0.4.5", "mocha": "^3.5.0" - } + }, + "files": [ + "index.js", + "index.d.ts" + ] } From e9270e89af6c6e5b84b8c668bf206c8f9ab97a45 Mon Sep 17 00:00:00 2001 From: "Herman J. Radtke III" Date: Fri, 17 May 2019 07:38:25 -0700 Subject: [PATCH 19/33] Add support for TLS parameters in URI The connection string now supports the following parameters: - sslcert - sslkey - sslrootcert Fixes #25. --- index.js | 17 +++++++++++++++++ test/example.ca | 1 + test/example.cert | 1 + test/example.key | 1 + test/parse.js | 24 ++++++++++++++++++++++++ 5 files changed, 44 insertions(+) create mode 100644 test/example.ca create mode 100644 test/example.cert create mode 100644 test/example.key diff --git a/index.js b/index.js index 0042faec0..981bdcda3 100644 --- a/index.js +++ b/index.js @@ -1,6 +1,7 @@ 'use strict'; var url = require('url'); +var fs = require('fs'); //Parse method copied from https://github.com/brianc/node-postgres //Copyright (c) 2010-2014 Brian Carlson (brian.m.carlson@gmail.com) @@ -48,6 +49,22 @@ function parse(str) { config.ssl = true; } + if (config.sslcert || config.sslkey || config.sslrootcert) { + config.ssl = {}; + } + + if (config.sslcert) { + config.ssl.cert = fs.readFileSync(config.sslcert).toString(); + } + + if (config.sslkey) { + config.ssl.key = fs.readFileSync(config.sslkey).toString(); + } + + if (config.sslrootcert) { + config.ssl.ca = fs.readFileSync(config.sslrootcert).toString(); + } + return config; } diff --git a/test/example.ca b/test/example.ca new file mode 100644 index 000000000..0a6dcf40e --- /dev/null +++ b/test/example.ca @@ -0,0 +1 @@ +example ca diff --git a/test/example.cert b/test/example.cert new file mode 100644 index 000000000..7693b3fed --- /dev/null +++ b/test/example.cert @@ -0,0 +1 @@ +example cert diff --git a/test/example.key b/test/example.key new file mode 100644 index 000000000..1aef9935f --- /dev/null +++ b/test/example.key @@ -0,0 +1 @@ +example key diff --git a/test/parse.js b/test/parse.js index 8ff3ee81d..6632cc712 100644 --- a/test/parse.js +++ b/test/parse.js @@ -147,6 +147,30 @@ describe('parse', function(){ subject.ssl.should.equal(true); }); + it('configuration parameter sslcert=/path/to/cert', function(){ + var connectionString = 'pg:///?sslcert=' + __dirname + '/example.cert'; + var subject = parse(connectionString); + subject.ssl.should.eql({ + cert: 'example cert\n' + }); + }); + + it('configuration parameter sslkey=/path/to/key', function(){ + var connectionString = 'pg:///?sslkey=' + __dirname + '/example.key'; + var subject = parse(connectionString); + subject.ssl.should.eql({ + key: 'example key\n' + }); + }); + + it('configuration parameter sslrootcert=/path/to/ca', function(){ + var connectionString = 'pg:///?sslrootcert=' + __dirname + '/example.ca'; + var subject = parse(connectionString); + subject.ssl.should.eql({ + ca: 'example ca\n' + }); + }); + it('allow other params like max, ...', function () { var subject = parse('pg://myhost/db?max=18&min=4'); subject.max.should.equal('18'); From 7b62226d573bdde749e4c94ed21d67c74d1f3bd2 Mon Sep 17 00:00:00 2001 From: "Herman J. Radtke III" Date: Thu, 23 May 2019 14:23:55 -0700 Subject: [PATCH 20/33] ssl=0 is now parses to false Fixes #20 --- index.js | 4 ++++ test/parse.js | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/index.js b/index.js index 667984018..3cabb372f 100644 --- a/index.js +++ b/index.js @@ -49,6 +49,10 @@ function parse(str) { config.ssl = true; } + if (config.ssl === '0') { + config.ssl = false; + } + if (config.sslcert || config.sslkey || config.sslrootcert) { config.ssl = {}; } diff --git a/test/parse.js b/test/parse.js index abf2c4f9e..4de28719e 100644 --- a/test/parse.js +++ b/test/parse.js @@ -150,6 +150,12 @@ describe('parse', function(){ subject.ssl.should.equal(true); }); + it('configuration parameter ssl=0', function(){ + var connectionString = 'pg:///?ssl=0'; + var subject = parse(connectionString); + subject.ssl.should.equal(false); + }); + it('set ssl', function () { var subject = parse('pg://myhost/db?ssl=1'); subject.ssl.should.equal(true); From 726f6202fa7eb89096bf6cb8d32526ebacf4be49 Mon Sep 17 00:00:00 2001 From: benny-medflyt Date: Mon, 27 May 2019 08:30:21 -0400 Subject: [PATCH 21/33] Update index.d.ts --- index.d.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/index.d.ts b/index.d.ts index 2a6574600..1d2f1606e 100644 --- a/index.d.ts +++ b/index.d.ts @@ -4,10 +4,10 @@ export interface ConnectionOptions { host: string | null; password?: string; user?: string; - port: string | null; + port?: string | null; database: string | null | undefined; - client_encoding?: string | undefined; - ssl?: boolean; + client_encoding?: string; + ssl?: boolean | string; application_name?: string; fallback_application_name?: string; From 06c46ac12b2a9540483450305f841938a759ba4d Mon Sep 17 00:00:00 2001 From: Andrew Bowerman Date: Tue, 18 Jun 2019 20:12:03 -0700 Subject: [PATCH 22/33] 2.1.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b625a16d7..c39da5f2c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pg-connection-string", - "version": "2.0.0", + "version": "2.1.0", "description": "Functions for dealing with a PostgresSQL connection string", "main": "./index.js", "types": "./index.d.ts", From c9ee9cd19970c93dda8ce66b2dd7fd1efa6b056f Mon Sep 17 00:00:00 2001 From: Andrew Bowerman Date: Tue, 18 Jun 2019 20:25:32 -0700 Subject: [PATCH 23/33] Update coveralls badge Closes #15 --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 2228b80e1..cb4b1accf 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,7 @@ pg-connection-string [![NPM](https://nodei.co/npm/pg-connection-string.png?compact=true)](https://nodei.co/npm/pg-connection-string/) [![Build Status](https://travis-ci.org/iceddev/pg-connection-string.svg?branch=master)](https://travis-ci.org/iceddev/pg-connection-string) -[![Coverage Status](https://coveralls.io/repos/iceddev/pg-connection-string/badge.svg?branch=master)](https://coveralls.io/r/iceddev/pg-connection-string?branch=master) - +[![Coverage Status](https://coveralls.io/repos/github/iceddev/pg-connection-string/badge.svg?branch=master)](https://coveralls.io/github/iceddev/pg-connection-string?branch=master) Functions for dealing with a PostgresSQL connection string `parse` method taken from [node-postgres](https://github.com/brianc/node-postgres.git) From c75c3929654401fbf8654f6df3613ef2748c1428 Mon Sep 17 00:00:00 2001 From: Andrew Bowerman Date: Tue, 18 Jun 2019 20:41:10 -0700 Subject: [PATCH 24/33] fix readme newline typo --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index cb4b1accf..4943d885b 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ pg-connection-string [![Build Status](https://travis-ci.org/iceddev/pg-connection-string.svg?branch=master)](https://travis-ci.org/iceddev/pg-connection-string) [![Coverage Status](https://coveralls.io/repos/github/iceddev/pg-connection-string/badge.svg?branch=master)](https://coveralls.io/github/iceddev/pg-connection-string?branch=master) + Functions for dealing with a PostgresSQL connection string `parse` method taken from [node-postgres](https://github.com/brianc/node-postgres.git) From e4c1002e2e9413636c32929236e96f893010a317 Mon Sep 17 00:00:00 2001 From: Andrew Bowerman Date: Tue, 18 Jun 2019 20:49:39 -0700 Subject: [PATCH 25/33] actually include coveralls --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index c39da5f2c..415638f07 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "dependencies": {}, "devDependencies": { "chai": "^4.1.1", + "coveralls": "^3.0.4", "istanbul": "^0.4.5", "mocha": "^3.5.0" }, From 0ff40e733b58096dd3e14a7a1c787a22058f54a1 Mon Sep 17 00:00:00 2001 From: Daniel Rozenberg Date: Tue, 28 Jan 2020 19:28:03 -0500 Subject: [PATCH 26/33] host= query param takes precedence --- index.js | 5 ++++- test/parse.js | 13 +++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index 3cabb372f..29d3653c5 100644 --- a/index.js +++ b/index.js @@ -35,7 +35,10 @@ function parse(str) { config.client_encoding = result.query.encoding; return config; } - config.host = result.hostname; + if (!config.host) { + // Only set the host if there is no equivalent query param. + config.host = result.hostname; + } // result.pathname is not always guaranteed to have a '/' prefix (e.g. relative urls) // only strip the slash if it is present. diff --git a/test/parse.js b/test/parse.js index 4de28719e..c973fb5c8 100644 --- a/test/parse.js +++ b/test/parse.js @@ -120,6 +120,19 @@ describe('parse', function(){ (subject.database === null).should.equal(true); }); + it('configuration parameter host', function() { + var subject = parse('pg://user:pass@/dbname?host=/unix/socket'); + subject.user.should.equal('user'); + subject.password.should.equal('pass'); + subject.host.should.equal('/unix/socket'); + subject.database.should.equal('dbname'); + }); + + it('configuration parameter host overrides url host', function() { + var subject = parse('pg://user:pass@localhost/dbname?host=/unix/socket'); + subject.host.should.equal('/unix/socket'); + }); + it('configuration parameter application_name', function(){ var connectionString = 'pg:///?application_name=TheApp'; var subject = parse(connectionString); From b309db074ff545ed93c6396a98029b5cce7b943d Mon Sep 17 00:00:00 2001 From: Daniel Rozenberg Date: Tue, 28 Jan 2020 19:29:38 -0500 Subject: [PATCH 27/33] Support URL-encoded socket names --- index.js | 10 ++++++++-- test/parse.js | 24 ++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 29d3653c5..7cfc82938 100644 --- a/index.js +++ b/index.js @@ -40,11 +40,17 @@ function parse(str) { config.host = result.hostname; } + // If the host is missing it might be a URL-encoded path to a socket. + var pathname = result.pathname; + if (!config.host && pathname && pathname.toLowerCase().startsWith('%2f')) { + var pathnameSplit = pathname.split('/'); + config.host = decodeURIComponent(pathnameSplit[0]); + pathname = pathnameSplit.splice(1).join('/'); + } // result.pathname is not always guaranteed to have a '/' prefix (e.g. relative urls) // only strip the slash if it is present. - var pathname = result.pathname; if (pathname && pathname.charAt(0) === '/') { - pathname = result.pathname.slice(1) || null; + pathname = pathname.slice(1) || null; } config.database = pathname && decodeURI(pathname); diff --git a/test/parse.js b/test/parse.js index c973fb5c8..07f886e1f 100644 --- a/test/parse.js +++ b/test/parse.js @@ -133,6 +133,30 @@ describe('parse', function(){ subject.host.should.equal('/unix/socket'); }); + it('url with encoded socket', function() { + var subject = parse('pg://user:pass@%2Funix%2Fsocket/dbname'); + subject.user.should.equal('user'); + subject.password.should.equal('pass'); + subject.host.should.equal('/unix/socket'); + subject.database.should.equal('dbname'); + }); + + it('url with real host and an encoded db name', function() { + var subject = parse('pg://user:pass@localhost/%2Fdbname'); + subject.user.should.equal('user'); + subject.password.should.equal('pass'); + subject.host.should.equal('localhost'); + subject.database.should.equal('%2Fdbname'); + }); + + it('configuration parameter host treats encoded socket as part of the db name', function() { + var subject = parse('pg://user:pass@%2Funix%2Fsocket/dbname?host=localhost'); + subject.user.should.equal('user'); + subject.password.should.equal('pass'); + subject.host.should.equal('localhost'); + subject.database.should.equal('%2Funix%2Fsocket/dbname'); + }); + it('configuration parameter application_name', function(){ var connectionString = 'pg:///?application_name=TheApp'; var subject = parse(connectionString); From 7ec9b70180b5aaadb75c4fde3f35ff86031ce279 Mon Sep 17 00:00:00 2001 From: Daniel Rozenberg Date: Tue, 28 Jan 2020 19:40:51 -0500 Subject: [PATCH 28/33] Use regex instead of startsWith which is unsupported in node 0.10 --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 7cfc82938..7e914ba1b 100644 --- a/index.js +++ b/index.js @@ -42,7 +42,7 @@ function parse(str) { // If the host is missing it might be a URL-encoded path to a socket. var pathname = result.pathname; - if (!config.host && pathname && pathname.toLowerCase().startsWith('%2f')) { + if (!config.host && pathname && /^%2f/i.test(pathname)) { var pathnameSplit = pathname.split('/'); config.host = decodeURIComponent(pathnameSplit[0]); pathname = pathnameSplit.splice(1).join('/'); From b4e0ba329ade3d976e0804dd0d79438274e7233f Mon Sep 17 00:00:00 2001 From: "Dustin J. Mitchell" Date: Sun, 16 Feb 2020 12:30:46 -0500 Subject: [PATCH 29/33] Include documentation on the URL format in the README This summarizes the common forms, but omits some of the more particular, and unnecessary forms, such as specifying UNIX domain sockets with `pg://` URLs. --- README.md | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/README.md b/README.md index 4943d885b..d5b45ab9e 100644 --- a/README.md +++ b/README.md @@ -19,3 +19,54 @@ var parse = require('pg-connection-string').parse; var config = parse('postgres://someuser:somepassword@somehost:381/somedatabase') ``` + +The resulting config contains a subset of the following properties: + +* `host` - Postgres server hostname or, for UNIX doamain sockets, the socket filename +* `port` - port on which to connect +* `user` - User with which to authenticate to the server +* `password` - Corresponding password +* `database` - Database name within the server +* `client_encoding` - string encoding the client will use +* `ssl`, either a boolean or an object with properties + * `cert` + * `key` + * `ca` +* any other query parameters (for example, `application_name`) are preserved intact. + +## Connection Strings + +The short summary of acceptable URLs is: + + * `socket:?` - UNIX domain socket + * `postgres://:@:/?` - TCP connection + +But see below for more details. + +### UNIX Domain Sockets + +When user and password are not given, the socket path follows `socket:`, as in `socket:/var/run/pgsql`. +This form can be shortened to just a path: `/var/run/pgsql`. + +When user and password are given, they are included in the typical URL positions, with an empty `host`, as in `socket://user:pass@/var/run/pgsql`. + +Query parameters follow a `?` character, including the following special query parameters: + + * `db=` - sets the database name (urlencoded) + * `encoding=` - sets the `client_encoding` property + +### TCP Connections + +TCP connections to the Postgres server are indicated with `pg:` or `postgres:` schemes (in fact, any scheme but `socket:` is accepted). +If username and password are included, they should be urlencoded. +The database name, however, should *not* be urlencoded. + +Query parameters follow a `?` character, including the following special query parameters: + * `host=` - sets `host` property, overriding the URL's host + * `encoding=` - sets the `client_encoding` property + * `ssl=1`, `ssl=true`, `ssl=0`, `ssl=false` - sets `ssl` to true or false, accordingly + * `sslcert=` - reads data from the given file and includes the result as `ssl.cert` + * `sslkey=` - reads data from the given file and includes the result as `ssl.key` + * `sslrootcert=` - reads data from the given file and includes the result as `ssl.ca` + +A bare relative URL, such as `salesdata`, will indicate a database name while leaving other properties empty. From 5233b3e77e396a368130709e762fca836290a528 Mon Sep 17 00:00:00 2001 From: "Herman J. Radtke III" Date: Thu, 19 Mar 2020 21:56:45 -0700 Subject: [PATCH 30/33] Release v2.2.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 415638f07..49345369c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pg-connection-string", - "version": "2.1.0", + "version": "2.2.0", "description": "Functions for dealing with a PostgresSQL connection string", "main": "./index.js", "types": "./index.d.ts", From 3a831fc77c8f65353e72d3120be5e3d8d197a1b3 Mon Sep 17 00:00:00 2001 From: "Brian M. Carlson" Date: Tue, 28 Apr 2020 10:02:38 -0500 Subject: [PATCH 31/33] Run lint --fix --- packages/pg-connection-string/index.d.ts | 20 +- packages/pg-connection-string/index.js | 72 +-- packages/pg-connection-string/test/parse.js | 491 ++++++++++---------- yarn.lock | 336 +++++++++++++- 4 files changed, 629 insertions(+), 290 deletions(-) diff --git a/packages/pg-connection-string/index.d.ts b/packages/pg-connection-string/index.d.ts index 1d2f1606e..b1b7abd9c 100644 --- a/packages/pg-connection-string/index.d.ts +++ b/packages/pg-connection-string/index.d.ts @@ -1,14 +1,14 @@ -export function parse(connectionString: string): ConnectionOptions; +export function parse(connectionString: string): ConnectionOptions export interface ConnectionOptions { - host: string | null; - password?: string; - user?: string; - port?: string | null; - database: string | null | undefined; - client_encoding?: string; - ssl?: boolean | string; + host: string | null + password?: string + user?: string + port?: string | null + database: string | null | undefined + client_encoding?: string + ssl?: boolean | string - application_name?: string; - fallback_application_name?: string; + application_name?: string + fallback_application_name?: string } diff --git a/packages/pg-connection-string/index.js b/packages/pg-connection-string/index.js index 7e914ba1b..65951c374 100644 --- a/packages/pg-connection-string/index.js +++ b/packages/pg-connection-string/index.js @@ -1,7 +1,7 @@ -'use strict'; +'use strict' -var url = require('url'); -var fs = require('fs'); +var url = require('url') +var fs = require('fs') //Parse method copied from https://github.com/brianc/node-postgres //Copyright (c) 2010-2014 Brian Carlson (brian.m.carlson@gmail.com) @@ -10,78 +10,80 @@ var fs = require('fs'); //parses a connection string function parse(str) { //unix socket - if(str.charAt(0) === '/') { - var config = str.split(' '); - return { host: config[0], database: config[1] }; + if (str.charAt(0) === '/') { + var config = str.split(' ') + return { host: config[0], database: config[1] } } // url parse expects spaces encoded as %20 - var result = url.parse(/ |%[^a-f0-9]|%[a-f0-9][^a-f0-9]/i.test(str) ? encodeURI(str).replace(/\%25(\d\d)/g, "%$1") : str, true); - var config = result.query; + var result = url.parse( + / |%[^a-f0-9]|%[a-f0-9][^a-f0-9]/i.test(str) ? encodeURI(str).replace(/\%25(\d\d)/g, '%$1') : str, + true + ) + var config = result.query for (var k in config) { if (Array.isArray(config[k])) { - config[k] = config[k][config[k].length-1]; + config[k] = config[k][config[k].length - 1] } } - var auth = (result.auth || ':').split(':'); - config.user = auth[0]; - config.password = auth.splice(1).join(':'); + var auth = (result.auth || ':').split(':') + config.user = auth[0] + config.password = auth.splice(1).join(':') - config.port = result.port; - if(result.protocol == 'socket:') { - config.host = decodeURI(result.pathname); - config.database = result.query.db; - config.client_encoding = result.query.encoding; - return config; + config.port = result.port + if (result.protocol == 'socket:') { + config.host = decodeURI(result.pathname) + config.database = result.query.db + config.client_encoding = result.query.encoding + return config } if (!config.host) { // Only set the host if there is no equivalent query param. - config.host = result.hostname; + config.host = result.hostname } // If the host is missing it might be a URL-encoded path to a socket. - var pathname = result.pathname; + var pathname = result.pathname if (!config.host && pathname && /^%2f/i.test(pathname)) { - var pathnameSplit = pathname.split('/'); - config.host = decodeURIComponent(pathnameSplit[0]); - pathname = pathnameSplit.splice(1).join('/'); + var pathnameSplit = pathname.split('/') + config.host = decodeURIComponent(pathnameSplit[0]) + pathname = pathnameSplit.splice(1).join('/') } // result.pathname is not always guaranteed to have a '/' prefix (e.g. relative urls) // only strip the slash if it is present. if (pathname && pathname.charAt(0) === '/') { - pathname = pathname.slice(1) || null; + pathname = pathname.slice(1) || null } - config.database = pathname && decodeURI(pathname); + config.database = pathname && decodeURI(pathname) if (config.ssl === 'true' || config.ssl === '1') { - config.ssl = true; + config.ssl = true } if (config.ssl === '0') { - config.ssl = false; + config.ssl = false } if (config.sslcert || config.sslkey || config.sslrootcert) { - config.ssl = {}; + config.ssl = {} } if (config.sslcert) { - config.ssl.cert = fs.readFileSync(config.sslcert).toString(); + config.ssl.cert = fs.readFileSync(config.sslcert).toString() } if (config.sslkey) { - config.ssl.key = fs.readFileSync(config.sslkey).toString(); + config.ssl.key = fs.readFileSync(config.sslkey).toString() } if (config.sslrootcert) { - config.ssl.ca = fs.readFileSync(config.sslrootcert).toString(); + config.ssl.ca = fs.readFileSync(config.sslrootcert).toString() } - return config; + return config } +module.exports = parse -module.exports = parse; - -parse.parse = parse; +parse.parse = parse diff --git a/packages/pg-connection-string/test/parse.js b/packages/pg-connection-string/test/parse.js index 07f886e1f..957f06441 100644 --- a/packages/pg-connection-string/test/parse.js +++ b/packages/pg-connection-string/test/parse.js @@ -1,257 +1,274 @@ -'use strict'; - -var chai = require('chai'); -var expect = chai.expect; -chai.should(); - -var parse = require('../').parse; - -describe('parse', function(){ - - it('using connection string in client constructor', function(){ - var subject = parse('postgres://brian:pw@boom:381/lala'); - subject.user.should.equal('brian'); - subject.password.should.equal( 'pw'); - subject.host.should.equal( 'boom'); - subject.port.should.equal( '381'); - subject.database.should.equal( 'lala'); - }); - - it('escape spaces if present', function(){ - var subject = parse('postgres://localhost/post gres'); - subject.database.should.equal('post gres'); - }); - - it('do not double escape spaces', function(){ - var subject = parse('postgres://localhost/post%20gres'); - subject.database.should.equal('post gres'); - }); - - it('initializing with unix domain socket', function(){ - var subject = parse('/var/run/'); - subject.host.should.equal('/var/run/'); - }); - - it('initializing with unix domain socket and a specific database, the simple way', function(){ - var subject = parse('/var/run/ mydb'); - subject.host.should.equal('/var/run/'); - subject.database.should.equal('mydb'); - }); - - it('initializing with unix domain socket, the health way', function(){ - var subject = parse('socket:/some path/?db=my[db]&encoding=utf8'); - subject.host.should.equal('/some path/'); - subject.database.should.equal('my[db]', 'must to be escaped and unescaped trough "my%5Bdb%5D"'); - subject.client_encoding.should.equal('utf8'); - }); - - it('initializing with unix domain socket, the escaped health way', function(){ - var subject = parse('socket:/some%20path/?db=my%2Bdb&encoding=utf8'); - subject.host.should.equal('/some path/'); - subject.database.should.equal('my+db'); - subject.client_encoding.should.equal('utf8'); - }); - - it('initializing with unix domain socket, username and password', function(){ - var subject = parse('socket://brian:pw@/var/run/?db=mydb'); - subject.user.should.equal('brian'); - subject.password.should.equal('pw'); - subject.host.should.equal('/var/run/'); - subject.database.should.equal('mydb'); - }); - - it('password contains < and/or > characters', function(){ +'use strict' + +var chai = require('chai') +var expect = chai.expect +chai.should() + +var parse = require('../').parse + +describe('parse', function () { + it('using connection string in client constructor', function () { + var subject = parse('postgres://brian:pw@boom:381/lala') + subject.user.should.equal('brian') + subject.password.should.equal('pw') + subject.host.should.equal('boom') + subject.port.should.equal('381') + subject.database.should.equal('lala') + }) + + it('escape spaces if present', function () { + var subject = parse('postgres://localhost/post gres') + subject.database.should.equal('post gres') + }) + + it('do not double escape spaces', function () { + var subject = parse('postgres://localhost/post%20gres') + subject.database.should.equal('post gres') + }) + + it('initializing with unix domain socket', function () { + var subject = parse('/var/run/') + subject.host.should.equal('/var/run/') + }) + + it('initializing with unix domain socket and a specific database, the simple way', function () { + var subject = parse('/var/run/ mydb') + subject.host.should.equal('/var/run/') + subject.database.should.equal('mydb') + }) + + it('initializing with unix domain socket, the health way', function () { + var subject = parse('socket:/some path/?db=my[db]&encoding=utf8') + subject.host.should.equal('/some path/') + subject.database.should.equal('my[db]', 'must to be escaped and unescaped trough "my%5Bdb%5D"') + subject.client_encoding.should.equal('utf8') + }) + + it('initializing with unix domain socket, the escaped health way', function () { + var subject = parse('socket:/some%20path/?db=my%2Bdb&encoding=utf8') + subject.host.should.equal('/some path/') + subject.database.should.equal('my+db') + subject.client_encoding.should.equal('utf8') + }) + + it('initializing with unix domain socket, username and password', function () { + var subject = parse('socket://brian:pw@/var/run/?db=mydb') + subject.user.should.equal('brian') + subject.password.should.equal('pw') + subject.host.should.equal('/var/run/') + subject.database.should.equal('mydb') + }) + + it('password contains < and/or > characters', function () { var sourceConfig = { - user:'brian', + user: 'brian', password: 'helloe', port: 5432, host: 'localhost', - database: 'postgres' - }; - var connectionString = 'postgres://' + sourceConfig.user + ':' + sourceConfig.password + '@' + sourceConfig.host + ':' + sourceConfig.port + '/' + sourceConfig.database; - var subject = parse(connectionString); - subject.password.should.equal(sourceConfig.password); - }); - - it('password contains colons', function(){ + database: 'postgres', + } + var connectionString = + 'postgres://' + + sourceConfig.user + + ':' + + sourceConfig.password + + '@' + + sourceConfig.host + + ':' + + sourceConfig.port + + '/' + + sourceConfig.database + var subject = parse(connectionString) + subject.password.should.equal(sourceConfig.password) + }) + + it('password contains colons', function () { var sourceConfig = { - user:'brian', + user: 'brian', password: 'hello:pass:world', port: 5432, host: 'localhost', - database: 'postgres' - }; - var connectionString = 'postgres://' + sourceConfig.user + ':' + sourceConfig.password + '@' + sourceConfig.host + ':' + sourceConfig.port + '/' + sourceConfig.database; - var subject = parse(connectionString); - subject.password.should.equal(sourceConfig.password); - }); - - it('username or password contains weird characters', function(){ - var strang = 'pg://my f%irst name:is&%awesome!@localhost:9000'; - var subject = parse(strang); - subject.user.should.equal('my f%irst name'); - subject.password.should.equal('is&%awesome!'); - subject.host.should.equal('localhost'); - }); - - it('url is properly encoded', function(){ - var encoded = 'pg://bi%25na%25%25ry%20:s%40f%23@localhost/%20u%2520rl'; - var subject = parse(encoded); - subject.user.should.equal('bi%na%%ry '); - subject.password.should.equal('s@f#'); - subject.host.should.equal('localhost'); - subject.database.should.equal(' u%20rl'); - }); - - it('relative url sets database', function(){ - var relative = 'different_db_on_default_host'; - var subject = parse(relative); - subject.database.should.equal('different_db_on_default_host'); - }); + database: 'postgres', + } + var connectionString = + 'postgres://' + + sourceConfig.user + + ':' + + sourceConfig.password + + '@' + + sourceConfig.host + + ':' + + sourceConfig.port + + '/' + + sourceConfig.database + var subject = parse(connectionString) + subject.password.should.equal(sourceConfig.password) + }) + + it('username or password contains weird characters', function () { + var strang = 'pg://my f%irst name:is&%awesome!@localhost:9000' + var subject = parse(strang) + subject.user.should.equal('my f%irst name') + subject.password.should.equal('is&%awesome!') + subject.host.should.equal('localhost') + }) + + it('url is properly encoded', function () { + var encoded = 'pg://bi%25na%25%25ry%20:s%40f%23@localhost/%20u%2520rl' + var subject = parse(encoded) + subject.user.should.equal('bi%na%%ry ') + subject.password.should.equal('s@f#') + subject.host.should.equal('localhost') + subject.database.should.equal(' u%20rl') + }) + + it('relative url sets database', function () { + var relative = 'different_db_on_default_host' + var subject = parse(relative) + subject.database.should.equal('different_db_on_default_host') + }) it('no pathname returns null database', function () { - var subject = parse('pg://myhost'); - (subject.database === null).should.equal(true); - }); + var subject = parse('pg://myhost') + ;(subject.database === null).should.equal(true) + }) it('pathname of "/" returns null database', function () { - var subject = parse('pg://myhost/'); - subject.host.should.equal('myhost'); - (subject.database === null).should.equal(true); - }); - - it('configuration parameter host', function() { - var subject = parse('pg://user:pass@/dbname?host=/unix/socket'); - subject.user.should.equal('user'); - subject.password.should.equal('pass'); - subject.host.should.equal('/unix/socket'); - subject.database.should.equal('dbname'); - }); - - it('configuration parameter host overrides url host', function() { - var subject = parse('pg://user:pass@localhost/dbname?host=/unix/socket'); - subject.host.should.equal('/unix/socket'); - }); - - it('url with encoded socket', function() { - var subject = parse('pg://user:pass@%2Funix%2Fsocket/dbname'); - subject.user.should.equal('user'); - subject.password.should.equal('pass'); - subject.host.should.equal('/unix/socket'); - subject.database.should.equal('dbname'); - }); - - it('url with real host and an encoded db name', function() { - var subject = parse('pg://user:pass@localhost/%2Fdbname'); - subject.user.should.equal('user'); - subject.password.should.equal('pass'); - subject.host.should.equal('localhost'); - subject.database.should.equal('%2Fdbname'); - }); - - it('configuration parameter host treats encoded socket as part of the db name', function() { - var subject = parse('pg://user:pass@%2Funix%2Fsocket/dbname?host=localhost'); - subject.user.should.equal('user'); - subject.password.should.equal('pass'); - subject.host.should.equal('localhost'); - subject.database.should.equal('%2Funix%2Fsocket/dbname'); - }); - - it('configuration parameter application_name', function(){ - var connectionString = 'pg:///?application_name=TheApp'; - var subject = parse(connectionString); - subject.application_name.should.equal('TheApp'); - }); - - it('configuration parameter fallback_application_name', function(){ - var connectionString = 'pg:///?fallback_application_name=TheAppFallback'; - var subject = parse(connectionString); - subject.fallback_application_name.should.equal('TheAppFallback'); - }); - - it('configuration parameter fallback_application_name', function(){ - var connectionString = 'pg:///?fallback_application_name=TheAppFallback'; - var subject = parse(connectionString); - subject.fallback_application_name.should.equal('TheAppFallback'); - }); - - it('configuration parameter ssl=true', function(){ - var connectionString = 'pg:///?ssl=true'; - var subject = parse(connectionString); - subject.ssl.should.equal(true); - }); - - it('configuration parameter ssl=1', function(){ - var connectionString = 'pg:///?ssl=1'; - var subject = parse(connectionString); - subject.ssl.should.equal(true); - }); - - it('configuration parameter ssl=0', function(){ - var connectionString = 'pg:///?ssl=0'; - var subject = parse(connectionString); - subject.ssl.should.equal(false); - }); + var subject = parse('pg://myhost/') + subject.host.should.equal('myhost') + ;(subject.database === null).should.equal(true) + }) + + it('configuration parameter host', function () { + var subject = parse('pg://user:pass@/dbname?host=/unix/socket') + subject.user.should.equal('user') + subject.password.should.equal('pass') + subject.host.should.equal('/unix/socket') + subject.database.should.equal('dbname') + }) + + it('configuration parameter host overrides url host', function () { + var subject = parse('pg://user:pass@localhost/dbname?host=/unix/socket') + subject.host.should.equal('/unix/socket') + }) + + it('url with encoded socket', function () { + var subject = parse('pg://user:pass@%2Funix%2Fsocket/dbname') + subject.user.should.equal('user') + subject.password.should.equal('pass') + subject.host.should.equal('/unix/socket') + subject.database.should.equal('dbname') + }) + + it('url with real host and an encoded db name', function () { + var subject = parse('pg://user:pass@localhost/%2Fdbname') + subject.user.should.equal('user') + subject.password.should.equal('pass') + subject.host.should.equal('localhost') + subject.database.should.equal('%2Fdbname') + }) + + it('configuration parameter host treats encoded socket as part of the db name', function () { + var subject = parse('pg://user:pass@%2Funix%2Fsocket/dbname?host=localhost') + subject.user.should.equal('user') + subject.password.should.equal('pass') + subject.host.should.equal('localhost') + subject.database.should.equal('%2Funix%2Fsocket/dbname') + }) + + it('configuration parameter application_name', function () { + var connectionString = 'pg:///?application_name=TheApp' + var subject = parse(connectionString) + subject.application_name.should.equal('TheApp') + }) + + it('configuration parameter fallback_application_name', function () { + var connectionString = 'pg:///?fallback_application_name=TheAppFallback' + var subject = parse(connectionString) + subject.fallback_application_name.should.equal('TheAppFallback') + }) + + it('configuration parameter fallback_application_name', function () { + var connectionString = 'pg:///?fallback_application_name=TheAppFallback' + var subject = parse(connectionString) + subject.fallback_application_name.should.equal('TheAppFallback') + }) + + it('configuration parameter ssl=true', function () { + var connectionString = 'pg:///?ssl=true' + var subject = parse(connectionString) + subject.ssl.should.equal(true) + }) + + it('configuration parameter ssl=1', function () { + var connectionString = 'pg:///?ssl=1' + var subject = parse(connectionString) + subject.ssl.should.equal(true) + }) + + it('configuration parameter ssl=0', function () { + var connectionString = 'pg:///?ssl=0' + var subject = parse(connectionString) + subject.ssl.should.equal(false) + }) it('set ssl', function () { - var subject = parse('pg://myhost/db?ssl=1'); - subject.ssl.should.equal(true); - }); + var subject = parse('pg://myhost/db?ssl=1') + subject.ssl.should.equal(true) + }) - it('configuration parameter sslcert=/path/to/cert', function(){ - var connectionString = 'pg:///?sslcert=' + __dirname + '/example.cert'; - var subject = parse(connectionString); + it('configuration parameter sslcert=/path/to/cert', function () { + var connectionString = 'pg:///?sslcert=' + __dirname + '/example.cert' + var subject = parse(connectionString) subject.ssl.should.eql({ - cert: 'example cert\n' - }); - }); + cert: 'example cert\n', + }) + }) - it('configuration parameter sslkey=/path/to/key', function(){ - var connectionString = 'pg:///?sslkey=' + __dirname + '/example.key'; - var subject = parse(connectionString); + it('configuration parameter sslkey=/path/to/key', function () { + var connectionString = 'pg:///?sslkey=' + __dirname + '/example.key' + var subject = parse(connectionString) subject.ssl.should.eql({ - key: 'example key\n' - }); - }); + key: 'example key\n', + }) + }) - it('configuration parameter sslrootcert=/path/to/ca', function(){ - var connectionString = 'pg:///?sslrootcert=' + __dirname + '/example.ca'; - var subject = parse(connectionString); + it('configuration parameter sslrootcert=/path/to/ca', function () { + var connectionString = 'pg:///?sslrootcert=' + __dirname + '/example.ca' + var subject = parse(connectionString) subject.ssl.should.eql({ - ca: 'example ca\n' - }); - }); - - it('allow other params like max, ...', function () { - var subject = parse('pg://myhost/db?max=18&min=4'); - subject.max.should.equal('18'); - subject.min.should.equal('4'); - }); - - - it('configuration parameter keepalives', function(){ - var connectionString = 'pg:///?keepalives=1'; - var subject = parse(connectionString); - subject.keepalives.should.equal('1'); - }); - - it('unknown configuration parameter is passed into client', function(){ - var connectionString = 'pg:///?ThereIsNoSuchPostgresParameter=1234'; - var subject = parse(connectionString); - subject.ThereIsNoSuchPostgresParameter.should.equal('1234'); - }); - - it('do not override a config field with value from query string', function(){ - var subject = parse('socket:/some path/?db=my[db]&encoding=utf8&client_encoding=bogus'); - subject.host.should.equal('/some path/'); - subject.database.should.equal('my[db]', 'must to be escaped and unescaped through "my%5Bdb%5D"'); - subject.client_encoding.should.equal('utf8'); - }); - - - it('return last value of repeated parameter', function(){ - var connectionString = 'pg:///?keepalives=1&keepalives=0'; - var subject = parse(connectionString); - subject.keepalives.should.equal('0'); - }); -}); + ca: 'example ca\n', + }) + }) + + it('allow other params like max, ...', function () { + var subject = parse('pg://myhost/db?max=18&min=4') + subject.max.should.equal('18') + subject.min.should.equal('4') + }) + + it('configuration parameter keepalives', function () { + var connectionString = 'pg:///?keepalives=1' + var subject = parse(connectionString) + subject.keepalives.should.equal('1') + }) + + it('unknown configuration parameter is passed into client', function () { + var connectionString = 'pg:///?ThereIsNoSuchPostgresParameter=1234' + var subject = parse(connectionString) + subject.ThereIsNoSuchPostgresParameter.should.equal('1234') + }) + + it('do not override a config field with value from query string', function () { + var subject = parse('socket:/some path/?db=my[db]&encoding=utf8&client_encoding=bogus') + subject.host.should.equal('/some path/') + subject.database.should.equal('my[db]', 'must to be escaped and unescaped through "my%5Bdb%5D"') + subject.client_encoding.should.equal('utf8') + }) + + it('return last value of repeated parameter', function () { + var connectionString = 'pg:///?keepalives=1&keepalives=0' + var subject = parse(connectionString) + subject.keepalives.should.equal('0') + }) +}) diff --git a/yarn.lock b/yarn.lock index 0d9360977..796307ce2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -948,6 +948,11 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +abbrev@1.0.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= + acorn-jsx@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" @@ -989,6 +994,11 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + ansi-colors@3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" @@ -1166,6 +1176,11 @@ async@0.9.0: resolved "https://registry.yarnpkg.com/async/-/async-0.9.0.tgz#ac3613b1da9bed1b47510bb4651b8931e47146c7" integrity sha1-rDYTsdqb7RtHUQu0ZRuJMeRxRsc= +async@1.x: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -1273,6 +1288,11 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" +browser-stdout@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" + integrity sha1-81HTKWnTL6XXpVZxVCY9korjvR8= + browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" @@ -1410,7 +1430,7 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chai@^4.2.0: +chai@^4.1.1, chai@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== @@ -1558,6 +1578,13 @@ commander@2.15.1: resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== +commander@2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q= + dependencies: + graceful-readlink ">= 1.0.0" + commander@~2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -1736,6 +1763,17 @@ cosmiconfig@^5.1.0: js-yaml "^3.13.1" parse-json "^4.0.0" +coveralls@^3.0.4: + version "3.1.0" + resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.1.0.tgz#13c754d5e7a2dd8b44fe5269e21ca394fb4d615b" + integrity sha512-sHxOu2ELzW8/NC1UP5XVLbZDzO4S3VxfFye3XYCznopHy02YjNkHcj5bKaVw2O7hVaBdBjEdQGpie4II1mWhuQ== + dependencies: + js-yaml "^3.13.1" + lcov-parse "^1.0.0" + log-driver "^1.2.7" + minimist "^1.2.5" + request "^2.88.2" + cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -1783,6 +1821,13 @@ dateformat@^3.0.0: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== +debug@2.6.8: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + integrity sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw= + dependencies: + ms "2.0.0" + debug@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" @@ -1915,6 +1960,11 @@ dezalgo@^1.0.0: asap "^2.0.0" wrappy "1" +diff@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" + integrity sha1-yc45Okt8vQsFinJck98pkCeGj/k= + diff@3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" @@ -2060,6 +2110,18 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escodegen@1.8.x: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + integrity sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg= + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + eslint-config-prettier@^6.10.1: version "6.10.1" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.10.1.tgz#129ef9ec575d5ddc0e269667bf09defcd898642a" @@ -2178,6 +2240,11 @@ espree@^6.1.2: acorn-jsx "^5.1.0" eslint-visitor-keys "^1.1.0" +esprima@2.7.x, esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= + esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -2197,6 +2264,11 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= + estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" @@ -2642,6 +2714,18 @@ glob-to-regexp@^0.3.0: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= +glob@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + integrity sha1-gFIR3wT6rxxjo2ADBs31reULLsg= + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" @@ -2666,6 +2750,17 @@ glob@7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^5.0.15: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" @@ -2704,11 +2799,33 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= + growl@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== +growl@1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" + integrity sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8= + +handlebars@^4.0.1: + version "4.7.6" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e" + integrity sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.0" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + handlebars@^4.4.0: version "4.5.3" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.3.tgz#5cf75bd8714f7605713511a56be7c349becb0482" @@ -2725,7 +2842,7 @@ har-schema@^2.0.0: resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= -har-validator@~5.1.0: +har-validator@~5.1.0, har-validator@~5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== @@ -2733,6 +2850,11 @@ har-validator@~5.1.0: ajv "^6.5.5" har-schema "^2.0.0" +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -3242,12 +3364,32 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= +istanbul@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" + integrity sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs= + dependencies: + abbrev "1.0.x" + async "1.x" + escodegen "1.8.x" + esprima "2.7.x" + glob "^5.0.15" + handlebars "^4.0.1" + js-yaml "3.x" + mkdirp "0.5.x" + nopt "3.x" + once "1.x" + resolve "1.1.x" + supports-color "^3.1.0" + which "^1.1.1" + wordwrap "^1.0.0" + js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.13.1, js-yaml@^3.13.1: +js-yaml@3.13.1, js-yaml@3.x, js-yaml@^3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -3285,6 +3427,11 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= +json3@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE= + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -3336,6 +3483,11 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== +lcov-parse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-1.0.0.tgz#eb0d46b54111ebc561acb4c408ef9363bdc8f7e0" + integrity sha1-6w1GtUER68VhrLTECO+TY73I9+A= + lerna@^3.19.0: version "3.19.0" resolved "https://registry.yarnpkg.com/lerna/-/lerna-3.19.0.tgz#6d53b613eca7da426ab1e97c01ce6fb39754da6c" @@ -3415,6 +3567,34 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + integrity sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4= + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + integrity sha1-jaDmqHbPNEwK2KVIghEd08XHyjY= + +lodash._basecreate@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" + integrity sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE= + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + integrity sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw= + lodash._reinterpolate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" @@ -3425,16 +3605,44 @@ lodash.clonedeep@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= +lodash.create@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" + integrity sha1-1/KEnw29p+BGgruM1yqwIkYd6+c= + dependencies: + lodash._baseassign "^3.0.0" + lodash._basecreate "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo= + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U= + lodash.ismatch@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc= +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + integrity sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo= + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + lodash.set@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" @@ -3470,6 +3678,11 @@ lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.2. resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +log-driver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8" + integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg== + log-symbols@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" @@ -3653,7 +3866,7 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimatch@3.0.4, minimatch@^3.0.4: +"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -3678,6 +3891,11 @@ minimist@^1.1.3, minimist@^1.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= +minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" @@ -3736,6 +3954,31 @@ mkdirp@*, mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1: dependencies: minimist "0.0.8" +mkdirp@0.5.x: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mocha@^3.5.0: + version "3.5.3" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.5.3.tgz#1e0480fe36d2da5858d1eb6acc38418b26eaa20d" + integrity sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg== + dependencies: + browser-stdout "1.3.0" + commander "2.9.0" + debug "2.6.8" + diff "3.2.0" + escape-string-regexp "1.0.5" + glob "7.1.1" + growl "1.9.2" + he "1.1.1" + json3 "3.3.2" + lodash.create "3.1.1" + mkdirp "0.5.1" + supports-color "3.1.2" + mocha@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" @@ -3914,6 +4157,13 @@ node-gyp@^5.0.2: tar "^4.4.12" which "^1.3.1" +nopt@3.x: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + dependencies: + abbrev "1" + nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -4078,7 +4328,7 @@ octokit-pagination-methods@^1.1.0: resolved "https://registry.yarnpkg.com/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz#cf472edc9d551055f9ef73f6e42b4dbb4c80bea4" integrity sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ== -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -4107,7 +4357,7 @@ optimist@^0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" -optionator@^0.8.3: +optionator@^0.8.1, optionator@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -4514,6 +4764,11 @@ psl@^1.1.24: resolved "https://registry.yarnpkg.com/psl/-/psl-1.6.0.tgz#60557582ee23b6c43719d9890fb4170ecd91e110" integrity sha512-SYKKmVel98NCOYXpkwUqZqh0ahZeeKfmisiLIcEZdsb+WbLv02g/dI5BUmZnIyOe7RzZtLax81nnb2HbvC2tzA== +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + pump@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" @@ -4544,7 +4799,7 @@ punycode@^1.4.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= -punycode@^2.1.0: +punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== @@ -4749,6 +5004,32 @@ request@^2.88.0: tunnel-agent "^0.6.0" uuid "^3.3.2" +request@^2.88.2: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -4781,6 +5062,11 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= +resolve@1.1.x: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + resolve@^1.10.0, resolve@^1.10.1: version "1.14.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.0.tgz#6d14c6f9db9f8002071332b600039abf82053f64" @@ -5036,6 +5322,13 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + integrity sha1-2rc/vPwrqBm03gO9b26qSBZLP50= + dependencies: + amdefine ">=0.0.4" + spdx-correct@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" @@ -5288,6 +5581,13 @@ strong-log-transformer@^2.0.0: minimist "^1.2.0" through "^2.3.4" +supports-color@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" + integrity sha1-cqJiiU2dQIuVbKBf83su2KbiotU= + dependencies: + has-flag "^1.0.0" + supports-color@5.4.0: version "5.4.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" @@ -5302,6 +5602,13 @@ supports-color@6.0.0: dependencies: has-flag "^3.0.0" +supports-color@^3.1.0: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= + dependencies: + has-flag "^1.0.0" + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -5443,6 +5750,14 @@ tough-cookie@~2.4.3: psl "^1.1.24" punycode "^1.4.1" +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" @@ -5702,7 +6017,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@1.3.1, which@^1.2.9, which@^1.3.1: +which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -5728,6 +6043,11 @@ word-wrap@~1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" From 16344cbfcdcd6fdaa8cc637f63b4ec65e652859e Mon Sep 17 00:00:00 2001 From: "Brian M. Carlson" Date: Tue, 28 Apr 2020 10:07:12 -0500 Subject: [PATCH 32/33] Update test command for travis I think the new syntax I'm using here is compatible with `sh`...let's see. --- .eslintrc | 14 +++----------- package.json | 2 +- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/.eslintrc b/.eslintrc index 57948b711..e03680342 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,16 +1,8 @@ { - "plugins": [ - "prettier" - ], + "plugins": ["prettier"], "parser": "@typescript-eslint/parser", - "extends": [ - "plugin:prettier/recommended", - "prettier/@typescript-eslint" - ], - "ignorePatterns": [ - "node_modules", - "packages/pg-protocol/dist/**/*" - ], + "extends": ["plugin:prettier/recommended", "prettier/@typescript-eslint"], + "ignorePatterns": ["node_modules", "coverage", "packages/pg-protocol/dist/**/*"], "parserOptions": { "ecmaVersion": 2017, "sourceType": "module" diff --git a/package.json b/package.json index dd32e85b6..5fb9b187e 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "test": "yarn lint && yarn lerna exec yarn test", "build": "yarn lerna exec --scope pg-protocol yarn build", "pretest": "yarn build", - "lint": "!([[ -e node_modules/.bin/prettier ]]) || eslint '*/**/*.{js,ts,tsx}'" + "lint": "if [ -x ./node_modules/.bin/eslint ]; then eslint '*/**/*.{js,ts,tsx}'; fi;" }, "devDependencies": { "@typescript-eslint/eslint-plugin": "^2.27.0", From ddf81128ab5a7c0920da02ff027dd9a0356bd8b9 Mon Sep 17 00:00:00 2001 From: "Brian M. Carlson" Date: Tue, 28 Apr 2020 10:20:22 -0500 Subject: [PATCH 33/33] Check for the correct binary --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5fb9b187e..282ca9376 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "test": "yarn lint && yarn lerna exec yarn test", "build": "yarn lerna exec --scope pg-protocol yarn build", "pretest": "yarn build", - "lint": "if [ -x ./node_modules/.bin/eslint ]; then eslint '*/**/*.{js,ts,tsx}'; fi;" + "lint": "if [ -x ./node_modules/.bin/prettier ]; then eslint '*/**/*.{js,ts,tsx}'; fi;" }, "devDependencies": { "@typescript-eslint/eslint-plugin": "^2.27.0",