├── _config.yml ├── .babelrc ├── src ├── debug.js ├── makeAsyncApi.js ├── index.js └── sql.js ├── .npmignore ├── lib └── README.md ├── .editorconfig ├── .travis.yml ├── test ├── mock │ ├── getClient.js │ ├── pgMock.js │ └── connect.js ├── driver.js ├── pg │ ├── getClient.js │ ├── shortcuts.js │ ├── sql.js │ ├── transaction.js │ └── connect.js ├── exports.js └── sql.js ├── .gitignore ├── gulpfile.babel.js ├── LICENSE ├── package.json ├── .eslintrc ├── README.md └── yarn.lock /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-midnight -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["es2015-node5", "stage-1"] 3 | } 4 | -------------------------------------------------------------------------------- /src/debug.js: -------------------------------------------------------------------------------- 1 | import debugLib from 'debug'; 2 | 3 | const debug = debugLib('pg-async'); 4 | 5 | export default debug; 6 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .babelrc 2 | .editorconfig 3 | .eslintrc 4 | .gitignore 5 | .npmignore 6 | circle.yml 7 | .travis.yml 8 | coverage/ 9 | gulpfile.babel.js 10 | src/ 11 | test/ 12 | -------------------------------------------------------------------------------- /lib/README.md: -------------------------------------------------------------------------------- 1 | # **WARNING:** GENERATED CODE HERE 2 | 3 | 4 | This folder contains generated code.
5 | 6 | Source codes are avaiable 7 | [here](https://github.com/langpavel/node-pg-async/tree/master/src) 8 | 9 |
10 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs. 3 | # editorconfig.org 4 | 5 | root = true 6 | 7 | [*] 8 | charset = utf-8 9 | end_of_line = lf 10 | indent_size = 2 11 | indent_style = space 12 | insert_final_newline = true 13 | trim_trailing_whitespace = true 14 | 15 | [*.md] 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - '11' 4 | - '10' 5 | - '8' 6 | services: 7 | - postgresql 8 | env: 9 | - CC=clang CXX=clang++ npm_config_clang=1 PGUSER=postgres PGDATABASE=postgres 10 | 11 | install: 12 | - npm install -g node-gyp 13 | - npm install 14 | 15 | script: 16 | - gulp lint 17 | - gulp build 18 | - npm test 19 | 20 | sudo: false 21 | addons: 22 | postgresql: '9.4' 23 | apt: 24 | sources: 25 | - ubuntu-toolchain-r-test 26 | packages: 27 | - g++-4.8 28 | after_success: 29 | - npm install coveralls 30 | - cat ./coverage/lcov.info | ./node_modules/.bin/coveralls 31 | -------------------------------------------------------------------------------- /test/mock/getClient.js: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import Pg from '../../src/index'; 3 | import PgMock, { Client } from './pgMock'; 4 | 5 | describe('pg-async getClient (with mock driver)', () => { 6 | let pg, pgInvalid; 7 | 8 | beforeEach(() => { 9 | pg = new Pg(null, new PgMock()); 10 | pgInvalid = new Pg('INVALID', new PgMock()); 11 | }); 12 | 13 | it('should fail if cannot connect', async () => { 14 | try { 15 | await pgInvalid.getClient(); 16 | } catch (err) { 17 | expect(err).to.be.instanceOf(Error); 18 | } 19 | }); 20 | 21 | it('should connect', async () => { 22 | const { client, done } = await pg.getClient(); 23 | expect(client).to.be.instanceOf(Client); 24 | expect(done).to.be.a('function'); 25 | }); 26 | }); 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | lib/** 2 | !**/*.md 3 | 4 | ## Standart - from https://github.com/github/gitignore/blob/master/Node.gitignore 5 | # Logs 6 | logs 7 | *.log 8 | npm-debug.log* 9 | 10 | # Runtime data 11 | pids 12 | *.pid 13 | *.seed 14 | 15 | # Directory for instrumented libs generated by jscoverage/JSCover 16 | lib-cov 17 | 18 | # Coverage directory used by tools like istanbul 19 | coverage 20 | 21 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 22 | .grunt 23 | 24 | # node-waf configuration 25 | .lock-wscript 26 | 27 | # Compiled binary addons (http://nodejs.org/api/addons.html) 28 | build/Release 29 | 30 | # Dependency directories 31 | node_modules 32 | jspm_packages 33 | 34 | # Optional npm cache directory 35 | .npm 36 | 37 | # Optional REPL history 38 | .node_repl_history 39 | -------------------------------------------------------------------------------- /gulpfile.babel.js: -------------------------------------------------------------------------------- 1 | import babel from 'gulp-babel'; 2 | import del from 'del'; 3 | import eslint from 'gulp-eslint'; 4 | import gulp from 'gulp'; 5 | 6 | const runEslint = () => 7 | gulp 8 | .src(['gulpfile.babel.js', 'src/**/*.js', 'test/**/*.js']) 9 | .pipe( 10 | eslint({ 11 | parser: 'babel-eslint', 12 | }), 13 | ) 14 | .pipe(eslint.format()) 15 | .pipe(eslint.failAfterError()); 16 | 17 | gulp.task('clean', () => del('lib/*.js')); 18 | 19 | gulp.task('eslint', () => runEslint()); 20 | 21 | gulp.task('lint', ['eslint']); 22 | 23 | gulp.task('build', ['clean', 'lint'], () => { 24 | gulp 25 | .src('src/*.js') 26 | .pipe(babel()) 27 | .pipe(gulp.dest('lib')); 28 | }); 29 | 30 | // Default task to start development. Just type gulp. 31 | gulp.task('default', ['clean', 'lint', 'build']); 32 | -------------------------------------------------------------------------------- /test/driver.js: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import Pg from '../src/index'; 3 | 4 | describe('pg-async driver', () => { 5 | it('should be `pg` module by default', () => { 6 | expect(new Pg().getDriver()).to.be.equal(require('pg')); 7 | }); 8 | 9 | it('should be `pg` module by if "pg" string used', () => { 10 | expect(new Pg(null, '').getDriver()).to.be.equal(require('pg')); 11 | expect(new Pg(null, 'pg').getDriver()).to.be.equal(require('pg')); 12 | }); 13 | 14 | it('should be `pg.native` module by if "native" string used', () => { 15 | expect(new Pg(null, 'native').getDriver()).to.be.equal( 16 | require('pg').native, 17 | ); 18 | expect(new Pg(null, 'pg.native').getDriver()).to.be.equal( 19 | require('pg').native, 20 | ); 21 | }); 22 | 23 | it('should throw if unknown driver used', () => { 24 | expect(() => new Pg(null, 'horse')).to.throw(Error); 25 | }); 26 | }); 27 | -------------------------------------------------------------------------------- /test/pg/getClient.js: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import Pg from '../../src/index'; 3 | 4 | testWithDriver('pg', require('pg')); 5 | testWithDriver('pg.native', require('pg').native); 6 | 7 | function testWithDriver(driverName, driver) { 8 | describe(`pg-async getClient (with ${driverName} driver)`, () => { 9 | it('should fail if cannot connect', async () => { 10 | try { 11 | // const pgInvalid = 12 | await new Pg('INVALID', driver); 13 | // TODO: fix this 14 | // await pgInvalid.getClient(); 15 | } catch (err) { 16 | expect(err).to.be.instanceOf(Error); 17 | } 18 | }); 19 | 20 | it('should connect', async () => { 21 | const pg = new Pg(null, driver); 22 | const { client, done } = await pg.getClient(); 23 | expect(done).to.be.a('function'); 24 | expect(client).to.be.a('object'); 25 | expect(client.query).to.be.a('function'); 26 | pg.closeConnections(); 27 | done(); 28 | }); 29 | }); 30 | } 31 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2016 Pavel Lang (langpavel@phpskelet.org) 2 | 3 | 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: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | 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. 8 | -------------------------------------------------------------------------------- /test/exports.js: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import Pg, { sqlStr, literal, identifier } from '../src/index'; 3 | 4 | const pg = new Pg(); 5 | 6 | describe('pg-async exports', () => { 7 | it('pgAsync', () => expect(Pg).to.be.a('function')); 8 | }); 9 | 10 | describe('pg-async client', () => { 11 | it('getDriver', () => expect(pg.getDriver).to.be.a('function')); 12 | it('getClient', () => expect(pg.closeConnections).to.be.a('function')); 13 | it('connect', () => expect(pg.closeConnections).to.be.a('function')); 14 | it('query', () => expect(pg.query).to.be.a('function')); 15 | it('queryArgs', () => expect(pg.query).to.be.a('function')); 16 | it('rows', () => expect(pg.rows).to.be.a('function')); 17 | it('rowsArgs', () => expect(pg.rows).to.be.a('function')); 18 | it('row', () => expect(pg.row).to.be.a('function')); 19 | it('rowArgs', () => expect(pg.row).to.be.a('function')); 20 | it('value', () => expect(pg.value).to.be.a('function')); 21 | it('valueArgs', () => expect(pg.value).to.be.a('function')); 22 | it('closeConnections', () => expect(pg.closeConnections).to.be.a('function')); 23 | it('SQL', () => expect(pg.SQL).to.be.a('function')); 24 | it('sqlStr', () => expect(sqlStr).to.be.a('function')); 25 | it('literal', () => expect(literal).to.be.a('function')); 26 | it('identifier', () => expect(identifier).to.be.a('function')); 27 | }); 28 | -------------------------------------------------------------------------------- /test/mock/pgMock.js: -------------------------------------------------------------------------------- 1 | export class Client { 2 | query(sql, values, cb) { 3 | setImmediate(() => { 4 | switch (sql.text || sql) { 5 | case 'ROWS': 6 | return cb(null, { 7 | rowCount: 2, 8 | rows: [{ id: 1, name: 'A' }, { id: 2, name: 'B' }], 9 | }); 10 | case 'ROW': 11 | return cb(null, { rowCount: 1, rows: [{ id: 1, name: 'A' }] }); 12 | case 'VALUE': 13 | return cb(null, { rowCount: 1, rows: [['value']] }); 14 | case 'NONE': 15 | return cb(null, { rowCount: 0, rows: [] }); 16 | default: 17 | return cb(new Error('ERROR')); 18 | } 19 | }); 20 | } 21 | } 22 | 23 | function poolFactory(driver) { 24 | return function Pool() { 25 | return driver; 26 | }; 27 | } 28 | 29 | export default class PgMock { 30 | constructor(conString) { 31 | this.conString = conString; 32 | this.connections = 0; 33 | this.defaults = {}; 34 | this.done = this.done.bind(this); 35 | this.Pool = poolFactory(this); 36 | } 37 | 38 | connect(cb) { 39 | if (this.conString === 'INVALID') { 40 | setImmediate(() => cb(new Error())); 41 | } else { 42 | this.connections++; 43 | setImmediate(() => cb(null, new Client(), this.done)); 44 | } 45 | } 46 | 47 | end() { 48 | this.connections = 0; 49 | } 50 | 51 | done() { 52 | this.connections--; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /test/pg/shortcuts.js: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import Pg from '../../src/index'; 3 | 4 | describe('pg shortcuts', () => { 5 | const pg = new Pg(); 6 | 7 | after(() => { 8 | pg.closeConnections(); 9 | }); 10 | 11 | it('query works', async () => { 12 | const result = await pg.query( 13 | pg.SQL`SELECT ${123}::int as int, ${'abc'}::text as text`, 14 | ); 15 | expect(result).to.be.a('object'); 16 | expect(result.rows).to.be.a('array'); 17 | expect(result.rows).lengthOf(1); 18 | expect(result.rows[0]).to.be.a('object'); 19 | expect(result.rows[0].int).equal(123); 20 | expect(result.rows[0].text).equal('abc'); 21 | expect(result.fields).to.be.a('array'); 22 | expect(result.fields).lengthOf(2); 23 | expect(result.fields[0]).to.be.a('object'); 24 | expect(result.fields[0].name).equal('int'); 25 | expect(result.fields[1].name).equal('text'); 26 | }); 27 | 28 | it('queryArgs works', async () => { 29 | const result = await pg.queryArgs( 30 | pg.SQL`SELECT ${123}::int as int, ${'abc'}::text as text`, 31 | ); 32 | expect(result).to.be.a('object'); 33 | expect(result.rows).to.be.a('array'); 34 | expect(result.rows).lengthOf(1); 35 | expect(result.rows[0]).to.be.a('object'); 36 | expect(result.rows[0].int).equal(123); 37 | expect(result.rows[0].text).equal('abc'); 38 | expect(result.fields).to.be.a('array'); 39 | expect(result.fields).lengthOf(2); 40 | expect(result.fields[0]).to.be.a('object'); 41 | expect(result.fields[0].name).equal('int'); 42 | expect(result.fields[1].name).equal('text'); 43 | }); 44 | }); 45 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pg-async", 3 | "version": "3.1.0", 4 | "description": "PostgreSQL client for node.js designed for usage with ES7 async/await based on node-postgres (pg) module", 5 | "main": "lib/index.js", 6 | "scripts": { 7 | "build": "gulp", 8 | "test": "mocha --require babel-register", 9 | "lint": "gulp eslint" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "git+https://github.com/langpavel/node-pg-async.git" 14 | }, 15 | "keywords": [ 16 | "pg", 17 | "postgre", 18 | "postgres", 19 | "postgreSQL", 20 | "libpq", 21 | "database", 22 | "rdbms", 23 | "async", 24 | "await", 25 | "async-await", 26 | "promise", 27 | "bluebird", 28 | "babel", 29 | "ES6", 30 | "ES7" 31 | ], 32 | "author": "Pavel Lang (https://github.com/langpavel)", 33 | "license": "MIT", 34 | "bugs": { 35 | "url": "https://github.com/langpavel/node-pg-async/issues" 36 | }, 37 | "homepage": "https://github.com/langpavel/node-pg-async#readme", 38 | "dependencies": { 39 | "bluebird": "^3.5.0", 40 | "debug": "^4.0.0", 41 | "pg": "^7.0.2" 42 | }, 43 | "devDependencies": { 44 | "babel": "^6.23.0", 45 | "babel-core": "^6.25.0", 46 | "babel-eslint": "^8.0.1", 47 | "babel-plugin-add-module-exports": "^0.2.1", 48 | "babel-preset-es2015-node5": "^1.2.0", 49 | "babel-preset-stage-1": "^6.24.1", 50 | "babel-register": "^6.24.1", 51 | "chai": "^4.1.2", 52 | "del": "^3.0.0", 53 | "eslint": "^4.2.0", 54 | "eslint-config-strict": "^14.0.0", 55 | "eslint-plugin-import": "^2.7.0", 56 | "estraverse-fb": "^1.3.1", 57 | "gulp": "^3.9.1", 58 | "gulp-babel": "^7.0.0", 59 | "gulp-eslint": "^4.0.0", 60 | "mocha": "^3.4.2", 61 | "pg-native": "^2.0.1" 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /test/pg/sql.js: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import Pg, { SQL } from '../../src/index'; 3 | 4 | const tableName = 'pgAsyncTest'; 5 | testWithDriver('pg', require('pg')); 6 | testWithDriver('pg.native', require('pg').native); 7 | 8 | function testWithDriver(driverName, driver) { 9 | describe(`pg-async SQL tag (with ${driverName} driver)`, () => { 10 | let pg; 11 | 12 | before(async () => { 13 | pg = new Pg(null, driver); 14 | await pg.query(SQL` 15 | CREATE TABLE IF NOT EXISTS $ID${tableName} ( 16 | id serial, 17 | val integer 18 | ) 19 | `); 20 | }); 21 | 22 | after(async () => { 23 | try { 24 | await pg.query(SQL`DROP TABLE $ID${tableName}`); 25 | } catch (err) { 26 | // ignore 27 | } 28 | pg.closeConnections(); 29 | }); 30 | 31 | it('returns string value', async () => { 32 | const result = await pg.transaction(t => 33 | t.value(SQL`SELECT ${'test'}::text`), 34 | ); 35 | expect(result).to.be.equal('test'); 36 | }); 37 | 38 | it('returns nested string value', async () => { 39 | const nested = SQL`${'test'}`; 40 | const result = await pg.transaction(t => 41 | t.value(SQL`SELECT ${nested}::text`), 42 | ); 43 | expect(result).to.be.equal('test'); 44 | }); 45 | 46 | it('returns nested subquery value', async () => { 47 | const nested = SQL`(select ${'test'}::text)`; 48 | const result = await pg.transaction(t => t.value(SQL`SELECT ${nested}`)); 49 | expect(result).to.be.equal('test'); 50 | }); 51 | 52 | it('returns row', async () => { 53 | const result = await pg.transaction(t => 54 | t.row(t.SQL` 55 | SELECT ${'test'}::text as t, ${123}::smallint as i 56 | `), 57 | ); 58 | expect(result.t).to.be.equal('test'); 59 | expect(result.i).to.be.equal(123); 60 | }); 61 | }); 62 | } 63 | -------------------------------------------------------------------------------- /src/makeAsyncApi.js: -------------------------------------------------------------------------------- 1 | import Promise from 'bluebird'; 2 | import debug from './debug'; 3 | import SQL, { SqlFragment } from './sql'; 4 | 5 | const makeAsyncApi = client => { 6 | let inQuery = false; 7 | 8 | function query(sql, ...values) { 9 | return query.queryArgs(sql, values); 10 | } 11 | 12 | let _queryArgs = (sql, values) => { 13 | if (sql instanceof SqlFragment) { 14 | values = sql.values; 15 | sql = sql.text; 16 | } 17 | 18 | inQuery = true; 19 | return new Promise((resolve, reject) => { 20 | debug( 21 | 'query params: %s query: %j', 22 | JSON.stringify(values).slice(0, 60), 23 | sql, 24 | ); 25 | client.query(sql, values, (err, result) => { 26 | inQuery = false; 27 | if (err) { 28 | debug('%s query(%j, %j)', err, sql, values); 29 | return reject(err); 30 | } 31 | debug('query ok: %d rows', result.rowCount); 32 | return resolve(result); 33 | }); 34 | }); 35 | }; 36 | 37 | query.SQL = SQL; 38 | 39 | query.query = (sql, ...values) => query.queryArgs(sql, values); 40 | query.queryArgs = (sql, values) => { 41 | if (inQuery) 42 | throw new Error( 43 | 'Commands on same client should be called serially. ' + 44 | 'Do you forget `await`?', 45 | ); 46 | return _queryArgs(sql, values); 47 | }; 48 | 49 | query.rows = (sql, ...values) => query.rowsArgs(sql, values); 50 | query.rowsArgs = (sql, values) => 51 | query.queryArgs(sql, values).then(r => r.rows); 52 | 53 | query.row = (sql, ...values) => query.rowArgs(sql, values); 54 | query.rowArgs = async (sql, values) => { 55 | const result = await query.queryArgs(sql, values); 56 | if (result.rowCount !== 1) 57 | throw new Error( 58 | `SQL: Expected exactly one row result but ${result.rowCount} returned`, 59 | ); 60 | return result.rows[0]; 61 | }; 62 | 63 | query.value = async (sql, ...values) => query.valueArgs(sql, values); 64 | query.valueArgs = async (sql, values) => { 65 | let opts; 66 | if (sql instanceof SqlFragment) { 67 | opts = { 68 | ...sql, 69 | rowMode: 'array', 70 | }; 71 | values = sql.values; 72 | } else { 73 | opts = 74 | typeof sql === 'string' 75 | ? { text: sql, rowMode: 'array' } 76 | : { ...sql, rowMode: 'array' }; 77 | } 78 | 79 | const result = await query.rowArgs(opts, values); 80 | if (result.length !== 1) 81 | throw new Error( 82 | `SQL: Expected exactly one column but ${result.length} returned`, 83 | ); 84 | return result[0]; 85 | }; 86 | 87 | query.inTransaction = false; 88 | 89 | query.startTransaction = () => { 90 | query.inTransaction = true; 91 | return query.query('BEGIN'); 92 | }; 93 | 94 | query.commit = () => { 95 | query.inTransaction = false; 96 | return query.query('COMMIT'); 97 | }; 98 | 99 | query.rollback = () => { 100 | query.inTransaction = false; 101 | return _queryArgs('ROLLBACK', []); 102 | }; 103 | 104 | query._end = () => { 105 | const queryArgs = _queryArgs; 106 | _queryArgs = () => { 107 | throw new Error('Client was released.'); 108 | }; 109 | return new Promise(resolve => { 110 | if (inQuery) 111 | throw new Error( 112 | 'Client shutting down but query is pending. ' + 113 | 'Do you forget `await`?', 114 | ); 115 | 116 | if (query.inTransaction) { 117 | query.inTransaction = false; 118 | queryArgs('ROLLBACK', []); 119 | throw new Error( 120 | 'Transaction started manually but not closed. Automatic rollback', 121 | ); 122 | } 123 | resolve(); 124 | }); 125 | }; 126 | 127 | return query; 128 | }; 129 | 130 | export default makeAsyncApi; 131 | -------------------------------------------------------------------------------- /test/pg/transaction.js: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import Pg from '../../src/index'; 3 | 4 | const SLEEP_SECONDS = 0.01; 5 | const SLEEP_SQL = Pg.SQL`pg_sleep(${SLEEP_SECONDS})`; 6 | const SLEEP_SELECT = Pg.SQL`select ${SLEEP_SQL}`; 7 | 8 | testWithDriver('pg', require('pg')); 9 | testWithDriver('pg.native', require('pg').native); 10 | 11 | function testWithDriver(driverName, driver) { 12 | describe(`pg-async transaction (with ${driverName} driver)`, () => { 13 | let pg; 14 | 15 | before(async () => { 16 | pg = new Pg(null, driver); 17 | await pg.query(` 18 | CREATE TABLE IF NOT EXISTS "pgAsyncTest" ( 19 | id serial, 20 | val integer 21 | ) 22 | `); 23 | }); 24 | 25 | beforeEach(() => { 26 | pg = new Pg(null, driver); 27 | }); 28 | 29 | after(async () => { 30 | try { 31 | await pg.query('DROP TABLE "pgAsyncTest"'); 32 | } catch (err) { 33 | // ignore 34 | } 35 | pg.closeConnections(); 36 | }); 37 | 38 | it('returns value', async () => { 39 | const result = await pg.transaction(t => t.value(`SELECT 'test'`)); 40 | expect(result).to.be.equal('test'); 41 | }); 42 | 43 | it('commits', async () => { 44 | const random = Math.trunc(Math.random() * 1e9) + 1; 45 | let id; 46 | try { 47 | id = await pg.transaction( 48 | async t => 49 | await t.value( 50 | `INSERT INTO "pgAsyncTest" (val) VALUES ($1) RETURNING id`, 51 | random, 52 | ), 53 | ); 54 | } catch (err) {} 55 | const restored = await pg.row( 56 | 'select * from "pgAsyncTest" where id = $1', 57 | id, 58 | ); 59 | expect(restored.val).equal(random); 60 | }); 61 | 62 | it('rollbacks', async () => { 63 | const random = Math.trunc(Math.random() * 1e9) + 1; 64 | let id; 65 | try { 66 | await pg.transaction(async t => { 67 | id = await t.value( 68 | `INSERT INTO "pgAsyncTest" (val) VALUES ($1) RETURNING id`, 69 | random, 70 | ); 71 | throw new Error('Test rollback'); 72 | }); 73 | } catch (err) {} 74 | const restoredRows = await pg.rows( 75 | 'select * from "pgAsyncTest" where id = $1', 76 | id, 77 | ); 78 | expect(restoredRows).lengthOf(0); 79 | }); 80 | 81 | it('rollbacks uncommited', async () => { 82 | const random = Math.trunc(Math.random() * 1e9) + 1; 83 | let error, id; 84 | try { 85 | await pg.connect(async t => { 86 | await t.startTransaction(); 87 | id = await t.value( 88 | `INSERT INTO "pgAsyncTest" (val) VALUES ($1) RETURNING id`, 89 | random, 90 | ); 91 | }); 92 | } catch (err) { 93 | error = err; 94 | } 95 | expect(error).to.be.a('Error'); 96 | const restoredRows = await pg.rows( 97 | 'select * from "pgAsyncTest" where id = $1', 98 | id, 99 | ); 100 | expect(restoredRows).lengthOf(0); 101 | }); 102 | 103 | it('throws on forgotten first await', async () => { 104 | let throws = false; 105 | try { 106 | await pg.transaction(async t => { 107 | t(SLEEP_SELECT); 108 | await t(SLEEP_SELECT); 109 | }); 110 | } catch (err) { 111 | throws = true; 112 | } 113 | expect(throws).equal(true); 114 | }); 115 | 116 | it('throws on forgotten second await', async () => { 117 | let throws = false; 118 | try { 119 | await pg.transaction(async t => { 120 | await t(SLEEP_SELECT); 121 | t(SLEEP_SELECT); 122 | }); 123 | } catch (err) { 124 | throws = true; 125 | } 126 | expect(throws).equal(true); 127 | }); 128 | }); 129 | } 130 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import Promise from 'bluebird'; 2 | import pgDriver from 'pg'; 3 | import debug from './debug'; 4 | import makeAsyncApi from './makeAsyncApi'; 5 | import SqlTag from './sql'; 6 | 7 | export { sqlStr, literal, identifier } from './sql'; 8 | export const SQL = SqlTag; 9 | 10 | function checkAsyncFunction(asyncFunc) { 11 | if (typeof asyncFunc !== 'function') 12 | throw new TypeError('async function expected'); 13 | } 14 | 15 | export default class PgAsync { 16 | constructor(connectionOptions, driver) { 17 | this.setConnectionOptions(connectionOptions); 18 | this.setDriver(driver); 19 | this.setPool(); 20 | 21 | const self = this; 22 | const wrap = name => { 23 | self[name] = (sql, ...values) => 24 | self.connect(client => client[`${name}Args`](sql, values)); 25 | }; 26 | const wrapArgs = name => { 27 | self[name] = (sql, values) => 28 | self.connect(client => client[name](sql, values)); 29 | }; 30 | 31 | wrap('query'); 32 | wrapArgs('queryArgs'); 33 | 34 | wrap('rows'); 35 | wrapArgs('rowsArgs'); 36 | 37 | wrap('row'); 38 | wrapArgs('rowArgs'); 39 | 40 | wrap('value'); 41 | wrapArgs('valueArgs'); 42 | } 43 | 44 | static SQL = SqlTag; 45 | SQL = SqlTag; 46 | 47 | setConnectionOptions(options) { 48 | this._connectionOptions = options; 49 | return this; 50 | } 51 | 52 | getConnectionOptions() { 53 | return this._connectionOptions || this.getDriver().defaults; 54 | } 55 | 56 | getDriver() { 57 | return this._driver; 58 | } 59 | 60 | setDriver(driver) { 61 | if (typeof driver === 'string') 62 | switch (driver) { 63 | case '': 64 | case 'pg': 65 | driver = pgDriver; 66 | break; 67 | case 'native': 68 | case 'pg.native': 69 | driver = pgDriver.native; 70 | break; 71 | default: 72 | throw new Error(`Unrecognized driver name: ${driver}`); 73 | } 74 | this._driver = driver || pgDriver; 75 | return this; 76 | } 77 | 78 | setPool() { 79 | const driver = this.getDriver(); 80 | const Pool = driver.Pool; 81 | this._pool = new Pool(this.getConnectionOptions()); 82 | return this; 83 | } 84 | 85 | getPool() { 86 | return this._pool; 87 | } 88 | 89 | async getClient() { 90 | return new Promise((resolve, reject) => { 91 | const pool = this.getPool(); 92 | pool.connect((err, client, done) => { 93 | if (err) { 94 | debug('%s getClient(%j)', err, this.getConnectionOptions()); 95 | if (done) done(err); 96 | return reject(err); 97 | } 98 | return resolve({ 99 | client, 100 | done: () => { 101 | debug('Client released'); 102 | done(); 103 | }, 104 | }); 105 | }); 106 | }); 107 | } 108 | 109 | async connect(asyncFunc) { 110 | checkAsyncFunction(asyncFunc); 111 | 112 | const { client, done } = await this.getClient(); 113 | try { 114 | const api = makeAsyncApi(client); 115 | const result = await asyncFunc(api); 116 | await api._end(); 117 | done(); 118 | return result; 119 | } catch (err) { 120 | done(err); 121 | throw err; 122 | } 123 | } 124 | 125 | async transaction(asyncFunc) { 126 | checkAsyncFunction(asyncFunc); 127 | 128 | return await this.connect(async client => { 129 | client.checkSerialAccess = true; 130 | await client.startTransaction(); 131 | try { 132 | const result = await asyncFunc(client); 133 | await client.commit(); 134 | return result; 135 | } catch (err) { 136 | try { 137 | await client.rollback(); 138 | } catch (_) { 139 | // client disconnected? 140 | } 141 | throw err; 142 | } 143 | }); 144 | } 145 | 146 | closeConnections = () => this.getPool().end(); 147 | } 148 | -------------------------------------------------------------------------------- /src/sql.js: -------------------------------------------------------------------------------- 1 | import { inspect } from 'util'; 2 | import pg from 'pg'; 3 | import { prepareValue } from 'pg/lib/utils'; 4 | 5 | let SQL; // eslint-disable-line prefer-const 6 | 7 | export class SqlFragment { 8 | // SQL`insert into $quote${tableName} $values${keyValue}`; 9 | constructor(templateParts, templateValues) { 10 | this._parts = []; 11 | this.values = []; 12 | 13 | const length = templateValues.length; 14 | const text = []; 15 | let currentFragment = []; 16 | let argIndex = 1; 17 | 18 | let i = 0; 19 | 20 | const addText = str => { 21 | currentFragment.push(str); 22 | }; 23 | 24 | const flushText = () => { 25 | const fragment = currentFragment.join(''); 26 | currentFragment = []; 27 | this._parts.push(fragment); 28 | text.push(fragment); 29 | }; 30 | 31 | const addValue = value => { 32 | flushText(); 33 | this.values.push(value); 34 | text.push('$', argIndex++); 35 | }; 36 | 37 | while (i < length) { 38 | const parts = templateParts[i].split('$'); 39 | let value = templateValues.shift(); 40 | if (typeof value === 'undefined') 41 | throw new Error( 42 | `Expected something, but got undefined. ` + 43 | `Value after SQL fragment: ${text.join('')}${templateParts[i]}`, 44 | ); 45 | 46 | while (parts.length > 1) value = SQL.transform(parts.pop(), value); 47 | 48 | addText(parts[0]); 49 | 50 | if (value && value.toSQL) value = value.toSQL(); 51 | 52 | if (value instanceof SqlFragment) { 53 | const nestedValuesLength = value.values.length; 54 | let valueIndex = 0; 55 | while (valueIndex < nestedValuesLength) { 56 | addText(value._parts[valueIndex]); 57 | addValue(value.values[valueIndex]); 58 | valueIndex++; 59 | } 60 | addText(value._parts[valueIndex]); 61 | } else { 62 | addValue(value); 63 | } 64 | i++; 65 | } 66 | // last part is alone, without value 67 | addText(templateParts[i]); 68 | flushText(); 69 | 70 | this.text = text.join(''); 71 | } 72 | 73 | // this is for log/debugging only 74 | toString() { 75 | if (this._asString) return this._asString; 76 | 77 | const text = []; 78 | const length = this.values.length; 79 | let i = 0; 80 | while (i < length) { 81 | text.push(this._parts[i]); 82 | const value = literal(this.values[i]); 83 | text.push(value); 84 | i++; 85 | } 86 | text.push(this._parts[i]); 87 | this._asString = text.join(''); 88 | return this._asString; 89 | } 90 | } 91 | 92 | SQL = (parts, ...values) => { 93 | // eslint-disable-line prefer-const 94 | // only one argument, called manually 95 | if (!Array.isArray(parts) && values.length === 0) { 96 | if (parts instanceof SqlFragment) return parts; 97 | 98 | parts = [parts]; 99 | } 100 | 101 | return new SqlFragment(parts, values); 102 | }; 103 | 104 | SQL.NULL = SQL('NULL'); 105 | SQL.DEFAULT = SQL('DEFAULT'); 106 | 107 | SQL._transforms = {}; 108 | SQL.registerTransform = (...names) => { 109 | const transform = names.pop(); 110 | if (typeof transform !== 'function') 111 | throw new Error('Last argument must be a function'); 112 | 113 | const transforms = SQL._transforms; 114 | for (let i = 0; i < names.length; i++) { 115 | const name = names[i].trim().toLowerCase(); 116 | if (transforms[name] && transforms[name] !== transform) 117 | throw new Error(`Transform ${name} already registered`); 118 | transforms[names[i].toLowerCase()] = transform; 119 | } 120 | }; 121 | 122 | SQL.transform = (name, value) => { 123 | name = name.trim().toLowerCase(); 124 | const transform = SQL._transforms[name]; 125 | if (!transform) throw new Error(`Unknown transform: "${name}"`); 126 | return transform(value); 127 | }; 128 | 129 | export const escapeIdentifier = pg.Client.prototype.escapeIdentifier; 130 | export const escapeLiteral = pg.Client.prototype.escapeLiteral; 131 | 132 | export function sqlStr(str) { 133 | if (typeof str !== 'string') 134 | throw new Error(`Expected string, got ${inspect(str)}`); 135 | 136 | return SQL(str); 137 | } 138 | 139 | // returns quoted identifier 140 | export function identifier(name) { 141 | if (!name) throw new Error(`Expected nonempty string, got ${inspect(name)}`); 142 | 143 | return SQL(escapeIdentifier(name)); 144 | } 145 | 146 | // returns quoted literal 147 | export function literal(value) { 148 | if (value instanceof SqlFragment) return value; 149 | 150 | if (typeof value === 'undefined') 151 | throw new Error(`Expected something, but got undefined.`); 152 | 153 | if (value === null) return SQL.NULL; 154 | 155 | if (value.toPostgres) 156 | return SQL(escapeLiteral(value.toPostgres(prepareValue))); 157 | 158 | if (value.toSQL) return SQL(value.toSQL()); 159 | 160 | return SQL(escapeLiteral(value.toString())); 161 | } 162 | 163 | export function insert_object(data) { 164 | const keys = Object.keys(data); 165 | const length = keys.length; 166 | const sqlFragments = new Array(length); 167 | const values = new Array(length - 1); 168 | const sb = []; 169 | 170 | sb.push('('); 171 | let i = 0; 172 | while (i < length) { 173 | const column = keys[i]; 174 | values[i] = data[column]; 175 | i++; 176 | sb.push(escapeIdentifier(column), ','); 177 | sqlFragments[i] = ','; 178 | } 179 | sb[sb.length - 1] = ') VALUES ('; 180 | sqlFragments[0] = sb.join(''); 181 | sqlFragments[i] = ')'; 182 | 183 | return new SqlFragment(sqlFragments, values); 184 | } 185 | 186 | SQL.registerTransform('id', 'ident', 'identifier', 'name', identifier); 187 | SQL.registerTransform('', 'literal', literal); 188 | SQL.registerTransform('!', 'raw', sqlStr); 189 | SQL.registerTransform('insert_object', 'insert', insert_object); 190 | 191 | export default SQL; 192 | -------------------------------------------------------------------------------- /test/sql.js: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import { SQL, literal } from '../src'; 3 | 4 | describe('pg-async SQL template tag', () => { 5 | it('parse without args', () => { 6 | const sql = SQL`SELECT * FROM test`; 7 | expect(sql.text).equal('SELECT * FROM test'); 8 | expect(sql.values.length).equal(0); 9 | expect(sql.toString()).equal('SELECT * FROM test'); 10 | }); 11 | 12 | it('parse with custom formater arg', () => { 13 | const value1 = { 14 | toPostgres() { 15 | return 'raw text value'; 16 | }, 17 | }; 18 | const sql = SQL`SELECT ${value1}`; 19 | expect(sql.text).equal('SELECT $1'); 20 | expect(sql.values.length).equal(1); 21 | expect(sql.values[0]).equal(value1); 22 | expect(sql.toString()).equal("SELECT 'raw text value'"); 23 | // cover caching 24 | expect(sql.toString()).equal("SELECT 'raw text value'"); 25 | }); 26 | 27 | it('parse with null arg', () => { 28 | const value1 = null; 29 | const sql = SQL`SELECT ${value1}`; 30 | expect(sql.text).equal('SELECT $1'); 31 | expect(sql.values.length).equal(1); 32 | expect(sql.values[0]).equal(null); 33 | expect(sql.toString()).equal('SELECT NULL'); 34 | // cover caching 35 | expect(sql.toString()).equal('SELECT NULL'); 36 | }); 37 | 38 | it('parse literal transform with null arg', () => { 39 | const value1 = null; 40 | const sql = SQL`SELECT $${value1}`; 41 | expect(sql.text).equal('SELECT NULL'); 42 | expect(sql.values.length).equal(0); 43 | expect(sql.toString()).equal('SELECT NULL'); 44 | }); 45 | 46 | it('parse literal transform with string arg', () => { 47 | const value1 = 'ABC'; 48 | const sql = SQL`SELECT $${value1}`; 49 | expect(sql.text).equal("SELECT 'ABC'"); 50 | expect(sql.values.length).equal(0); 51 | expect(sql.toString()).equal("SELECT 'ABC'"); 52 | }); 53 | 54 | it('parse nested literal transform arg', () => { 55 | const value1 = SQL`${'ABC'}`; 56 | const sql = SQL`SELECT $${value1}`; 57 | expect(sql.text).equal('SELECT $1'); 58 | expect(sql.values.length).equal(1); 59 | expect(sql.values[0]).equal('ABC'); 60 | expect(sql.toString()).equal("SELECT 'ABC'"); 61 | }); 62 | 63 | it('parse with SQL formater arg', () => { 64 | const value1 = { 65 | toSQL() { 66 | return SQL`123.45::numeric(15,2)`; 67 | }, 68 | }; 69 | const sql = SQL`SELECT ${value1}`; 70 | expect(sql.text).equal('SELECT 123.45::numeric(15,2)'); 71 | expect(sql.values.length).equal(0); 72 | expect(sql.toString()).equal('SELECT 123.45::numeric(15,2)'); 73 | }); 74 | 75 | it('parse with nested SQL', () => { 76 | const ip = '127.0.0.1'; 77 | const login = 'langpavel'; 78 | const userIdSql = SQL`(select id from user where login = ${login})`; 79 | const auditSql = SQL`insert into audit (uder_id, ip) values (${userIdSql}, ${ip})`; 80 | 81 | expect(userIdSql.text).equal('(select id from user where login = $1)'); 82 | expect(userIdSql.values.length).equal(1); 83 | expect(userIdSql.values[0]).equal(login); 84 | 85 | expect(auditSql.text).equal( 86 | 'insert into audit (uder_id, ip) values ((select id from user where login = $1), $2)', 87 | ); 88 | expect(auditSql.values.length).equal(2); 89 | expect(auditSql.values[0]).equal(login); 90 | expect(auditSql.values[1]).equal(ip); 91 | }); 92 | 93 | it('transform name', () => { 94 | const sql = SQL.transform('name', 'test "identifier"'); 95 | expect(sql.toString()).equal('"test ""identifier"""'); 96 | }); 97 | 98 | it('parse with transform', () => { 99 | const table = 'address'; 100 | const sql = SQL`select * from $name${table}`; 101 | expect(sql.text).equal('select * from "address"'); 102 | expect(sql.values.length).equal(0); 103 | }); 104 | 105 | it('parse with raw transform', () => { 106 | const table = 'address'; 107 | const sql = SQL`select * from $!${table}`; 108 | expect(sql.text).equal('select * from address'); 109 | expect(sql.values.length).equal(0); 110 | }); 111 | 112 | it('parse with insert_object transform', () => { 113 | const data = { 114 | id: 123, 115 | val: 'abc', 116 | }; 117 | const sql = SQL`INSERT INTO t $insert_object${data}`; 118 | expect(sql.text).equal('INSERT INTO t ("id","val") VALUES ($1,$2)'); 119 | expect(sql.values.length).equal(2); 120 | expect(sql.values[0]).equal(123); 121 | expect(sql.values[1]).equal('abc'); 122 | }); 123 | 124 | it('SQL not nesting if ensuring SQL', () => { 125 | const sql1 = SQL`${'Value'}`; 126 | const sql2 = SQL(sql1); 127 | expect(sql1).equal(sql2); 128 | }); 129 | 130 | it('SQL literal custom SQL transform', () => { 131 | const val = { 132 | toSQL() { 133 | return 'DEFAULT'; 134 | }, 135 | }; 136 | const sql = SQL`insert... ($${val})`; 137 | expect(sql.text).equal('insert... (DEFAULT)'); 138 | expect(sql.values.length).equal(0); 139 | expect(sql.toString()).equal('insert... (DEFAULT)'); 140 | }); 141 | }); 142 | 143 | describe('pg-async SQL errors', () => { 144 | it('throws on unknown transform', () => { 145 | expect(() => SQL`SELECT * FROM $bleh${'something'}`).throws(Error); 146 | }); 147 | 148 | it('throws on empty string', () => { 149 | expect(() => SQL`SELECT * FROM $ID${''}`).throws(Error); 150 | }); 151 | 152 | it('throws on nonstring raw transform', () => { 153 | expect(() => SQL`SELECT * FROM $RAW${null}`).throws(Error); 154 | }); 155 | 156 | it('throws on re-registering transform', () => { 157 | expect(() => { 158 | SQL.registerTransform('Id', val => val); 159 | }).throws(Error); 160 | }); 161 | 162 | it('throws on registering nonfunction transform', () => { 163 | expect(() => { 164 | SQL.registerTransform('dummy', null); 165 | }).throws(Error); 166 | }); 167 | 168 | it('throws on passing undefined', () => { 169 | const data = {}; 170 | expect(() => SQL`update mytable set myvalue = ${data.mistyped}`).throws( 171 | Error, 172 | ); 173 | }); 174 | 175 | it('throws on transforming undefined', () => { 176 | let undef; 177 | expect(() => SQL`SELECT * FROM $ID${undef}`).throws(Error); 178 | expect(() => SQL`SELECT * FROM $${undef}`).throws(Error); 179 | expect(() => literal(undef)).throws(Error); 180 | }); 181 | }); 182 | -------------------------------------------------------------------------------- /test/pg/connect.js: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import Pg from '../../src/index'; 3 | 4 | const SELECT = { 5 | row: 'select 1 as id, 2 as value', 6 | rows: 'select oid, typname from pg_type limit 2', 7 | empty: 'select * from pg_type where false', 8 | error: 'ERROR', 9 | }; 10 | 11 | testWithDriver('pg', require('pg')); 12 | // testWithDriver('pg.native', require('pg').native); 13 | 14 | function testWithDriver(driverName, driver) { 15 | describe(`pg-async connect (with ${driverName} driver)`, () => { 16 | let pg, pgInvalid; 17 | 18 | beforeEach(() => { 19 | pg = new Pg(null, driver); 20 | pgInvalid = new Pg('INVALID', driver); 21 | }); 22 | 23 | after(() => { 24 | pg.closeConnections(); 25 | }); 26 | 27 | it('should fail if invalid connection conf', async () => { 28 | try { 29 | await pgInvalid(async () => null); 30 | } catch (err) { 31 | expect(err).to.be.instanceOf(Error); 32 | } 33 | }); 34 | 35 | it('should fail if invalid callback', async () => { 36 | try { 37 | await pg.connect(); 38 | } catch (err) { 39 | expect(err).to.be.instanceOf(Error); 40 | } 41 | }); 42 | 43 | it('throws if client early ended', async () => { 44 | let throws = false; 45 | try { 46 | await pg.connect(async q => { 47 | q('select pg_sleep(0.1)'); 48 | }); 49 | } catch (err) { 50 | throws = true; 51 | expect(err).instanceOf(Error); 52 | } 53 | expect(throws).equal(true); 54 | }); 55 | 56 | describe('method', () => { 57 | it('query works', async () => { 58 | await pg.connect(async q => { 59 | const row = await q(SELECT.row); 60 | expect(row.rows).to.have.length(1); 61 | 62 | const rows = await q(SELECT.rows); 63 | expect(rows.rows).to.have.length(2); 64 | 65 | const rows2 = await q(SELECT.rows); 66 | expect(rows2.rows).to.have.length(2); 67 | 68 | const none = await q(SELECT.empty); 69 | expect(none.rows).to.have.length(0); 70 | 71 | try { 72 | await q(SELECT.error); 73 | } catch (err) { 74 | expect(err).to.be.instanceOf(Error); 75 | } 76 | }); 77 | }); 78 | 79 | it('query.query works', async () => { 80 | await pg.connect(async q => { 81 | const row = await q.query(SELECT.row); 82 | expect(row.rows).to.have.length(1); 83 | 84 | const rows = await q.query(SELECT.rows); 85 | expect(rows.rows).to.have.length(2); 86 | 87 | const none = await q.query(SELECT.empty); 88 | expect(none.rows).to.have.length(0); 89 | 90 | try { 91 | await q.query(SELECT.error); 92 | } catch (err) { 93 | expect(err).to.be.instanceOf(Error); 94 | } 95 | }); 96 | }); 97 | 98 | it('query.rows works', async () => { 99 | await pg.connect(async q => { 100 | const row = await q.rows(SELECT.row); 101 | expect(row).to.have.length(1); 102 | 103 | const rows = await q.rows(SELECT.rows); 104 | expect(rows).to.have.length(2); 105 | 106 | const none = await q.rows(SELECT.empty); 107 | expect(none).to.have.length(0); 108 | 109 | try { 110 | await q.rows(SELECT.error); 111 | } catch (err) { 112 | expect(err).to.be.instanceOf(Error); 113 | } 114 | }); 115 | }); 116 | 117 | it('query.row works with arguments', async () => { 118 | await pg.connect(async q => { 119 | const result = await q.row( 120 | 'select $1::int as i, $2::text as t', 121 | 123, 122 | 'abc', 123 | ); 124 | expect(result).to.be.a('object'); 125 | expect(result.i).equal(123); 126 | expect(result.t).equal('abc'); 127 | }); 128 | }); 129 | 130 | it('query.rowArgs works with arguments', async () => { 131 | await pg.connect(async q => { 132 | const result = await q.rowArgs('select $1::int as i, $2::text as t', [ 133 | 123, 134 | 'abc', 135 | ]); 136 | expect(result).to.be.a('object'); 137 | expect(result.i).equal(123); 138 | expect(result.t).equal('abc'); 139 | }); 140 | }); 141 | 142 | it('query.row works', async () => { 143 | await pg.connect(async q => { 144 | const row = await q.row(SELECT.row); 145 | expect(row).to.be.a('object'); 146 | 147 | try { 148 | await q.row(SELECT.rows); 149 | } catch (err) { 150 | expect(err).to.be.instanceOf(Error); 151 | } 152 | 153 | try { 154 | await q.row(SELECT.empty); 155 | } catch (err) { 156 | expect(err).to.be.instanceOf(Error); 157 | } 158 | 159 | try { 160 | await q.row(SELECT.error); 161 | } catch (err) { 162 | expect(err).to.be.instanceOf(Error); 163 | } 164 | }); 165 | }); 166 | 167 | it('query.value works', async () => { 168 | await pg.connect(async q => { 169 | const value = await q.value(`SELECT 'value'`); 170 | expect(value).to.be.equal('value'); 171 | 172 | try { 173 | await q.value(SELECT.row); 174 | } catch (err) { 175 | expect(err).to.be.instanceOf(Error); 176 | } 177 | 178 | try { 179 | await q.value(SELECT.rows); 180 | } catch (err) { 181 | expect(err).to.be.instanceOf(Error); 182 | } 183 | 184 | try { 185 | await q.value(SELECT.empty); 186 | } catch (err) { 187 | expect(err).to.be.instanceOf(Error); 188 | } 189 | 190 | try { 191 | await q.value(SELECT.error); 192 | } catch (err) { 193 | expect(err).to.be.instanceOf(Error); 194 | } 195 | }); 196 | }); 197 | 198 | it('rows - shorthand works', async () => { 199 | const row = await pg.rows(SELECT.row); 200 | expect(row).to.have.length(1); 201 | const rows = await pg.rows(SELECT.rows); 202 | expect(rows).to.have.length(2); 203 | const none = await pg.rows(SELECT.empty); 204 | expect(none).to.have.length(0); 205 | }); 206 | 207 | it('value ovverides custom query config correctly', async () => { 208 | const value = await pg.value({ 209 | text: 'SELECT 123', 210 | rowMode: 'object', 211 | }); 212 | expect(value).equal(123); 213 | }); 214 | }); 215 | }); 216 | } 217 | -------------------------------------------------------------------------------- /test/mock/connect.js: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import Pg from '../../src/index'; 3 | import PgMock from './pgMock'; 4 | 5 | describe('pg-async connect (with mock driver)', () => { 6 | let pg, pgInvalid; 7 | 8 | beforeEach(() => { 9 | pg = new Pg(null, new PgMock()); 10 | pgInvalid = new Pg('INVALID', new PgMock()); 11 | }); 12 | 13 | it('should fail if invalid connection conf', async () => { 14 | try { 15 | await pgInvalid.connect( 16 | 'INVALID', 17 | async () => null, 18 | ); 19 | } catch (err) { 20 | expect(pgInvalid.getDriver().connections).to.be.equal(0); 21 | expect(err).to.be.instanceOf(Error); 22 | } 23 | }); 24 | 25 | it('should fail if invalid callback', async () => { 26 | try { 27 | await pg.connect('INVALID'); 28 | } catch (err) { 29 | expect(err).to.be.instanceOf(Error); 30 | } 31 | }); 32 | 33 | it('should release connection', async () => { 34 | await pg.connect(async () => { 35 | expect(pg.getDriver().connections).to.be.equal(1); 36 | return null; 37 | }); 38 | expect(pg.getDriver().connections).to.be.equal(0); 39 | }); 40 | 41 | it('should throw after connection released', async () => { 42 | const cli = await pg.connect(client => client); 43 | let throws = false; 44 | try { 45 | await cli.queryArgs('SELECT 1'); 46 | } catch (err) { 47 | throws = true; 48 | } 49 | expect(throws).equal(true); 50 | }); 51 | 52 | it('should release connection on client error', async () => { 53 | try { 54 | await pg.connect(async () => { 55 | expect(pg.getDriver().connections).to.be.equal(1); 56 | throw new Error('CustomError'); 57 | }); 58 | } catch (err) { 59 | expect(err.message).to.be.equal('CustomError'); 60 | } 61 | expect(pg.getDriver().connections).to.be.equal(0); 62 | }); 63 | 64 | describe('method', () => { 65 | it('query works', async () => { 66 | await pg.connect(async q => { 67 | expect(pg.getDriver().connections).to.be.equal(1); 68 | 69 | const row = await q('ROW'); 70 | expect(row.rows).to.have.length(1); 71 | 72 | const rows = await q('ROWS'); 73 | expect(rows.rows).to.have.length(2); 74 | 75 | const none = await q('NONE'); 76 | expect(none.rows).to.have.length(0); 77 | 78 | try { 79 | await q('INVALID'); 80 | } catch (err) { 81 | expect(err).to.be.instanceOf(Error); 82 | } 83 | 84 | expect(pg.getDriver().connections).to.be.equal(1); 85 | }); 86 | expect(pg.getDriver().connections).to.be.equal(0); 87 | }); 88 | 89 | it('query.query works', async () => { 90 | await pg.connect(async q => { 91 | expect(pg.getDriver().connections).to.be.equal(1); 92 | 93 | const row = await q.query('ROW'); 94 | expect(row.rows).to.have.length(1); 95 | 96 | const rows = await q.query('ROWS'); 97 | expect(rows.rows).to.have.length(2); 98 | 99 | const none = await q.query('NONE'); 100 | expect(none.rows).to.have.length(0); 101 | 102 | try { 103 | await q.query('INVALID'); 104 | } catch (err) { 105 | expect(err).to.be.instanceOf(Error); 106 | } 107 | 108 | expect(pg.getDriver().connections).to.be.equal(1); 109 | }); 110 | expect(pg.getDriver().connections).to.be.equal(0); 111 | }); 112 | 113 | it('query.rows works', async () => { 114 | await pg.connect(async q => { 115 | expect(pg.getDriver().connections).to.be.equal(1); 116 | 117 | const row = await q.rows('ROW'); 118 | expect(row).to.have.length(1); 119 | 120 | const rows = await q.rows('ROWS'); 121 | expect(rows).to.have.length(2); 122 | 123 | const none = await q.rows('NONE'); 124 | expect(none).to.have.length(0); 125 | 126 | try { 127 | await q.rows('INVALID'); 128 | } catch (err) { 129 | expect(err).to.be.instanceOf(Error); 130 | } 131 | 132 | expect(pg.getDriver().connections).to.be.equal(1); 133 | }); 134 | expect(pg.getDriver().connections).to.be.equal(0); 135 | }); 136 | 137 | it('query.row works', async () => { 138 | await pg.connect(async q => { 139 | expect(pg.getDriver().connections).to.be.equal(1); 140 | 141 | const row = await q.row('ROW'); 142 | expect(row).to.be.a('object'); 143 | 144 | try { 145 | await q.row('ROWS'); 146 | } catch (err) { 147 | expect(err).to.be.instanceOf(Error); 148 | } 149 | 150 | try { 151 | await q.row('NONE'); 152 | } catch (err) { 153 | expect(err).to.be.instanceOf(Error); 154 | } 155 | 156 | try { 157 | await q.row('INVALID'); 158 | } catch (err) { 159 | expect(err).to.be.instanceOf(Error); 160 | } 161 | 162 | expect(pg.getDriver().connections).to.be.equal(1); 163 | }); 164 | expect(pg.getDriver().connections).to.be.equal(0); 165 | }); 166 | 167 | it('query.value works', async () => { 168 | await pg.connect(async q => { 169 | expect(pg.getDriver().connections).to.be.equal(1); 170 | 171 | const value = await q.value('VALUE'); 172 | expect(value).to.be.equal('value'); 173 | 174 | try { 175 | await q.value('ROW'); 176 | } catch (err) { 177 | expect(err).to.be.instanceOf(Error); 178 | } 179 | 180 | try { 181 | await q.value('ROWS'); 182 | } catch (err) { 183 | expect(err).to.be.instanceOf(Error); 184 | } 185 | 186 | try { 187 | await q.value('NONE'); 188 | } catch (err) { 189 | expect(err).to.be.instanceOf(Error); 190 | } 191 | 192 | try { 193 | await q.value('INVALID'); 194 | } catch (err) { 195 | expect(err).to.be.instanceOf(Error); 196 | } 197 | 198 | expect(pg.getDriver().connections).to.be.equal(1); 199 | }); 200 | expect(pg.getDriver().connections).to.be.equal(0); 201 | }); 202 | 203 | it('rows - shorthand works', async () => { 204 | expect(pg.getDriver().connections).to.be.equal(0); 205 | const row = await pg.rows('ROW', null, 'VALID'); 206 | expect(row).to.have.length(1); 207 | expect(pg.getDriver().connections).to.be.equal(0); 208 | const rows = await pg.rows('ROWS'); 209 | expect(rows).to.have.length(2); 210 | expect(pg.getDriver().connections).to.be.equal(0); 211 | const none = await pg.rows('NONE'); 212 | expect(none).to.have.length(0); 213 | expect(pg.getDriver().connections).to.be.equal(0); 214 | }); 215 | }); 216 | }); 217 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "node": true 4 | }, 5 | "parser": "babel-eslint", 6 | "parserOptions": { 7 | "ecmaVersion": 6, 8 | "sourceType": "module", 9 | "ecmaFeatures": { 10 | "modules": true 11 | } 12 | }, 13 | "plugins": ["import"], 14 | "rules": { 15 | // enforces getter/setter pairs in objects 16 | "accessor-pairs": 0, 17 | // treat var statements as if they were block scoped 18 | "block-scoped-var": 2, 19 | // specify the maximum cyclomatic complexity allowed in a program 20 | "complexity": [0, 11], 21 | // require return statements to either always or never specify values 22 | "consistent-return": 2, 23 | // specify curly brace conventions for all control statements 24 | "curly": [2, "multi", "consistent"], 25 | // require default case in switch statements 26 | "default-case": 2, 27 | // encourages use of dot notation whenever possible 28 | "dot-notation": [2, { "allowKeywords": true }], 29 | // enforces consistent newlines before or after dots 30 | "dot-location": 0, 31 | // require the use of === and !== 32 | "eqeqeq": 2, 33 | // make sure for-in loops have an if statement 34 | "guard-for-in": 2, 35 | // disallow the use of alert, confirm, and prompt 36 | "no-alert": 1, 37 | // disallow use of arguments.caller or arguments.callee 38 | "no-caller": 2, 39 | // disallow lexical declarations in case/default clauses 40 | // http://eslint.org/docs/rules/no-case-declarations.html 41 | "no-case-declarations": 2, 42 | // disallow division operators explicitly at beginning of regular expression 43 | "no-div-regex": 0, 44 | // disallow else after a return in an if 45 | "no-else-return": 2, 46 | // disallow comparisons to null without a type-checking operator 47 | "no-eq-null": 0, 48 | // disallow use of eval() 49 | "no-eval": 2, 50 | // disallow adding to native types 51 | "no-extend-native": 2, 52 | // disallow unnecessary function binding 53 | "no-extra-bind": 2, 54 | // disallow fallthrough of case statements 55 | "no-fallthrough": 2, 56 | // disallow the use of leading or trailing decimal points in numeric literals 57 | "no-floating-decimal": 2, 58 | // disallow the type conversions with shorter notations 59 | "no-implicit-coercion": 0, 60 | // disallow use of eval()-like methods 61 | "no-implied-eval": 2, 62 | // disallow this keywords outside of classes or class-like objects 63 | "no-invalid-this": 0, 64 | // disallow usage of __iterator__ property 65 | "no-iterator": 2, 66 | // disallow use of labeled statements 67 | "no-labels": 2, 68 | // disallow unnecessary nested blocks 69 | "no-lone-blocks": 2, 70 | // disallow creation of functions within loops 71 | "no-loop-func": 2, 72 | // disallow use of multiple spaces 73 | "no-multi-spaces": 2, 74 | // disallow use of multiline strings 75 | "no-multi-str": 2, 76 | // disallow reassignments of native objects 77 | "no-native-reassign": 2, 78 | // disallow use of new operator when not part of the assignment or comparison 79 | "no-new": 2, 80 | // disallow use of new operator for Function object 81 | "no-new-func": 2, 82 | // disallows creating new instances of String,Number, and Boolean 83 | "no-new-wrappers": 2, 84 | // disallow use of (old style) octal literals 85 | "no-octal": 2, 86 | // disallow use of octal escape sequences in string literals, such as 87 | // var foo = "Copyright \251"; 88 | "no-octal-escape": 2, 89 | // disallow use of process.env 90 | "no-process-env": 0, 91 | // disallow usage of __proto__ property 92 | "no-proto": 2, 93 | // disallow declaring the same variable more then once 94 | "no-redeclare": 2, 95 | // disallow use of assignment in return statement 96 | "no-return-assign": 2, 97 | // disallow use of `javascript:` urls. 98 | "no-script-url": 2, 99 | // disallow comparisons where both sides are exactly the same 100 | "no-self-compare": 2, 101 | // disallow use of comma operator 102 | "no-sequences": 2, 103 | // restrict what can be thrown as an exception 104 | "no-throw-literal": 2, 105 | // disallow usage of expressions in statement position 106 | "no-unused-expressions": 1, 107 | // disallow unnecessary .call() and .apply() 108 | "no-useless-call": 0, 109 | // disallow use of void operator 110 | "no-void": 0, 111 | // disallow usage of configurable warning terms in comments: e.g. todo 112 | "no-warning-comments": [ 113 | 0, 114 | { "terms": ["todo", "fixme", "xxx"], "location": "start" } 115 | ], 116 | // disallow use of the with statement 117 | "no-with": 2, 118 | // require use of the second argument for parseInt() 119 | "radix": 2, 120 | // requires to declare all vars on top of their containing scope 121 | "vars-on-top": 2, 122 | // require immediate function invocation to be wrapped in parentheses 123 | // http://eslint.org/docs/rules/wrap-iife.html 124 | "wrap-iife": [2, "outside"], 125 | // require or disallow Yoda conditions 126 | "yoda": 2, 127 | // enforce return after a callback 128 | "callback-return": 0, 129 | // enforces error handling in callbacks (node environment) 130 | "handle-callback-err": 0, 131 | // disallow mixing regular variable and require declarations 132 | "no-mixed-requires": [0, false], 133 | // disallow use of new operator with the require function 134 | "no-new-require": 0, 135 | // disallow string concatenation with __dirname and __filename 136 | "no-path-concat": 0, 137 | // disallow process.exit() 138 | "no-process-exit": 0, 139 | // restrict usage of specified node modules 140 | "no-restricted-modules": 0, 141 | // disallow use of synchronous methods (off by default) 142 | "no-sync": 0, 143 | // enforces no braces where they can be omitted 144 | // http://eslint.org/docs/rules/arrow-body-style 145 | "arrow-body-style": [1, "as-needed"], 146 | // require parens in arrow function arguments 147 | "arrow-parens": 0, 148 | // require space before/after arrow function"s arrow 149 | // https://github.com/eslint/eslint/blob/master/docs/rules/arrow-spacing.md 150 | "arrow-spacing": [1, { "before": true, "after": true }], 151 | // verify super() callings in constructors 152 | "constructor-super": 0, 153 | // enforce the spacing around the * in generator functions 154 | "generator-star-spacing": 0, 155 | // disallow modifying variables of class declarations 156 | "no-class-assign": 0, 157 | // disallow modifying variables that are declared using const 158 | "no-const-assign": 2, 159 | // disallow to use this/super before super() calling in constructors. 160 | "no-this-before-super": 0, 161 | // require let or const instead of var 162 | "no-var": 2, 163 | // require method and property shorthand syntax for object literals 164 | // https://github.com/eslint/eslint/blob/master/docs/rules/object-shorthand.md 165 | "object-shorthand": [2, "always"], 166 | // suggest using arrow functions as callbacks 167 | "prefer-arrow-callback": 2, 168 | // suggest using of const declaration for variables that are never modified after declared 169 | "prefer-const": 1, 170 | // suggest using the spread operator instead of .apply() 171 | "prefer-spread": 0, 172 | // suggest using Reflect methods where applicable 173 | "prefer-reflect": 0, 174 | // suggest using template literals instead of string concatenation 175 | // http://eslint.org/docs/rules/prefer-template 176 | "prefer-template": 1, 177 | // disallow generator functions that do not have yield 178 | "require-yield": 0, 179 | "import/default": 2, 180 | "import/export": 2, 181 | "import/named": 2, 182 | "import/namespace": 2, 183 | "import/no-unresolved": [2, { "commonjs": true, "amd": true }], 184 | "new-cap": [2, { "capIsNew": false, "newIsCap": true }], 185 | "no-console": 1, 186 | "no-shadow": 1, 187 | "no-unused-vars": 1, 188 | "no-use-before-define": [2, "nofunc"], 189 | "object-curly-spacing": [2, "always"], 190 | "padded-blocks": 0, 191 | "spaced-comment": 1, 192 | "strict": [2, "never"], 193 | "semi": [1, "always"] 194 | }, 195 | "globals": { 196 | "require": false 197 | }, 198 | "settings": { 199 | "import/ignore": ["node_modules", "lib", "\\.json$"], 200 | "import/parser": "babel-eslint", 201 | "import/resolve": { 202 | "extensions": [".js", ".json"] 203 | } 204 | } 205 | } 206 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # pg-async 2 | 3 | [![Greenkeeper badge](https://badges.greenkeeper.io/langpavel/node-pg-async.svg)](https://greenkeeper.io/) 4 | 5 | [![Npm Version](https://badge.fury.io/js/pg-async.svg)](https://badge.fury.io/js/pg-async) 6 | [![NPM downloads](http://img.shields.io/npm/dm/pg-async.svg)](https://www.npmjs.com/package/pg-async) 7 | [![Dependency Status](https://david-dm.org/langpavel/node-pg-async.svg)](https://david-dm.org/langpavel/node-pg-async) 8 | [![devDependency Status](https://david-dm.org/langpavel/node-pg-async/dev-status.svg)](https://david-dm.org/langpavel/node-pg-async#info=devDependencies) 9 | [![Build Status](https://travis-ci.org/langpavel/node-pg-async.svg?branch=master)](https://travis-ci.org/langpavel/node-pg-async) 10 | [![Coverage Status](https://coveralls.io/repos/github/langpavel/node-pg-async/badge.svg?branch=master)](https://coveralls.io/github/langpavel/node-pg-async?branch=master) 11 | [![Join the chat at https://gitter.im/langpavel/node-pg-async](https://badges.gitter.im/langpavel/node-pg-async.svg)](https://gitter.im/langpavel/node-pg-async?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) 12 | 13 | Tiny but powerful Promise based PostgreSQL client for node.js 14 | designed for easy use with ES7 async/await.
15 | Based on [node-postgres](https://github.com/brianc/node-postgres) (known as `pg` in npm registry). 16 | Can use `pg` or native `pg-native` backend. 17 | 18 | ## Example 19 | 20 | ```js 21 | import PgAsync, {SQL} from 'pg-async'; 22 | 23 | // using default connection 24 | const pgAsync = new PgAsync(); 25 | 26 | const userTable = 'user'; 27 | const sqlUserByLogin = (login) => SQL` 28 | select id 29 | from $ID${userTable} 30 | where login = ${login} 31 | `; 32 | 33 | async function setPassword(login, newPwd) { 34 | const userId = await pgAsync.value(sqlUserByLogin(login)); 35 | // userId is guaranted here, 36 | // pgAsync.value requires query yielding exactly one row with one column. 37 | await pgAsync.query(SQL` 38 | update $ID${userTable} set 39 | passwd = ${newPwd} 40 | where userId = ${userId} 41 | `); 42 | } 43 | 44 | ``` 45 | 46 | ## Install 47 | 48 | ``` 49 | $ npm install --save pg-async 50 | ``` 51 | 52 | ## API 53 | 54 | #### Configuring Connection Options 55 | ```js 56 | new PgAsync([connectionOptions], [driver]) 57 | ``` 58 | 59 | * The default export of `pg-async` is `PgAsync` class which let you configure connection options 60 | * Connection options defaults to [`pg.defaults`](https://github.com/brianc/node-postgres/wiki/pg#pgdefaults) 61 | * Optional `driver` let you choose underlying library 62 | * To use the [native bindings](https://github.com/brianc/node-pg-native.git) you must `npm install --save pg-native` 63 | 64 | ```js 65 | import PgAsync from 'pg-async'; 66 | 67 | // using default connection 68 | const pgAsync = new PgAsync(); 69 | 70 | // using connection string 71 | const pgAsync = new PgAsync({connectionString: 'postgres://user:secret@host:port/database'}); 72 | 73 | // using connection object 74 | const pgAsync = new PgAsync({user, password, host, port, database, ...}); 75 | 76 | // using default for current user, with native driver 77 | // install pg-native package manually 78 | const pgAsync = new PgAsync(null, 'native'); 79 | const pgAsync = new PgAsync(null, require('pg').native); 80 | ``` 81 | 82 | --- 83 | 84 | #### ```await pgAsync.query(SQL`...`) -> pg.Result``` 85 | #### `await pgAsync.query(sql, values...) -> pg.Result` 86 | #### `await pgAsync.queryArgs(sql, [values]) -> pg.Result` 87 | 88 | * Execute SQL and return `Result` object from underlying `pg` library 89 | * Interesting properties on `Result` object are: 90 | * `rowCount` Number ­– returned rows 91 | * `oid` Number ­– Postgres oid 92 | * `rows` Array ­– Actual result of `pgAsync.rows()` 93 | * `rowAsArray` Boolean 94 | * `fields` Array of: 95 | * `name` String ­– name or alias of column 96 | * `tableID` Number ­– oid of table or 0 97 | * `columnID` Number ­– index of column in table or 0 98 | * `dataTypeID` Number ­– oid of data type 99 | * `dataTypeSize` Number ­– size in bytes od colum, -1 for variable length 100 | * ­`dataTypeModifier` Number 101 | 102 | --- 103 | 104 | #### ```await pgAsync.rows(SQL`...`) -> array of objects``` 105 | #### `await pgAsync.rows(sql, values...) -> array of objects` 106 | #### `await pgAsync.rowsArgs(sql, [values]) -> array of objects` 107 | 108 | * Execute SQL and return array of key/value objects (`result.rows`) 109 | 110 | --- 111 | 112 | #### ```await pgAsync.row(SQL`...`) -> object``` 113 | #### `await pgAsync.row(sql, values...) -> object` 114 | #### `await pgAsync.rowArgs(sql, [values]) -> object` 115 | 116 | * Execute SQL and return single key/value object. 117 | If query yields more than one or none rows, promise will be rejected. 118 | * Rejected promise throw exception at **`await`** location. 119 | 120 | --- 121 | 122 | #### ```await pgAsync.value(SQL`...`) -> any``` 123 | #### `await pgAsync.value(sql, values...) -> any` 124 | #### `await pgAsync.valueArgs(sql, [values]) -> any` 125 | 126 | * Same as row, but query must yields single column in single row, otherwise throws. 127 | 128 | --- 129 | 130 | #### `await pgAsync.connect(async (client) => innerResult) -> innerResult` 131 | 132 | * Execute multiple queries in sequence on same connection. This is handy for transactions. 133 | * `asyncFunc` here has signature `async (client, pgClient) => { ... }` 134 | * provided `client` has async methods: 135 | * `query`, `rows`, `row`, `value` as above 136 | * `queryArgs`, `rowsArgs`, `rowArgs`, `valueArgs` as above 137 | * `startTransaction`, `commit`, `rollback` - start new transaction manually. Use `pgAsync.transaction` when possible 138 | * `client` itself is shorthand for `query` 139 | 140 | --- 141 | 142 | #### `await pgAsync.transaction(async (client) => innerResult) -> innerResult` 143 | 144 | Transaction is similar to `connect` but automatically start and commit transaction, 145 | rollback on throwen error 146 | __Example:__ 147 | 148 | ```js 149 | const pgAsync = new PgAsync(); 150 | 151 | function moveMoney(fromAccount, toAccount, amount) { 152 | return pgAsync.transaction(async (client) => { 153 | let movementFrom, movementTo, movementId; 154 | const sql = ` 155 | INSERT INTO bank_account (account, amount) 156 | VALUES ($1, $2) 157 | RETURNING id 158 | `; 159 | movementFrom = await client.value(sql, [fromAccount, -amount]); 160 | movementTo = await client.value(sql, [toAccount, amount]); 161 | return {movementFrom, movementTo} 162 | }); 163 | } 164 | 165 | async function doTheWork() { 166 | // ... 167 | try { 168 | const result = await moveMoney('alice', 'bob', 19.95); 169 | // transaction is commited 170 | } catch (err) { 171 | // transaction is rollbacked 172 | } 173 | // ... 174 | } 175 | ``` 176 | 177 | --- 178 | 179 | #### `await pgAsync.getClient([connectionOptions]) -> {client, done}` 180 | 181 | * Get unwrapped `pg.Client` callback based instance.
182 | You should not call this method unless you know what are you doing. 183 | * Client must be returned to pool manually by calling `done()` 184 | 185 | --- 186 | 187 | #### `pgAsync.closeConnections()` 188 | 189 | * Disconnects all idle clients within all active pools, and has all client pools terminate. 190 | See [`pool.end()`](https://node-postgres.com/api/pool#pool-end) 191 | * This actually terminates all connections on driver used by Pg instance 192 | 193 | --- 194 | 195 | ## Features 196 | 197 | * [x] `pg` driver support 198 | * [x] `pg.native` driver support 199 | * [x] [`debug`](https://github.com/visionmedia/debug#readme) — Enable debugging with `DEBUG="pg-async"` environment variable 200 | * [x] Transaction API wrapper - Postgres does not support nested transactions 201 | * [x] Template tag SQL formatting 202 | * [ ] Transaction `SAVEPOINT` support 203 | * [ ] Cursor API wrapper 204 | 205 | If you miss something, don't be shy, just 206 | [open new issue!](https://github.com/langpavel/node-pg-async/issues) 207 | It will be nice if you label your issue with prefix `[bug]` `[doc]` `[question]` `[typo]` 208 | etc. 209 | 210 | ## License (MIT) 211 | 212 | Copyright (c) 2016 Pavel Lang (langpavel@phpskelet.org) 213 | 214 | 215 | 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: 216 | 217 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 218 | 219 | 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. 220 | 221 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@7.0.0-beta.44": 6 | version "7.0.0-beta.44" 7 | resolved "http://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" 8 | dependencies: 9 | "@babel/highlight" "7.0.0-beta.44" 10 | 11 | "@babel/generator@7.0.0-beta.44": 12 | version "7.0.0-beta.44" 13 | resolved "http://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" 14 | dependencies: 15 | "@babel/types" "7.0.0-beta.44" 16 | jsesc "^2.5.1" 17 | lodash "^4.2.0" 18 | source-map "^0.5.0" 19 | trim-right "^1.0.1" 20 | 21 | "@babel/helper-function-name@7.0.0-beta.44": 22 | version "7.0.0-beta.44" 23 | resolved "http://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" 24 | dependencies: 25 | "@babel/helper-get-function-arity" "7.0.0-beta.44" 26 | "@babel/template" "7.0.0-beta.44" 27 | "@babel/types" "7.0.0-beta.44" 28 | 29 | "@babel/helper-get-function-arity@7.0.0-beta.44": 30 | version "7.0.0-beta.44" 31 | resolved "http://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" 32 | dependencies: 33 | "@babel/types" "7.0.0-beta.44" 34 | 35 | "@babel/helper-split-export-declaration@7.0.0-beta.44": 36 | version "7.0.0-beta.44" 37 | resolved "http://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" 38 | dependencies: 39 | "@babel/types" "7.0.0-beta.44" 40 | 41 | "@babel/highlight@7.0.0-beta.44": 42 | version "7.0.0-beta.44" 43 | resolved "http://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" 44 | dependencies: 45 | chalk "^2.0.0" 46 | esutils "^2.0.2" 47 | js-tokens "^3.0.0" 48 | 49 | "@babel/template@7.0.0-beta.44": 50 | version "7.0.0-beta.44" 51 | resolved "http://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" 52 | dependencies: 53 | "@babel/code-frame" "7.0.0-beta.44" 54 | "@babel/types" "7.0.0-beta.44" 55 | babylon "7.0.0-beta.44" 56 | lodash "^4.2.0" 57 | 58 | "@babel/traverse@7.0.0-beta.44": 59 | version "7.0.0-beta.44" 60 | resolved "http://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" 61 | dependencies: 62 | "@babel/code-frame" "7.0.0-beta.44" 63 | "@babel/generator" "7.0.0-beta.44" 64 | "@babel/helper-function-name" "7.0.0-beta.44" 65 | "@babel/helper-split-export-declaration" "7.0.0-beta.44" 66 | "@babel/types" "7.0.0-beta.44" 67 | babylon "7.0.0-beta.44" 68 | debug "^3.1.0" 69 | globals "^11.1.0" 70 | invariant "^2.2.0" 71 | lodash "^4.2.0" 72 | 73 | "@babel/types@7.0.0-beta.44": 74 | version "7.0.0-beta.44" 75 | resolved "http://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" 76 | dependencies: 77 | esutils "^2.0.2" 78 | lodash "^4.2.0" 79 | to-fast-properties "^2.0.0" 80 | 81 | acorn-jsx@^3.0.0: 82 | version "3.0.1" 83 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" 84 | dependencies: 85 | acorn "^3.0.4" 86 | 87 | acorn@^3.0.4: 88 | version "3.3.0" 89 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" 90 | 91 | acorn@^5.0.1: 92 | version "5.1.1" 93 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.1.tgz#53fe161111f912ab999ee887a90a0bc52822fd75" 94 | 95 | acorn@^5.5.0: 96 | version "5.7.3" 97 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" 98 | 99 | ajv-keywords@^1.0.0: 100 | version "1.5.1" 101 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" 102 | 103 | ajv-keywords@^2.1.0: 104 | version "2.1.1" 105 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" 106 | 107 | ajv@^4.7.0: 108 | version "4.11.8" 109 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" 110 | dependencies: 111 | co "^4.6.0" 112 | json-stable-stringify "^1.0.1" 113 | 114 | ajv@^5.2.0: 115 | version "5.2.2" 116 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.2.tgz#47c68d69e86f5d953103b0074a9430dc63da5e39" 117 | dependencies: 118 | co "^4.6.0" 119 | fast-deep-equal "^1.0.0" 120 | json-schema-traverse "^0.3.0" 121 | json-stable-stringify "^1.0.1" 122 | 123 | ajv@^5.2.3, ajv@^5.3.0: 124 | version "5.5.2" 125 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" 126 | dependencies: 127 | co "^4.6.0" 128 | fast-deep-equal "^1.0.0" 129 | fast-json-stable-stringify "^2.0.0" 130 | json-schema-traverse "^0.3.0" 131 | 132 | ansi-colors@^1.0.1: 133 | version "1.1.0" 134 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" 135 | dependencies: 136 | ansi-wrap "^0.1.0" 137 | 138 | ansi-escapes@^2.0.0: 139 | version "2.0.0" 140 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" 141 | 142 | ansi-gray@^0.1.1: 143 | version "0.1.1" 144 | resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" 145 | dependencies: 146 | ansi-wrap "0.1.0" 147 | 148 | ansi-regex@^2.0.0: 149 | version "2.1.1" 150 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 151 | 152 | ansi-regex@^3.0.0: 153 | version "3.0.0" 154 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 155 | 156 | ansi-styles@^2.2.1: 157 | version "2.2.1" 158 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 159 | 160 | ansi-styles@^3.1.0: 161 | version "3.1.0" 162 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.1.0.tgz#09c202d5c917ec23188caa5c9cb9179cd9547750" 163 | dependencies: 164 | color-convert "^1.0.0" 165 | 166 | ansi-styles@^3.2.1: 167 | version "3.2.1" 168 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 169 | dependencies: 170 | color-convert "^1.9.0" 171 | 172 | ansi-wrap@0.1.0, ansi-wrap@^0.1.0: 173 | version "0.1.0" 174 | resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" 175 | 176 | ap@~0.2.0: 177 | version "0.2.0" 178 | resolved "https://registry.yarnpkg.com/ap/-/ap-0.2.0.tgz#ae0942600b29912f0d2b14ec60c45e8f330b6110" 179 | 180 | archy@^1.0.0: 181 | version "1.0.0" 182 | resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" 183 | 184 | argparse@^1.0.7: 185 | version "1.0.9" 186 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 187 | dependencies: 188 | sprintf-js "~1.0.2" 189 | 190 | arr-diff@^2.0.0: 191 | version "2.0.0" 192 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 193 | dependencies: 194 | arr-flatten "^1.0.1" 195 | 196 | arr-diff@^4.0.0: 197 | version "4.0.0" 198 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" 199 | 200 | arr-flatten@^1.0.1: 201 | version "1.1.0" 202 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" 203 | 204 | arr-union@^3.1.0: 205 | version "3.1.0" 206 | resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" 207 | 208 | array-differ@^1.0.0: 209 | version "1.0.0" 210 | resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" 211 | 212 | array-each@^1.0.1: 213 | version "1.0.1" 214 | resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" 215 | 216 | array-slice@^1.0.0: 217 | version "1.0.0" 218 | resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.0.0.tgz#e73034f00dcc1f40876008fd20feae77bd4b7c2f" 219 | 220 | array-union@^1.0.1: 221 | version "1.0.2" 222 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 223 | dependencies: 224 | array-uniq "^1.0.1" 225 | 226 | array-uniq@^1.0.1, array-uniq@^1.0.2: 227 | version "1.0.3" 228 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 229 | 230 | array-unique@^0.2.1: 231 | version "0.2.1" 232 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 233 | 234 | arrify@^1.0.0: 235 | version "1.0.1" 236 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 237 | 238 | assertion-error@^1.0.1: 239 | version "1.0.2" 240 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" 241 | 242 | assign-symbols@^1.0.0: 243 | version "1.0.0" 244 | resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" 245 | 246 | babel-code-frame@^6.22.0: 247 | version "6.22.0" 248 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" 249 | dependencies: 250 | chalk "^1.1.0" 251 | esutils "^2.0.2" 252 | js-tokens "^3.0.0" 253 | 254 | babel-core@^6.24.1, babel-core@^6.25.0: 255 | version "6.25.0" 256 | resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.25.0.tgz#7dd42b0463c742e9d5296deb3ec67a9322dad729" 257 | dependencies: 258 | babel-code-frame "^6.22.0" 259 | babel-generator "^6.25.0" 260 | babel-helpers "^6.24.1" 261 | babel-messages "^6.23.0" 262 | babel-register "^6.24.1" 263 | babel-runtime "^6.22.0" 264 | babel-template "^6.25.0" 265 | babel-traverse "^6.25.0" 266 | babel-types "^6.25.0" 267 | babylon "^6.17.2" 268 | convert-source-map "^1.1.0" 269 | debug "^2.1.1" 270 | json5 "^0.5.0" 271 | lodash "^4.2.0" 272 | minimatch "^3.0.2" 273 | path-is-absolute "^1.0.0" 274 | private "^0.1.6" 275 | slash "^1.0.0" 276 | source-map "^0.5.0" 277 | 278 | babel-eslint@^8.0.1: 279 | version "8.2.6" 280 | resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.6.tgz#6270d0c73205628067c0f7ae1693a9e797acefd9" 281 | dependencies: 282 | "@babel/code-frame" "7.0.0-beta.44" 283 | "@babel/traverse" "7.0.0-beta.44" 284 | "@babel/types" "7.0.0-beta.44" 285 | babylon "7.0.0-beta.44" 286 | eslint-scope "3.7.1" 287 | eslint-visitor-keys "^1.0.0" 288 | 289 | babel-generator@^6.25.0: 290 | version "6.25.0" 291 | resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.25.0.tgz#33a1af70d5f2890aeb465a4a7793c1df6a9ea9fc" 292 | dependencies: 293 | babel-messages "^6.23.0" 294 | babel-runtime "^6.22.0" 295 | babel-types "^6.25.0" 296 | detect-indent "^4.0.0" 297 | jsesc "^1.3.0" 298 | lodash "^4.2.0" 299 | source-map "^0.5.0" 300 | trim-right "^1.0.1" 301 | 302 | babel-helper-bindify-decorators@^6.24.1: 303 | version "6.24.1" 304 | resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330" 305 | dependencies: 306 | babel-runtime "^6.22.0" 307 | babel-traverse "^6.24.1" 308 | babel-types "^6.24.1" 309 | 310 | babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: 311 | version "6.24.1" 312 | resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" 313 | dependencies: 314 | babel-helper-explode-assignable-expression "^6.24.1" 315 | babel-runtime "^6.22.0" 316 | babel-types "^6.24.1" 317 | 318 | babel-helper-call-delegate@^6.24.1: 319 | version "6.24.1" 320 | resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" 321 | dependencies: 322 | babel-helper-hoist-variables "^6.24.1" 323 | babel-runtime "^6.22.0" 324 | babel-traverse "^6.24.1" 325 | babel-types "^6.24.1" 326 | 327 | babel-helper-explode-assignable-expression@^6.24.1: 328 | version "6.24.1" 329 | resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" 330 | dependencies: 331 | babel-runtime "^6.22.0" 332 | babel-traverse "^6.24.1" 333 | babel-types "^6.24.1" 334 | 335 | babel-helper-explode-class@^6.24.1: 336 | version "6.24.1" 337 | resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" 338 | dependencies: 339 | babel-helper-bindify-decorators "^6.24.1" 340 | babel-runtime "^6.22.0" 341 | babel-traverse "^6.24.1" 342 | babel-types "^6.24.1" 343 | 344 | babel-helper-function-name@^6.24.1: 345 | version "6.24.1" 346 | resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" 347 | dependencies: 348 | babel-helper-get-function-arity "^6.24.1" 349 | babel-runtime "^6.22.0" 350 | babel-template "^6.24.1" 351 | babel-traverse "^6.24.1" 352 | babel-types "^6.24.1" 353 | 354 | babel-helper-get-function-arity@^6.24.1: 355 | version "6.24.1" 356 | resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" 357 | dependencies: 358 | babel-runtime "^6.22.0" 359 | babel-types "^6.24.1" 360 | 361 | babel-helper-hoist-variables@^6.24.1: 362 | version "6.24.1" 363 | resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" 364 | dependencies: 365 | babel-runtime "^6.22.0" 366 | babel-types "^6.24.1" 367 | 368 | babel-helper-regex@^6.24.1: 369 | version "6.24.1" 370 | resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8" 371 | dependencies: 372 | babel-runtime "^6.22.0" 373 | babel-types "^6.24.1" 374 | lodash "^4.2.0" 375 | 376 | babel-helper-remap-async-to-generator@^6.24.1: 377 | version "6.24.1" 378 | resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" 379 | dependencies: 380 | babel-helper-function-name "^6.24.1" 381 | babel-runtime "^6.22.0" 382 | babel-template "^6.24.1" 383 | babel-traverse "^6.24.1" 384 | babel-types "^6.24.1" 385 | 386 | babel-helpers@^6.24.1: 387 | version "6.24.1" 388 | resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" 389 | dependencies: 390 | babel-runtime "^6.22.0" 391 | babel-template "^6.24.1" 392 | 393 | babel-messages@^6.23.0: 394 | version "6.23.0" 395 | resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" 396 | dependencies: 397 | babel-runtime "^6.22.0" 398 | 399 | babel-plugin-add-module-exports@^0.2.1: 400 | version "0.2.1" 401 | resolved "https://registry.yarnpkg.com/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz#9ae9a1f4a8dc67f0cdec4f4aeda1e43a5ff65e25" 402 | 403 | babel-plugin-syntax-async-functions@^6.8.0: 404 | version "6.13.0" 405 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" 406 | 407 | babel-plugin-syntax-async-generators@^6.5.0: 408 | version "6.13.0" 409 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" 410 | 411 | babel-plugin-syntax-class-constructor-call@^6.18.0: 412 | version "6.18.0" 413 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416" 414 | 415 | babel-plugin-syntax-class-properties@^6.8.0: 416 | version "6.13.0" 417 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" 418 | 419 | babel-plugin-syntax-decorators@^6.13.0: 420 | version "6.13.0" 421 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" 422 | 423 | babel-plugin-syntax-dynamic-import@^6.18.0: 424 | version "6.18.0" 425 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" 426 | 427 | babel-plugin-syntax-exponentiation-operator@^6.8.0: 428 | version "6.13.0" 429 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" 430 | 431 | babel-plugin-syntax-export-extensions@^6.8.0: 432 | version "6.13.0" 433 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" 434 | 435 | babel-plugin-syntax-object-rest-spread@^6.8.0: 436 | version "6.13.0" 437 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" 438 | 439 | babel-plugin-syntax-trailing-function-commas@^6.22.0: 440 | version "6.22.0" 441 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" 442 | 443 | babel-plugin-transform-async-generator-functions@^6.24.1: 444 | version "6.24.1" 445 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" 446 | dependencies: 447 | babel-helper-remap-async-to-generator "^6.24.1" 448 | babel-plugin-syntax-async-generators "^6.5.0" 449 | babel-runtime "^6.22.0" 450 | 451 | babel-plugin-transform-async-to-generator@^6.24.1: 452 | version "6.24.1" 453 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" 454 | dependencies: 455 | babel-helper-remap-async-to-generator "^6.24.1" 456 | babel-plugin-syntax-async-functions "^6.8.0" 457 | babel-runtime "^6.22.0" 458 | 459 | babel-plugin-transform-class-constructor-call@^6.24.1: 460 | version "6.24.1" 461 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz#80dc285505ac067dcb8d6c65e2f6f11ab7765ef9" 462 | dependencies: 463 | babel-plugin-syntax-class-constructor-call "^6.18.0" 464 | babel-runtime "^6.22.0" 465 | babel-template "^6.24.1" 466 | 467 | babel-plugin-transform-class-properties@^6.24.1: 468 | version "6.24.1" 469 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" 470 | dependencies: 471 | babel-helper-function-name "^6.24.1" 472 | babel-plugin-syntax-class-properties "^6.8.0" 473 | babel-runtime "^6.22.0" 474 | babel-template "^6.24.1" 475 | 476 | babel-plugin-transform-decorators@^6.24.1: 477 | version "6.24.1" 478 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" 479 | dependencies: 480 | babel-helper-explode-class "^6.24.1" 481 | babel-plugin-syntax-decorators "^6.13.0" 482 | babel-runtime "^6.22.0" 483 | babel-template "^6.24.1" 484 | babel-types "^6.24.1" 485 | 486 | babel-plugin-transform-es2015-destructuring@^6.6.5: 487 | version "6.23.0" 488 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" 489 | dependencies: 490 | babel-runtime "^6.22.0" 491 | 492 | babel-plugin-transform-es2015-function-name@^6.5.0: 493 | version "6.24.1" 494 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" 495 | dependencies: 496 | babel-helper-function-name "^6.24.1" 497 | babel-runtime "^6.22.0" 498 | babel-types "^6.24.1" 499 | 500 | babel-plugin-transform-es2015-modules-commonjs@^6.7.0: 501 | version "6.24.1" 502 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" 503 | dependencies: 504 | babel-plugin-transform-strict-mode "^6.24.1" 505 | babel-runtime "^6.22.0" 506 | babel-template "^6.24.1" 507 | babel-types "^6.24.1" 508 | 509 | babel-plugin-transform-es2015-parameters@^6.7.0: 510 | version "6.24.1" 511 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" 512 | dependencies: 513 | babel-helper-call-delegate "^6.24.1" 514 | babel-helper-get-function-arity "^6.24.1" 515 | babel-runtime "^6.22.0" 516 | babel-template "^6.24.1" 517 | babel-traverse "^6.24.1" 518 | babel-types "^6.24.1" 519 | 520 | babel-plugin-transform-es2015-shorthand-properties@^6.5.0: 521 | version "6.24.1" 522 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" 523 | dependencies: 524 | babel-runtime "^6.22.0" 525 | babel-types "^6.24.1" 526 | 527 | babel-plugin-transform-es2015-sticky-regex@^6.5.0: 528 | version "6.24.1" 529 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" 530 | dependencies: 531 | babel-helper-regex "^6.24.1" 532 | babel-runtime "^6.22.0" 533 | babel-types "^6.24.1" 534 | 535 | babel-plugin-transform-es2015-unicode-regex@^6.5.0: 536 | version "6.24.1" 537 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" 538 | dependencies: 539 | babel-helper-regex "^6.24.1" 540 | babel-runtime "^6.22.0" 541 | regexpu-core "^2.0.0" 542 | 543 | babel-plugin-transform-exponentiation-operator@^6.24.1: 544 | version "6.24.1" 545 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" 546 | dependencies: 547 | babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" 548 | babel-plugin-syntax-exponentiation-operator "^6.8.0" 549 | babel-runtime "^6.22.0" 550 | 551 | babel-plugin-transform-export-extensions@^6.22.0: 552 | version "6.22.0" 553 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653" 554 | dependencies: 555 | babel-plugin-syntax-export-extensions "^6.8.0" 556 | babel-runtime "^6.22.0" 557 | 558 | babel-plugin-transform-object-rest-spread@^6.22.0: 559 | version "6.23.0" 560 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz#875d6bc9be761c58a2ae3feee5dc4895d8c7f921" 561 | dependencies: 562 | babel-plugin-syntax-object-rest-spread "^6.8.0" 563 | babel-runtime "^6.22.0" 564 | 565 | babel-plugin-transform-strict-mode@^6.24.1: 566 | version "6.24.1" 567 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" 568 | dependencies: 569 | babel-runtime "^6.22.0" 570 | babel-types "^6.24.1" 571 | 572 | babel-preset-es2015-node5@^1.2.0: 573 | version "1.2.0" 574 | resolved "https://registry.yarnpkg.com/babel-preset-es2015-node5/-/babel-preset-es2015-node5-1.2.0.tgz#dedc38178d5873a07be3065b5f669fc90677eb8b" 575 | dependencies: 576 | babel-plugin-transform-es2015-destructuring "^6.6.5" 577 | babel-plugin-transform-es2015-function-name "^6.5.0" 578 | babel-plugin-transform-es2015-modules-commonjs "^6.7.0" 579 | babel-plugin-transform-es2015-parameters "^6.7.0" 580 | babel-plugin-transform-es2015-shorthand-properties "^6.5.0" 581 | babel-plugin-transform-es2015-sticky-regex "^6.5.0" 582 | babel-plugin-transform-es2015-unicode-regex "^6.5.0" 583 | 584 | babel-preset-stage-1@^6.24.1: 585 | version "6.24.1" 586 | resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0" 587 | dependencies: 588 | babel-plugin-transform-class-constructor-call "^6.24.1" 589 | babel-plugin-transform-export-extensions "^6.22.0" 590 | babel-preset-stage-2 "^6.24.1" 591 | 592 | babel-preset-stage-2@^6.24.1: 593 | version "6.24.1" 594 | resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1" 595 | dependencies: 596 | babel-plugin-syntax-dynamic-import "^6.18.0" 597 | babel-plugin-transform-class-properties "^6.24.1" 598 | babel-plugin-transform-decorators "^6.24.1" 599 | babel-preset-stage-3 "^6.24.1" 600 | 601 | babel-preset-stage-3@^6.24.1: 602 | version "6.24.1" 603 | resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" 604 | dependencies: 605 | babel-plugin-syntax-trailing-function-commas "^6.22.0" 606 | babel-plugin-transform-async-generator-functions "^6.24.1" 607 | babel-plugin-transform-async-to-generator "^6.24.1" 608 | babel-plugin-transform-exponentiation-operator "^6.24.1" 609 | babel-plugin-transform-object-rest-spread "^6.22.0" 610 | 611 | babel-register@^6.24.1: 612 | version "6.24.1" 613 | resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" 614 | dependencies: 615 | babel-core "^6.24.1" 616 | babel-runtime "^6.22.0" 617 | core-js "^2.4.0" 618 | home-or-tmp "^2.0.0" 619 | lodash "^4.2.0" 620 | mkdirp "^0.5.1" 621 | source-map-support "^0.4.2" 622 | 623 | babel-runtime@^6.22.0: 624 | version "6.23.0" 625 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" 626 | dependencies: 627 | core-js "^2.4.0" 628 | regenerator-runtime "^0.10.0" 629 | 630 | babel-template@^6.24.1, babel-template@^6.25.0: 631 | version "6.25.0" 632 | resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.25.0.tgz#665241166b7c2aa4c619d71e192969552b10c071" 633 | dependencies: 634 | babel-runtime "^6.22.0" 635 | babel-traverse "^6.25.0" 636 | babel-types "^6.25.0" 637 | babylon "^6.17.2" 638 | lodash "^4.2.0" 639 | 640 | babel-traverse@^6.24.1, babel-traverse@^6.25.0: 641 | version "6.25.0" 642 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1" 643 | dependencies: 644 | babel-code-frame "^6.22.0" 645 | babel-messages "^6.23.0" 646 | babel-runtime "^6.22.0" 647 | babel-types "^6.25.0" 648 | babylon "^6.17.2" 649 | debug "^2.2.0" 650 | globals "^9.0.0" 651 | invariant "^2.2.0" 652 | lodash "^4.2.0" 653 | 654 | babel-types@^6.24.1, babel-types@^6.25.0: 655 | version "6.25.0" 656 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e" 657 | dependencies: 658 | babel-runtime "^6.22.0" 659 | esutils "^2.0.2" 660 | lodash "^4.2.0" 661 | to-fast-properties "^1.0.1" 662 | 663 | babel@^6.23.0: 664 | version "6.23.0" 665 | resolved "https://registry.yarnpkg.com/babel/-/babel-6.23.0.tgz#d0d1e7d803e974765beea3232d4e153c0efb90f4" 666 | 667 | babylon@7.0.0-beta.44: 668 | version "7.0.0-beta.44" 669 | resolved "http://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" 670 | 671 | babylon@^6.17.2: 672 | version "6.17.4" 673 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.4.tgz#3e8b7402b88d22c3423e137a1577883b15ff869a" 674 | 675 | balanced-match@^1.0.0: 676 | version "1.0.0" 677 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 678 | 679 | beeper@^1.0.0: 680 | version "1.1.1" 681 | resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" 682 | 683 | bindings@1.2.1: 684 | version "1.2.1" 685 | resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11" 686 | 687 | bluebird@^3.5.0: 688 | version "3.5.0" 689 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" 690 | 691 | brace-expansion@^1.0.0, brace-expansion@^1.1.7: 692 | version "1.1.8" 693 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 694 | dependencies: 695 | balanced-match "^1.0.0" 696 | concat-map "0.0.1" 697 | 698 | braces@^1.8.2: 699 | version "1.8.5" 700 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 701 | dependencies: 702 | expand-range "^1.8.1" 703 | preserve "^0.2.0" 704 | repeat-element "^1.1.2" 705 | 706 | browser-stdout@1.3.0: 707 | version "1.3.0" 708 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" 709 | 710 | buffer-writer@1.0.1: 711 | version "1.0.1" 712 | resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-1.0.1.tgz#22a936901e3029afcd7547eb4487ceb697a3bf08" 713 | 714 | builtin-modules@^1.0.0, builtin-modules@^1.1.1: 715 | version "1.1.1" 716 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 717 | 718 | caller-path@^0.1.0: 719 | version "0.1.0" 720 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 721 | dependencies: 722 | callsites "^0.2.0" 723 | 724 | callsites@^0.2.0: 725 | version "0.2.0" 726 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 727 | 728 | chai@^4.1.2: 729 | version "4.1.2" 730 | resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" 731 | dependencies: 732 | assertion-error "^1.0.1" 733 | check-error "^1.0.1" 734 | deep-eql "^3.0.0" 735 | get-func-name "^2.0.0" 736 | pathval "^1.0.0" 737 | type-detect "^4.0.0" 738 | 739 | chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: 740 | version "1.1.3" 741 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 742 | dependencies: 743 | ansi-styles "^2.2.1" 744 | escape-string-regexp "^1.0.2" 745 | has-ansi "^2.0.0" 746 | strip-ansi "^3.0.0" 747 | supports-color "^2.0.0" 748 | 749 | chalk@^2.0.0: 750 | version "2.0.1" 751 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.0.1.tgz#dbec49436d2ae15f536114e76d14656cdbc0f44d" 752 | dependencies: 753 | ansi-styles "^3.1.0" 754 | escape-string-regexp "^1.0.5" 755 | supports-color "^4.0.0" 756 | 757 | chalk@^2.1.0: 758 | version "2.4.1" 759 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" 760 | dependencies: 761 | ansi-styles "^3.2.1" 762 | escape-string-regexp "^1.0.5" 763 | supports-color "^5.3.0" 764 | 765 | check-error@^1.0.1: 766 | version "1.0.2" 767 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" 768 | 769 | circular-json@^0.3.1: 770 | version "0.3.1" 771 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" 772 | 773 | cli-cursor@^2.1.0: 774 | version "2.1.0" 775 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 776 | dependencies: 777 | restore-cursor "^2.0.0" 778 | 779 | cli-width@^2.0.0: 780 | version "2.1.0" 781 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" 782 | 783 | clone-stats@^0.0.1: 784 | version "0.0.1" 785 | resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" 786 | 787 | clone@^0.2.0: 788 | version "0.2.0" 789 | resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" 790 | 791 | clone@^1.0.0, clone@^1.0.2: 792 | version "1.0.2" 793 | resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" 794 | 795 | co@^4.6.0: 796 | version "4.6.0" 797 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 798 | 799 | color-convert@^1.0.0: 800 | version "1.9.0" 801 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" 802 | dependencies: 803 | color-name "^1.1.1" 804 | 805 | color-convert@^1.9.0: 806 | version "1.9.3" 807 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 808 | dependencies: 809 | color-name "1.1.3" 810 | 811 | color-name@1.1.3, color-name@^1.1.1: 812 | version "1.1.3" 813 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 814 | 815 | color-support@^1.1.3: 816 | version "1.1.3" 817 | resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" 818 | 819 | commander@2.9.0: 820 | version "2.9.0" 821 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" 822 | dependencies: 823 | graceful-readlink ">= 1.0.0" 824 | 825 | concat-map@0.0.1: 826 | version "0.0.1" 827 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 828 | 829 | concat-stream@^1.6.0: 830 | version "1.6.0" 831 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" 832 | dependencies: 833 | inherits "^2.0.3" 834 | readable-stream "^2.2.2" 835 | typedarray "^0.0.6" 836 | 837 | contains-path@^0.1.0: 838 | version "0.1.0" 839 | resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" 840 | 841 | convert-source-map@^1.1.0: 842 | version "1.5.0" 843 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" 844 | 845 | core-js@^2.4.0: 846 | version "2.4.1" 847 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" 848 | 849 | core-util-is@~1.0.0: 850 | version "1.0.2" 851 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 852 | 853 | cross-spawn@^5.1.0: 854 | version "5.1.0" 855 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 856 | dependencies: 857 | lru-cache "^4.0.1" 858 | shebang-command "^1.2.0" 859 | which "^1.2.9" 860 | 861 | dateformat@^2.0.0: 862 | version "2.0.0" 863 | resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17" 864 | 865 | debug@2.6.0: 866 | version "2.6.0" 867 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" 868 | dependencies: 869 | ms "0.7.2" 870 | 871 | debug@^2.1.1, debug@^2.2.0, debug@^2.6.8: 872 | version "2.6.8" 873 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" 874 | dependencies: 875 | ms "2.0.0" 876 | 877 | debug@^3.1.0: 878 | version "3.2.4" 879 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.4.tgz#82123737c51afbe9609a2b5dfe9664e7487171f0" 880 | dependencies: 881 | ms "^2.1.1" 882 | 883 | debug@^4.0.0: 884 | version "4.0.0" 885 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.0.0.tgz#ef7592a30b1c5e05a78e96926df2e6b36b5544e7" 886 | dependencies: 887 | ms "^2.1.1" 888 | 889 | deep-eql@^3.0.0: 890 | version "3.0.1" 891 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" 892 | dependencies: 893 | type-detect "^4.0.0" 894 | 895 | deep-is@~0.1.3: 896 | version "0.1.3" 897 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 898 | 899 | defaults@^1.0.0: 900 | version "1.0.3" 901 | resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" 902 | dependencies: 903 | clone "^1.0.2" 904 | 905 | del@^2.0.2: 906 | version "2.2.2" 907 | resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 908 | dependencies: 909 | globby "^5.0.0" 910 | is-path-cwd "^1.0.0" 911 | is-path-in-cwd "^1.0.0" 912 | object-assign "^4.0.1" 913 | pify "^2.0.0" 914 | pinkie-promise "^2.0.0" 915 | rimraf "^2.2.8" 916 | 917 | del@^3.0.0: 918 | version "3.0.0" 919 | resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" 920 | dependencies: 921 | globby "^6.1.0" 922 | is-path-cwd "^1.0.0" 923 | is-path-in-cwd "^1.0.0" 924 | p-map "^1.1.1" 925 | pify "^3.0.0" 926 | rimraf "^2.2.8" 927 | 928 | deprecated@^0.0.1: 929 | version "0.0.1" 930 | resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" 931 | 932 | detect-file@^0.1.0: 933 | version "0.1.0" 934 | resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" 935 | dependencies: 936 | fs-exists-sync "^0.1.0" 937 | 938 | detect-indent@^4.0.0: 939 | version "4.0.0" 940 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" 941 | dependencies: 942 | repeating "^2.0.0" 943 | 944 | diff@3.2.0: 945 | version "3.2.0" 946 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" 947 | 948 | doctrine@1.5.0: 949 | version "1.5.0" 950 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" 951 | dependencies: 952 | esutils "^2.0.2" 953 | isarray "^1.0.0" 954 | 955 | doctrine@^2.0.0: 956 | version "2.0.0" 957 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" 958 | dependencies: 959 | esutils "^2.0.2" 960 | isarray "^1.0.0" 961 | 962 | doctrine@^2.1.0: 963 | version "2.1.0" 964 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 965 | dependencies: 966 | esutils "^2.0.2" 967 | 968 | duplexer2@0.0.2: 969 | version "0.0.2" 970 | resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" 971 | dependencies: 972 | readable-stream "~1.1.9" 973 | 974 | end-of-stream@~0.1.5: 975 | version "0.1.5" 976 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" 977 | dependencies: 978 | once "~1.3.0" 979 | 980 | error-ex@^1.2.0: 981 | version "1.3.1" 982 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" 983 | dependencies: 984 | is-arrayish "^0.2.1" 985 | 986 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 987 | version "1.0.5" 988 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 989 | 990 | eslint-config-strict@^14.0.0: 991 | version "14.0.1" 992 | resolved "https://registry.yarnpkg.com/eslint-config-strict/-/eslint-config-strict-14.0.1.tgz#63afcb55fa37b8b539ed946f02ede6fd2002b347" 993 | dependencies: 994 | eslint "^4.1.1" 995 | eslint-plugin-filenames "^1.1.0" 996 | 997 | eslint-import-resolver-node@^0.3.1: 998 | version "0.3.1" 999 | resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.1.tgz#4422574cde66a9a7b099938ee4d508a199e0e3cc" 1000 | dependencies: 1001 | debug "^2.6.8" 1002 | resolve "^1.2.0" 1003 | 1004 | eslint-module-utils@^2.1.1: 1005 | version "2.1.1" 1006 | resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz#abaec824177613b8a95b299639e1b6facf473449" 1007 | dependencies: 1008 | debug "^2.6.8" 1009 | pkg-dir "^1.0.0" 1010 | 1011 | eslint-plugin-filenames@^1.1.0: 1012 | version "1.2.0" 1013 | resolved "https://registry.yarnpkg.com/eslint-plugin-filenames/-/eslint-plugin-filenames-1.2.0.tgz#aee9c1c90189c95d2e49902c160eceefecd99f53" 1014 | dependencies: 1015 | lodash.camelcase "4.3.0" 1016 | lodash.kebabcase "4.1.1" 1017 | lodash.snakecase "4.1.1" 1018 | lodash.upperfirst "4.3.1" 1019 | 1020 | eslint-plugin-import@^2.7.0: 1021 | version "2.7.0" 1022 | resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.7.0.tgz#21de33380b9efb55f5ef6d2e210ec0e07e7fa69f" 1023 | dependencies: 1024 | builtin-modules "^1.1.1" 1025 | contains-path "^0.1.0" 1026 | debug "^2.6.8" 1027 | doctrine "1.5.0" 1028 | eslint-import-resolver-node "^0.3.1" 1029 | eslint-module-utils "^2.1.1" 1030 | has "^1.0.1" 1031 | lodash.cond "^4.3.0" 1032 | minimatch "^3.0.3" 1033 | read-pkg-up "^2.0.0" 1034 | 1035 | eslint-scope@3.7.1, eslint-scope@^3.7.1: 1036 | version "3.7.1" 1037 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" 1038 | dependencies: 1039 | esrecurse "^4.1.0" 1040 | estraverse "^4.1.1" 1041 | 1042 | eslint-visitor-keys@^1.0.0: 1043 | version "1.0.0" 1044 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" 1045 | 1046 | eslint@^4.0.0, eslint@^4.1.1: 1047 | version "4.19.1" 1048 | resolved "http://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" 1049 | dependencies: 1050 | ajv "^5.3.0" 1051 | babel-code-frame "^6.22.0" 1052 | chalk "^2.1.0" 1053 | concat-stream "^1.6.0" 1054 | cross-spawn "^5.1.0" 1055 | debug "^3.1.0" 1056 | doctrine "^2.1.0" 1057 | eslint-scope "^3.7.1" 1058 | eslint-visitor-keys "^1.0.0" 1059 | espree "^3.5.4" 1060 | esquery "^1.0.0" 1061 | esutils "^2.0.2" 1062 | file-entry-cache "^2.0.0" 1063 | functional-red-black-tree "^1.0.1" 1064 | glob "^7.1.2" 1065 | globals "^11.0.1" 1066 | ignore "^3.3.3" 1067 | imurmurhash "^0.1.4" 1068 | inquirer "^3.0.6" 1069 | is-resolvable "^1.0.0" 1070 | js-yaml "^3.9.1" 1071 | json-stable-stringify-without-jsonify "^1.0.1" 1072 | levn "^0.3.0" 1073 | lodash "^4.17.4" 1074 | minimatch "^3.0.2" 1075 | mkdirp "^0.5.1" 1076 | natural-compare "^1.4.0" 1077 | optionator "^0.8.2" 1078 | path-is-inside "^1.0.2" 1079 | pluralize "^7.0.0" 1080 | progress "^2.0.0" 1081 | regexpp "^1.0.1" 1082 | require-uncached "^1.0.3" 1083 | semver "^5.3.0" 1084 | strip-ansi "^4.0.0" 1085 | strip-json-comments "~2.0.1" 1086 | table "4.0.2" 1087 | text-table "~0.2.0" 1088 | 1089 | eslint@^4.2.0: 1090 | version "4.3.0" 1091 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.3.0.tgz#fcd7c96376bbf34c85ee67ed0012a299642b108f" 1092 | dependencies: 1093 | ajv "^5.2.0" 1094 | babel-code-frame "^6.22.0" 1095 | chalk "^1.1.3" 1096 | concat-stream "^1.6.0" 1097 | cross-spawn "^5.1.0" 1098 | debug "^2.6.8" 1099 | doctrine "^2.0.0" 1100 | eslint-scope "^3.7.1" 1101 | espree "^3.4.3" 1102 | esquery "^1.0.0" 1103 | estraverse "^4.2.0" 1104 | esutils "^2.0.2" 1105 | file-entry-cache "^2.0.0" 1106 | functional-red-black-tree "^1.0.1" 1107 | glob "^7.1.2" 1108 | globals "^9.17.0" 1109 | ignore "^3.3.3" 1110 | imurmurhash "^0.1.4" 1111 | inquirer "^3.0.6" 1112 | is-resolvable "^1.0.0" 1113 | js-yaml "^3.8.4" 1114 | json-stable-stringify "^1.0.1" 1115 | levn "^0.3.0" 1116 | lodash "^4.17.4" 1117 | minimatch "^3.0.2" 1118 | mkdirp "^0.5.1" 1119 | natural-compare "^1.4.0" 1120 | optionator "^0.8.2" 1121 | path-is-inside "^1.0.2" 1122 | pluralize "^4.0.0" 1123 | progress "^2.0.0" 1124 | require-uncached "^1.0.3" 1125 | semver "^5.3.0" 1126 | strip-json-comments "~2.0.1" 1127 | table "^4.0.1" 1128 | text-table "~0.2.0" 1129 | 1130 | espree@^3.4.3: 1131 | version "3.4.3" 1132 | resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.3.tgz#2910b5ccd49ce893c2ffffaab4fd8b3a31b82374" 1133 | dependencies: 1134 | acorn "^5.0.1" 1135 | acorn-jsx "^3.0.0" 1136 | 1137 | espree@^3.5.4: 1138 | version "3.5.4" 1139 | resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" 1140 | dependencies: 1141 | acorn "^5.5.0" 1142 | acorn-jsx "^3.0.0" 1143 | 1144 | esprima@^4.0.0: 1145 | version "4.0.0" 1146 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" 1147 | 1148 | esquery@^1.0.0: 1149 | version "1.0.0" 1150 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" 1151 | dependencies: 1152 | estraverse "^4.0.0" 1153 | 1154 | esrecurse@^4.1.0: 1155 | version "4.2.0" 1156 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" 1157 | dependencies: 1158 | estraverse "^4.1.0" 1159 | object-assign "^4.0.1" 1160 | 1161 | estraverse-fb@^1.3.1: 1162 | version "1.3.2" 1163 | resolved "https://registry.yarnpkg.com/estraverse-fb/-/estraverse-fb-1.3.2.tgz#d323a4cb5e5ac331cea033413a9253e1643e07c4" 1164 | 1165 | estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: 1166 | version "4.2.0" 1167 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 1168 | 1169 | esutils@^2.0.2: 1170 | version "2.0.2" 1171 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 1172 | 1173 | expand-brackets@^0.1.4: 1174 | version "0.1.5" 1175 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 1176 | dependencies: 1177 | is-posix-bracket "^0.1.0" 1178 | 1179 | expand-range@^1.8.1: 1180 | version "1.8.2" 1181 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 1182 | dependencies: 1183 | fill-range "^2.1.0" 1184 | 1185 | expand-tilde@^1.2.2: 1186 | version "1.2.2" 1187 | resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" 1188 | dependencies: 1189 | os-homedir "^1.0.1" 1190 | 1191 | expand-tilde@^2.0.2: 1192 | version "2.0.2" 1193 | resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" 1194 | dependencies: 1195 | homedir-polyfill "^1.0.1" 1196 | 1197 | extend-shallow@^3.0.2: 1198 | version "3.0.2" 1199 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" 1200 | dependencies: 1201 | assign-symbols "^1.0.0" 1202 | is-extendable "^1.0.1" 1203 | 1204 | extend@^3.0.0: 1205 | version "3.0.1" 1206 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" 1207 | 1208 | external-editor@^2.0.4: 1209 | version "2.0.4" 1210 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972" 1211 | dependencies: 1212 | iconv-lite "^0.4.17" 1213 | jschardet "^1.4.2" 1214 | tmp "^0.0.31" 1215 | 1216 | extglob@^0.3.1: 1217 | version "0.3.2" 1218 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 1219 | dependencies: 1220 | is-extglob "^1.0.0" 1221 | 1222 | fancy-log@^1.1.0: 1223 | version "1.3.0" 1224 | resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948" 1225 | dependencies: 1226 | chalk "^1.1.1" 1227 | time-stamp "^1.0.0" 1228 | 1229 | fancy-log@^1.3.2: 1230 | version "1.3.2" 1231 | resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1" 1232 | dependencies: 1233 | ansi-gray "^0.1.1" 1234 | color-support "^1.1.3" 1235 | time-stamp "^1.0.0" 1236 | 1237 | fast-deep-equal@^1.0.0: 1238 | version "1.0.0" 1239 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" 1240 | 1241 | fast-json-stable-stringify@^2.0.0: 1242 | version "2.0.0" 1243 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 1244 | 1245 | fast-levenshtein@~2.0.4: 1246 | version "2.0.6" 1247 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 1248 | 1249 | figures@^2.0.0: 1250 | version "2.0.0" 1251 | resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 1252 | dependencies: 1253 | escape-string-regexp "^1.0.5" 1254 | 1255 | file-entry-cache@^2.0.0: 1256 | version "2.0.0" 1257 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 1258 | dependencies: 1259 | flat-cache "^1.2.1" 1260 | object-assign "^4.0.1" 1261 | 1262 | filename-regex@^2.0.0: 1263 | version "2.0.1" 1264 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" 1265 | 1266 | fill-range@^2.1.0: 1267 | version "2.2.3" 1268 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" 1269 | dependencies: 1270 | is-number "^2.1.0" 1271 | isobject "^2.0.0" 1272 | randomatic "^1.1.3" 1273 | repeat-element "^1.1.2" 1274 | repeat-string "^1.5.2" 1275 | 1276 | find-index@^0.1.1: 1277 | version "0.1.1" 1278 | resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" 1279 | 1280 | find-up@^1.0.0: 1281 | version "1.1.2" 1282 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 1283 | dependencies: 1284 | path-exists "^2.0.0" 1285 | pinkie-promise "^2.0.0" 1286 | 1287 | find-up@^2.0.0: 1288 | version "2.1.0" 1289 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" 1290 | dependencies: 1291 | locate-path "^2.0.0" 1292 | 1293 | findup-sync@^0.4.2: 1294 | version "0.4.3" 1295 | resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" 1296 | dependencies: 1297 | detect-file "^0.1.0" 1298 | is-glob "^2.0.1" 1299 | micromatch "^2.3.7" 1300 | resolve-dir "^0.1.0" 1301 | 1302 | fined@^1.0.1: 1303 | version "1.1.0" 1304 | resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.0.tgz#b37dc844b76a2f5e7081e884f7c0ae344f153476" 1305 | dependencies: 1306 | expand-tilde "^2.0.2" 1307 | is-plain-object "^2.0.3" 1308 | object.defaults "^1.1.0" 1309 | object.pick "^1.2.0" 1310 | parse-filepath "^1.0.1" 1311 | 1312 | first-chunk-stream@^1.0.0: 1313 | version "1.0.0" 1314 | resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" 1315 | 1316 | flagged-respawn@^0.3.2: 1317 | version "0.3.2" 1318 | resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5" 1319 | 1320 | flat-cache@^1.2.1: 1321 | version "1.2.2" 1322 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" 1323 | dependencies: 1324 | circular-json "^0.3.1" 1325 | del "^2.0.2" 1326 | graceful-fs "^4.1.2" 1327 | write "^0.2.1" 1328 | 1329 | for-in@^1.0.1: 1330 | version "1.0.2" 1331 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 1332 | 1333 | for-own@^0.1.4: 1334 | version "0.1.5" 1335 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" 1336 | dependencies: 1337 | for-in "^1.0.1" 1338 | 1339 | for-own@^1.0.0: 1340 | version "1.0.0" 1341 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" 1342 | dependencies: 1343 | for-in "^1.0.1" 1344 | 1345 | fs-exists-sync@^0.1.0: 1346 | version "0.1.0" 1347 | resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" 1348 | 1349 | fs.realpath@^1.0.0: 1350 | version "1.0.0" 1351 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1352 | 1353 | function-bind@^1.0.2: 1354 | version "1.1.0" 1355 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" 1356 | 1357 | functional-red-black-tree@^1.0.1: 1358 | version "1.0.1" 1359 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 1360 | 1361 | gaze@^0.5.1: 1362 | version "0.5.2" 1363 | resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" 1364 | dependencies: 1365 | globule "~0.1.0" 1366 | 1367 | get-func-name@^2.0.0: 1368 | version "2.0.0" 1369 | resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" 1370 | 1371 | glob-base@^0.3.0: 1372 | version "0.3.0" 1373 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 1374 | dependencies: 1375 | glob-parent "^2.0.0" 1376 | is-glob "^2.0.0" 1377 | 1378 | glob-parent@^2.0.0: 1379 | version "2.0.0" 1380 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 1381 | dependencies: 1382 | is-glob "^2.0.0" 1383 | 1384 | glob-stream@^3.1.5: 1385 | version "3.1.18" 1386 | resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" 1387 | dependencies: 1388 | glob "^4.3.1" 1389 | glob2base "^0.0.12" 1390 | minimatch "^2.0.1" 1391 | ordered-read-streams "^0.1.0" 1392 | through2 "^0.6.1" 1393 | unique-stream "^1.0.0" 1394 | 1395 | glob-watcher@^0.0.6: 1396 | version "0.0.6" 1397 | resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" 1398 | dependencies: 1399 | gaze "^0.5.1" 1400 | 1401 | glob2base@^0.0.12: 1402 | version "0.0.12" 1403 | resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" 1404 | dependencies: 1405 | find-index "^0.1.1" 1406 | 1407 | glob@7.1.1: 1408 | version "7.1.1" 1409 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 1410 | dependencies: 1411 | fs.realpath "^1.0.0" 1412 | inflight "^1.0.4" 1413 | inherits "2" 1414 | minimatch "^3.0.2" 1415 | once "^1.3.0" 1416 | path-is-absolute "^1.0.0" 1417 | 1418 | glob@^4.3.1: 1419 | version "4.5.3" 1420 | resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" 1421 | dependencies: 1422 | inflight "^1.0.4" 1423 | inherits "2" 1424 | minimatch "^2.0.1" 1425 | once "^1.3.0" 1426 | 1427 | glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: 1428 | version "7.1.2" 1429 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 1430 | dependencies: 1431 | fs.realpath "^1.0.0" 1432 | inflight "^1.0.4" 1433 | inherits "2" 1434 | minimatch "^3.0.4" 1435 | once "^1.3.0" 1436 | path-is-absolute "^1.0.0" 1437 | 1438 | glob@~3.1.21: 1439 | version "3.1.21" 1440 | resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" 1441 | dependencies: 1442 | graceful-fs "~1.2.0" 1443 | inherits "1" 1444 | minimatch "~0.2.11" 1445 | 1446 | global-modules@^0.2.3: 1447 | version "0.2.3" 1448 | resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" 1449 | dependencies: 1450 | global-prefix "^0.1.4" 1451 | is-windows "^0.2.0" 1452 | 1453 | global-prefix@^0.1.4: 1454 | version "0.1.5" 1455 | resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" 1456 | dependencies: 1457 | homedir-polyfill "^1.0.0" 1458 | ini "^1.3.4" 1459 | is-windows "^0.2.0" 1460 | which "^1.2.12" 1461 | 1462 | globals@^11.0.1, globals@^11.1.0: 1463 | version "11.7.0" 1464 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" 1465 | 1466 | globals@^9.0.0, globals@^9.17.0: 1467 | version "9.18.0" 1468 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" 1469 | 1470 | globby@^5.0.0: 1471 | version "5.0.0" 1472 | resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" 1473 | dependencies: 1474 | array-union "^1.0.1" 1475 | arrify "^1.0.0" 1476 | glob "^7.0.3" 1477 | object-assign "^4.0.1" 1478 | pify "^2.0.0" 1479 | pinkie-promise "^2.0.0" 1480 | 1481 | globby@^6.1.0: 1482 | version "6.1.0" 1483 | resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" 1484 | dependencies: 1485 | array-union "^1.0.1" 1486 | glob "^7.0.3" 1487 | object-assign "^4.0.1" 1488 | pify "^2.0.0" 1489 | pinkie-promise "^2.0.0" 1490 | 1491 | globule@~0.1.0: 1492 | version "0.1.0" 1493 | resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" 1494 | dependencies: 1495 | glob "~3.1.21" 1496 | lodash "~1.0.1" 1497 | minimatch "~0.2.11" 1498 | 1499 | glogg@^1.0.0: 1500 | version "1.0.0" 1501 | resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5" 1502 | dependencies: 1503 | sparkles "^1.0.0" 1504 | 1505 | graceful-fs@^3.0.0: 1506 | version "3.0.11" 1507 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" 1508 | dependencies: 1509 | natives "^1.1.0" 1510 | 1511 | graceful-fs@^4.1.2: 1512 | version "4.1.11" 1513 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 1514 | 1515 | graceful-fs@~1.2.0: 1516 | version "1.2.3" 1517 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" 1518 | 1519 | "graceful-readlink@>= 1.0.0": 1520 | version "1.0.1" 1521 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 1522 | 1523 | growl@1.9.2: 1524 | version "1.9.2" 1525 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" 1526 | 1527 | gulp-babel@^7.0.0: 1528 | version "7.0.1" 1529 | resolved "https://registry.yarnpkg.com/gulp-babel/-/gulp-babel-7.0.1.tgz#b9c8e29fa376b36c57989db820fc1c1715bb47cb" 1530 | dependencies: 1531 | plugin-error "^1.0.1" 1532 | replace-ext "0.0.1" 1533 | through2 "^2.0.0" 1534 | vinyl-sourcemaps-apply "^0.2.0" 1535 | 1536 | gulp-eslint@^4.0.0: 1537 | version "4.0.2" 1538 | resolved "https://registry.yarnpkg.com/gulp-eslint/-/gulp-eslint-4.0.2.tgz#18a2a6768e4404cbf3e203239cb57474168fa606" 1539 | dependencies: 1540 | eslint "^4.0.0" 1541 | fancy-log "^1.3.2" 1542 | plugin-error "^1.0.0" 1543 | 1544 | gulp-util@^3.0.0: 1545 | version "3.0.8" 1546 | resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" 1547 | dependencies: 1548 | array-differ "^1.0.0" 1549 | array-uniq "^1.0.2" 1550 | beeper "^1.0.0" 1551 | chalk "^1.0.0" 1552 | dateformat "^2.0.0" 1553 | fancy-log "^1.1.0" 1554 | gulplog "^1.0.0" 1555 | has-gulplog "^0.1.0" 1556 | lodash._reescape "^3.0.0" 1557 | lodash._reevaluate "^3.0.0" 1558 | lodash._reinterpolate "^3.0.0" 1559 | lodash.template "^3.0.0" 1560 | minimist "^1.1.0" 1561 | multipipe "^0.1.2" 1562 | object-assign "^3.0.0" 1563 | replace-ext "0.0.1" 1564 | through2 "^2.0.0" 1565 | vinyl "^0.5.0" 1566 | 1567 | gulp@^3.9.1: 1568 | version "3.9.1" 1569 | resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" 1570 | dependencies: 1571 | archy "^1.0.0" 1572 | chalk "^1.0.0" 1573 | deprecated "^0.0.1" 1574 | gulp-util "^3.0.0" 1575 | interpret "^1.0.0" 1576 | liftoff "^2.1.0" 1577 | minimist "^1.1.0" 1578 | orchestrator "^0.3.0" 1579 | pretty-hrtime "^1.0.0" 1580 | semver "^4.1.0" 1581 | tildify "^1.0.0" 1582 | v8flags "^2.0.2" 1583 | vinyl-fs "^0.3.0" 1584 | 1585 | gulplog@^1.0.0: 1586 | version "1.0.0" 1587 | resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" 1588 | dependencies: 1589 | glogg "^1.0.0" 1590 | 1591 | has-ansi@^2.0.0: 1592 | version "2.0.0" 1593 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 1594 | dependencies: 1595 | ansi-regex "^2.0.0" 1596 | 1597 | has-flag@^1.0.0: 1598 | version "1.0.0" 1599 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" 1600 | 1601 | has-flag@^2.0.0: 1602 | version "2.0.0" 1603 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" 1604 | 1605 | has-flag@^3.0.0: 1606 | version "3.0.0" 1607 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 1608 | 1609 | has-gulplog@^0.1.0: 1610 | version "0.1.0" 1611 | resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" 1612 | dependencies: 1613 | sparkles "^1.0.0" 1614 | 1615 | has@^1.0.1: 1616 | version "1.0.1" 1617 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" 1618 | dependencies: 1619 | function-bind "^1.0.2" 1620 | 1621 | home-or-tmp@^2.0.0: 1622 | version "2.0.0" 1623 | resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" 1624 | dependencies: 1625 | os-homedir "^1.0.0" 1626 | os-tmpdir "^1.0.1" 1627 | 1628 | homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: 1629 | version "1.0.1" 1630 | resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" 1631 | dependencies: 1632 | parse-passwd "^1.0.0" 1633 | 1634 | hosted-git-info@^2.1.4: 1635 | version "2.5.0" 1636 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" 1637 | 1638 | iconv-lite@^0.4.17: 1639 | version "0.4.18" 1640 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" 1641 | 1642 | ignore@^3.3.3: 1643 | version "3.3.3" 1644 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d" 1645 | 1646 | imurmurhash@^0.1.4: 1647 | version "0.1.4" 1648 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1649 | 1650 | inflight@^1.0.4: 1651 | version "1.0.6" 1652 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1653 | dependencies: 1654 | once "^1.3.0" 1655 | wrappy "1" 1656 | 1657 | inherits@1: 1658 | version "1.0.2" 1659 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" 1660 | 1661 | inherits@2, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: 1662 | version "2.0.3" 1663 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1664 | 1665 | ini@^1.3.4: 1666 | version "1.3.4" 1667 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 1668 | 1669 | inquirer@^3.0.6: 1670 | version "3.2.0" 1671 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.2.0.tgz#45b44c2160c729d7578c54060b3eed94487bb42b" 1672 | dependencies: 1673 | ansi-escapes "^2.0.0" 1674 | chalk "^2.0.0" 1675 | cli-cursor "^2.1.0" 1676 | cli-width "^2.0.0" 1677 | external-editor "^2.0.4" 1678 | figures "^2.0.0" 1679 | lodash "^4.3.0" 1680 | mute-stream "0.0.7" 1681 | run-async "^2.2.0" 1682 | rx-lite "^4.0.8" 1683 | rx-lite-aggregates "^4.0.8" 1684 | string-width "^2.1.0" 1685 | strip-ansi "^4.0.0" 1686 | through "^2.3.6" 1687 | 1688 | interpret@^1.0.0: 1689 | version "1.0.3" 1690 | resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90" 1691 | 1692 | invariant@^2.2.0: 1693 | version "2.2.2" 1694 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" 1695 | dependencies: 1696 | loose-envify "^1.0.0" 1697 | 1698 | is-absolute@^0.2.3: 1699 | version "0.2.6" 1700 | resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.2.6.tgz#20de69f3db942ef2d87b9c2da36f172235b1b5eb" 1701 | dependencies: 1702 | is-relative "^0.2.1" 1703 | is-windows "^0.2.0" 1704 | 1705 | is-arrayish@^0.2.1: 1706 | version "0.2.1" 1707 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 1708 | 1709 | is-buffer@^1.1.5: 1710 | version "1.1.5" 1711 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" 1712 | 1713 | is-builtin-module@^1.0.0: 1714 | version "1.0.0" 1715 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 1716 | dependencies: 1717 | builtin-modules "^1.0.0" 1718 | 1719 | is-dotfile@^1.0.0: 1720 | version "1.0.3" 1721 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" 1722 | 1723 | is-equal-shallow@^0.1.3: 1724 | version "0.1.3" 1725 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 1726 | dependencies: 1727 | is-primitive "^2.0.0" 1728 | 1729 | is-extendable@^0.1.1: 1730 | version "0.1.1" 1731 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 1732 | 1733 | is-extendable@^1.0.1: 1734 | version "1.0.1" 1735 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" 1736 | dependencies: 1737 | is-plain-object "^2.0.4" 1738 | 1739 | is-extglob@^1.0.0: 1740 | version "1.0.0" 1741 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 1742 | 1743 | is-finite@^1.0.0: 1744 | version "1.0.2" 1745 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 1746 | dependencies: 1747 | number-is-nan "^1.0.0" 1748 | 1749 | is-fullwidth-code-point@^2.0.0: 1750 | version "2.0.0" 1751 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1752 | 1753 | is-glob@^2.0.0, is-glob@^2.0.1: 1754 | version "2.0.1" 1755 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 1756 | dependencies: 1757 | is-extglob "^1.0.0" 1758 | 1759 | is-number@^2.1.0: 1760 | version "2.1.0" 1761 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 1762 | dependencies: 1763 | kind-of "^3.0.2" 1764 | 1765 | is-number@^3.0.0: 1766 | version "3.0.0" 1767 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 1768 | dependencies: 1769 | kind-of "^3.0.2" 1770 | 1771 | is-path-cwd@^1.0.0: 1772 | version "1.0.0" 1773 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 1774 | 1775 | is-path-in-cwd@^1.0.0: 1776 | version "1.0.0" 1777 | resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" 1778 | dependencies: 1779 | is-path-inside "^1.0.0" 1780 | 1781 | is-path-inside@^1.0.0: 1782 | version "1.0.0" 1783 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" 1784 | dependencies: 1785 | path-is-inside "^1.0.1" 1786 | 1787 | is-plain-object@^2.0.3, is-plain-object@^2.0.4: 1788 | version "2.0.4" 1789 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 1790 | dependencies: 1791 | isobject "^3.0.1" 1792 | 1793 | is-posix-bracket@^0.1.0: 1794 | version "0.1.1" 1795 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 1796 | 1797 | is-primitive@^2.0.0: 1798 | version "2.0.0" 1799 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 1800 | 1801 | is-promise@^2.1.0: 1802 | version "2.1.0" 1803 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 1804 | 1805 | is-relative@^0.2.1: 1806 | version "0.2.1" 1807 | resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5" 1808 | dependencies: 1809 | is-unc-path "^0.1.1" 1810 | 1811 | is-resolvable@^1.0.0: 1812 | version "1.0.0" 1813 | resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" 1814 | dependencies: 1815 | tryit "^1.0.1" 1816 | 1817 | is-unc-path@^0.1.1: 1818 | version "0.1.2" 1819 | resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-0.1.2.tgz#6ab053a72573c10250ff416a3814c35178af39b9" 1820 | dependencies: 1821 | unc-path-regex "^0.1.0" 1822 | 1823 | is-utf8@^0.2.0: 1824 | version "0.2.1" 1825 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 1826 | 1827 | is-windows@^0.2.0: 1828 | version "0.2.0" 1829 | resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" 1830 | 1831 | isarray@0.0.1: 1832 | version "0.0.1" 1833 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 1834 | 1835 | isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: 1836 | version "1.0.0" 1837 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1838 | 1839 | isexe@^2.0.0: 1840 | version "2.0.0" 1841 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1842 | 1843 | isobject@^2.0.0, isobject@^2.1.0: 1844 | version "2.1.0" 1845 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 1846 | dependencies: 1847 | isarray "1.0.0" 1848 | 1849 | isobject@^3.0.0, isobject@^3.0.1: 1850 | version "3.0.1" 1851 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 1852 | 1853 | js-tokens@^3.0.0: 1854 | version "3.0.2" 1855 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 1856 | 1857 | js-yaml@^3.8.4: 1858 | version "3.9.0" 1859 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.9.0.tgz#4ffbbf25c2ac963b8299dc74da7e3740de1c18ce" 1860 | dependencies: 1861 | argparse "^1.0.7" 1862 | esprima "^4.0.0" 1863 | 1864 | js-yaml@^3.9.1: 1865 | version "3.12.0" 1866 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" 1867 | dependencies: 1868 | argparse "^1.0.7" 1869 | esprima "^4.0.0" 1870 | 1871 | jschardet@^1.4.2: 1872 | version "1.5.0" 1873 | resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.5.0.tgz#a61f310306a5a71188e1b1acd08add3cfbb08b1e" 1874 | 1875 | jsesc@^1.3.0: 1876 | version "1.3.0" 1877 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" 1878 | 1879 | jsesc@^2.5.1: 1880 | version "2.5.1" 1881 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" 1882 | 1883 | jsesc@~0.5.0: 1884 | version "0.5.0" 1885 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" 1886 | 1887 | json-schema-traverse@^0.3.0: 1888 | version "0.3.1" 1889 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" 1890 | 1891 | json-stable-stringify-without-jsonify@^1.0.1: 1892 | version "1.0.1" 1893 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1894 | 1895 | json-stable-stringify@^1.0.1: 1896 | version "1.0.1" 1897 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 1898 | dependencies: 1899 | jsonify "~0.0.0" 1900 | 1901 | json3@3.3.2: 1902 | version "3.3.2" 1903 | resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" 1904 | 1905 | json5@^0.5.0: 1906 | version "0.5.1" 1907 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" 1908 | 1909 | jsonify@~0.0.0: 1910 | version "0.0.0" 1911 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 1912 | 1913 | kind-of@^3.0.2: 1914 | version "3.2.2" 1915 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 1916 | dependencies: 1917 | is-buffer "^1.1.5" 1918 | 1919 | kind-of@^4.0.0: 1920 | version "4.0.0" 1921 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" 1922 | dependencies: 1923 | is-buffer "^1.1.5" 1924 | 1925 | levn@^0.3.0, levn@~0.3.0: 1926 | version "0.3.0" 1927 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 1928 | dependencies: 1929 | prelude-ls "~1.1.2" 1930 | type-check "~0.3.2" 1931 | 1932 | libpq@^1.7.0: 1933 | version "1.8.7" 1934 | resolved "https://registry.yarnpkg.com/libpq/-/libpq-1.8.7.tgz#c2deb121e28f7f84bd3b2451afff68b6663e74f9" 1935 | dependencies: 1936 | bindings "1.2.1" 1937 | nan "^2.3.0" 1938 | 1939 | liftoff@^2.1.0: 1940 | version "2.3.0" 1941 | resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.3.0.tgz#a98f2ff67183d8ba7cfaca10548bd7ff0550b385" 1942 | dependencies: 1943 | extend "^3.0.0" 1944 | findup-sync "^0.4.2" 1945 | fined "^1.0.1" 1946 | flagged-respawn "^0.3.2" 1947 | lodash.isplainobject "^4.0.4" 1948 | lodash.isstring "^4.0.1" 1949 | lodash.mapvalues "^4.4.0" 1950 | rechoir "^0.6.2" 1951 | resolve "^1.1.7" 1952 | 1953 | load-json-file@^2.0.0: 1954 | version "2.0.0" 1955 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" 1956 | dependencies: 1957 | graceful-fs "^4.1.2" 1958 | parse-json "^2.2.0" 1959 | pify "^2.0.0" 1960 | strip-bom "^3.0.0" 1961 | 1962 | locate-path@^2.0.0: 1963 | version "2.0.0" 1964 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 1965 | dependencies: 1966 | p-locate "^2.0.0" 1967 | path-exists "^3.0.0" 1968 | 1969 | lodash._baseassign@^3.0.0: 1970 | version "3.2.0" 1971 | resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" 1972 | dependencies: 1973 | lodash._basecopy "^3.0.0" 1974 | lodash.keys "^3.0.0" 1975 | 1976 | lodash._basecopy@^3.0.0: 1977 | version "3.0.1" 1978 | resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" 1979 | 1980 | lodash._basecreate@^3.0.0: 1981 | version "3.0.3" 1982 | resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" 1983 | 1984 | lodash._basetostring@^3.0.0: 1985 | version "3.0.1" 1986 | resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" 1987 | 1988 | lodash._basevalues@^3.0.0: 1989 | version "3.0.0" 1990 | resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" 1991 | 1992 | lodash._getnative@^3.0.0: 1993 | version "3.9.1" 1994 | resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" 1995 | 1996 | lodash._isiterateecall@^3.0.0: 1997 | version "3.0.9" 1998 | resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" 1999 | 2000 | lodash._reescape@^3.0.0: 2001 | version "3.0.0" 2002 | resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" 2003 | 2004 | lodash._reevaluate@^3.0.0: 2005 | version "3.0.0" 2006 | resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" 2007 | 2008 | lodash._reinterpolate@^3.0.0: 2009 | version "3.0.0" 2010 | resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" 2011 | 2012 | lodash._root@^3.0.0: 2013 | version "3.0.1" 2014 | resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" 2015 | 2016 | lodash.camelcase@4.3.0: 2017 | version "4.3.0" 2018 | resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" 2019 | 2020 | lodash.cond@^4.3.0: 2021 | version "4.5.2" 2022 | resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" 2023 | 2024 | lodash.create@3.1.1: 2025 | version "3.1.1" 2026 | resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" 2027 | dependencies: 2028 | lodash._baseassign "^3.0.0" 2029 | lodash._basecreate "^3.0.0" 2030 | lodash._isiterateecall "^3.0.0" 2031 | 2032 | lodash.escape@^3.0.0: 2033 | version "3.2.0" 2034 | resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" 2035 | dependencies: 2036 | lodash._root "^3.0.0" 2037 | 2038 | lodash.isarguments@^3.0.0: 2039 | version "3.1.0" 2040 | resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" 2041 | 2042 | lodash.isarray@^3.0.0: 2043 | version "3.0.4" 2044 | resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" 2045 | 2046 | lodash.isplainobject@^4.0.4: 2047 | version "4.0.6" 2048 | resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" 2049 | 2050 | lodash.isstring@^4.0.1: 2051 | version "4.0.1" 2052 | resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" 2053 | 2054 | lodash.kebabcase@4.1.1: 2055 | version "4.1.1" 2056 | resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" 2057 | 2058 | lodash.keys@^3.0.0: 2059 | version "3.1.2" 2060 | resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" 2061 | dependencies: 2062 | lodash._getnative "^3.0.0" 2063 | lodash.isarguments "^3.0.0" 2064 | lodash.isarray "^3.0.0" 2065 | 2066 | lodash.mapvalues@^4.4.0: 2067 | version "4.6.0" 2068 | resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" 2069 | 2070 | lodash.restparam@^3.0.0: 2071 | version "3.6.1" 2072 | resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" 2073 | 2074 | lodash.snakecase@4.1.1: 2075 | version "4.1.1" 2076 | resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" 2077 | 2078 | lodash.template@^3.0.0: 2079 | version "3.6.2" 2080 | resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" 2081 | dependencies: 2082 | lodash._basecopy "^3.0.0" 2083 | lodash._basetostring "^3.0.0" 2084 | lodash._basevalues "^3.0.0" 2085 | lodash._isiterateecall "^3.0.0" 2086 | lodash._reinterpolate "^3.0.0" 2087 | lodash.escape "^3.0.0" 2088 | lodash.keys "^3.0.0" 2089 | lodash.restparam "^3.0.0" 2090 | lodash.templatesettings "^3.0.0" 2091 | 2092 | lodash.templatesettings@^3.0.0: 2093 | version "3.1.1" 2094 | resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" 2095 | dependencies: 2096 | lodash._reinterpolate "^3.0.0" 2097 | lodash.escape "^3.0.0" 2098 | 2099 | lodash.upperfirst@4.3.1: 2100 | version "4.3.1" 2101 | resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" 2102 | 2103 | lodash@^4.0.0, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0: 2104 | version "4.17.4" 2105 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 2106 | 2107 | lodash@~1.0.1: 2108 | version "1.0.2" 2109 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" 2110 | 2111 | loose-envify@^1.0.0: 2112 | version "1.3.1" 2113 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" 2114 | dependencies: 2115 | js-tokens "^3.0.0" 2116 | 2117 | lru-cache@2: 2118 | version "2.7.3" 2119 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" 2120 | 2121 | lru-cache@^4.0.1: 2122 | version "4.1.1" 2123 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" 2124 | dependencies: 2125 | pseudomap "^1.0.2" 2126 | yallist "^2.1.2" 2127 | 2128 | map-cache@^0.2.0: 2129 | version "0.2.2" 2130 | resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" 2131 | 2132 | micromatch@^2.3.7: 2133 | version "2.3.11" 2134 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 2135 | dependencies: 2136 | arr-diff "^2.0.0" 2137 | array-unique "^0.2.1" 2138 | braces "^1.8.2" 2139 | expand-brackets "^0.1.4" 2140 | extglob "^0.3.1" 2141 | filename-regex "^2.0.0" 2142 | is-extglob "^1.0.0" 2143 | is-glob "^2.0.1" 2144 | kind-of "^3.0.2" 2145 | normalize-path "^2.0.1" 2146 | object.omit "^2.0.0" 2147 | parse-glob "^3.0.4" 2148 | regex-cache "^0.4.2" 2149 | 2150 | mimic-fn@^1.0.0: 2151 | version "1.1.0" 2152 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" 2153 | 2154 | minimatch@^2.0.1: 2155 | version "2.0.10" 2156 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" 2157 | dependencies: 2158 | brace-expansion "^1.0.0" 2159 | 2160 | minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: 2161 | version "3.0.4" 2162 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 2163 | dependencies: 2164 | brace-expansion "^1.1.7" 2165 | 2166 | minimatch@~0.2.11: 2167 | version "0.2.14" 2168 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" 2169 | dependencies: 2170 | lru-cache "2" 2171 | sigmund "~1.0.0" 2172 | 2173 | minimist@0.0.8: 2174 | version "0.0.8" 2175 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 2176 | 2177 | minimist@^1.1.0: 2178 | version "1.2.0" 2179 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 2180 | 2181 | mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1: 2182 | version "0.5.1" 2183 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 2184 | dependencies: 2185 | minimist "0.0.8" 2186 | 2187 | mocha@^3.4.2: 2188 | version "3.4.2" 2189 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.4.2.tgz#d0ef4d332126dbf18d0d640c9b382dd48be97594" 2190 | dependencies: 2191 | browser-stdout "1.3.0" 2192 | commander "2.9.0" 2193 | debug "2.6.0" 2194 | diff "3.2.0" 2195 | escape-string-regexp "1.0.5" 2196 | glob "7.1.1" 2197 | growl "1.9.2" 2198 | json3 "3.3.2" 2199 | lodash.create "3.1.1" 2200 | mkdirp "0.5.1" 2201 | supports-color "3.1.2" 2202 | 2203 | ms@0.7.2: 2204 | version "0.7.2" 2205 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" 2206 | 2207 | ms@2.0.0: 2208 | version "2.0.0" 2209 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 2210 | 2211 | ms@^2.1.1: 2212 | version "2.1.1" 2213 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 2214 | 2215 | multipipe@^0.1.2: 2216 | version "0.1.2" 2217 | resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" 2218 | dependencies: 2219 | duplexer2 "0.0.2" 2220 | 2221 | mute-stream@0.0.7: 2222 | version "0.0.7" 2223 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 2224 | 2225 | nan@^2.3.0: 2226 | version "2.6.2" 2227 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" 2228 | 2229 | natives@^1.1.0: 2230 | version "1.1.0" 2231 | resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31" 2232 | 2233 | natural-compare@^1.4.0: 2234 | version "1.4.0" 2235 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 2236 | 2237 | normalize-package-data@^2.3.2: 2238 | version "2.4.0" 2239 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" 2240 | dependencies: 2241 | hosted-git-info "^2.1.4" 2242 | is-builtin-module "^1.0.0" 2243 | semver "2 || 3 || 4 || 5" 2244 | validate-npm-package-license "^3.0.1" 2245 | 2246 | normalize-path@^2.0.1: 2247 | version "2.1.1" 2248 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 2249 | dependencies: 2250 | remove-trailing-separator "^1.0.1" 2251 | 2252 | number-is-nan@^1.0.0: 2253 | version "1.0.1" 2254 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 2255 | 2256 | object-assign@^3.0.0: 2257 | version "3.0.0" 2258 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" 2259 | 2260 | object-assign@^4.0.1: 2261 | version "4.1.1" 2262 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 2263 | 2264 | object.defaults@^1.1.0: 2265 | version "1.1.0" 2266 | resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" 2267 | dependencies: 2268 | array-each "^1.0.1" 2269 | array-slice "^1.0.0" 2270 | for-own "^1.0.0" 2271 | isobject "^3.0.0" 2272 | 2273 | object.omit@^2.0.0: 2274 | version "2.0.1" 2275 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 2276 | dependencies: 2277 | for-own "^0.1.4" 2278 | is-extendable "^0.1.1" 2279 | 2280 | object.pick@^1.2.0: 2281 | version "1.2.0" 2282 | resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.2.0.tgz#b5392bee9782da6d9fb7d6afaf539779f1234c2b" 2283 | dependencies: 2284 | isobject "^2.1.0" 2285 | 2286 | once@^1.3.0: 2287 | version "1.4.0" 2288 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 2289 | dependencies: 2290 | wrappy "1" 2291 | 2292 | once@~1.3.0: 2293 | version "1.3.3" 2294 | resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" 2295 | dependencies: 2296 | wrappy "1" 2297 | 2298 | onetime@^2.0.0: 2299 | version "2.0.1" 2300 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 2301 | dependencies: 2302 | mimic-fn "^1.0.0" 2303 | 2304 | optionator@^0.8.2: 2305 | version "0.8.2" 2306 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 2307 | dependencies: 2308 | deep-is "~0.1.3" 2309 | fast-levenshtein "~2.0.4" 2310 | levn "~0.3.0" 2311 | prelude-ls "~1.1.2" 2312 | type-check "~0.3.2" 2313 | wordwrap "~1.0.0" 2314 | 2315 | orchestrator@^0.3.0: 2316 | version "0.3.8" 2317 | resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" 2318 | dependencies: 2319 | end-of-stream "~0.1.5" 2320 | sequencify "~0.0.7" 2321 | stream-consume "~0.1.0" 2322 | 2323 | ordered-read-streams@^0.1.0: 2324 | version "0.1.0" 2325 | resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" 2326 | 2327 | os-homedir@^1.0.0, os-homedir@^1.0.1: 2328 | version "1.0.2" 2329 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 2330 | 2331 | os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: 2332 | version "1.0.2" 2333 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 2334 | 2335 | p-limit@^1.1.0: 2336 | version "1.1.0" 2337 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" 2338 | 2339 | p-locate@^2.0.0: 2340 | version "2.0.0" 2341 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 2342 | dependencies: 2343 | p-limit "^1.1.0" 2344 | 2345 | p-map@^1.1.1: 2346 | version "1.1.1" 2347 | resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.1.1.tgz#05f5e4ae97a068371bc2a5cc86bfbdbc19c4ae7a" 2348 | 2349 | packet-reader@0.3.1: 2350 | version "0.3.1" 2351 | resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-0.3.1.tgz#cd62e60af8d7fea8a705ec4ff990871c46871f27" 2352 | 2353 | parse-filepath@^1.0.1: 2354 | version "1.0.1" 2355 | resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.1.tgz#159d6155d43904d16c10ef698911da1e91969b73" 2356 | dependencies: 2357 | is-absolute "^0.2.3" 2358 | map-cache "^0.2.0" 2359 | path-root "^0.1.1" 2360 | 2361 | parse-glob@^3.0.4: 2362 | version "3.0.4" 2363 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 2364 | dependencies: 2365 | glob-base "^0.3.0" 2366 | is-dotfile "^1.0.0" 2367 | is-extglob "^1.0.0" 2368 | is-glob "^2.0.0" 2369 | 2370 | parse-json@^2.2.0: 2371 | version "2.2.0" 2372 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 2373 | dependencies: 2374 | error-ex "^1.2.0" 2375 | 2376 | parse-passwd@^1.0.0: 2377 | version "1.0.0" 2378 | resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" 2379 | 2380 | path-exists@^2.0.0: 2381 | version "2.1.0" 2382 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 2383 | dependencies: 2384 | pinkie-promise "^2.0.0" 2385 | 2386 | path-exists@^3.0.0: 2387 | version "3.0.0" 2388 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 2389 | 2390 | path-is-absolute@^1.0.0: 2391 | version "1.0.1" 2392 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 2393 | 2394 | path-is-inside@^1.0.1, path-is-inside@^1.0.2: 2395 | version "1.0.2" 2396 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 2397 | 2398 | path-parse@^1.0.5: 2399 | version "1.0.5" 2400 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" 2401 | 2402 | path-root-regex@^0.1.0: 2403 | version "0.1.2" 2404 | resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" 2405 | 2406 | path-root@^0.1.1: 2407 | version "0.1.1" 2408 | resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" 2409 | dependencies: 2410 | path-root-regex "^0.1.0" 2411 | 2412 | path-type@^2.0.0: 2413 | version "2.0.0" 2414 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" 2415 | dependencies: 2416 | pify "^2.0.0" 2417 | 2418 | pathval@^1.0.0: 2419 | version "1.1.0" 2420 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" 2421 | 2422 | pg-connection-string@0.1.3: 2423 | version "0.1.3" 2424 | resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-0.1.3.tgz#da1847b20940e42ee1492beaf65d49d91b245df7" 2425 | 2426 | pg-native@^2.0.1: 2427 | version "2.0.1" 2428 | resolved "https://registry.yarnpkg.com/pg-native/-/pg-native-2.0.1.tgz#f7139360e001f522f44192dc2c19fb6a55e2cf18" 2429 | dependencies: 2430 | libpq "^1.7.0" 2431 | pg-types "1.6.0" 2432 | readable-stream "1.0.31" 2433 | 2434 | pg-pool@2.*: 2435 | version "2.0.1" 2436 | resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-2.0.1.tgz#8b12541df271b57f7020c50a3f5566471f82c77e" 2437 | 2438 | pg-types@1.*: 2439 | version "1.12.0" 2440 | resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-1.12.0.tgz#8ad3b7b897e3fd463e62de241ad5fc640b4a66f0" 2441 | dependencies: 2442 | ap "~0.2.0" 2443 | postgres-array "~1.0.0" 2444 | postgres-bytea "~1.0.0" 2445 | postgres-date "~1.0.0" 2446 | postgres-interval "^1.1.0" 2447 | 2448 | pg-types@1.6.0: 2449 | version "1.6.0" 2450 | resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-1.6.0.tgz#3872a0f199143025497f4ee2a65fdaf00d7ea8b3" 2451 | 2452 | pg@^7.0.2: 2453 | version "7.0.2" 2454 | resolved "https://registry.yarnpkg.com/pg/-/pg-7.0.2.tgz#b9c2fe8168e7edfe9343aebe6fc48591e766ada7" 2455 | dependencies: 2456 | buffer-writer "1.0.1" 2457 | packet-reader "0.3.1" 2458 | pg-connection-string "0.1.3" 2459 | pg-pool "2.*" 2460 | pg-types "1.*" 2461 | pgpass "1.x" 2462 | semver "4.3.2" 2463 | 2464 | pgpass@1.x: 2465 | version "1.0.2" 2466 | resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.2.tgz#2a7bb41b6065b67907e91da1b07c1847c877b306" 2467 | dependencies: 2468 | split "^1.0.0" 2469 | 2470 | pify@^2.0.0: 2471 | version "2.3.0" 2472 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 2473 | 2474 | pify@^3.0.0: 2475 | version "3.0.0" 2476 | resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" 2477 | 2478 | pinkie-promise@^2.0.0: 2479 | version "2.0.1" 2480 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 2481 | dependencies: 2482 | pinkie "^2.0.0" 2483 | 2484 | pinkie@^2.0.0: 2485 | version "2.0.4" 2486 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 2487 | 2488 | pkg-dir@^1.0.0: 2489 | version "1.0.0" 2490 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" 2491 | dependencies: 2492 | find-up "^1.0.0" 2493 | 2494 | plugin-error@^1.0.0, plugin-error@^1.0.1: 2495 | version "1.0.1" 2496 | resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" 2497 | dependencies: 2498 | ansi-colors "^1.0.1" 2499 | arr-diff "^4.0.0" 2500 | arr-union "^3.1.0" 2501 | extend-shallow "^3.0.2" 2502 | 2503 | pluralize@^4.0.0: 2504 | version "4.0.0" 2505 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-4.0.0.tgz#59b708c1c0190a2f692f1c7618c446b052fd1762" 2506 | 2507 | pluralize@^7.0.0: 2508 | version "7.0.0" 2509 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" 2510 | 2511 | postgres-array@~1.0.0: 2512 | version "1.0.2" 2513 | resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-1.0.2.tgz#8e0b32eb03bf77a5c0a7851e0441c169a256a238" 2514 | 2515 | postgres-bytea@~1.0.0: 2516 | version "1.0.0" 2517 | resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" 2518 | 2519 | postgres-date@~1.0.0: 2520 | version "1.0.3" 2521 | resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.3.tgz#e2d89702efdb258ff9d9cee0fe91bd06975257a8" 2522 | 2523 | postgres-interval@^1.1.0: 2524 | version "1.1.1" 2525 | resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.1.1.tgz#acdb0f897b4b1c6e496d9d4e0a853e1c428f06f0" 2526 | dependencies: 2527 | xtend "^4.0.0" 2528 | 2529 | prelude-ls@~1.1.2: 2530 | version "1.1.2" 2531 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 2532 | 2533 | preserve@^0.2.0: 2534 | version "0.2.0" 2535 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 2536 | 2537 | pretty-hrtime@^1.0.0: 2538 | version "1.0.3" 2539 | resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" 2540 | 2541 | private@^0.1.6: 2542 | version "0.1.7" 2543 | resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" 2544 | 2545 | process-nextick-args@~1.0.6: 2546 | version "1.0.7" 2547 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 2548 | 2549 | progress@^2.0.0: 2550 | version "2.0.0" 2551 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" 2552 | 2553 | pseudomap@^1.0.2: 2554 | version "1.0.2" 2555 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 2556 | 2557 | randomatic@^1.1.3: 2558 | version "1.1.7" 2559 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" 2560 | dependencies: 2561 | is-number "^3.0.0" 2562 | kind-of "^4.0.0" 2563 | 2564 | read-pkg-up@^2.0.0: 2565 | version "2.0.0" 2566 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" 2567 | dependencies: 2568 | find-up "^2.0.0" 2569 | read-pkg "^2.0.0" 2570 | 2571 | read-pkg@^2.0.0: 2572 | version "2.0.0" 2573 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" 2574 | dependencies: 2575 | load-json-file "^2.0.0" 2576 | normalize-package-data "^2.3.2" 2577 | path-type "^2.0.0" 2578 | 2579 | readable-stream@1.0.31: 2580 | version "1.0.31" 2581 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.31.tgz#8f2502e0bc9e3b0da1b94520aabb4e2603ecafae" 2582 | dependencies: 2583 | core-util-is "~1.0.0" 2584 | inherits "~2.0.1" 2585 | isarray "0.0.1" 2586 | string_decoder "~0.10.x" 2587 | 2588 | "readable-stream@>=1.0.33-1 <1.1.0-0": 2589 | version "1.0.34" 2590 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" 2591 | dependencies: 2592 | core-util-is "~1.0.0" 2593 | inherits "~2.0.1" 2594 | isarray "0.0.1" 2595 | string_decoder "~0.10.x" 2596 | 2597 | readable-stream@^2.1.5, readable-stream@^2.2.2: 2598 | version "2.3.3" 2599 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" 2600 | dependencies: 2601 | core-util-is "~1.0.0" 2602 | inherits "~2.0.3" 2603 | isarray "~1.0.0" 2604 | process-nextick-args "~1.0.6" 2605 | safe-buffer "~5.1.1" 2606 | string_decoder "~1.0.3" 2607 | util-deprecate "~1.0.1" 2608 | 2609 | readable-stream@~1.1.9: 2610 | version "1.1.14" 2611 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" 2612 | dependencies: 2613 | core-util-is "~1.0.0" 2614 | inherits "~2.0.1" 2615 | isarray "0.0.1" 2616 | string_decoder "~0.10.x" 2617 | 2618 | rechoir@^0.6.2: 2619 | version "0.6.2" 2620 | resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" 2621 | dependencies: 2622 | resolve "^1.1.6" 2623 | 2624 | regenerate@^1.2.1: 2625 | version "1.3.2" 2626 | resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" 2627 | 2628 | regenerator-runtime@^0.10.0: 2629 | version "0.10.5" 2630 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" 2631 | 2632 | regex-cache@^0.4.2: 2633 | version "0.4.3" 2634 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" 2635 | dependencies: 2636 | is-equal-shallow "^0.1.3" 2637 | is-primitive "^2.0.0" 2638 | 2639 | regexpp@^1.0.1: 2640 | version "1.1.0" 2641 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" 2642 | 2643 | regexpu-core@^2.0.0: 2644 | version "2.0.0" 2645 | resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" 2646 | dependencies: 2647 | regenerate "^1.2.1" 2648 | regjsgen "^0.2.0" 2649 | regjsparser "^0.1.4" 2650 | 2651 | regjsgen@^0.2.0: 2652 | version "0.2.0" 2653 | resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" 2654 | 2655 | regjsparser@^0.1.4: 2656 | version "0.1.5" 2657 | resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" 2658 | dependencies: 2659 | jsesc "~0.5.0" 2660 | 2661 | remove-trailing-separator@^1.0.1: 2662 | version "1.0.2" 2663 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz#69b062d978727ad14dc6b56ba4ab772fd8d70511" 2664 | 2665 | repeat-element@^1.1.2: 2666 | version "1.1.2" 2667 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" 2668 | 2669 | repeat-string@^1.5.2: 2670 | version "1.6.1" 2671 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 2672 | 2673 | repeating@^2.0.0: 2674 | version "2.0.1" 2675 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 2676 | dependencies: 2677 | is-finite "^1.0.0" 2678 | 2679 | replace-ext@0.0.1: 2680 | version "0.0.1" 2681 | resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" 2682 | 2683 | require-uncached@^1.0.3: 2684 | version "1.0.3" 2685 | resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 2686 | dependencies: 2687 | caller-path "^0.1.0" 2688 | resolve-from "^1.0.0" 2689 | 2690 | resolve-dir@^0.1.0: 2691 | version "0.1.1" 2692 | resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" 2693 | dependencies: 2694 | expand-tilde "^1.2.2" 2695 | global-modules "^0.2.3" 2696 | 2697 | resolve-from@^1.0.0: 2698 | version "1.0.1" 2699 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 2700 | 2701 | resolve@^1.1.6, resolve@^1.1.7, resolve@^1.2.0: 2702 | version "1.3.3" 2703 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" 2704 | dependencies: 2705 | path-parse "^1.0.5" 2706 | 2707 | restore-cursor@^2.0.0: 2708 | version "2.0.0" 2709 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 2710 | dependencies: 2711 | onetime "^2.0.0" 2712 | signal-exit "^3.0.2" 2713 | 2714 | rimraf@^2.2.8: 2715 | version "2.6.1" 2716 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" 2717 | dependencies: 2718 | glob "^7.0.5" 2719 | 2720 | run-async@^2.2.0: 2721 | version "2.3.0" 2722 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 2723 | dependencies: 2724 | is-promise "^2.1.0" 2725 | 2726 | rx-lite-aggregates@^4.0.8: 2727 | version "4.0.8" 2728 | resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" 2729 | dependencies: 2730 | rx-lite "*" 2731 | 2732 | rx-lite@*, rx-lite@^4.0.8: 2733 | version "4.0.8" 2734 | resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" 2735 | 2736 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 2737 | version "5.1.1" 2738 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 2739 | 2740 | "semver@2 || 3 || 4 || 5", semver@^5.3.0: 2741 | version "5.3.0" 2742 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 2743 | 2744 | semver@4.3.2: 2745 | version "4.3.2" 2746 | resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7" 2747 | 2748 | semver@^4.1.0: 2749 | version "4.3.6" 2750 | resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" 2751 | 2752 | sequencify@~0.0.7: 2753 | version "0.0.7" 2754 | resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" 2755 | 2756 | shebang-command@^1.2.0: 2757 | version "1.2.0" 2758 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 2759 | dependencies: 2760 | shebang-regex "^1.0.0" 2761 | 2762 | shebang-regex@^1.0.0: 2763 | version "1.0.0" 2764 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 2765 | 2766 | sigmund@~1.0.0: 2767 | version "1.0.1" 2768 | resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" 2769 | 2770 | signal-exit@^3.0.2: 2771 | version "3.0.2" 2772 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 2773 | 2774 | slash@^1.0.0: 2775 | version "1.0.0" 2776 | resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" 2777 | 2778 | slice-ansi@0.0.4: 2779 | version "0.0.4" 2780 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" 2781 | 2782 | slice-ansi@1.0.0: 2783 | version "1.0.0" 2784 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" 2785 | dependencies: 2786 | is-fullwidth-code-point "^2.0.0" 2787 | 2788 | source-map-support@^0.4.2: 2789 | version "0.4.15" 2790 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" 2791 | dependencies: 2792 | source-map "^0.5.6" 2793 | 2794 | source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.6: 2795 | version "0.5.6" 2796 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" 2797 | 2798 | sparkles@^1.0.0: 2799 | version "1.0.0" 2800 | resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" 2801 | 2802 | spdx-correct@~1.0.0: 2803 | version "1.0.2" 2804 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" 2805 | dependencies: 2806 | spdx-license-ids "^1.0.2" 2807 | 2808 | spdx-expression-parse@~1.0.0: 2809 | version "1.0.4" 2810 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" 2811 | 2812 | spdx-license-ids@^1.0.2: 2813 | version "1.2.2" 2814 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" 2815 | 2816 | split@^1.0.0: 2817 | version "1.0.0" 2818 | resolved "https://registry.yarnpkg.com/split/-/split-1.0.0.tgz#c4395ce683abcd254bc28fe1dabb6e5c27dcffae" 2819 | dependencies: 2820 | through "2" 2821 | 2822 | sprintf-js@~1.0.2: 2823 | version "1.0.3" 2824 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 2825 | 2826 | stream-consume@~0.1.0: 2827 | version "0.1.0" 2828 | resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f" 2829 | 2830 | string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: 2831 | version "2.1.1" 2832 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 2833 | dependencies: 2834 | is-fullwidth-code-point "^2.0.0" 2835 | strip-ansi "^4.0.0" 2836 | 2837 | string_decoder@~0.10.x: 2838 | version "0.10.31" 2839 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 2840 | 2841 | string_decoder@~1.0.3: 2842 | version "1.0.3" 2843 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" 2844 | dependencies: 2845 | safe-buffer "~5.1.0" 2846 | 2847 | strip-ansi@^3.0.0: 2848 | version "3.0.1" 2849 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 2850 | dependencies: 2851 | ansi-regex "^2.0.0" 2852 | 2853 | strip-ansi@^4.0.0: 2854 | version "4.0.0" 2855 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 2856 | dependencies: 2857 | ansi-regex "^3.0.0" 2858 | 2859 | strip-bom@^1.0.0: 2860 | version "1.0.0" 2861 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" 2862 | dependencies: 2863 | first-chunk-stream "^1.0.0" 2864 | is-utf8 "^0.2.0" 2865 | 2866 | strip-bom@^3.0.0: 2867 | version "3.0.0" 2868 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 2869 | 2870 | strip-json-comments@~2.0.1: 2871 | version "2.0.1" 2872 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 2873 | 2874 | supports-color@3.1.2: 2875 | version "3.1.2" 2876 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" 2877 | dependencies: 2878 | has-flag "^1.0.0" 2879 | 2880 | supports-color@^2.0.0: 2881 | version "2.0.0" 2882 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 2883 | 2884 | supports-color@^4.0.0: 2885 | version "4.2.1" 2886 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.2.1.tgz#65a4bb2631e90e02420dba5554c375a4754bb836" 2887 | dependencies: 2888 | has-flag "^2.0.0" 2889 | 2890 | supports-color@^5.3.0: 2891 | version "5.5.0" 2892 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 2893 | dependencies: 2894 | has-flag "^3.0.0" 2895 | 2896 | table@4.0.2: 2897 | version "4.0.2" 2898 | resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" 2899 | dependencies: 2900 | ajv "^5.2.3" 2901 | ajv-keywords "^2.1.0" 2902 | chalk "^2.1.0" 2903 | lodash "^4.17.4" 2904 | slice-ansi "1.0.0" 2905 | string-width "^2.1.1" 2906 | 2907 | table@^4.0.1: 2908 | version "4.0.1" 2909 | resolved "https://registry.yarnpkg.com/table/-/table-4.0.1.tgz#a8116c133fac2c61f4a420ab6cdf5c4d61f0e435" 2910 | dependencies: 2911 | ajv "^4.7.0" 2912 | ajv-keywords "^1.0.0" 2913 | chalk "^1.1.1" 2914 | lodash "^4.0.0" 2915 | slice-ansi "0.0.4" 2916 | string-width "^2.0.0" 2917 | 2918 | text-table@~0.2.0: 2919 | version "0.2.0" 2920 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 2921 | 2922 | through2@^0.6.1: 2923 | version "0.6.5" 2924 | resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" 2925 | dependencies: 2926 | readable-stream ">=1.0.33-1 <1.1.0-0" 2927 | xtend ">=4.0.0 <4.1.0-0" 2928 | 2929 | through2@^2.0.0: 2930 | version "2.0.3" 2931 | resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" 2932 | dependencies: 2933 | readable-stream "^2.1.5" 2934 | xtend "~4.0.1" 2935 | 2936 | through@2, through@^2.3.6: 2937 | version "2.3.8" 2938 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 2939 | 2940 | tildify@^1.0.0: 2941 | version "1.2.0" 2942 | resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" 2943 | dependencies: 2944 | os-homedir "^1.0.0" 2945 | 2946 | time-stamp@^1.0.0: 2947 | version "1.1.0" 2948 | resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" 2949 | 2950 | tmp@^0.0.31: 2951 | version "0.0.31" 2952 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" 2953 | dependencies: 2954 | os-tmpdir "~1.0.1" 2955 | 2956 | to-fast-properties@^1.0.1: 2957 | version "1.0.3" 2958 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" 2959 | 2960 | to-fast-properties@^2.0.0: 2961 | version "2.0.0" 2962 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 2963 | 2964 | trim-right@^1.0.1: 2965 | version "1.0.1" 2966 | resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" 2967 | 2968 | tryit@^1.0.1: 2969 | version "1.0.3" 2970 | resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" 2971 | 2972 | type-check@~0.3.2: 2973 | version "0.3.2" 2974 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 2975 | dependencies: 2976 | prelude-ls "~1.1.2" 2977 | 2978 | type-detect@^4.0.0: 2979 | version "4.0.8" 2980 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" 2981 | 2982 | typedarray@^0.0.6: 2983 | version "0.0.6" 2984 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 2985 | 2986 | unc-path-regex@^0.1.0: 2987 | version "0.1.2" 2988 | resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" 2989 | 2990 | unique-stream@^1.0.0: 2991 | version "1.0.0" 2992 | resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" 2993 | 2994 | user-home@^1.1.1: 2995 | version "1.1.1" 2996 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" 2997 | 2998 | util-deprecate@~1.0.1: 2999 | version "1.0.2" 3000 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 3001 | 3002 | v8flags@^2.0.2: 3003 | version "2.1.1" 3004 | resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" 3005 | dependencies: 3006 | user-home "^1.1.1" 3007 | 3008 | validate-npm-package-license@^3.0.1: 3009 | version "3.0.1" 3010 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" 3011 | dependencies: 3012 | spdx-correct "~1.0.0" 3013 | spdx-expression-parse "~1.0.0" 3014 | 3015 | vinyl-fs@^0.3.0: 3016 | version "0.3.14" 3017 | resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" 3018 | dependencies: 3019 | defaults "^1.0.0" 3020 | glob-stream "^3.1.5" 3021 | glob-watcher "^0.0.6" 3022 | graceful-fs "^3.0.0" 3023 | mkdirp "^0.5.0" 3024 | strip-bom "^1.0.0" 3025 | through2 "^0.6.1" 3026 | vinyl "^0.4.0" 3027 | 3028 | vinyl-sourcemaps-apply@^0.2.0: 3029 | version "0.2.1" 3030 | resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" 3031 | dependencies: 3032 | source-map "^0.5.1" 3033 | 3034 | vinyl@^0.4.0: 3035 | version "0.4.6" 3036 | resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" 3037 | dependencies: 3038 | clone "^0.2.0" 3039 | clone-stats "^0.0.1" 3040 | 3041 | vinyl@^0.5.0: 3042 | version "0.5.3" 3043 | resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" 3044 | dependencies: 3045 | clone "^1.0.0" 3046 | clone-stats "^0.0.1" 3047 | replace-ext "0.0.1" 3048 | 3049 | which@^1.2.12, which@^1.2.9: 3050 | version "1.2.14" 3051 | resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" 3052 | dependencies: 3053 | isexe "^2.0.0" 3054 | 3055 | wordwrap@~1.0.0: 3056 | version "1.0.0" 3057 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 3058 | 3059 | wrappy@1: 3060 | version "1.0.2" 3061 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 3062 | 3063 | write@^0.2.1: 3064 | version "0.2.1" 3065 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 3066 | dependencies: 3067 | mkdirp "^0.5.1" 3068 | 3069 | "xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.1: 3070 | version "4.0.1" 3071 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 3072 | 3073 | yallist@^2.1.2: 3074 | version "2.1.2" 3075 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 3076 | --------------------------------------------------------------------------------