diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index d072e181..00000000 --- a/.eslintrc +++ /dev/null @@ -1,29 +0,0 @@ -{ - "extends": [ - "eslint:recommended", - "eslint-config-airbnb-base", - "plugin:import/errors", - "plugin:import/warnings" - ], - "parser": "babel-eslint", - "env": { - "node": true, - "mocha": true - }, - "rules": { - "no-console": 0, - "no-underscore-dangle": 0, - "quote-props": [2, "consistent-as-needed"], - "comma-dangle": ["error", { - "arrays": "always-multiline", - "objects": "always-multiline", - "imports": "always-multiline", - "exports": "always-multiline", - "functions": "ignore" - }], - "function-paren-newline": 0 - }, - "plugins": [ - "import" - ] -} diff --git a/bin/node-pg-migrate b/bin/node-pg-migrate index 2c5a9f6c..f44100c6 100755 --- a/bin/node-pg-migrate +++ b/bin/node-pg-migrate @@ -1,164 +1,166 @@ #!/usr/bin/env node /* eslint-disable strict,prefer-destructuring */ -'use strict'; +"use strict"; -const util = require('util'); -const path = require('path'); -const yargs = require('yargs'); -const Migration = require('../dist/migration').default; // eslint-disable-line import/no-unresolved,import/extensions -const runner = require('../dist/runner'); // eslint-disable-line import/no-unresolved,import/extensions +const util = require("util"); +const path = require("path"); +const yargs = require("yargs"); +const Migration = require("../dist/migration").default; // eslint-disable-line import/no-unresolved,import/extensions +const runner = require("../dist/runner"); // eslint-disable-line import/no-unresolved,import/extensions const migrationRunner = runner.default; const unlockRunner = runner.unlockRunner; -process.on('uncaughtException', (err) => { +process.on("uncaughtException", err => { console.log(err.stack); process.exit(1); }); try { - require('dotenv').load({ silent: true }); // eslint-disable-line global-require,import/no-extraneous-dependencies + require("dotenv").load({ silent: true }); // eslint-disable-line global-require,import/no-extraneous-dependencies } catch (err) { - if (err.code !== 'MODULE_NOT_FOUND') { + if (err.code !== "MODULE_NOT_FOUND") { throw err; } } -const schemaArg = 'schema'; -const createSchemaArg = 'create-schema'; -const databaseUrlVarArg = 'database-url-var'; -const migrationsDirArg = 'migrations-dir'; -const migrationsTableArg = 'migrations-table'; -const migrationsSchemaArg = 'migrations-schema'; -const createMigrationsSchemaArg = 'create-migrations-schema'; -const migrationFileLanguageArg = 'migration-file-language'; -const checkOrderArg = 'check-order'; -const configValueArg = 'config-value'; -const configFileArg = 'config-file'; -const ignorePatternArg = 'ignore-pattern'; -const singleTransactionArg = 'single-transaction'; -const lockArg = 'lock'; -const timestampArg = 'timestamp'; -const dryRunArg = 'dry-run'; +const schemaArg = "schema"; +const createSchemaArg = "create-schema"; +const databaseUrlVarArg = "database-url-var"; +const migrationsDirArg = "migrations-dir"; +const migrationsTableArg = "migrations-table"; +const migrationsSchemaArg = "migrations-schema"; +const createMigrationsSchemaArg = "create-migrations-schema"; +const migrationFileLanguageArg = "migration-file-language"; +const checkOrderArg = "check-order"; +const configValueArg = "config-value"; +const configFileArg = "config-file"; +const ignorePatternArg = "ignore-pattern"; +const singleTransactionArg = "single-transaction"; +const lockArg = "lock"; +const timestampArg = "timestamp"; +const dryRunArg = "dry-run"; const argv = yargs - .usage('Usage: $0 [up|down|create|unlock|redo] [migrationName] [options]') + .usage("Usage: $0 [up|down|create|unlock|redo] [migrationName] [options]") - .option('d', { + .option("d", { alias: databaseUrlVarArg, - default: 'DATABASE_URL', - describe: 'Name of env variable where is set the databaseUrl', - type: 'string', + default: "DATABASE_URL", + describe: "Name of env variable where is set the databaseUrl", + type: "string" }) - .option('m', { + .option("m", { alias: migrationsDirArg, default: `${process.cwd()}/migrations`, - defaultDescription: 'migrations', - describe: 'The directory containing your migration files', - type: 'string', + defaultDescription: "migrations", + describe: "The directory containing your migration files", + type: "string" }) - .option('t', { + .option("t", { alias: migrationsTableArg, - default: 'pgmigrations', - describe: 'The table storing which migrations have been run', - type: 'string', + default: "pgmigrations", + describe: "The table storing which migrations have been run", + type: "string" }) - .option('s', { + .option("s", { alias: schemaArg, - default: 'public', - describe: 'The schema on which migration will be run (defaults to `public`)', - type: 'string', + default: "public", + describe: + "The schema on which migration will be run (defaults to `public`)", + type: "string" }) .option(createSchemaArg, { default: false, - describe: 'Creates the configured schema if it doesn\'t exist', - type: 'boolean', + describe: "Creates the configured schema if it doesn't exist", + type: "boolean" }) .option(migrationsSchemaArg, { default: undefined, defaultDescription: 'Same as "schema"', - describe: 'The schema storing table which migrations have been run', - type: 'string', + describe: "The schema storing table which migrations have been run", + type: "string" }) .option(createMigrationsSchemaArg, { default: false, - describe: 'Creates the configured migration schema if it doesn\'t exist', - type: 'boolean', + describe: "Creates the configured migration schema if it doesn't exist", + type: "boolean" }) .option(dryRunArg, { default: false, - describe: 'Prints the SQL but doesn\'t run it', - type: 'boolean', + describe: "Prints the SQL but doesn't run it", + type: "boolean" }) .option(checkOrderArg, { default: true, - describe: 'Check order of migrations before running them', - type: 'boolean', + describe: "Check order of migrations before running them", + type: "boolean" }) .option(ignorePatternArg, { - default: '', - describe: 'Regex pattern for file names to ignore', - type: 'string', + default: "", + describe: "Regex pattern for file names to ignore", + type: "string" }) - .option('i', { - alias: 'version', + .option("i", { + alias: "version", default: false, - describe: 'Print version info', - type: 'boolean', + describe: "Print version info", + type: "boolean" }) .option(configValueArg, { - default: 'db', - describe: 'Name of config section with db options', - type: 'string', + default: "db", + describe: "Name of config section with db options", + type: "string" }) - .option('f', { + .option("f", { alias: configFileArg, default: undefined, - describe: 'Name of config file with db options', - type: 'string', + describe: "Name of config file with db options", + type: "string" }) - .option('j', { + .option("j", { alias: migrationFileLanguageArg, - default: 'js', - choices: ['js', 'ts'], - describe: 'Language of the migration file (Only valid with the create action)', - type: 'string', + default: "js", + choices: ["js", "ts"], + describe: + "Language of the migration file (Only valid with the create action)", + type: "string" }) .option(singleTransactionArg, { default: true, - describe: 'Combines all pending migrations into a single database transaction so that if any migration fails, all will be rolled back', - type: 'boolean', + describe: + "Combines all pending migrations into a single database transaction so that if any migration fails, all will be rolled back", + type: "boolean" }) .option(lockArg, { default: true, - describe: 'When false, disables locking mechanism and checks', - type: 'boolean', + describe: "When false, disables locking mechanism and checks", + type: "boolean" }) .option(timestampArg, { default: false, - describe: 'Treats number argument to up/down migration as timestamp', - type: 'boolean', + describe: "Treats number argument to up/down migration as timestamp", + type: "boolean" }) - .help() - .argv; + .help().argv; if (argv.version) { console.log(module.exports.version); @@ -183,21 +185,27 @@ let CHECK_ORDER = argv[checkOrderArg]; const TIMESTAMP = argv[timestampArg]; function readJson(json) { - if (typeof json === 'object') { + if (typeof json === "object") { SCHEMA = json[schemaArg] || SCHEMA; CREATE_SCHEMA = json[createSchemaArg] || CREATE_SCHEMA; MIGRATIONS_DIR = json[migrationsDirArg] || MIGRATIONS_DIR; MIGRATIONS_SCHEMA = json[migrationsSchemaArg] || MIGRATIONS_SCHEMA; - CREATE_MIGRATIONS_SCHEMA = json[createMigrationsSchemaArg] || CREATE_MIGRATIONS_SCHEMA; + CREATE_MIGRATIONS_SCHEMA = + json[createMigrationsSchemaArg] || CREATE_MIGRATIONS_SCHEMA; MIGRATIONS_TABLE = json[migrationsTableArg] || MIGRATIONS_TABLE; - MIGRATIONS_FILE_LANGUAGE = json[migrationFileLanguageArg] || MIGRATIONS_FILE_LANGUAGE; - CHECK_ORDER = typeof json[checkOrderArg] !== 'undefined' ? json[checkOrderArg] : CHECK_ORDER; + MIGRATIONS_FILE_LANGUAGE = + json[migrationFileLanguageArg] || MIGRATIONS_FILE_LANGUAGE; + CHECK_ORDER = + typeof json[checkOrderArg] !== "undefined" + ? json[checkOrderArg] + : CHECK_ORDER; IGNORE_PATTERN = json[ignorePatternArg] || IGNORE_PATTERN; if (json.url) { DATABASE_URL = json.url; } else if (json.host || json.port || json.name || json.database) { - const creds = `${json.user}${json.password ? `:${json.password}` : ''}`; - DATABASE_URL = `postgres://${creds ? `${creds}@` : ''}${json.host || 'localhost'}:${json.port || 5432}/${json.name || json.database}`; + const creds = `${json.user}${json.password ? `:${json.password}` : ""}`; + DATABASE_URL = `postgres://${creds ? `${creds}@` : ""}${json.host || + "localhost"}:${json.port || 5432}/${json.name || json.database}`; } } else { DATABASE_URL = json || DATABASE_URL; @@ -208,76 +216,84 @@ try { // Load config (and suppress the no-config-warning) const oldSuppressWarning = process.env.SUPPRESS_NO_CONFIG_WARNING; process.env.SUPPRESS_NO_CONFIG_WARNING = 1; - const config = require('config'); // eslint-disable-line global-require,import/no-extraneous-dependencies + const config = require("config"); // eslint-disable-line global-require,import/no-extraneous-dependencies if (config.has(argv[configValueArg])) { const db = config.get(argv[configValueArg]); readJson(db); } process.env.SUPPRESS_NO_CONFIG_WARNING = oldSuppressWarning; } catch (err) { - if (err.code !== 'MODULE_NOT_FOUND') { + if (err.code !== "MODULE_NOT_FOUND") { throw err; } } const configFileName = argv[configFileArg]; if (configFileName) { - // eslint-disable-next-line global-require,import/no-dynamic-require + // eslint-disable-next-line global-require,import/no-dynamic-require,security/detect-non-literal-require const config = require(path.resolve(configFileName)); readJson(config); } const action = argv._.shift(); -if (action === 'create') { +if (action === "create") { // replaces spaces with dashes - should help fix some errors - let newMigrationName = argv._.length ? argv._.join('-') : ''; + let newMigrationName = argv._.length ? argv._.join("-") : ""; // forces use of dashes in names - keep thing clean - newMigrationName = newMigrationName.replace(/_ /g, '-'); + newMigrationName = newMigrationName.replace(/_ /g, "-"); if (!newMigrationName) { - console.log('\'migrationName\' is required.'); + console.log("'migrationName' is required."); yargs.showHelp(); process.exit(1); } - const migration = Migration.create(newMigrationName, MIGRATIONS_DIR, MIGRATIONS_FILE_LANGUAGE); - console.log(util.format('Created migration -- %s', migration.path)); -} else if (action === 'unlock') { + const migration = Migration.create( + newMigrationName, + MIGRATIONS_DIR, + MIGRATIONS_FILE_LANGUAGE + ); + console.log(util.format("Created migration -- %s", migration.path)); +} else if (action === "unlock") { if (!DATABASE_URL) { - console.error(`The $${argv[databaseUrlVarArg]} environment variable is not set.`); + console.error( + `The $${argv[databaseUrlVarArg]} environment variable is not set.` + ); process.exit(1); } unlockRunner({ databaseUrl: DATABASE_URL, schema: SCHEMA, migrationsSchema: MIGRATIONS_SCHEMA, - migrationsTable: MIGRATIONS_TABLE, + migrationsTable: MIGRATIONS_TABLE }) .then(() => { - console.log('Unlocked!'); + console.log("Unlocked!"); process.exit(0); }) - .catch((err) => { + .catch(err => { console.log(err.stack); process.exit(1); }); -} else if (action === 'up' || action === 'down' || action === 'redo') { +} else if (action === "up" || action === "down" || action === "redo") { if (!DATABASE_URL) { - console.error(`The $${argv[databaseUrlVarArg]} environment variable is not set.`); + console.error( + `The $${argv[databaseUrlVarArg]} environment variable is not set.` + ); process.exit(1); } const dryRun = argv[dryRunArg]; if (dryRun) { - console.log('dry run'); + console.log("dry run"); } const singleTransaction = argv[singleTransactionArg]; const noLock = !argv[lockArg]; if (noLock) { - console.log('no lock'); + console.log("no lock"); } const updownArg = argv._.length ? argv._[0] : null; @@ -285,10 +301,11 @@ if (action === 'create') { let migrationName; if (updownArg !== null) { - if (parseInt(updownArg, 10) == updownArg) { // eslint-disable-line eqeqeq + // eslint-disable-next-line eqeqeq + if (parseInt(updownArg, 10) == updownArg) { numMigrations = parseInt(updownArg, 10); } else { - migrationName = argv._.join('-').replace(/_ /g, '-'); + migrationName = argv._.join("-").replace(/_ /g, "-"); } } @@ -311,28 +328,31 @@ if (action === 'create') { createMigrationsSchema: CREATE_MIGRATIONS_SCHEMA, direction, singleTransaction, - noLock, + noLock }; }; - const promise = action === 'redo' - ? migrationRunner(options('down')).then(() => migrationRunner(options('up', Infinity, false))) - : migrationRunner(options(action)); + const promise = + action === "redo" + ? migrationRunner(options("down")).then(() => + migrationRunner(options("up", Infinity, false)) + ) + : migrationRunner(options(action)); promise .then(() => { - console.log('Migrations complete!'); + console.log("Migrations complete!"); process.exit(0); }) - .catch((err) => { + .catch(err => { console.log(err.stack); process.exit(1); }); } else { - console.log('Invalid Action: Must be [up|down|create|unlock|redo].'); + console.log("Invalid Action: Must be [up|down|create|unlock|redo]."); yargs.showHelp(); process.exit(1); } -if (argv['force-exit']) { - console.log('Forcing exit'); +if (argv["force-exit"]) { + console.log("Forcing exit"); process.exit(0); } diff --git a/eslintrc.js b/eslintrc.js new file mode 100644 index 00000000..a426fde6 --- /dev/null +++ b/eslintrc.js @@ -0,0 +1,27 @@ +module.exports = { + extends: [ + "eslint:recommended", + "eslint-config-airbnb-base", + "plugin:import/errors", + "plugin:import/warnings", + "plugin:security/recommended", + "plugin:prettier/recommended" + ], + parser: "babel-eslint", + env: { + node: true, + mocha: true + }, + rules: { + "no-console": 0, + "no-underscore-dangle": 0, + "security/detect-object-injection": 0, + "import/no-extraneous-dependencies": [ + "error", + { + devDependencies: ["mocha.bootstrap.js", "/test/**"] + } + ] + }, + plugins: ["import", "security"] +}; diff --git a/lib/db.js b/lib/db.js index c4e1998d..4b15c98c 100644 --- a/lib/db.js +++ b/lib/db.js @@ -2,7 +2,7 @@ This file just manages the database connection and provides a query method */ -import pg from 'pg'; +import pg from "pg"; // or native libpq bindings // import pg from 'pg/native'; @@ -11,34 +11,33 @@ export default (connectionString, log = console.error) => { let clientActive = false; const beforeCloseListeners = []; - const createConnection = () => ( + const createConnection = () => clientActive ? Promise.resolve() - : client.connect() - .then(() => { - clientActive = true; - }) - .catch((err) => { - log('could not connect to postgres', err); - throw err; - }) - ); + : client + .connect() + .then(() => { + clientActive = true; + }) + .catch(err => { + log("could not connect to postgres", err); + throw err; + }); const query = (...args) => createConnection() - .then(() => - client.query(...args) - ) - .catch((err) => { + .then(() => client.query(...args)) + .catch(err => { const { message, position } = err; const string = args[0].text || args[0]; if (message && position >= 1) { - const endLineWrapIndexOf = string.indexOf('\n', position); - const endLineWrapPos = endLineWrapIndexOf >= 0 ? endLineWrapIndexOf : string.length; + const endLineWrapIndexOf = string.indexOf("\n", position); + const endLineWrapPos = + endLineWrapIndexOf >= 0 ? endLineWrapIndexOf : string.length; const stringStart = string.substring(0, endLineWrapPos); const stringEnd = string.substr(endLineWrapPos); - const startLineWrapPos = stringStart.lastIndexOf('\n') + 1; - const padding = ' '.repeat(position - startLineWrapPos - 1); + const startLineWrapPos = stringStart.lastIndexOf("\n") + 1; + const padding = " ".repeat(position - startLineWrapPos - 1); log(`Error executing: ${stringStart} ${padding}^^^^${stringEnd} @@ -54,12 +53,9 @@ ${err} throw err; }); - const select = string => - query(string) - .then(result => result && result.rows); + const select = string => query(string).then(result => result && result.rows); const column = (string, columnName) => - select(string) - .then(rows => rows.map(r => r[columnName])); + select(string).then(rows => rows.map(r => r[columnName])); return { query, @@ -72,11 +68,7 @@ ${err} beforeCloseListeners .reduce( (promise, listener) => - promise - .then(listener) - .catch(err => - log(err.stack || err) - ), + promise.then(listener).catch(err => log(err.stack || err)), Promise.resolve() ) .then(() => { @@ -84,6 +76,6 @@ ${err} if (client) { client.end(); } - }), + }) }; }; diff --git a/lib/migration-builder.js b/lib/migration-builder.js index c66eb3a8..08b936e5 100644 --- a/lib/migration-builder.js +++ b/lib/migration-builder.js @@ -9,23 +9,23 @@ and it makes inference of down migrations possible. */ -import { PgLiteral } from './utils'; - -import * as extensions from './operations/extensions'; -import * as indexes from './operations/indexes'; -import * as tables from './operations/tables'; -import * as types from './operations/types'; -import * as roles from './operations/roles'; -import * as functions from './operations/functions'; -import * as triggers from './operations/triggers'; -import * as schemas from './operations/schemas'; -import * as domains from './operations/domains'; -import * as sequences from './operations/sequences'; -import * as operators from './operations/operators'; -import * as policies from './operations/policies'; -import * as other from './operations/other'; - -export default class MigrationBuilder { +import { PgLiteral } from "./utils"; + +import * as extensions from "./operations/extensions"; +import * as indexes from "./operations/indexes"; +import * as tables from "./operations/tables"; +import * as types from "./operations/types"; +import * as roles from "./operations/roles"; +import * as functions from "./operations/functions"; +import * as triggers from "./operations/triggers"; +import * as schemas from "./operations/schemas"; +import * as domains from "./operations/domains"; +import * as sequences from "./operations/sequences"; +import * as operators from "./operations/operators"; +import * as policies from "./operations/policies"; +import * as other from "./operations/other"; /* ?!?!?! */ + +/* eslint-disable security/detect-non-literal-fs-filename */ export default class MigrationBuilder { constructor(typeShorthands, db) { this._steps = []; this._REVERSE_MODE = false; @@ -36,13 +36,11 @@ export default class MigrationBuilder { // calls the operation or its reverse, and appends the result (array of sql statements) // to the steps array const wrap = operation => (...args) => { - if (this._REVERSE_MODE && typeof operation.reverse !== 'function') { - throw new Error('Impossible to automatically infer down migration'); + if (this._REVERSE_MODE && typeof operation.reverse !== "function") { + throw new Error("Impossible to automatically infer down migration"); } this._steps = this._steps.concat( - this._REVERSE_MODE - ? operation.reverse(...args) - : operation(...args) + this._REVERSE_MODE ? operation.reverse(...args) : operation(...args) ); }; @@ -112,14 +110,20 @@ export default class MigrationBuilder { this.createOperator = wrap(operators.createOperator); this.dropOperator = wrap(operators.dropOperator); - this.createOperatorClass = wrap(operators.createOperatorClass(typeShorthands)); + this.createOperatorClass = wrap( + operators.createOperatorClass(typeShorthands) + ); this.dropOperatorClass = wrap(operators.dropOperatorClass); this.renameOperatorClass = wrap(operators.renameOperatorClass); this.createOperatorFamily = wrap(operators.createOperatorFamily); this.dropOperatorFamily = wrap(operators.dropOperatorFamily); this.renameOperatorFamily = wrap(operators.renameOperatorFamily); - this.addToOperatorFamily = wrap(operators.addToOperatorFamily(typeShorthands)); - this.removeFromOperatorFamily = wrap(operators.removeFromOperatorFamily(typeShorthands)); // eslint-disable-line max-len + this.addToOperatorFamily = wrap( + operators.addToOperatorFamily(typeShorthands) + ); + this.removeFromOperatorFamily = wrap( + operators.removeFromOperatorFamily(typeShorthands) + ); this.createPolicy = wrap(policies.create); this.dropPolicy = wrap(policies.drop); @@ -136,13 +140,13 @@ export default class MigrationBuilder { // expose DB so we can access database within transaction const wrapDB = operation => (...args) => { if (this._REVERSE_MODE) { - throw new Error('Impossible to automatically infer down migration'); + throw new Error("Impossible to automatically infer down migration"); } return operation(...args); }; this.db = { query: wrapDB(db.query), - select: wrapDB(db.select), + select: wrapDB(db.select) }; } @@ -161,7 +165,7 @@ export default class MigrationBuilder { } getSql() { - return `${this.getSqlSteps().join('\n')}\n`; + return `${this.getSqlSteps().join("\n")}\n`; } getSqlSteps() { @@ -169,3 +173,4 @@ export default class MigrationBuilder { return this._REVERSE_MODE ? this._steps.slice().reverse() : this._steps; } } +/* eslint-enable security/detect-non-literal-fs-filename */ diff --git a/lib/migration.js b/lib/migration.js index 3e0134b1..0a544224 100644 --- a/lib/migration.js +++ b/lib/migration.js @@ -6,14 +6,14 @@ */ -import fs from 'fs'; -import mkdirp from 'mkdirp'; -import path from 'path'; +import fs from "fs"; +import mkdirp from "mkdirp"; +import path from "path"; -import MigrationBuilder from './migration-builder'; -import { getMigrationTableSchema } from './utils'; +import MigrationBuilder from "./migration-builder"; +import { getMigrationTableSchema } from "./utils"; -const SEPARATOR = '_'; +const SEPARATOR = "_"; class Migration { // class method that creates a new migration file by cloning the migration template @@ -25,14 +25,23 @@ class Migration { const newFile = `${directory}/${Date.now()}${SEPARATOR}${name}.${language}`; // copy the default migration template to the new file location - fs.createReadStream(path.resolve(__dirname, `./migration-template.${language}`)) - .pipe(fs.createWriteStream(newFile)); + fs // eslint-disable-line security/detect-non-literal-fs-filename + .createReadStream( + path.resolve(__dirname, `./migration-template.${language}`) + ) + .pipe(fs.createWriteStream(newFile)); // eslint-disable-line security/detect-non-literal-fs-filename return new Migration(newFile, directory); } - // eslint-disable-next-line max-len - constructor(db, migrationPath, { up, down } = {}, options = {}, typeShorthands, log = console.log) { + constructor( + db, + migrationPath, + { up, down } = {}, + options = {}, + typeShorthands, + log = console.log + ) { this.db = db; this.path = migrationPath; this.name = path.basename(migrationPath, path.extname(migrationPath)); @@ -51,7 +60,11 @@ class Migration { } else { const result = action(pgm); // result conforms to Promises/A+ spec - if (result && typeof result === 'object' && typeof result.then === 'function') { + if ( + result && + typeof result === "object" && + typeof result.then === "function" + ) { result.then(resolve).catch(reject); } else { resolve(); @@ -64,33 +77,44 @@ class Migration { switch (action) { case this.down: this.log(`### MIGRATION ${this.name} (DOWN) ###`); - sqlSteps.push(`DELETE FROM "${schema}"."${this.options.migrationsTable}" WHERE name='${this.name}';`); + sqlSteps.push( + `DELETE FROM "${schema}"."${ + this.options.migrationsTable + }" WHERE name='${this.name}';` + ); break; case this.up: this.log(`### MIGRATION ${this.name} (UP) ###`); - sqlSteps.push(`INSERT INTO "${schema}"."${this.options.migrationsTable}" (name, run_on) VALUES ('${this.name}', NOW());`); + sqlSteps.push( + `INSERT INTO "${schema}"."${ + this.options.migrationsTable + }" (name, run_on) VALUES ('${this.name}', NOW());` + ); break; default: - throw new Error('Unknown direction'); + throw new Error("Unknown direction"); } if (!this.options.singleTransaction && pgm.isUsingTransaction()) { // if not in singleTransaction mode we need to create our own transaction - sqlSteps.unshift('BEGIN;'); - sqlSteps.push('COMMIT;'); + sqlSteps.unshift("BEGIN;"); + sqlSteps.push("COMMIT;"); } else if (this.options.singleTransaction && !pgm.isUsingTransaction()) { // in singleTransaction mode we are already wrapped in a global transaction - this.log('#> WARNING: Need to break single transaction! <'); - sqlSteps.unshift('COMMIT;'); - sqlSteps.push('BEGIN;'); + this.log("#> WARNING: Need to break single transaction! <"); + sqlSteps.unshift("COMMIT;"); + sqlSteps.push("BEGIN;"); } else if (!this.options.singleTransaction || !pgm.isUsingTransaction()) { - this.log('#> WARNING: This migration is not wrapped in a transaction! <'); + this.log( + "#> WARNING: This migration is not wrapped in a transaction! <" + ); } - this.log(`${sqlSteps.join('\n')}\n\n`); + this.log(`${sqlSteps.join("\n")}\n\n`); return sqlSteps.reduce( - (promise, sql) => promise.then(() => this.options.dryRun || this.db.query(sql)), + (promise, sql) => + promise.then(() => this.options.dryRun || this.db.query(sql)), Promise.resolve() ); }); @@ -106,7 +130,9 @@ class Migration { const pgm = new MigrationBuilder(this.typeShorthands, this.db); if (this.down === false) { - return Promise.reject(new Error(`User has disabled down migration on file: ${this.name}`)); + return Promise.reject( + new Error(`User has disabled down migration on file: ${this.name}`) + ); } else if (this.down === undefined) { // automatically infer the down migration by running the up migration in reverse mode... pgm.enableReverseMode(); diff --git a/lib/operations/domains.js b/lib/operations/domains.js index d0cf6ed6..2ea55519 100644 --- a/lib/operations/domains.js +++ b/lib/operations/domains.js @@ -1,16 +1,18 @@ -import { template, applyType, escapeValue } from '../utils'; +import { template, applyType, escapeValue } from "../utils"; export const drop = (domainName, { ifExists, cascade } = {}) => - template`DROP DOMAIN${ifExists ? ' IF EXISTS' : ''} "${domainName}"${cascade ? ' CASCADE' : ''};`; + template`DROP DOMAIN${ifExists ? " IF EXISTS" : ""} "${domainName}"${ + cascade ? " CASCADE" : "" + };`; -export const create = (typeShorthands) => { +export const create = typeShorthands => { const _create = (domainName, type, options) => { const { default: defaultValue, collation, notNull, check, - constraintName, + constraintName } = options; const constraints = []; if (collation) { @@ -26,15 +28,19 @@ export const create = (typeShorthands) => { constraints.push(`CONSTRAINT ${constraintName}`); } if (notNull) { - constraints.push('NOT NULL'); + constraints.push("NOT NULL"); } else if (check) { constraints.push(`CHECK (${check})`); } } - const constraintsString = constraints.length ? ` ${constraints.join(' ')}` : ''; + const constraintsString = constraints.length + ? ` ${constraints.join(" ")}` + : ""; - return template`CREATE DOMAIN "${domainName}" AS ${applyType(type, typeShorthands).type}${constraintsString};`; + return template`CREATE DOMAIN "${domainName}" AS ${ + applyType(type, typeShorthands).type + }${constraintsString};`; }; _create.reverse = (domainName, type, options) => drop(domainName, options); return _create; @@ -46,24 +52,28 @@ export const alter = (domainName, options) => { notNull, allowNull, check, - constraintName, + constraintName } = options; const actions = []; if (defaultValue === null) { - actions.push('DROP DEFAULT'); + actions.push("DROP DEFAULT"); } else if (defaultValue !== undefined) { actions.push(`SET DEFAULT ${escapeValue(defaultValue)}`); } if (notNull) { - actions.push('SET NOT NULL'); + actions.push("SET NOT NULL"); } else if (notNull === false || allowNull) { - actions.push('DROP NOT NULL'); + actions.push("DROP NOT NULL"); } if (check) { - actions.push(`${constraintName ? `CONSTRAINT ${constraintName} ` : ''}CHECK (${check})`); + actions.push( + `${constraintName ? `CONSTRAINT ${constraintName} ` : ""}CHECK (${check})` + ); } - return `${actions.map(action => template`ALTER DOMAIN "${domainName}" ${action}`).join(';\n')};`; + return `${actions + .map(action => template`ALTER DOMAIN "${domainName}" ${action}`) + .join(";\n")};`; }; // RENAME diff --git a/lib/operations/extensions.js b/lib/operations/extensions.js index 1fa88234..0dc91f17 100644 --- a/lib/operations/extensions.js +++ b/lib/operations/extensions.js @@ -1,14 +1,26 @@ -import _ from 'lodash'; -import { template } from '../utils'; +import _ from "lodash"; +import { template } from "../utils"; export const create = (extensions, { ifNotExists }) => { if (!_.isArray(extensions)) extensions = [extensions]; // eslint-disable-line no-param-reassign - return _.map(extensions, extension => template`CREATE EXTENSION${ifNotExists ? ' IF NOT EXISTS' : ''} "${extension}";`); + return _.map( + extensions, + extension => + template`CREATE EXTENSION${ + ifNotExists ? " IF NOT EXISTS" : "" + } "${extension}";` + ); }; export const drop = (extensions, { ifExists, cascade } = {}) => { if (!_.isArray(extensions)) extensions = [extensions]; // eslint-disable-line no-param-reassign - return _.map(extensions, extension => template`DROP EXTENSION${ifExists ? ' IF EXISTS' : ''} "${extension}"${cascade ? ' CASCADE' : ''};`); + return _.map( + extensions, + extension => + template`DROP EXTENSION${ifExists ? " IF EXISTS" : ""} "${extension}"${ + cascade ? " CASCADE" : "" + };` + ); }; // setup reverse functions diff --git a/lib/operations/functions.js b/lib/operations/functions.js index ad917b79..c0abaaf0 100644 --- a/lib/operations/functions.js +++ b/lib/operations/functions.js @@ -1,19 +1,31 @@ -import { template, escapeValue, formatParams } from '../utils'; +import { template, escapeValue, formatParams } from "../utils"; -export const drop = typeShorthands => - (functionName, functionParams = [], { ifExists, cascade } = {}) => - template`DROP FUNCTION${ifExists ? ' IF EXISTS' : ''} "${functionName}"${formatParams(functionParams, typeShorthands)}${cascade ? ' CASCADE' : ''};`; +export const drop = typeShorthands => ( + functionName, + functionParams = [], + { ifExists, cascade } = {} +) => + template`DROP FUNCTION${ + ifExists ? " IF EXISTS" : "" + } "${functionName}"${formatParams(functionParams, typeShorthands)}${ + cascade ? " CASCADE" : "" + };`; -export const create = (typeShorthands) => { - const _create = (functionName, functionParams = [], functionOptions = {}, definition) => { +export const create = typeShorthands => { + const _create = ( + functionName, + functionParams = [], + functionOptions = {}, + definition + ) => { const { replace, - returns = 'void', + returns = "void", language, window, - behavior = 'VOLATILE', + behavior = "VOLATILE", onNull, - parallel = 'UNSAFE', + parallel = "UNSAFE" } = functionOptions; const options = []; if (behavior) { @@ -22,22 +34,26 @@ export const create = (typeShorthands) => { if (language) { options.push(`LANGUAGE ${language}`); } else { - throw new Error(`Language for function ${functionName} have to be specified`); + throw new Error( + `Language for function ${functionName} have to be specified` + ); } if (window) { - options.push('WINDOW'); + options.push("WINDOW"); } if (onNull) { - options.push('RETURNS NULL ON NULL INPUT'); + options.push("RETURNS NULL ON NULL INPUT"); } if (parallel) { options.push(`PARALLEL ${parallel}`); } - return template`CREATE${replace ? ' OR REPLACE' : ''} FUNCTION "${functionName}"${formatParams(functionParams, typeShorthands)} + return template`CREATE${ + replace ? " OR REPLACE" : "" + } FUNCTION "${functionName}"${formatParams(functionParams, typeShorthands)} RETURNS ${returns} AS ${escapeValue(definition)} - ${options.join('\n ')};`; + ${options.join("\n ")};`; }; _create.reverse = drop(typeShorthands); @@ -45,9 +61,12 @@ export const create = (typeShorthands) => { return _create; }; -export const rename = (typeShorthands) => { +export const rename = typeShorthands => { const _rename = (oldFunctionName, functionParams = [], newFunctionName) => - template`ALTER FUNCTION "${oldFunctionName}"${formatParams(functionParams, typeShorthands)} RENAME TO "${newFunctionName}";`; + template`ALTER FUNCTION "${oldFunctionName}"${formatParams( + functionParams, + typeShorthands + )} RENAME TO "${newFunctionName}";`; _rename.reverse = (oldFunctionName, functionParams, newFunctionName) => _rename(newFunctionName, functionParams, oldFunctionName); diff --git a/lib/operations/indexes.js b/lib/operations/indexes.js index 1757b373..840a8b3d 100644 --- a/lib/operations/indexes.js +++ b/lib/operations/indexes.js @@ -1,19 +1,20 @@ -import _ from 'lodash'; -import { template } from '../utils'; +import _ from "lodash"; +import { template } from "../utils"; function generateIndexName(table, columns, options) { - const tableName = typeof table === 'object' - ? table.name - : table; + const tableName = typeof table === "object" ? table.name : table; return options.name ? options.name - : template`${tableName}_${_.isArray(columns) ? columns.join('_') : columns}${options.unique ? '_unique' : ''}_index`; + : template`${tableName}_${ + _.isArray(columns) ? columns.join("_") : columns + }${options.unique ? "_unique" : ""}_index`; } function generateColumnString(column) { - const openingBracketPos = column.indexOf('('); - const closingBracketPos = column.indexOf(')'); - const isFunction = openingBracketPos >= 0 && closingBracketPos > openingBracketPos; + const openingBracketPos = column.indexOf("("); + const closingBracketPos = column.indexOf(")"); + const isFunction = + openingBracketPos >= 0 && closingBracketPos > openingBracketPos; return isFunction ? column // expression : template`"${column}"`; // single column @@ -21,7 +22,7 @@ function generateColumnString(column) { function generateColumnsString(columns) { return _.isArray(columns) - ? columns.map(generateColumnString).join(', ') + ? columns.map(generateColumnString).join(", ") : generateColumnString(columns); } @@ -38,21 +39,21 @@ export const create = (tableName, columns, options = {}) => { */ const indexName = generateIndexName(tableName, columns, options); const columnsString = generateColumnsString(columns); - const unique = options.unique ? ' UNIQUE ' : ''; - const concurrently = options.concurrently ? ' CONCURRENTLY ' : ''; - const method = options.method ? ` USING ${options.method}` : ''; - const where = options.where ? ` WHERE ${options.where}` : ''; + const unique = options.unique ? " UNIQUE " : ""; + const concurrently = options.concurrently ? " CONCURRENTLY " : ""; + const method = options.method ? ` USING ${options.method}` : ""; + const where = options.where ? ` WHERE ${options.where}` : ""; return template`CREATE ${unique} INDEX ${concurrently} "${indexName}" ON "${tableName}"${method} (${columnsString})${where};`; }; export const drop = (tableName, columns, options = {}) => { - const { - concurrently, - ifExists, - cascade, - } = options; - return `DROP INDEX${concurrently ? ' CONCURRENTLY' : ''}${ifExists ? ' IF EXISTS' : ''} "${generateIndexName(tableName, columns, options)}"${cascade ? ' CASCADE' : ''};`; + const { concurrently, ifExists, cascade } = options; + return `DROP INDEX${concurrently ? " CONCURRENTLY" : ""}${ + ifExists ? " IF EXISTS" : "" + } "${generateIndexName(tableName, columns, options)}"${ + cascade ? " CASCADE" : "" + };`; }; // setup reverse functions diff --git a/lib/operations/operators.js b/lib/operations/operators.js index fa53a5d5..c580f60a 100644 --- a/lib/operations/operators.js +++ b/lib/operations/operators.js @@ -1,4 +1,4 @@ -import { opSchemalize, schemalize, formatParams, applyType } from '../utils'; +import { opSchemalize, schemalize, formatParams, applyType } from "../utils"; export const createOperator = (operatorName, options = {}) => { const { @@ -10,7 +10,7 @@ export const createOperator = (operatorName, options = {}) => { restrict, join, hashes, - merges, + merges } = options; const defs = []; @@ -34,93 +34,152 @@ export const createOperator = (operatorName, options = {}) => { defs.push(`JOIN = ${schemalize(join)}`); } if (hashes) { - defs.push('HASHES'); + defs.push("HASHES"); } if (merges) { - defs.push('MERGES'); + defs.push("MERGES"); } - return `CREATE OPERATOR ${opSchemalize(operatorName)} (${defs.join(', ')});`; + return `CREATE OPERATOR ${opSchemalize(operatorName)} (${defs.join(", ")});`; }; export const dropOperator = (operatorName, options = {}) => { - const { - ifExists, - cascade, - left, - right, - } = options; + const { ifExists, cascade, left, right } = options; - const leftType = left || 'none'; - const rightType = right || 'none'; + const leftType = left || "none"; + const rightType = right || "none"; - return `DROP OPERATOR${ifExists ? ' IF EXISTS' : ''} ${opSchemalize(operatorName)}(${schemalize(leftType)}, ${schemalize(rightType)})${cascade ? ' CASCADE' : ''};`; + return `DROP OPERATOR${ifExists ? " IF EXISTS" : ""} ${opSchemalize( + operatorName + )}(${schemalize(leftType)}, ${schemalize(rightType)})${ + cascade ? " CASCADE" : "" + };`; }; - export const createOperatorFamily = (operatorFamilyName, indexMethod) => - `CREATE OPERATOR FAMILY ${schemalize(operatorFamilyName)} USING ${indexMethod};`; - -export const dropOperatorFamily = (operatorFamilyName, indexMethod, { ifExists, cascade } = {}) => // eslint-disable-line max-len - `DROP OPERATOR FAMILY ${ifExists ? ' IF EXISTS' : ''} ${schemalize(operatorFamilyName)} USING ${indexMethod}${cascade ? ' CASCADE' : ''};`; + `CREATE OPERATOR FAMILY ${schemalize( + operatorFamilyName + )} USING ${indexMethod};`; + +export const dropOperatorFamily = ( + operatorFamilyName, + indexMethod, + { ifExists, cascade } = {} +) => + `DROP OPERATOR FAMILY ${ifExists ? " IF EXISTS" : ""} ${schemalize( + operatorFamilyName + )} USING ${indexMethod}${cascade ? " CASCADE" : ""};`; const operatorMap = typeShorthands => ({ - type = '', + type = "", number, name, - params = [], + params = [] }) => { - if (String(type).toLowerCase() === 'function') { + if (String(type).toLowerCase() === "function") { if (params.length > 2) { - throw new Error('Operator can\'t have more than 2 parameters'); + throw new Error("Operator can't have more than 2 parameters"); } - return `OPERATOR ${number} ${opSchemalize(name)}${params.length > 0 ? formatParams(params, typeShorthands) : ''}`; - } else if (String(type).toLowerCase() === 'operator') { - return `FUNCTION ${number} ${schemalize(name)}${formatParams(params, typeShorthands)}`; + return `OPERATOR ${number} ${opSchemalize(name)}${ + params.length > 0 ? formatParams(params, typeShorthands) : "" + }`; + } else if (String(type).toLowerCase() === "operator") { + return `FUNCTION ${number} ${schemalize(name)}${formatParams( + params, + typeShorthands + )}`; } throw new Error('Operator "type" must be either "function" or "operator"'); }; -export const removeFromOperatorFamily = typeShorthands => - (operatorFamilyName, indexMethod, operatorList) => - `ALTER OPERATOR FAMILY ${schemalize(operatorFamilyName)} USING ${indexMethod} DROP - ${operatorList.map(operatorMap(typeShorthands)).join(',\n ')};`; - -export const addToOperatorFamily = (typeShorthands) => { +export const removeFromOperatorFamily = typeShorthands => ( + operatorFamilyName, + indexMethod, + operatorList +) => + `ALTER OPERATOR FAMILY ${schemalize( + operatorFamilyName + )} USING ${indexMethod} DROP + ${operatorList.map(operatorMap(typeShorthands)).join(",\n ")};`; + +export const addToOperatorFamily = typeShorthands => { const _add = (operatorFamilyName, indexMethod, operatorList) => - `ALTER OPERATOR FAMILY ${schemalize(operatorFamilyName)} USING ${indexMethod} ADD - ${operatorList.map(operatorMap(typeShorthands)).join(',\n ')};`; + `ALTER OPERATOR FAMILY ${schemalize( + operatorFamilyName + )} USING ${indexMethod} ADD + ${operatorList.map(operatorMap(typeShorthands)).join(",\n ")};`; _add.reverse = removeFromOperatorFamily(typeShorthands); return _add; }; -export const renameOperatorFamily = (oldOperatorFamilyName, indexMethod, newOperatorFamilyName) => // eslint-disable-line max-len - `ALTER OPERATOR FAMILY ${schemalize(oldOperatorFamilyName)} USING ${indexMethod} RENAME TO ${schemalize(newOperatorFamilyName)};`; - -const undoRenameOperatorFamily = (oldOperatorFamilyName, indexMethod, newOperatorFamilyName) => // eslint-disable-line max-len - renameOperatorFamily(newOperatorFamilyName, indexMethod, oldOperatorFamilyName); - - -export const dropOperatorClass = (operatorClassName, indexMethod, { ifExists, cascade } = {}) => // eslint-disable-line max-len - `DROP OPERATOR CLASS ${ifExists ? ' IF EXISTS' : ''} ${schemalize(operatorClassName)} USING ${indexMethod}${cascade ? ' CASCADE' : ''};`; - -export const createOperatorClass = (typeShorthands) => { - const _create = (operatorClassName, type, indexMethod, operatorList, options) => { - const { - default: isDefault, - family, - } = options; - return `CREATE OPERATOR CLASS ${schemalize(operatorClassName)}${isDefault ? ' DEFAULT' : ''} FOR TYPE ${schemalize(applyType(type).type)} USING ${schemalize(indexMethod)} ${family ? ` FAMILY ${family}` : ''} AS - ${operatorList.map(operatorMap(typeShorthands)).join(',\n ')};`; +export const renameOperatorFamily = ( + oldOperatorFamilyName, + indexMethod, + newOperatorFamilyName +) => + `ALTER OPERATOR FAMILY ${schemalize( + oldOperatorFamilyName + )} USING ${indexMethod} RENAME TO ${schemalize(newOperatorFamilyName)};`; + +const undoRenameOperatorFamily = ( + oldOperatorFamilyName, + indexMethod, + newOperatorFamilyName +) => + renameOperatorFamily( + newOperatorFamilyName, + indexMethod, + oldOperatorFamilyName + ); + +export const dropOperatorClass = ( + operatorClassName, + indexMethod, + { ifExists, cascade } = {} +) => + `DROP OPERATOR CLASS ${ifExists ? " IF EXISTS" : ""} ${schemalize( + operatorClassName + )} USING ${indexMethod}${cascade ? " CASCADE" : ""};`; + +export const createOperatorClass = typeShorthands => { + const _create = ( + operatorClassName, + type, + indexMethod, + operatorList, + options + ) => { + const { default: isDefault, family } = options; + return `CREATE OPERATOR CLASS ${schemalize(operatorClassName)}${ + isDefault ? " DEFAULT" : "" + } FOR TYPE ${schemalize(applyType(type).type)} USING ${schemalize( + indexMethod + )} ${family ? ` FAMILY ${family}` : ""} AS + ${operatorList.map(operatorMap(typeShorthands)).join(",\n ")};`; }; - _create.reverse = (operatorClassName, type, indexMethod, operatorList, options) => - dropOperatorClass(operatorClassName, indexMethod, options); + _create.reverse = ( + operatorClassName, + type, + indexMethod, + operatorList, + options + ) => dropOperatorClass(operatorClassName, indexMethod, options); return _create; }; -export const renameOperatorClass = (oldOperatorClassName, indexMethod, newOperatorClassName) => // eslint-disable-line max-len - `ALTER OPERATOR CLASS ${schemalize(oldOperatorClassName)} USING ${indexMethod} RENAME TO ${schemalize(newOperatorClassName)};`; - -const undoRenameOperatorClass = (oldOperatorClassName, indexMethod, newOperatorClassName) => // eslint-disable-line max-len +export const renameOperatorClass = ( + oldOperatorClassName, + indexMethod, + newOperatorClassName +) => + `ALTER OPERATOR CLASS ${schemalize( + oldOperatorClassName + )} USING ${indexMethod} RENAME TO ${schemalize(newOperatorClassName)};`; + +const undoRenameOperatorClass = ( + oldOperatorClassName, + indexMethod, + newOperatorClassName +) => renameOperatorClass(newOperatorClassName, indexMethod, oldOperatorClassName); // setup reverse functions diff --git a/lib/operations/other.js b/lib/operations/other.js index cecc5159..87deb4fc 100644 --- a/lib/operations/other.js +++ b/lib/operations/other.js @@ -1,12 +1,12 @@ -import { t } from '../utils'; +import { t } from "../utils"; // eslint-disable-next-line import/prefer-default-export export const sql = (...args) => { // applies some very basic templating using the utils.p let s = t(...args); // add trailing ; if not present - if (s.lastIndexOf(';') !== (s.length - 1)) { - s += ';'; + if (s.lastIndexOf(";") !== s.length - 1) { + s += ";"; } return s; }; diff --git a/lib/operations/policies.js b/lib/operations/policies.js index 1545b184..1691fa50 100644 --- a/lib/operations/policies.js +++ b/lib/operations/policies.js @@ -1,7 +1,7 @@ -import { template } from '../utils'; +import { template } from "../utils"; const makeClauses = ({ role, using, check }) => { - const roles = (Array.isArray(role) ? role : [role]).join(', '); + const roles = (Array.isArray(role) ? role : [role]).join(", "); const clauses = []; if (roles) { clauses.push(`TO ${roles}`); @@ -18,22 +18,28 @@ const makeClauses = ({ role, using, check }) => { export const create = (tableName, policyName, options = {}) => { const createOptions = { ...options, - role: options.role || 'PUBLIC', + role: options.role || "PUBLIC" }; const clauses = [ - `FOR ${options.command || 'ALL'}`, - ...makeClauses(createOptions), + `FOR ${options.command || "ALL"}`, + ...makeClauses(createOptions) ]; - return template`CREATE POLICY "${policyName}" ON "${tableName}" ${clauses.join(' ')};`; + return template`CREATE POLICY "${policyName}" ON "${tableName}" ${clauses.join( + " " + )};`; }; export const alter = (tableName, policyName, options = {}) => { const clauses = makeClauses(options); - return template`ALTER POLICY "${policyName}" ON "${tableName}" ${clauses.join(' ')};`; + return template`ALTER POLICY "${policyName}" ON "${tableName}" ${clauses.join( + " " + )};`; }; export const drop = (tableName, policyName, { ifExists } = {}) => - template`DROP POLICY${ifExists ? ' IF EXISTS' : ''} "${policyName}" ON "${tableName}";`; + template`DROP POLICY${ + ifExists ? " IF EXISTS" : "" + } "${policyName}" ON "${tableName}";`; export const rename = (tableName, policyName, newPolicyName) => template`ALTER POLICY "${policyName}" ON "${tableName}" RENAME TO "${newPolicyName}";`; diff --git a/lib/operations/roles.js b/lib/operations/roles.js index 1194ce6f..bab0865b 100644 --- a/lib/operations/roles.js +++ b/lib/operations/roles.js @@ -1,49 +1,75 @@ -import { isArray } from 'lodash'; -import { template, escapeValue } from '../utils'; +import { isArray } from "lodash"; +import { template, escapeValue } from "../utils"; const formatRoleOptions = (roleOptions = {}) => { const options = []; if (roleOptions.superuser !== undefined) { - options.push(roleOptions.superuser ? 'SUPERUSER' : 'NOSUPERUSER'); + options.push(roleOptions.superuser ? "SUPERUSER" : "NOSUPERUSER"); } if (roleOptions.createdb !== undefined) { - options.push(roleOptions.createdb ? 'CREATEDB' : 'NOCREATEDB'); + options.push(roleOptions.createdb ? "CREATEDB" : "NOCREATEDB"); } if (roleOptions.createrole !== undefined) { - options.push(roleOptions.createrole ? 'CREATEROLE' : 'NOCREATEROLE'); + options.push(roleOptions.createrole ? "CREATEROLE" : "NOCREATEROLE"); } if (roleOptions.inherit !== undefined) { - options.push(roleOptions.inherit ? 'INHERIT' : 'NOINHERIT'); + options.push(roleOptions.inherit ? "INHERIT" : "NOINHERIT"); } if (roleOptions.login !== undefined) { - options.push(roleOptions.login ? 'LOGIN' : 'NOLOGIN'); + options.push(roleOptions.login ? "LOGIN" : "NOLOGIN"); } if (roleOptions.replication !== undefined) { - options.push(roleOptions.replication ? 'REPLICATION' : 'NOREPLICATION'); + options.push(roleOptions.replication ? "REPLICATION" : "NOREPLICATION"); } if (roleOptions.bypassrls !== undefined) { - options.push(roleOptions.bypassrls ? 'BYPASSRLS' : 'NOBYPASSRLS'); + options.push(roleOptions.bypassrls ? "BYPASSRLS" : "NOBYPASSRLS"); } if (roleOptions.limit) { options.push(`CONNECTION LIMIT ${Number(roleOptions.limit)}`); } if (roleOptions.password !== undefined) { - options.push(`${roleOptions.encrypted === false ? 'UNENCRYPTED' : 'ENCRYPTED'} PASSWORD ${escapeValue(roleOptions.password)}`); + options.push( + `${ + roleOptions.encrypted === false ? "UNENCRYPTED" : "ENCRYPTED" + } PASSWORD ${escapeValue(roleOptions.password)}` + ); } if (roleOptions.valid !== undefined) { - options.push(`VALID UNTIL ${roleOptions.valid ? escapeValue(roleOptions.valid) : "'infinity'"}`); + options.push( + `VALID UNTIL ${ + roleOptions.valid ? escapeValue(roleOptions.valid) : "'infinity'" + }` + ); } if (roleOptions.inRole) { - options.push(`IN ROLE ${isArray(roleOptions.inRole) ? roleOptions.inRole.join(',') : roleOptions.inRole}`); + options.push( + `IN ROLE ${ + isArray(roleOptions.inRole) + ? roleOptions.inRole.join(",") + : roleOptions.inRole + }` + ); } if (roleOptions.role) { - options.push(`ROLE ${isArray(roleOptions.role) ? roleOptions.role.join(',') : roleOptions.role}`); + options.push( + `ROLE ${ + isArray(roleOptions.role) + ? roleOptions.role.join(",") + : roleOptions.role + }` + ); } if (roleOptions.admin) { - options.push(`ADMIN ${isArray(roleOptions.admin) ? roleOptions.admin.join(',') : roleOptions.admin}`); + options.push( + `ADMIN ${ + isArray(roleOptions.admin) + ? roleOptions.admin.join(",") + : roleOptions.admin + }` + ); } - return options.join(' '); + return options.join(" "); }; export const create = (roleName, roleOptions = {}) => { @@ -54,17 +80,21 @@ export const create = (roleName, roleOptions = {}) => { createrole: roleOptions.createrole || false, inherit: roleOptions.inherit !== false, login: roleOptions.login || false, - replication: roleOptions.replication || false, + replication: roleOptions.replication || false }); - return template`CREATE ROLE "${roleName}"${options ? ` WITH ${options}` : ''};`; + return template`CREATE ROLE "${roleName}"${ + options ? ` WITH ${options}` : "" + };`; }; export const drop = (roleName, { ifExists } = {}) => - template`DROP ROLE${ifExists ? ' IF EXISTS' : ''} "${roleName}";`; + template`DROP ROLE${ifExists ? " IF EXISTS" : ""} "${roleName}";`; export const alter = (roleName, roleOptions = {}) => { const options = formatRoleOptions(roleOptions); - return template`ALTER ROLE "${roleName}"${options ? ` WITH ${options}` : ''};`; + return template`ALTER ROLE "${roleName}"${ + options ? ` WITH ${options}` : "" + };`; }; export const rename = (oldRoleName, newRoleName) => diff --git a/lib/operations/schemas.js b/lib/operations/schemas.js index 8352d505..665b81a9 100644 --- a/lib/operations/schemas.js +++ b/lib/operations/schemas.js @@ -1,10 +1,14 @@ -import { template } from '../utils'; +import { template } from "../utils"; export const drop = (schemaName, { ifExists, cascade } = {}) => - template`DROP SCHEMA${ifExists ? ' IF EXISTS' : ''} "${schemaName}"${cascade ? ' CASCADE' : ''};`; + template`DROP SCHEMA${ifExists ? " IF EXISTS" : ""} "${schemaName}"${ + cascade ? " CASCADE" : "" + };`; export const create = (schemaName, { ifNotExists, authorization } = {}) => - template`CREATE SCHEMA${ifNotExists ? ' IF NOT EXISTS' : ''} "${schemaName}"${authorization ? ` AUTHORIZATION ${authorization}` : ''};`; + template`CREATE SCHEMA${ifNotExists ? " IF NOT EXISTS" : ""} "${schemaName}"${ + authorization ? ` AUTHORIZATION ${authorization}` : "" + };`; // RENAME export const rename = (schemaName, newSchemaName) => diff --git a/lib/operations/sequences.js b/lib/operations/sequences.js index ae5411ca..f01b5ef2 100644 --- a/lib/operations/sequences.js +++ b/lib/operations/sequences.js @@ -1,4 +1,4 @@ -import { template, applyType } from '../utils'; +import { template, applyType } from "../utils"; const parseOptions = (typeShorthands, options) => { const { @@ -9,7 +9,7 @@ const parseOptions = (typeShorthands, options) => { start, cache, cycle, - owner, + owner } = options; const clauses = []; if (type) { @@ -21,12 +21,12 @@ const parseOptions = (typeShorthands, options) => { if (minvalue) { clauses.push(`MINVALUE ${minvalue}`); } else if (minvalue === null || minvalue === false) { - clauses.push('NO MINVALUE'); + clauses.push("NO MINVALUE"); } if (maxvalue) { clauses.push(`MAXVALUE ${maxvalue}`); } else if (maxvalue === null || maxvalue === false) { - clauses.push('NO MAXVALUE'); + clauses.push("NO MAXVALUE"); } if (start) { clauses.push(`START WITH ${start}`); @@ -35,51 +35,49 @@ const parseOptions = (typeShorthands, options) => { clauses.push(`CACHE ${cache}`); } if (cycle) { - clauses.push('CYCLE'); + clauses.push("CYCLE"); } else if (cycle === false) { - clauses.push('NO CYCLE'); + clauses.push("NO CYCLE"); } if (owner) { clauses.push(`OWNED BY ${owner}`); } else if (owner === null || owner === false) { - clauses.push('OWNED BY NONE'); + clauses.push("OWNED BY NONE"); } return clauses; }; export const drop = (sequenceName, { ifExists, cascade } = {}) => - template`DROP SEQUENCE${ifExists ? ' IF EXISTS' : ''} "${sequenceName}"${cascade ? ' CASCADE' : ''};`; + template`DROP SEQUENCE${ifExists ? " IF EXISTS" : ""} "${sequenceName}"${ + cascade ? " CASCADE" : "" + };`; -export const create = (typeShorthands) => { +export const create = typeShorthands => { const _create = (sequenceName, options) => { - const { - temporary, - ifNotExists, - } = options; + const { temporary, ifNotExists } = options; const clauses = parseOptions(typeShorthands, options); - return template`CREATE${temporary ? ' TEMPORARY' : ''} SEQUENCE${ifNotExists ? ' IF NOT EXISTS' : ''} "${sequenceName}" - ${clauses.join('\n ')};`; + return template`CREATE${temporary ? " TEMPORARY" : ""} SEQUENCE${ + ifNotExists ? " IF NOT EXISTS" : "" + } "${sequenceName}" + ${clauses.join("\n ")};`; }; _create.reverse = drop; return _create; }; -export const alter = typeShorthands => - (sequenceName, options) => { - const { - restart, - } = options; - const clauses = parseOptions(typeShorthands, options); - if (restart) { - if (restart === true) { - clauses.push('RESTART'); - } else { - clauses.push(`RESTART WITH ${restart}`); - } +export const alter = typeShorthands => (sequenceName, options) => { + const { restart } = options; + const clauses = parseOptions(typeShorthands, options); + if (restart) { + if (restart === true) { + clauses.push("RESTART"); + } else { + clauses.push(`RESTART WITH ${restart}`); } - return template`ALTER SEQUENCE "${sequenceName}" - ${clauses.join('\n ')};`; - }; + } + return template`ALTER SEQUENCE "${sequenceName}" + ${clauses.join("\n ")};`; +}; // RENAME export const rename = (sequenceName, newSequenceName) => diff --git a/lib/operations/tables.js b/lib/operations/tables.js index f5d284d6..34ca6593 100644 --- a/lib/operations/tables.js +++ b/lib/operations/tables.js @@ -1,23 +1,26 @@ -import _ from 'lodash'; -import { escapeValue, template, quote, applyType, applyTypeAdapters, comment, schemalize } from '../utils'; +import _ from "lodash"; +import { + escapeValue, + template, + quote, + applyType, + applyTypeAdapters, + comment, + schemalize +} from "../utils"; -const formatLines = (lines, replace, separator = ',') => +const formatLines = (lines, replace, separator = ",") => lines - .map(line => line.replace(/(?:\r\n|\r|\n)+/g, ' ')) + .map(line => line.replace(/(?:\r\n|\r|\n)+/g, " ")) .join(`${separator}\n`) .replace(/^/gm, replace); -const parseReferences = (options) => { - const { - references, - match, - onDelete, - onUpdate, - } = options; +const parseReferences = options => { + const { references, match, onDelete, onUpdate } = options; const clauses = [ - typeof references === 'string' + typeof references === "string" ? `REFERENCES ${references}` - : template`REFERENCES "${references}"`, + : template`REFERENCES "${references}"` ]; if (match) { clauses.push(`MATCH ${match}`); @@ -28,23 +31,19 @@ const parseReferences = (options) => { if (onUpdate) { clauses.push(`ON UPDATE ${onUpdate}`); } - return clauses.join(' '); + return clauses.join(" "); }; -const parseDeferrable = (options) => { - const { - deferrable, - deferred, - } = options; +const parseDeferrable = options => { + const { deferrable, deferred } = options; return deferrable - ? `DEFERRABLE INITIALLY ${deferred ? 'DEFERRED' : 'IMMEDIATE'}` + ? `DEFERRABLE INITIALLY ${deferred ? "DEFERRED" : "IMMEDIATE"}` : null; }; const parseColumns = (tableName, columns, extendingTypeShorthands = {}) => { - let columnsWithOptions = _.mapValues( - columns, - column => applyType(column, extendingTypeShorthands) + let columnsWithOptions = _.mapValues(columns, column => + applyType(column, extendingTypeShorthands) ); const primaryColumns = _.chain(columnsWithOptions) @@ -54,14 +53,22 @@ const parseColumns = (tableName, columns, extendingTypeShorthands = {}) => { const multiplePrimaryColumns = primaryColumns.length > 1; if (multiplePrimaryColumns) { - columnsWithOptions = _.mapValues( - columnsWithOptions, - options => ({ ...options, primaryKey: false }) - ); + columnsWithOptions = _.mapValues(columnsWithOptions, options => ({ + ...options, + primaryKey: false + })); } const comments = _.chain(columnsWithOptions) - .map((options, columnName) => typeof options.comment !== 'undefined' && comment('COLUMN', `${schemalize(tableName)}"."${columnName}`, options.comment)) + .map( + (options, columnName) => + typeof options.comment !== "undefined" && + comment( + "COLUMN", + `${schemalize(tableName)}"."${columnName}`, + options.comment + ) + ) .filter() .value(); @@ -76,7 +83,7 @@ const parseColumns = (tableName, columns, extendingTypeShorthands = {}) => { notNull, check, references, - deferrable, + deferrable } = options; const constraints = []; if (collation) { @@ -86,13 +93,13 @@ const parseColumns = (tableName, columns, extendingTypeShorthands = {}) => { constraints.push(`DEFAULT ${escapeValue(defaultValue)}`); } if (unique) { - constraints.push('UNIQUE'); + constraints.push("UNIQUE"); } if (primaryKey) { - constraints.push('PRIMARY KEY'); + constraints.push("PRIMARY KEY"); } if (notNull) { - constraints.push('NOT NULL'); + constraints.push("NOT NULL"); } if (check) { constraints.push(`CHECK (${check})`); @@ -104,14 +111,16 @@ const parseColumns = (tableName, columns, extendingTypeShorthands = {}) => { constraints.push(parseDeferrable(options)); } - const constraintsString = constraints.length ? ` ${constraints.join(' ')}` : ''; + const constraintsString = constraints.length + ? ` ${constraints.join(" ")}` + : ""; return template`"${columnName}" ${type}${constraintsString}`; }), constraints: { - ...(multiplePrimaryColumns ? { primaryKey: primaryColumns } : {}), + ...(multiplePrimaryColumns ? { primaryKey: primaryColumns } : {}) }, - comments, + comments }; }; @@ -122,37 +131,49 @@ const parseConstraints = (table, options, genName) => { primaryKey, foreignKeys, exclude, - deferrable, + deferrable } = options; - const tableName = typeof table === 'object' ? table.name : table; + const tableName = typeof table === "object" ? table.name : table; const constraints = []; if (check) { - constraints.push(`${genName ? `CONSTRAINT "${tableName}_chck" ` : ''}CHECK (${check})`); + constraints.push( + `${genName ? `CONSTRAINT "${tableName}_chck" ` : ""}CHECK (${check})` + ); } if (unique) { const uniqueArray = _.isArray(unique) ? unique : [unique]; const isArrayOfArrays = uniqueArray.some(uniqueSet => _.isArray(uniqueSet)); - (isArrayOfArrays ? uniqueArray : [uniqueArray]) - .forEach((uniqueSet) => { - const cols = _.isArray(uniqueSet) ? uniqueSet : [uniqueSet]; - constraints.push(`${genName ? `CONSTRAINT "${tableName}_uniq_${cols.join('_')}" ` : ''}UNIQUE (${quote(cols).join(', ')})`); - }); + (isArrayOfArrays ? uniqueArray : [uniqueArray]).forEach(uniqueSet => { + const cols = _.isArray(uniqueSet) ? uniqueSet : [uniqueSet]; + constraints.push( + `${ + genName ? `CONSTRAINT "${tableName}_uniq_${cols.join("_")}" ` : "" + }UNIQUE (${quote(cols).join(", ")})` + ); + }); } if (primaryKey) { - constraints.push(`${genName ? `CONSTRAINT "${tableName}_pkey" ` : ''}PRIMARY KEY (${quote(_.isArray(primaryKey) ? primaryKey : [primaryKey]).join(', ')})`); + constraints.push( + `${genName ? `CONSTRAINT "${tableName}_pkey" ` : ""}PRIMARY KEY (${quote( + _.isArray(primaryKey) ? primaryKey : [primaryKey] + ).join(", ")})` + ); } if (foreignKeys) { - (_.isArray(foreignKeys) ? foreignKeys : [foreignKeys]) - .forEach((fk) => { - const { - columns, - } = fk; - const cols = _.isArray(columns) ? columns : [columns]; - constraints.push(`${genName ? `CONSTRAINT "${tableName}_fk_${cols.join('_')}" ` : ''}FOREIGN KEY (${quote(cols).join(', ')}) ${parseReferences(fk)}`); - }); + (_.isArray(foreignKeys) ? foreignKeys : [foreignKeys]).forEach(fk => { + const { columns } = fk; + const cols = _.isArray(columns) ? columns : [columns]; + constraints.push( + `${ + genName ? `CONSTRAINT "${tableName}_fk_${cols.join("_")}" ` : "" + }FOREIGN KEY (${quote(cols).join(", ")}) ${parseReferences(fk)}` + ); + }); } if (exclude) { - constraints.push(`${genName ? `CONSTRAINT "${tableName}_excl" ` : ''}EXCLUDE ${exclude}`); + constraints.push( + `${genName ? `CONSTRAINT "${tableName}_excl" ` : ""}EXCLUDE ${exclude}` + ); } return deferrable @@ -162,9 +183,11 @@ const parseConstraints = (table, options, genName) => { // TABLE export const drop = (tableName, { ifExists, cascade } = {}) => - template`DROP TABLE${ifExists ? ' IF EXISTS' : ''} "${tableName}"${cascade ? ' CASCADE' : ''};`; + template`DROP TABLE${ifExists ? " IF EXISTS" : ""} "${tableName}"${ + cascade ? " CASCADE" : "" + };`; -export const create = (typeShorthands) => { +export const create = typeShorthands => { const _create = (tableName, columns, options = {}) => { const { temporary, @@ -172,35 +195,43 @@ export const create = (typeShorthands) => { inherits, like, constraints: optionsConstraints = {}, - comment: tableComment, + comment: tableComment } = options; const { columns: columnLines, constraints: columnsConstraints, - comments: columnComments = [], + comments: columnComments = [] } = parseColumns(tableName, columns, typeShorthands); - const dupes = _.intersection(Object.keys(optionsConstraints), Object.keys(columnsConstraints)); + const dupes = _.intersection( + Object.keys(optionsConstraints), + Object.keys(columnsConstraints) + ); if (dupes.length > 0) { - throw new Error(`There is duplicate constraint definition in table and columns options: ${dupes.join(', ')}`); + throw new Error( + `There is duplicate constraint definition in table and columns options: ${dupes.join( + ", " + )}` + ); } const constraints = { ...optionsConstraints, ...columnsConstraints }; const constraintLines = parseConstraints(tableName, constraints, true); - const tableDefinition = [ - ...columnLines, - ...constraintLines, - ].concat(like - ? [template`LIKE "${like}"`] - : []); + const tableDefinition = [...columnLines, ...constraintLines].concat( + like ? [template`LIKE "${like}"`] : [] + ); - const createTable = template`CREATE TABLE${temporary ? ' TEMPORARY' : ''}${ifNotExists ? ' IF NOT EXISTS' : ''} "${tableName}" ( -${formatLines(tableDefinition, ' ')} -)${inherits ? template` INHERITS ("${inherits}")` : ''};`; + const createTable = template`CREATE TABLE${temporary ? " TEMPORARY" : ""}${ + ifNotExists ? " IF NOT EXISTS" : "" + } "${tableName}" ( +${formatLines(tableDefinition, " ")} +)${inherits ? template` INHERITS ("${inherits}")` : ""};`; const comments = columnComments; - if (typeof tableComment !== 'undefined') { - comments.push(comment('TABLE ', tableName, tableComment)); + if (typeof tableComment !== "undefined") { + comments.push(comment("TABLE ", tableName, tableComment)); } - return `${createTable}${comments.length > 0 ? `\n${comments.join('\n')}` : ''}`; + return `${createTable}${ + comments.length > 0 ? `\n${comments.join("\n")}` : "" + }`; }; _create.reverse = drop; return _create; @@ -212,28 +243,37 @@ export const alter = (tableName, options) => { alterDefinition.push(`${options.levelSecurity} ROW LEVEL SECURITY`); } return template`ALTER TABLE "${tableName}" -${formatLines(alterDefinition, ' ')};`; +${formatLines(alterDefinition, " ")};`; }; // COLUMNS export const dropColumns = (tableName, columns, { ifExists, cascade } = {}) => { - if (typeof columns === 'string') { + if (typeof columns === "string") { columns = [columns]; // eslint-disable-line no-param-reassign - } else if (!_.isArray(columns) && typeof columns === 'object') { + } else if (!_.isArray(columns) && typeof columns === "object") { columns = _.keys(columns); // eslint-disable-line no-param-reassign } return template`ALTER TABLE "${tableName}" -${formatLines(quote(columns), ` DROP ${ifExists ? ' IF EXISTS' : ''}`, `${cascade ? ' CASCADE' : ''},`)};`; +${formatLines( + quote(columns), + ` DROP ${ifExists ? " IF EXISTS" : ""}`, + `${cascade ? " CASCADE" : ""},` + )};`; }; -export const addColumns = (typeShorthands) => { +export const addColumns = typeShorthands => { const _add = (tableName, columns) => { const { columns: columnLines, - comments: columnComments = [], + comments: columnComments = [] } = parseColumns(tableName, columns, typeShorthands); - const alterTable = template`ALTER TABLE "${tableName}"\n${formatLines(columnLines, ' ADD ')};`; - return `${alterTable}${columnComments.length > 0 ? `\n${columnComments.join('\n')}` : ''}`; + const alterTable = template`ALTER TABLE "${tableName}"\n${formatLines( + columnLines, + " ADD " + )};`; + return `${alterTable}${ + columnComments.length > 0 ? `\n${columnComments.join("\n")}` : "" + }`; }; _add.reverse = dropColumns; return _add; @@ -247,26 +287,34 @@ export const alterColumn = (tableName, columnName, options) => { using, notNull, allowNull, - comment: columnComment, + comment: columnComment } = options; const actions = []; if (defaultValue === null) { - actions.push('DROP DEFAULT'); + actions.push("DROP DEFAULT"); } else if (defaultValue !== undefined) { actions.push(`SET DEFAULT ${escapeValue(defaultValue)}`); } if (type) { - actions.push(`SET DATA TYPE ${applyTypeAdapters(type)}${collation ? `COLLATE ${collation}` : ''}${using ? ` USING ${using}` : ''}`); + actions.push( + `SET DATA TYPE ${applyTypeAdapters(type)}${ + collation ? `COLLATE ${collation}` : "" + }${using ? ` USING ${using}` : ""}` + ); } if (notNull) { - actions.push('SET NOT NULL'); + actions.push("SET NOT NULL"); } else if (notNull === false || allowNull) { - actions.push('DROP NOT NULL'); + actions.push("DROP NOT NULL"); } - return template`ALTER TABLE "${tableName}"\n${formatLines(actions, ` ALTER "${columnName}" `)};${typeof columnComment !== 'undefined' - ? `\n${comment('TABLE ', columnName, columnComment)}` - : '' + return template`ALTER TABLE "${tableName}"\n${formatLines( + actions, + ` ALTER "${columnName}" ` + )};${ + typeof columnComment !== "undefined" + ? `\n${comment("TABLE ", columnName, columnComment)}` + : "" }`; }; @@ -291,12 +339,20 @@ export const undoRenameConstraint = (tableName, constraintName, newName) => export const addConstraint = (tableName, constraintName, expression) => template`ALTER TABLE "${tableName}"\n${formatLines( - typeof expression === 'string' ? [expression] : parseConstraints(tableName, expression, false), + typeof expression === "string" + ? [expression] + : parseConstraints(tableName, expression, false), ` ADD CONSTRAINT "${constraintName}" ` )};`; -export const dropConstraint = (tableName, constraintName, { ifExists, cascade } = {}) => - template`ALTER TABLE "${tableName}" DROP CONSTRAINT${ifExists ? ' IF EXISTS' : ''} "${constraintName}"${cascade ? ' CASCADE' : ''};`; +export const dropConstraint = ( + tableName, + constraintName, + { ifExists, cascade } = {} +) => + template`ALTER TABLE "${tableName}" DROP CONSTRAINT${ + ifExists ? " IF EXISTS" : "" + } "${constraintName}"${cascade ? " CASCADE" : ""};`; addColumns.reverse = dropColumns; addConstraint.reverse = dropConstraint; diff --git a/lib/operations/triggers.js b/lib/operations/triggers.js index 580bd09b..1996a26f 100644 --- a/lib/operations/triggers.js +++ b/lib/operations/triggers.js @@ -1,11 +1,13 @@ -import { isArray } from 'lodash'; -import { escapeValue, template } from '../utils'; -import { create as createFunction, drop as dropFunction } from './functions'; +import { isArray } from "lodash"; +import { escapeValue, template } from "../utils"; +import { create as createFunction, drop as dropFunction } from "./functions"; export const drop = (tableName, triggerName, { ifExists, cascade } = {}) => - template`DROP TRIGGER${ifExists ? ' IF EXISTS' : ''} "${triggerName}" ON "${tableName}"${cascade ? ' CASCADE' : ''};`; + template`DROP TRIGGER${ + ifExists ? " IF EXISTS" : "" + } "${triggerName}" ON "${tableName}"${cascade ? " CASCADE" : ""};`; -export const create = (typeShorthands) => { +export const create = typeShorthands => { const _create = (tableName, triggerName, triggerOptions = {}, definition) => { const { constraint, @@ -13,20 +15,16 @@ export const create = (typeShorthands) => { operation, deferrable, deferred, - functionArgs = [], + functionArgs = [] } = triggerOptions; - let { - when, - level = 'STATEMENT', - function: functionName, - } = triggerOptions; - const operations = isArray(operation) ? operation.join(' OR ') : operation; + let { when, level = "STATEMENT", function: functionName } = triggerOptions; + const operations = isArray(operation) ? operation.join(" OR ") : operation; if (constraint) { - when = 'AFTER'; + when = "AFTER"; } const isInsteadOf = /instead\s+of/i.test(when); if (isInsteadOf) { - level = 'ROW'; + level = "ROW"; } if (definition) { functionName = functionName || triggerName; @@ -35,34 +33,53 @@ export const create = (typeShorthands) => { if (!when) { throw new Error('"when" (BEFORE/AFTER/INSTEAD OF) have to be specified'); } else if (isInsteadOf && condition) { - throw new Error('INSTEAD OF trigger can\'t have condition specified'); + throw new Error("INSTEAD OF trigger can't have condition specified"); } if (!operations) { - throw new Error('"operation" (INSERT/UPDATE[ OF ...]/DELETE/TRUNCATE) have to be specified'); + throw new Error( + '"operation" (INSERT/UPDATE[ OF ...]/DELETE/TRUNCATE) have to be specified' + ); } const defferClause = constraint - ? `${deferrable ? `DEFERRABLE INITIALLY ${deferred ? 'DEFERRED' : 'IMMEDIATE'}` : 'NOT DEFERRABLE'}\n ` - : ''; - const conditionClause = condition - ? `WHEN (${condition})\n ` - : ''; + ? `${ + deferrable + ? `DEFERRABLE INITIALLY ${deferred ? "DEFERRED" : "IMMEDIATE"}` + : "NOT DEFERRABLE" + }\n ` + : ""; + const conditionClause = condition ? `WHEN (${condition})\n ` : ""; - const triggerSQL = template`CREATE${constraint ? ' CONSTRAINT' : ''} TRIGGER "${triggerName}" + const triggerSQL = template`CREATE${ + constraint ? " CONSTRAINT" : "" + } TRIGGER "${triggerName}" ${when} ${operations} ON "${tableName}" ${defferClause}FOR EACH ${level} - ${conditionClause}EXECUTE PROCEDURE "${functionName}"(${functionArgs.map(escapeValue).join(', ')});`; + ${conditionClause}EXECUTE PROCEDURE "${functionName}"(${functionArgs + .map(escapeValue) + .join(", ")});`; - return `${definition - ? `${createFunction(typeShorthands)(functionName, [], { ...triggerOptions, returns: 'trigger' }, definition)}\n` - : ''}${triggerSQL}`; + return `${ + definition + ? `${createFunction(typeShorthands)( + functionName, + [], + { ...triggerOptions, returns: "trigger" }, + definition + )}\n` + : "" + }${triggerSQL}`; }; _create.reverse = (tableName, triggerName, triggerOptions = {}, definition) => `${drop(tableName, triggerName, triggerOptions)}${ definition - ? `\n${dropFunction(typeShorthands)(triggerOptions.function || triggerName, [], triggerOptions)}` - : '' + ? `\n${dropFunction(typeShorthands)( + triggerOptions.function || triggerName, + [], + triggerOptions + )}` + : "" }`; return _create; diff --git a/lib/operations/types.js b/lib/operations/types.js index 5bbc910c..7ccd2a88 100644 --- a/lib/operations/types.js +++ b/lib/operations/types.js @@ -1,17 +1,25 @@ -import _ from 'lodash'; -import { template, applyType, escapeValue } from '../utils'; +import _ from "lodash"; +import { template, applyType, escapeValue } from "../utils"; export const drop = (typeName, { ifExists, cascade } = {}) => - template`DROP TYPE${ifExists ? ' IF EXISTS' : ''} "${typeName}"${cascade ? ' CASCADE' : ''};`; + template`DROP TYPE${ifExists ? " IF EXISTS" : ""} "${typeName}"${ + cascade ? " CASCADE" : "" + };`; -export const create = (typeShorthands) => { +export const create = typeShorthands => { const _create = (typeName, options) => { if (_.isArray(options)) { - return template`CREATE TYPE "${typeName}" AS ENUM (${options.map(escapeValue).join(', ')});`; + return template`CREATE TYPE "${typeName}" AS ENUM (${options + .map(escapeValue) + .join(", ")});`; } - const attributes = _.map(options, (attribute, attributeName) => - template`"${attributeName}" ${applyType(attribute, typeShorthands).type}` - ).join(',\n'); + const attributes = _.map( + options, + (attribute, attributeName) => + template`"${attributeName}" ${ + applyType(attribute, typeShorthands).type + }` + ).join(",\n"); return template`CREATE TYPE "${typeName}" AS (\n${attributes}\n);`; }; _create.reverse = drop; @@ -19,33 +27,40 @@ export const create = (typeShorthands) => { }; export const dropTypeAttribute = (typeName, attributeName, { ifExists } = {}) => - template`ALTER TYPE "${typeName}" DROP ATTRIBUTE "${attributeName}"${ifExists ? ' IF EXISTS' : ''};`; + template`ALTER TYPE "${typeName}" DROP ATTRIBUTE "${attributeName}"${ + ifExists ? " IF EXISTS" : "" + };`; -export const addTypeAttribute = (typeShorthands) => { +export const addTypeAttribute = typeShorthands => { const _alterAttributeAdd = (typeName, attributeName, attributeType) => - template`ALTER TYPE "${typeName}" ADD ATTRIBUTE "${attributeName}" ${applyType(attributeType, typeShorthands).type};`; + template`ALTER TYPE "${typeName}" ADD ATTRIBUTE "${attributeName}" ${ + applyType(attributeType, typeShorthands).type + };`; _alterAttributeAdd.reverse = dropTypeAttribute; return _alterAttributeAdd; }; -export const setTypeAttribute = typeShorthands => - (typeName, attributeName, attributeType) => - template`ALTER TYPE "${typeName}" ALTER ATTRIBUTE "${attributeName}" SET DATA TYPE ${applyType(attributeType, typeShorthands).type};`; +export const setTypeAttribute = typeShorthands => ( + typeName, + attributeName, + attributeType +) => + template`ALTER TYPE "${typeName}" ALTER ATTRIBUTE "${attributeName}" SET DATA TYPE ${ + applyType(attributeType, typeShorthands).type + };`; export const addTypeValue = (typeName, value, options = {}) => { - const { - ifNotExists, - before, - after, - } = options; + const { ifNotExists, before, after } = options; if (before && after) { throw new Error('"before" and "after" can\'t be specified together'); } - const beforeClause = before ? ` BEFORE ${before}` : ''; - const afterClause = after ? ` AFTER ${after}` : ''; + const beforeClause = before ? ` BEFORE ${before}` : ""; + const afterClause = after ? ` AFTER ${after}` : ""; - return template`ALTER TYPE "${typeName}" ADD VALUE${ifNotExists ? ' IF NOT EXISTS' : ''} ${escapeValue(value)}${beforeClause}${afterClause};`; + return template`ALTER TYPE "${typeName}" ADD VALUE${ + ifNotExists ? " IF NOT EXISTS" : "" + } ${escapeValue(value)}${beforeClause}${afterClause};`; }; // RENAME @@ -55,11 +70,18 @@ export const rename = (typeName, newTypeName) => export const undoRename = (typeName, newTypeName) => rename(newTypeName, typeName); -export const renameTypeAttribute = (typeName, attributeName, newAttributeName) => +export const renameTypeAttribute = ( + typeName, + attributeName, + newAttributeName +) => template`ALTER TYPE "${typeName}" RENAME ATTRIBUTE "${attributeName}" TO "${newAttributeName}";`; -export const undoRenameTypeAttribute = (typeName, attributeName, newAttributeName) => - renameTypeAttribute(typeName, newAttributeName, attributeName); +export const undoRenameTypeAttribute = ( + typeName, + attributeName, + newAttributeName +) => renameTypeAttribute(typeName, newAttributeName, attributeName); rename.reverse = undoRename; renameTypeAttribute.reverse = undoRenameTypeAttribute; diff --git a/lib/runner.js b/lib/runner.js index a75103bb..db650c0c 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -1,183 +1,238 @@ -import path from 'path'; -import crypto from 'crypto'; -import fs from 'fs'; -import Db from './db'; -import Migration from './migration'; -import { getMigrationTableSchema, finallyPromise, template } from './utils'; +import path from "path"; +import crypto from "crypto"; +import fs from "fs"; +import Db from "./db"; +import Migration from "./migration"; +import { getMigrationTableSchema, finallyPromise, template } from "./utils"; -export { PgLiteral } from './utils'; +export { PgLiteral } from "./utils"; const readdir = (...args) => - new Promise((resolve, reject) => - fs.readdir( - ...args, - (err, files) => ( - err - ? reject(err) - : resolve(files) - ) - ) + new Promise( + (resolve, reject) => + fs.readdir(...args, (err, files) => (err ? reject(err) : resolve(files))) // eslint-disable-line security/detect-non-literal-fs-filename ); -const nameColumn = 'name'; -const runOnColumn = 'run_on'; +const nameColumn = "name"; +const runOnColumn = "run_on"; const loadMigrationFiles = (db, options) => readdir(`${options.dir}/`) .then(files => - Promise.all(files.map(file => - new Promise((resolve, reject) => - fs.lstat(`${options.dir}/${file}`, (err, stats) => ( - err - ? reject(err) - : resolve(stats.isFile() ? file : null) - ))) - )) + Promise.all( + files.map( + file => + new Promise((resolve, reject) => + // eslint-disable-next-line security/detect-non-literal-fs-filename + fs.lstat( + `${options.dir}/${file}`, + (err, stats) => + err ? reject(err) : resolve(stats.isFile() ? file : null) + ) + ) + ) + ) ) - .then((files) => { - const filter = new RegExp(`^(${options.ignorePattern})$`); + .then(files => { + const filter = new RegExp(`^(${options.ignorePattern})$`); // eslint-disable-line security/detect-non-literal-regexp let shorthands = {}; return files .filter(i => i && !filter.test(i)) - .sort((f1, f2) => ( - f1 < f2 // eslint-disable-line no-nested-ternary - ? -1 - : f1 > f2 - ? 1 - : 0 - )) - .map((file) => { + .sort( + (f1, f2) => + f1 < f2 // eslint-disable-line no-nested-ternary + ? -1 + : f1 > f2 ? 1 : 0 + ) + .map(file => { const filePath = `${options.dir}/${file}`; - // eslint-disable-next-line global-require,import/no-dynamic-require + // eslint-disable-next-line global-require,import/no-dynamic-require,security/detect-non-literal-require const actions = require(path.relative(__dirname, filePath)); shorthands = { ...shorthands, ...actions.shorthands }; - return new Migration(db, filePath, actions, options, { ...shorthands }); + return new Migration(db, filePath, actions, options, { + ...shorthands + }); }); }) - .catch((err) => { + .catch(err => { throw new Error(`Can't get migration files: ${err.stack}`); }); const lock = (db, options) => { const schema = getMigrationTableSchema(options); - const lockName = crypto.randomBytes(30).toString('base64'); + const lockName = crypto.randomBytes(30).toString("base64"); const getCurrentLockName = () => db - .select(`SELECT obj_description(c.oid) as "comment" + .select( + `SELECT obj_description(c.oid) as "comment" FROM pg_class c join pg_namespace n ON (c.relnamespace = n.oid) - WHERE c.relname = '${options.migrationsTable}' and c.relkind = 'r' and n.nspname = '${schema}'`) - .then((rows) => { + WHERE c.relname = '${ + options.migrationsTable + }' and c.relkind = 'r' and n.nspname = '${schema}'` + ) + .then(rows => { if (rows.length > 1) { - throw new Error('More then one migration table'); + throw new Error("More then one migration table"); } else if (rows.length === 1) { return rows[0].comment; } return null; }); - return db.query('BEGIN') - .then(() => db.query(template`LOCK "${{ schema, name: options.migrationsTable }}" IN ACCESS EXCLUSIVE MODE`)) + return db + .query("BEGIN") + .then(() => + db.query( + template`LOCK "${{ + schema, + name: options.migrationsTable + }}" IN ACCESS EXCLUSIVE MODE` + ) + ) .then(getCurrentLockName) - .then((currentLockName) => { + .then(currentLockName => { if (currentLockName) { - throw new Error('Another migration is already running'); + throw new Error("Another migration is already running"); } }) - .then(() => db.query(template`COMMENT ON TABLE "${{ schema, name: options.migrationsTable }}" IS '${lockName}'`)) - .then(() => db.query('COMMIT')); + .then(() => + db.query( + template`COMMENT ON TABLE "${{ + schema, + name: options.migrationsTable + }}" IS '${lockName}'` + ) + ) + .then(() => db.query("COMMIT")); }; const unlock = (db, options) => { const schema = getMigrationTableSchema(options); - return db.query(template`COMMENT ON TABLE "${{ schema, name: options.migrationsTable }}" IS NULL`); + return db.query( + template`COMMENT ON TABLE "${{ + schema, + name: options.migrationsTable + }}" IS NULL` + ); }; const getRunMigrations = (db, options) => { const schema = getMigrationTableSchema(options); - return db.select(`SELECT table_name FROM information_schema.tables WHERE table_schema = '${schema}' AND table_name = '${options.migrationsTable}'`) - .then(migrationTables => - (migrationTables && migrationTables.length === 1) - || db.query(template`CREATE TABLE "${{ schema, name: options.migrationsTable }}" ( id SERIAL, ${nameColumn} varchar(255) NOT NULL, ${runOnColumn} timestamp NOT NULL)`) + return db + .select( + `SELECT table_name FROM information_schema.tables WHERE table_schema = '${schema}' AND table_name = '${ + options.migrationsTable + }'` + ) + .then( + migrationTables => + (migrationTables && migrationTables.length === 1) || + db.query( + template`CREATE TABLE "${{ + schema, + name: options.migrationsTable + }}" ( id SERIAL, ${nameColumn} varchar(255) NOT NULL, ${runOnColumn} timestamp NOT NULL)` + ) + ) + .then(() => (!options.noLock ? lock(db, options) : null)) + .then( + () => + !options.noLock + ? db.addBeforeCloseListener(() => unlock(db, options)) + : null ) - .then(() => ( - !options.noLock - ? lock(db, options) - : null - )) - .then(() => ( - !options.noLock - ? db.addBeforeCloseListener(() => unlock(db, options)) - : null - )) .then(() => - db.column(template`SELECT ${nameColumn} FROM "${{ schema, name: options.migrationsTable }}" ORDER BY ${runOnColumn}`, nameColumn) + db.column( + template`SELECT ${nameColumn} FROM "${{ + schema, + name: options.migrationsTable + }}" ORDER BY ${runOnColumn}`, + nameColumn + ) ) - .catch((err) => { + .catch(err => { throw new Error(`Unable to fetch migrations: ${err.stack}`); }); }; const getMigrationsToRun = (options, runNames, migrations) => { - if (options.direction === 'down') { + if (options.direction === "down") { const downMigrations = runNames .filter(migrationName => !options.file || options.file === migrationName) - .map(migrationName => - migrations.find(({ name }) => name === migrationName) || migrationName + .map( + migrationName => + migrations.find(({ name }) => name === migrationName) || migrationName ); const toRun = (options.timestamp ? downMigrations.filter(({ timestamp }) => timestamp >= options.count) - : downMigrations.slice(-Math.abs(options.count === undefined ? 1 : options.count)) + : downMigrations.slice( + -Math.abs(options.count === undefined ? 1 : options.count) + ) ).reverse(); - const deletedMigrations = toRun.filter(migration => typeof migration === 'string'); + const deletedMigrations = toRun.filter( + migration => typeof migration === "string" + ); if (deletedMigrations.length) { - throw new Error(`Definitions of migrations ${deletedMigrations.join(', ')} have been deleted.`); + throw new Error( + `Definitions of migrations ${deletedMigrations.join( + ", " + )} have been deleted.` + ); } return toRun; } - const upMigrations = migrations - .filter(({ name }) => + const upMigrations = migrations.filter( + ({ name }) => runNames.indexOf(name) < 0 && (!options.file || options.file === name) - ); - return (options.timestamp - ? upMigrations.filter(({ timestamp }) => timestamp <= options.count) - : upMigrations.slice(0, Math.abs(options.count === undefined ? Infinity : options.count)) ); + return options.timestamp + ? upMigrations.filter(({ timestamp }) => timestamp <= options.count) + : upMigrations.slice( + 0, + Math.abs(options.count === undefined ? Infinity : options.count) + ); }; -const ifSingleTransaction = (operation, options, db) => ( - options.singleTransaction === false - ? Promise.resolve() - : db.query(operation) -); +const ifSingleTransaction = (operation, options, db) => + options.singleTransaction === false ? Promise.resolve() : db.query(operation); -export default (options) => { +export default options => { const db = Db(options.databaseUrl); return Promise.resolve() .then(() => { let promise = Promise.resolve(); if (options.schema) { if (options.createSchema) { - promise = promise.then(() => db.query(`CREATE SCHEMA IF NOT EXISTS "${options.schema}"`)); + promise = promise.then(() => + db.query(`CREATE SCHEMA IF NOT EXISTS "${options.schema}"`) + ); } - promise = promise.then(() => db.query(`SET SCHEMA '${options.schema}'`)); + promise = promise.then(() => + db.query(`SET SCHEMA '${options.schema}'`) + ); } if (options.migrationsSchema && options.createMigrationsSchema) { - promise = promise.then(() => db.query(`CREATE SCHEMA IF NOT EXISTS "${options.migrationsSchema}"`)); + promise = promise.then(() => + db.query(`CREATE SCHEMA IF NOT EXISTS "${options.migrationsSchema}"`) + ); } return promise; }) .then(() => - Promise - .all([ - loadMigrationFiles(db, options), - getRunMigrations(db, options), - ]) + Promise.all([ + loadMigrationFiles(db, options), + getRunMigrations(db, options) + ]) ) .then(([migrations, runNames]) => { if (options.checkOrder) { const len = Math.min(runNames.length, migrations.length); for (let i = 0; i < len; i += 1) { if (runNames[i] !== migrations[i].name) { - throw new Error(`Not run migration ${migrations[i].name} is preceding already run migration ${runNames[i]}`); + throw new Error( + `Not run migration ${ + migrations[i].name + } is preceding already run migration ${runNames[i]}` + ); } } } @@ -185,38 +240,43 @@ export default (options) => { const toRun = getMigrationsToRun(options, runNames, migrations); if (!toRun.length) { - console.log('No migrations to run!'); + console.log("No migrations to run!"); return null; } // TODO: add some fancy colors to logging - console.log('> Migrating files:'); - toRun.forEach((m) => { + console.log("> Migrating files:"); + toRun.forEach(m => { console.log(`> - ${m.name}`); }); - return ifSingleTransaction('BEGIN', options, db) - .then(() => toRun.reduce( - (promise, migration) => promise.then(() => ( - options.direction === 'up' - ? migration.applyUp() - : migration.applyDown() - )), - Promise.resolve() - )).then(() => ifSingleTransaction('COMMIT', options, db)); + return ifSingleTransaction("BEGIN", options, db) + .then(() => + toRun.reduce( + (promise, migration) => + promise.then( + () => + options.direction === "up" + ? migration.applyUp() + : migration.applyDown() + ), + Promise.resolve() + ) + ) + .then(() => ifSingleTransaction("COMMIT", options, db)); }) - .catch((e) => { - console.log('> Rolling back attempted migration ...'); - return db.query('ROLLBACK') - .then(...finallyPromise(() => { + .catch(e => { + console.log("> Rolling back attempted migration ..."); + return db.query("ROLLBACK").then( + ...finallyPromise(() => { throw e; - })); + }) + ); }) .then(...finallyPromise(db.close)); }; -export const unlockRunner = (options) => { +export const unlockRunner = options => { const db = Db(options.databaseUrl); - return unlock(db, options) - .then(...finallyPromise(db.close)); + return unlock(db, options).then(...finallyPromise(db.close)); }; diff --git a/lib/utils.js b/lib/utils.js index 5bffe7a8..596e4cf4 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -14,16 +14,16 @@ export class PgLiteral { } } -export const schemalize = (v) => { - if (typeof v === 'object') { +export const schemalize = v => { + if (typeof v === "object") { const { schema, name } = v; - return (schema ? `${schema}"."` : '') + name; + return (schema ? `${schema}"."` : "") + name; } return v; }; -export const opSchemalize = (v) => { - if (typeof v === 'object') { +export const opSchemalize = v => { + if (typeof v === "object") { const { schema, name } = v; return schema ? `OPERATOR(${schema}.${name})` : name; } @@ -31,18 +31,19 @@ export const opSchemalize = (v) => { }; export const t = (s, d) => - Object - .keys(d || {}) - .reduce((str, p) => str.replace(new RegExp(`{${p}}`, 'g'), schemalize(d[p])), s); + Object.keys(d || {}).reduce( + (str, p) => str.replace(new RegExp(`{${p}}`, "g"), schemalize(d[p])), // eslint-disable-line security/detect-non-literal-regexp + s + ); -export const escapeValue = (val) => { +export const escapeValue = val => { if (val === null) { - return 'NULL'; + return "NULL"; } - if (typeof val === 'boolean') { + if (typeof val === "boolean") { return val.toString(); } - if (typeof val === 'string') { + if (typeof val === "string") { let dollars; let index = 0; do { @@ -51,16 +52,19 @@ export const escapeValue = (val) => { } while (val.indexOf(dollars) >= 0); return `${dollars}${val}${dollars}`; } - if (typeof val === 'number') { + if (typeof val === "number") { return val; } if (Array.isArray(val)) { - return `ARRAY[${val.map(escapeValue).join(',').replace(/ARRAY/g, '')}]`; + return `ARRAY[${val + .map(escapeValue) + .join(",") + .replace(/ARRAY/g, "")}]`; } if (val instanceof PgLiteral) { return val.toString(); } - return ''; + return ""; }; export const template = (strings, ...keys) => { @@ -68,7 +72,7 @@ export const template = (strings, ...keys) => { keys.forEach((key, i) => { result.push(schemalize(key), strings[i + 1]); }); - return result.join(''); + return result.join(""); }; export const opTemplate = (strings, ...keys) => { @@ -76,79 +80,69 @@ export const opTemplate = (strings, ...keys) => { keys.forEach((key, i) => { result.push(opSchemalize(key), strings[i + 1]); }); - return result.join(''); + return result.join(""); }; -export const getMigrationTableSchema = options => ( +export const getMigrationTableSchema = options => options.migrationsSchema !== undefined // eslint-disable-line no-nested-ternary ? options.migrationsSchema - : options.schema !== undefined - ? options.schema - : 'public' -); + : options.schema !== undefined ? options.schema : "public"; export const finallyPromise = func => [ func, - (err) => { - const errHandler = (innerErr) => { - console.error( - innerErr.stack - ? innerErr.stack - : innerErr - ); + err => { + const errHandler = innerErr => { + console.error(innerErr.stack ? innerErr.stack : innerErr); throw err; }; try { - return Promise - .resolve(func()) - .then( - () => { - throw err; - }, - errHandler - ); + return Promise.resolve(func()).then(() => { + throw err; + }, errHandler); } catch (innerErr) { return errHandler(innerErr); } - }, + } ]; export const quote = array => array.map(item => template`"${item}"`); const typeAdapters = { - int: 'integer', - string: 'text', - float: 'real', - double: 'double precision', - datetime: 'timestamp', - bool: 'boolean', + int: "integer", + string: "text", + float: "real", + double: "double precision", + datetime: "timestamp", + bool: "boolean" }; const defaultTypeShorthands = { - id: { type: 'serial', primaryKey: true }, // convenience type for serial primary keys + id: { type: "serial", primaryKey: true } // convenience type for serial primary keys }; // some convenience adapters -- see above -export const applyTypeAdapters = type => (typeAdapters[type] ? typeAdapters[type] : type); +export const applyTypeAdapters = type => + typeAdapters[type] ? typeAdapters[type] : type; export const applyType = (type, extendingTypeShorthands = {}) => { - const typeShorthands = { ...defaultTypeShorthands, ...extendingTypeShorthands }; - const options = typeof type === 'string' ? { type } : type; + const typeShorthands = { + ...defaultTypeShorthands, + ...extendingTypeShorthands + }; + const options = typeof type === "string" ? { type } : type; const ext = typeShorthands[options.type] || { type: options.type }; return { ...ext, ...options, - type: applyTypeAdapters(ext.type), + type: applyTypeAdapters(ext.type) }; }; -const formatParam = typeShorthands => (param) => { - const { - mode, - name, - type, - default: defaultValue, - } = applyType(param, typeShorthands); +const formatParam = typeShorthands => param => { + const { mode, name, type, default: defaultValue } = applyType( + param, + typeShorthands + ); const options = []; if (mode) { options.push(mode); @@ -162,9 +156,11 @@ const formatParam = typeShorthands => (param) => { if (defaultValue) { options.push(`DEFAULT ${escapeValue(defaultValue)}`); } - return options.join(' '); + return options.join(" "); }; -export const formatParams = (params = [], typeShorthands) => `(${params.map(formatParam(typeShorthands)).join(', ')})`; +export const formatParams = (params = [], typeShorthands) => + `(${params.map(formatParam(typeShorthands)).join(", ")})`; -export const comment = (object, name, text) => template`COMMENT ON ${object} "${name}" IS ${text ? `'${text}'` : 'NULL'};`; +export const comment = (object, name, text) => + template`COMMENT ON ${object} "${name}" IS ${text ? `'${text}'` : "NULL"};`; diff --git a/mocha.bootstrap.js b/mocha.bootstrap.js index 5e639268..304dfafe 100644 --- a/mocha.bootstrap.js +++ b/mocha.bootstrap.js @@ -1,6 +1,6 @@ -import chai from 'chai'; // eslint-disable-line import/no-extraneous-dependencies -import sinonChai from 'sinon-chai'; // eslint-disable-line import/no-extraneous-dependencies -import chaiAsPromised from 'chai-as-promised'; // eslint-disable-line import/no-extraneous-dependencies +import chai from "chai"; +import sinonChai from "sinon-chai"; +import chaiAsPromised from "chai-as-promised"; chai.use(sinonChai); chai.use(chaiAsPromised); diff --git a/package-lock.json b/package-lock.json index 2e2ae672..a3f21bef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,21 +5,21 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.40.tgz", - "integrity": "sha512-eVXQSbu/RimU6OKcK2/gDJVTFcxXJI4sHbIqw2mhwMZeQ2as/8AhS9DGkEDoHMBBNJZ5B0US63lF56x+KDcxiA==", + "version": "7.0.0-beta.42", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.42.tgz", + "integrity": "sha512-L8i94FLSyaLQpRfDo/qqSm8Ndb44zMtXParXo0MebJICG1zoCCL4+GkzUOlB4BNTRSXXQdb3feam/qw7bKPipQ==", "dev": true, "requires": { - "@babel/highlight": "7.0.0-beta.40" + "@babel/highlight": "7.0.0-beta.42" } }, "@babel/generator": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.40.tgz", - "integrity": "sha512-c91BQcXyTq/5aFV4afgOionxZS1dxWt8OghEx5Q52SKssdGRFSiMKnk9tGkev1pYULPJBqjSDZU2Pcuc58ffZw==", + "version": "7.0.0-beta.42", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.42.tgz", + "integrity": "sha512-9x3zS4nG/6GAvJWB8fAK+5g/Di36xdubB43dMNSucNJTwPvmyfCippir/0I8zyG+ID66hLCLi8V9bomlWRYaHA==", "dev": true, "requires": { - "@babel/types": "7.0.0-beta.40", + "@babel/types": "7.0.0-beta.42", "jsesc": "2.5.1", "lodash": "4.17.5", "source-map": "0.5.7", @@ -35,29 +35,38 @@ } }, "@babel/helper-function-name": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.40.tgz", - "integrity": "sha512-cK9BVLtOfisSISTTHXKGvBc2OBh65tjEk4PgXhsSnnH0i8RP2v+5RCxoSlh2y/i+l2fxQqKqv++Qo5RMiwmRCA==", + "version": "7.0.0-beta.42", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.42.tgz", + "integrity": "sha512-6IZ+kkPypwJrnmNzI3y31qAps2kXoPtCE241SvBva2YzB0n/YORWx2YM0jHPYOJBU9Xx5KkUhOKuWkeXZQgtTA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "7.0.0-beta.40", - "@babel/template": "7.0.0-beta.40", - "@babel/types": "7.0.0-beta.40" + "@babel/helper-get-function-arity": "7.0.0-beta.42", + "@babel/template": "7.0.0-beta.42", + "@babel/types": "7.0.0-beta.42" } }, "@babel/helper-get-function-arity": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.40.tgz", - "integrity": "sha512-MwquaPznI4cUoZEgHC/XGkddOXtqKqD4DvZDOyJK2LR9Qi6TbMbAhc6IaFoRX7CRTFCmtGeu8gdXW2dBotBBTA==", + "version": "7.0.0-beta.42", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.42.tgz", + "integrity": "sha512-hF5KKcn+V/5PwU7KZ1aVwo535woLC9eV+djaoyNPZeMMJ2s+8bZlEa66Tarei0T68VRL5LXIs1Ao4hSabSkpBg==", "dev": true, "requires": { - "@babel/types": "7.0.0-beta.40" + "@babel/types": "7.0.0-beta.42" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.0.0-beta.42", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.42.tgz", + "integrity": "sha512-2r8pZG6SAJTTaI2OhxCmz5PKlMUPY5adOHrHtb1gM3ibJPDOzPAeOQNzItdxNnM33jjRakEGitXX6iYg7Sz73w==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.42" } }, "@babel/highlight": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.40.tgz", - "integrity": "sha512-mOhhTrzieV6VO7odgzFGFapiwRK0ei8RZRhfzHhb6cpX3QM8XXuCLXWjN8qBB7JReDdUR80V3LFfFrGUYevhNg==", + "version": "7.0.0-beta.42", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.42.tgz", + "integrity": "sha512-X3Ur/A/lIbbP8W0pmwgqtDXIxhQmxPaiwY9SKP7kF9wvZfjZRwMvbJE92ozUhF3UDK3DCKaV7oGqmI1rP/zqWA==", "dev": true, "requires": { "chalk": "2.3.2", @@ -97,46 +106,47 @@ } }, "@babel/template": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.40.tgz", - "integrity": "sha512-RlQiVB7eL7fxsKN6JvnCCwEwEL28CBYalXSgWWULuFlEHjtMoXBqQanSie3bNyhrANJx67sb+Sd/vuGivoMwLQ==", + "version": "7.0.0-beta.42", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.42.tgz", + "integrity": "sha512-EK7YdTe47j4VxlwNvz5bnlk5Jx/wWublnqfgOY2IuSNdxCQgXrLD34PfTnabGxywNSkJkcSo6jwr2JGT+S48dA==", "dev": true, "requires": { - "@babel/code-frame": "7.0.0-beta.40", - "@babel/types": "7.0.0-beta.40", - "babylon": "7.0.0-beta.40", + "@babel/code-frame": "7.0.0-beta.42", + "@babel/types": "7.0.0-beta.42", + "babylon": "7.0.0-beta.42", "lodash": "4.17.5" }, "dependencies": { "babylon": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.40.tgz", - "integrity": "sha512-AVxF2EcxvGD5hhOuLTOLAXBb0VhwWpEX0HyHdAI2zU+AAP4qEwtQj8voz1JR3uclGai0rfcE+dCTHnNMOnimFg==", + "version": "7.0.0-beta.42", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.42.tgz", + "integrity": "sha512-h6E/OkkvcBw/JimbL0p8dIaxrcuQn3QmIYGC/GtJlRYif5LTKBYPHXYwqluJpfS/kOXoz0go+9mkmOVC0M+zWw==", "dev": true } } }, "@babel/traverse": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.40.tgz", - "integrity": "sha512-h96SQorjvdSuxQ6hHFIuAa3oxnad1TA5bU1Zz88+XqzwmM5QM0/k2D+heXGGy/76gT5ajl7xYLKGiPA/KTyVhQ==", + "version": "7.0.0-beta.42", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.42.tgz", + "integrity": "sha512-DZwMuZBfYVIn/cxpXZzHDgKmarW/MWqplLv1k7QJYhK5r5l6GAac/DkKl75A0CjPYrD3VGco6H6ZQp12QaYKSw==", "dev": true, "requires": { - "@babel/code-frame": "7.0.0-beta.40", - "@babel/generator": "7.0.0-beta.40", - "@babel/helper-function-name": "7.0.0-beta.40", - "@babel/types": "7.0.0-beta.40", - "babylon": "7.0.0-beta.40", + "@babel/code-frame": "7.0.0-beta.42", + "@babel/generator": "7.0.0-beta.42", + "@babel/helper-function-name": "7.0.0-beta.42", + "@babel/helper-split-export-declaration": "7.0.0-beta.42", + "@babel/types": "7.0.0-beta.42", + "babylon": "7.0.0-beta.42", "debug": "3.1.0", - "globals": "11.3.0", - "invariant": "2.2.3", + "globals": "11.4.0", + "invariant": "2.2.4", "lodash": "4.17.5" }, "dependencies": { "babylon": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.40.tgz", - "integrity": "sha512-AVxF2EcxvGD5hhOuLTOLAXBb0VhwWpEX0HyHdAI2zU+AAP4qEwtQj8voz1JR3uclGai0rfcE+dCTHnNMOnimFg==", + "version": "7.0.0-beta.42", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.42.tgz", + "integrity": "sha512-h6E/OkkvcBw/JimbL0p8dIaxrcuQn3QmIYGC/GtJlRYif5LTKBYPHXYwqluJpfS/kOXoz0go+9mkmOVC0M+zWw==", "dev": true }, "debug": { @@ -149,17 +159,17 @@ } }, "globals": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.3.0.tgz", - "integrity": "sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw==", + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.4.0.tgz", + "integrity": "sha512-Dyzmifil8n/TmSqYDEXbm+C8yitzJQqQIlJQLNRMwa+BOUJpRC19pyVeN12JAjt61xonvXjtff+hJruTRXn5HA==", "dev": true } } }, "@babel/types": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.40.tgz", - "integrity": "sha512-uXCGCzTgMZxcSUzutCPtZmXbVC+cvENgS2e0tRuhn+Y1hZnMb8IHP0Trq7Q2MB/eFmG5pKrAeTIUfQIe5kA4Tg==", + "version": "7.0.0-beta.42", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.42.tgz", + "integrity": "sha512-+pmpISmTHQqMMpHHtDLxcvtRhmn53bAxy8goJfHipS/uy/r3PLcuSdPizLW7DhtBWbtgIKZufLObfnIMoyMNsw==", "dev": true, "requires": { "esutils": "2.0.2", @@ -177,7 +187,7 @@ }, "@sinonjs/formatio": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", + "resolved": "http://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==", "dev": true, "requires": { @@ -190,9 +200,9 @@ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==" }, "@types/node": { - "version": "9.4.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.6.tgz", - "integrity": "sha512-CTUtLb6WqCCgp6P59QintjHWqzf4VL1uPA27bipLAPxFqrtK1gEYllePzTICGqQ8rYsCbpnsNypXjjDzGAAjEQ==" + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.0.tgz", + "integrity": "sha512-h3YZbOq2+ZoDFI1z8Zx0Ck/xRWkOESVaLdgLdd/c25mMQ1Y2CAkILu9ny5A15S5f32gGcQdaUIZ2jzYr8D7IFg==" }, "@types/pg": { "version": "7.4.5", @@ -200,7 +210,7 @@ "integrity": "sha512-DV9A1X9duAnZrF+ANT9i7Z3k+49Dfl96hJlmpz8KCZtBaB7ck3eaAX/37P/vOtpb1VBS5C7xfYI1oRnAfL71DQ==", "requires": { "@types/events": "1.2.0", - "@types/node": "9.4.6", + "@types/node": "9.6.0", "@types/pg-types": "1.11.4" } }, @@ -212,12 +222,27 @@ "moment": "2.21.0" } }, + "abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", + "dev": true + }, "acorn": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", "dev": true }, + "acorn-globals": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz", + "integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==", + "dev": true, + "requires": { + "acorn": "5.5.3" + } + }, "acorn-jsx": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", @@ -254,9 +279,9 @@ "dev": true }, "ansi-escapes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", "dev": true }, "ansi-regex": { @@ -270,6 +295,12 @@ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, + "any-observable": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.2.0.tgz", + "integrity": "sha1-xnhwBYADV5AJCD9UrAq6+1wz0kI=", + "dev": true + }, "anymatch": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", @@ -281,6 +312,12 @@ "normalize-path": "2.1.1" } }, + "app-root-path": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.0.1.tgz", + "integrity": "sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y=", + "dev": true + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -295,7 +332,6 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, - "optional": true, "requires": { "arr-flatten": "1.1.0" } @@ -304,8 +340,19 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "optional": true + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true }, "array-union": { "version": "1.0.2", @@ -326,8 +373,7 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true, - "optional": true + "dev": true }, "arrify": { "version": "1.0.1", @@ -335,12 +381,30 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, "async-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", @@ -348,6 +412,36 @@ "dev": true, "optional": true }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz", + "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true + }, "babel-cli": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", @@ -359,7 +453,7 @@ "babel-register": "6.26.0", "babel-runtime": "6.26.0", "chokidar": "1.7.0", - "commander": "2.15.0", + "commander": "2.15.1", "convert-source-map": "1.5.1", "fs-readdir-recursive": "1.1.0", "glob": "7.1.2", @@ -419,22 +513,22 @@ }, "babel-eslint": { "version": "8.2.2", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.2.tgz", + "resolved": "http://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.2.tgz", "integrity": "sha512-Qt2lz2egBxNYWqN9JIO2z4NOOf8i4b5JS6CFoYrOZZTDssueiV1jH/jsefyg+86SeNY3rB361/mi3kE1WK2WYQ==", "dev": true, "requires": { - "@babel/code-frame": "7.0.0-beta.40", - "@babel/traverse": "7.0.0-beta.40", - "@babel/types": "7.0.0-beta.40", - "babylon": "7.0.0-beta.40", + "@babel/code-frame": "7.0.0-beta.42", + "@babel/traverse": "7.0.0-beta.42", + "@babel/types": "7.0.0-beta.42", + "babylon": "7.0.0-beta.42", "eslint-scope": "3.7.1", "eslint-visitor-keys": "1.0.0" }, "dependencies": { "babylon": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.40.tgz", - "integrity": "sha512-AVxF2EcxvGD5hhOuLTOLAXBb0VhwWpEX0HyHdAI2zU+AAP4qEwtQj8voz1JR3uclGai0rfcE+dCTHnNMOnimFg==", + "version": "7.0.0-beta.42", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.42.tgz", + "integrity": "sha512-h6E/OkkvcBw/JimbL0p8dIaxrcuQn3QmIYGC/GtJlRYif5LTKBYPHXYwqluJpfS/kOXoz0go+9mkmOVC0M+zWw==", "dev": true } } @@ -995,7 +1089,7 @@ "babel-plugin-transform-exponentiation-operator": "6.24.1", "babel-plugin-transform-regenerator": "6.26.0", "browserslist": "2.11.3", - "invariant": "2.2.3", + "invariant": "2.2.4", "semver": "5.5.0" } }, @@ -1063,7 +1157,7 @@ "babylon": "6.18.0", "debug": "2.6.9", "globals": "9.18.0", - "invariant": "2.2.3", + "invariant": "2.2.4", "lodash": "4.17.5" } }, @@ -1091,6 +1185,48 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, "binary-extensions": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", @@ -1098,6 +1234,15 @@ "dev": true, "optional": true }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1113,13 +1258,35 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, - "optional": true, "requires": { "expand-range": "1.8.2", "preserve": "0.2.0", "repeat-element": "1.1.2" } }, + "browser-process-hrtime": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz", + "integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44=", + "dev": true + }, + "browser-resolve": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", + "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -1132,10 +1299,16 @@ "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", "dev": true, "requires": { - "caniuse-lite": "1.0.30000813", - "electron-to-chromium": "1.3.36" + "caniuse-lite": "1.0.30000820", + "electron-to-chromium": "1.3.40" } }, + "buffer-from": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", + "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", + "dev": true + }, "buffer-writer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.1.tgz", @@ -1148,6 +1321,31 @@ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, "caller-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", @@ -1169,9 +1367,15 @@ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" }, "caniuse-lite": { - "version": "1.0.30000813", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000813.tgz", - "integrity": "sha512-A8ITSmH5SFdMFdC704ggjg+x2z5PzQmVlG8tavwnfvbC33Q1UYrj0+G+Xm0SNAnd4He36fwUE/KEWytOEchw+A==", + "version": "1.0.30000820", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000820.tgz", + "integrity": "sha512-E0dpVjnt1XTNmWlGgdiae/tOF0jrJ/s+dOnwk8PLmPdu5uSu8wTLJhhbhcgUWU4aO9Iy5yUMZYxT60JS259sbQ==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, "chai": { @@ -1257,12 +1461,104 @@ "readdirp": "2.1.0" } }, + "ci-info": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", + "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==", + "dev": true + }, "circular-json": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", "dev": true }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -1272,6 +1568,65 @@ "restore-cursor": "2.0.0" } }, + "cli-spinners": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", + "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=", + "dev": true + }, + "cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", + "dev": true, + "requires": { + "slice-ansi": "0.0.4", + "string-width": "1.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", @@ -1299,6 +1654,16 @@ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, "color-convert": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", @@ -1314,10 +1679,25 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, "commander": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.0.tgz", - "integrity": "sha512-7B1ilBwtYSbetCgTY1NJFg+gVpestg0fdA1MhC1Vs4ssyfSXnCAjFr+QcQM9/RedXC0EaUx1sG8Smgw2VfgKEg==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", "dev": true }, "concat-map": { @@ -1327,11 +1707,12 @@ "dev": true }, "concat-stream": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.1.tgz", - "integrity": "sha512-gslSSJx03QKa59cIKqeJO9HQ/WZMotvYJCuaUULrLpjj8oG40kV2Z+gz82pVxlTkOADi4PJxQPPfhl1ELYrrXw==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { + "buffer-from": "1.0.0", "inherits": "2.0.3", "readable-stream": "2.3.5", "typedarray": "0.0.6" @@ -1354,12 +1735,24 @@ "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", "dev": true }, + "content-type-parser": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz", + "integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==", + "dev": true + }, "convert-source-map": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", "dev": true }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, "core-js": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", @@ -1372,10 +1765,34 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "cosmiconfig": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", + "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", + "dev": true, + "requires": { + "is-directory": "0.3.1", + "js-yaml": "3.11.0", + "parse-json": "4.0.0", + "require-from-string": "2.0.1" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "1.3.1", + "json-parse-better-errors": "1.0.1" + } + } + } + }, "cross-env": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.1.3.tgz", - "integrity": "sha512-UOokgwvDzCT0mqRSLEkJzUhYXB1vK3E5UgDrD41QiXsm9UetcW2rCGHYz/O3p873lMJ1VZbFCF9Izkwh7nYR5A==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.1.4.tgz", + "integrity": "sha512-Mx8mw6JWhfpYoEk7PGvHxJMLQwQHORAs8+2bX+C1lGQ4h3GkDb1zbzC2Nw85YH9ZQMlO0BHZxMacgrfPmMFxbg==", "dev": true, "requires": { "cross-spawn": "5.1.0", @@ -1387,28 +1804,90 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "requires": { - "lru-cache": "4.1.1", + "lru-cache": "4.1.2", "shebang-command": "1.2.0", "which": "1.3.0" } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", "dev": true, "requires": { - "ms": "2.0.0" + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + } } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "cssom": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", + "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=", + "dev": true }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "dev": true, + "requires": { + "cssom": "0.3.2" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "date-fns": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", + "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { @@ -1421,6 +1900,24 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, "del": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", @@ -1429,13 +1926,19 @@ "requires": { "globby": "5.0.0", "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", + "is-path-in-cwd": "1.0.1", "object-assign": "4.1.1", "pify": "2.3.0", "pinkie-promise": "2.0.1", "rimraf": "2.6.2" } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, "detect-indent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", @@ -1460,6 +1963,15 @@ "esutils": "2.0.2" } }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "4.0.2" + } + }, "dotenv": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz", @@ -1467,10 +1979,26 @@ "dev": true, "optional": true }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, "electron-to-chromium": { - "version": "1.3.36", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.36.tgz", - "integrity": "sha1-Dqv3Gp6+qQE/scw1o5DgaGJPJ+g=", + "version": "1.3.40", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.40.tgz", + "integrity": "sha1-H71tl779crim+SHcONIkE9L2/d8=", + "dev": true + }, + "elegant-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", + "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", "dev": true }, "error-ex": { @@ -1488,16 +2016,44 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "escodegen": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", + "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", + "dev": true, + "requires": { + "esprima": "3.1.3", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "optionator": "0.8.2", + "source-map": "0.6.1" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, "eslint": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.18.2.tgz", - "integrity": "sha512-qy4i3wODqKMYfz9LUI8N2qYDkHkoieTbiHpMrYUI/WbjhXJQr7lI4VngixTgaG+yHX+NBCv7nW4hA0ShbvaNKw==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", "dev": true, "requires": { "ajv": "5.5.2", "babel-code-frame": "6.26.0", "chalk": "2.3.2", - "concat-stream": "1.6.1", + "concat-stream": "1.6.2", "cross-spawn": "5.1.0", "debug": "3.1.0", "doctrine": "2.1.0", @@ -1509,7 +2065,7 @@ "file-entry-cache": "2.0.0", "functional-red-black-tree": "1.0.1", "glob": "7.1.2", - "globals": "11.3.0", + "globals": "11.4.0", "ignore": "3.3.7", "imurmurhash": "0.1.4", "inquirer": "3.3.0", @@ -1525,6 +2081,7 @@ "path-is-inside": "1.0.2", "pluralize": "7.0.0", "progress": "2.0.0", + "regexpp": "1.0.1", "require-uncached": "1.0.3", "semver": "5.5.0", "strip-ansi": "4.0.0", @@ -1563,9 +2120,9 @@ } }, "globals": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.3.0.tgz", - "integrity": "sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw==", + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.4.0.tgz", + "integrity": "sha512-Dyzmifil8n/TmSqYDEXbm+C8yitzJQqQIlJQLNRMwa+BOUJpRC19pyVeN12JAjt61xonvXjtff+hJruTRXn5HA==", "dev": true }, "supports-color": { @@ -1588,6 +2145,15 @@ "eslint-restricted-globals": "0.1.1" } }, + "eslint-config-prettier": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-2.9.0.tgz", + "integrity": "sha512-ag8YEyBXsm3nmOv1Hz991VtNNDMRa+MNy8cY47Pl4bw6iuzqKbJajXdqUpiw13STdLLrznxgm1hj9NhxeOYq0A==", + "dev": true, + "requires": { + "get-stdin": "5.0.1" + } + }, "eslint-import-resolver-node": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", @@ -1595,7 +2161,7 @@ "dev": true, "requires": { "debug": "2.6.9", - "resolve": "1.5.0" + "resolve": "1.6.0" } }, "eslint-module-utils": { @@ -1638,6 +2204,25 @@ } } }, + "eslint-plugin-prettier": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-2.6.0.tgz", + "integrity": "sha512-floiaI4F7hRkTrFe8V2ItOK97QYrX75DjmdzmVITZoAP6Cn06oEDPQRsO6MlHEP/u2SxI3xQ52Kpjw6j5WGfeQ==", + "dev": true, + "requires": { + "fast-diff": "1.1.2", + "jest-docblock": "21.2.0" + } + }, + "eslint-plugin-security": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.4.0.tgz", + "integrity": "sha512-xlS7P2PLMXeqfhyf3NpqbvbnW04kN8M9NtmhpR3XGyOvt/vNKS7XPXT5EDbwKW9vCjWH4PpfQvgD/+JgN0VJKA==", + "dev": true, + "requires": { + "safe-regex": "1.1.0" + } + }, "eslint-restricted-globals": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz", @@ -1720,12 +2305,17 @@ "strip-eof": "1.0.0" } }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, "expand-brackets": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, - "optional": true, "requires": { "is-posix-bracket": "0.1.1" } @@ -1735,11 +2325,62 @@ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, - "optional": true, "requires": { "fill-range": "2.2.3" } }, + "expect": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-22.4.3.tgz", + "integrity": "sha512-XcNXEPehqn8b/jm8FYotdX0YrXn36qp4HWlrVT4ktwQas1l1LPxiVWncYnnL2eyMtKAmVIaG0XAp0QlrqJaxaA==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "jest-diff": "22.4.3", + "jest-get-type": "22.4.3", + "jest-matcher-utils": "22.4.3", + "jest-message-util": "22.4.3", + "jest-regex-util": "22.4.3" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, "external-editor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", @@ -1756,17 +2397,28 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, - "optional": true, "requires": { "is-extglob": "1.0.0" } }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, "fast-deep-equal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", "dev": true }, + "fast-diff": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", + "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==", + "dev": true + }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", @@ -1802,15 +2454,13 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true, - "optional": true + "dev": true }, "fill-range": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", "dev": true, - "optional": true, "requires": { "is-number": "2.1.0", "isobject": "2.1.0", @@ -1819,6 +2469,12 @@ "repeat-string": "1.6.1" } }, + "find-parent-dir": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", + "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", + "dev": true + }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -1843,19 +2499,43 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, - "optional": true + "dev": true }, "for-own": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, - "optional": true, "requires": { "for-in": "1.0.2" } }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "0.2.2" + } + }, "fs-readdir-recursive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", @@ -1875,7 +2555,7 @@ "dev": true, "optional": true, "requires": { - "nan": "2.9.2", + "nan": "2.10.0", "node-pre-gyp": "0.6.39" }, "dependencies": { @@ -2795,11 +3475,38 @@ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, + "get-own-enumerable-property-symbols": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz", + "integrity": "sha512-TtY/sbOemiMKPRUDDanGCSgBYe7Mf0vbRsWnBZ+9yghpZ1MvcpSpuZFjHdEeY/LZjZy0vdLjS77L6HosisFiug==", + "dev": true + }, + "get-stdin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", + "dev": true + }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", @@ -2819,7 +3526,6 @@ "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, - "optional": true, "requires": { "glob-parent": "2.0.0", "is-glob": "2.0.1" @@ -2866,6 +3572,22 @@ "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", "dev": true }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "requires": { + "ajv": "5.5.2", + "har-schema": "2.0.0" + } + }, "has": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", @@ -2898,12 +3620,90 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "dev": true, + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.1", + "sntp": "2.1.0" + } + }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "dev": true }, + "hoek": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==", + "dev": true + }, "home-or-tmp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", @@ -2920,6 +3720,45 @@ "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", "dev": true }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "1.0.3" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.1" + } + }, + "husky": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-0.14.3.tgz", + "integrity": "sha512-e21wivqHpstpoiWA/Yi8eFti8E+sQDSS53cpJsPptPs295QTOQR0ZwnHo2TXy1XOpZFD9rPOd3NpmqTK6uMLJA==", + "dev": true, + "requires": { + "is-ci": "1.1.0", + "normalize-path": "1.0.0", + "strip-indent": "2.0.0" + }, + "dependencies": { + "normalize-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", + "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", + "dev": true + } + } + }, "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", @@ -2938,10 +3777,19 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "1.4.0", @@ -2960,7 +3808,7 @@ "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "dev": true, "requires": { - "ansi-escapes": "3.0.0", + "ansi-escapes": "3.1.0", "chalk": "2.3.2", "cli-cursor": "2.1.0", "cli-width": "2.2.0", @@ -3008,9 +3856,9 @@ } }, "invariant": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.3.tgz", - "integrity": "sha512-7Z5PPegwDTyjbaeCnV0efcyS6vdKAU51kpEmS7QFib3P4822l8ICYyMn7qvJnc+WzLoDsuI9gPMKbJ8pCu8XtA==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, "requires": { "loose-envify": "1.3.1" @@ -3021,6 +3869,23 @@ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -3052,19 +3917,68 @@ "builtin-modules": "1.1.1" } }, + "is-ci": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", + "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", + "dev": true, + "requires": { + "ci-info": "1.1.3" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, "is-dotfile": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true, - "optional": true + "dev": true }, "is-equal-shallow": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, - "optional": true, "requires": { "is-primitive": "2.0.0" } @@ -3073,8 +3987,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "optional": true + "dev": true }, "is-extglob": { "version": "1.0.0", @@ -3096,6 +4009,12 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, + "is-generator-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", + "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", + "dev": true + }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", @@ -3110,11 +4029,42 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, - "optional": true, "requires": { "kind-of": "3.2.2" } }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-observable": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-0.2.0.tgz", + "integrity": "sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI=", + "dev": true, + "requires": { + "symbol-observable": "0.2.4" + } + }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "dev": true, + "requires": { + "is-number": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -3122,9 +4072,9 @@ "dev": true }, "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", "dev": true, "requires": { "is-path-inside": "1.0.1" @@ -3139,19 +4089,34 @@ "path-is-inside": "1.0.2" } }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, "is-posix-bracket": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true, - "optional": true + "dev": true }, "is-primitive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true, - "optional": true + "dev": true }, "is-promise": { "version": "2.1.0", @@ -3159,6 +4124,12 @@ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, "is-resolvable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", @@ -3170,6 +4141,12 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -3192,112 +4169,1221 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dev": true, - "optional": true, "requires": { "isarray": "1.0.0" } }, - "js-string-escape": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, - "js-yaml": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", - "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", + "jest-config": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-22.4.3.tgz", + "integrity": "sha512-KSg3EOToCgkX+lIvenKY7J8s426h6ahXxaUFJxvGoEk0562Z6inWj1TnKoGycTASwiLD+6kSYFALcjdosq9KIQ==", "dev": true, "requires": { - "argparse": "1.0.10", - "esprima": "4.0.0" + "chalk": "2.3.2", + "glob": "7.1.2", + "jest-environment-jsdom": "22.4.3", + "jest-environment-node": "22.4.3", + "jest-get-type": "22.4.3", + "jest-jasmine2": "22.4.3", + "jest-regex-util": "22.4.3", + "jest-resolve": "22.4.3", + "jest-util": "22.4.3", + "jest-validate": "22.4.3", + "pretty-format": "22.4.3" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } } }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json5": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", - "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=", + "jest-diff": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz", + "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==", "dev": true, - "optional": true + "requires": { + "chalk": "2.3.2", + "diff": "3.5.0", + "jest-get-type": "22.4.3", + "pretty-format": "22.4.3" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } }, - "just-extend": { - "version": "1.1.27", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.27.tgz", - "integrity": "sha512-mJVp13Ix6gFo3SBAy9U/kL+oeZqzlYYYLQBwXVBlVzIsZwBqGREnOro24oC/8s8aox+rJhtZ2DiQof++IrkA+g==", + "jest-docblock": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz", + "integrity": "sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw==", "dev": true }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "jest-environment-jsdom": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz", + "integrity": "sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w==", "dev": true, "requires": { - "is-buffer": "1.1.6" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "1.0.0" + "jest-mock": "22.4.3", + "jest-util": "22.4.3", + "jsdom": "11.6.2" } }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "jest-environment-node": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-22.4.3.tgz", + "integrity": "sha512-reZl8XF6t/lMEuPWwo9OLfttyC26A5AMgDyEQ6DBgZuyfyeNUzYT8BFo6uxCCP/Av/b7eb9fTi3sIHFPBzmlRA==", "dev": true, "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" + "jest-mock": "22.4.3", + "jest-util": "22.4.3" } }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "jest-get-type": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "dev": true + }, + "jest-jasmine2": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-22.4.3.tgz", + "integrity": "sha512-yZCPCJUcEY6R5KJB/VReo1AYI2b+5Ky+C+JA1v34jndJsRcLpU4IZX4rFJn7yDTtdNbO/nNqg+3SDIPNH2ecnw==", "dev": true, "requires": { + "chalk": "2.3.2", + "co": "4.6.0", + "expect": "22.4.3", "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - } - }, + "is-generator-fn": "1.0.0", + "jest-diff": "22.4.3", + "jest-matcher-utils": "22.4.3", + "jest-message-util": "22.4.3", + "jest-snapshot": "22.4.3", + "jest-util": "22.4.3", + "source-map-support": "0.5.4" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.4.tgz", + "integrity": "sha512-PETSPG6BjY1AHs2t64vS2aqAgu6dMIMXJULWFBGbh2Gr8nVLbCFDo6i/RMMvviIQ2h1Z8+5gQhVKSn2je9nmdg==", + "dev": true, + "requires": { + "source-map": "0.6.1" + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-matcher-utils": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz", + "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", + "dev": true, + "requires": { + "chalk": "2.3.2", + "jest-get-type": "22.4.3", + "pretty-format": "22.4.3" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-message-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-22.4.3.tgz", + "integrity": "sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.42", + "chalk": "2.3.2", + "micromatch": "2.3.11", + "slash": "1.0.0", + "stack-utils": "1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-mock": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-22.4.3.tgz", + "integrity": "sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q==", + "dev": true + }, + "jest-regex-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-22.4.3.tgz", + "integrity": "sha512-LFg1gWr3QinIjb8j833bq7jtQopiwdAs67OGfkPrvy7uNUbVMfTXXcOKXJaeY5GgjobELkKvKENqq1xrUectWg==", + "dev": true + }, + "jest-resolve": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-22.4.3.tgz", + "integrity": "sha512-u3BkD/MQBmwrOJDzDIaxpyqTxYH+XqAXzVJP51gt29H8jpj3QgKof5GGO2uPGKGeA1yTMlpbMs1gIQ6U4vcRhw==", + "dev": true, + "requires": { + "browser-resolve": "1.11.2", + "chalk": "2.3.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-snapshot": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-22.4.3.tgz", + "integrity": "sha512-JXA0gVs5YL0HtLDCGa9YxcmmV2LZbwJ+0MfyXBBc5qpgkEYITQFJP7XNhcHFbUvRiniRpRbGVfJrOoYhhGE0RQ==", + "dev": true, + "requires": { + "chalk": "2.3.2", + "jest-diff": "22.4.3", + "jest-matcher-utils": "22.4.3", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "pretty-format": "22.4.3" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-22.4.3.tgz", + "integrity": "sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ==", + "dev": true, + "requires": { + "callsites": "2.0.0", + "chalk": "2.3.2", + "graceful-fs": "4.1.11", + "is-ci": "1.1.0", + "jest-message-util": "22.4.3", + "mkdirp": "0.5.1", + "source-map": "0.6.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-validate": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-22.4.3.tgz", + "integrity": "sha512-CfFM18W3GSP/xgmA4UouIx0ljdtfD2mjeBC6c89Gg17E44D4tQhAcTrZmf9djvipwU30kSTnk6CzcxdCCeSXfA==", + "dev": true, + "requires": { + "chalk": "2.3.2", + "jest-config": "22.4.3", + "jest-get-type": "22.4.3", + "leven": "2.1.0", + "pretty-format": "22.4.3" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", + "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", + "dev": true, + "requires": { + "argparse": "1.0.10", + "esprima": "4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "jsdom": { + "version": "11.6.2", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.6.2.tgz", + "integrity": "sha512-pAeZhpbSlUp5yQcS6cBQJwkbzmv4tWFaYxHbFVSxzXefqjvtRA851Z5N2P+TguVG9YeUDcgb8pdeVQRJh0XR3Q==", + "dev": true, + "requires": { + "abab": "1.0.4", + "acorn": "5.5.3", + "acorn-globals": "4.1.0", + "array-equal": "1.0.0", + "browser-process-hrtime": "0.1.2", + "content-type-parser": "1.0.2", + "cssom": "0.3.2", + "cssstyle": "0.2.37", + "domexception": "1.0.1", + "escodegen": "1.9.1", + "html-encoding-sniffer": "1.0.2", + "left-pad": "1.2.0", + "nwmatcher": "1.4.4", + "parse5": "4.0.0", + "pn": "1.1.0", + "request": "2.85.0", + "request-promise-native": "1.0.5", + "sax": "1.2.4", + "symbol-tree": "3.2.2", + "tough-cookie": "2.3.4", + "w3c-hr-time": "1.0.1", + "webidl-conversions": "4.0.2", + "whatwg-encoding": "1.0.3", + "whatwg-url": "6.4.0", + "ws": "4.1.0", + "xml-name-validator": "3.0.0" + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz", + "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", + "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=", + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "just-extend": { + "version": "1.1.27", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.27.tgz", + "integrity": "sha512-mJVp13Ix6gFo3SBAy9U/kL+oeZqzlYYYLQBwXVBlVzIsZwBqGREnOro24oC/8s8aox+rJhtZ2DiQof++IrkA+g==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "1.0.0" + } + }, + "left-pad": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.2.0.tgz", + "integrity": "sha1-0wpzxrggHY99jnlWupYWCHpo4O4=", + "dev": true + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "lint-staged": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-7.0.0.tgz", + "integrity": "sha512-6Z89we28Qy1Ez7ZxO8yYfPKqzdxkSjnURq1d3RS2gKkZrA135xN+ptF3EWHrcHyBMmgA20vA7dGCQGj+OMS22g==", + "dev": true, + "requires": { + "app-root-path": "2.0.1", + "chalk": "2.3.2", + "commander": "2.15.1", + "cosmiconfig": "4.0.0", + "debug": "3.1.0", + "dedent": "0.7.0", + "execa": "0.9.0", + "find-parent-dir": "0.3.0", + "is-glob": "4.0.0", + "jest-validate": "22.4.3", + "listr": "0.13.0", + "lodash": "4.17.5", + "log-symbols": "2.2.0", + "micromatch": "3.1.10", + "npm-which": "3.0.1", + "p-map": "1.2.0", + "path-is-inside": "1.0.2", + "pify": "3.0.0", + "please-upgrade-node": "3.0.1", + "staged-git-files": "1.1.0", + "stringify-object": "3.2.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", + "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "define-property": "1.0.0", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "kind-of": "6.0.2", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "execa": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.9.0.tgz", + "integrity": "sha512-BbUMBiX4hqiHZUA5+JujIjNb6TyAlp2D5KLheMjMluwOuzcnylDL4AxZYLLn1n2AGB49eSWwyKvvEQoRpnAtmA==", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.1", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "listr": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.13.0.tgz", + "integrity": "sha1-ILsLowuuZg7oTMBQPfS+PVYjiH0=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "cli-truncate": "0.2.1", + "figures": "1.7.0", + "indent-string": "2.1.0", + "is-observable": "0.2.0", + "is-promise": "2.1.0", + "is-stream": "1.1.0", + "listr-silent-renderer": "1.1.1", + "listr-update-renderer": "0.4.0", + "listr-verbose-renderer": "0.4.1", + "log-symbols": "1.0.2", + "log-update": "1.0.2", + "ora": "0.2.3", + "p-map": "1.2.0", + "rxjs": "5.5.8", + "stream-to-observable": "0.2.0", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "1.1.3" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "listr-silent-renderer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", + "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", + "dev": true + }, + "listr-update-renderer": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz", + "integrity": "sha1-NE2YDaLKLosUW6MFkI8yrj9MyKc=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "cli-truncate": "0.2.1", + "elegant-spinner": "1.0.1", + "figures": "1.7.0", + "indent-string": "3.2.0", + "log-symbols": "1.0.2", + "log-update": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "1.1.3" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "listr-verbose-renderer": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", + "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "date-fns": "1.29.0", + "figures": "1.7.0" + }, + "dependencies": { + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "1.0.1" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } + } + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + } + }, "lodash": { "version": "4.17.5", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", @@ -3309,6 +5395,95 @@ "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "2.3.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "log-update": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz", + "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", + "dev": true, + "requires": { + "ansi-escapes": "1.4.0", + "cli-cursor": "1.0.2" + }, + "dependencies": { + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "1.0.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } + } + } + }, "lolex": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.3.2.tgz", @@ -3325,14 +5500,29 @@ } }, "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", + "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", "requires": { "pseudomap": "1.0.2", "yallist": "2.1.2" } }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "1.0.1" + } + }, "mem": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", @@ -3346,7 +5536,6 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, - "optional": true, "requires": { "arr-diff": "2.0.0", "array-unique": "0.2.1", @@ -3363,6 +5552,21 @@ "regex-cache": "0.4.4" } }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, + "requires": { + "mime-db": "1.33.0" + } + }, "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", @@ -3382,6 +5586,27 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -3391,9 +5616,9 @@ } }, "mocha": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.4.tgz", - "integrity": "sha512-nMOpAPFosU1B4Ix1jdhx5e3q7XO55ic5a8cgYvW27CequcEY+BabS0kUVL1Cw1V5PuVHZWeNRWFLmEPexo79VA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.5.tgz", + "integrity": "sha512-3MM3UjZ5p8EJrYpG7s+29HAI9G7sTzKEe4+w37Dg0QP7qL4XGsV+Q2xet2cE37AqdgN1OtYQB6Vl98YiPV3PgA==", "dev": true, "requires": { "browser-stdout": "1.3.1", @@ -3458,12 +5683,52 @@ "dev": true }, "nan": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.9.2.tgz", - "integrity": "sha512-ltW65co7f3PQWBDbqVvaU1WtFJUsNW7sWWm4HINhbMQIyVyzIeyZ8toX5TC5eeooE6piZoaEh4cZkueSKG3KYw==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", "dev": true, "optional": true }, + "nanomatch": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -3471,9 +5736,9 @@ "dev": true }, "nise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.3.0.tgz", - "integrity": "sha512-U+Krdzhsw4losPP/Rij5UGTLQgS9gaWmXdRIbZQIQWVsUGDBo+N0m9mrY9CCEnmwssgswwydxLJUZtFfouC0gA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.3.2.tgz", + "integrity": "sha512-KPKb+wvETBiwb4eTwtR/OsA2+iijXP+VnlSFYJo3EHjm2yjek1NWxHOUQat3i7xNLm1Bm18UA5j5Wor0yO2GtA==", "dev": true, "requires": { "@sinonjs/formatio": "2.0.0", @@ -3504,6 +5769,15 @@ "remove-trailing-separator": "1.1.0" } }, + "npm-path": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz", + "integrity": "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==", + "dev": true, + "requires": { + "which": "1.3.0" + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -3512,28 +5786,143 @@ "path-key": "2.0.1" } }, - "number-is-nan": { + "npm-which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz", + "integrity": "sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo=", + "dev": true, + "requires": { + "commander": "2.15.1", + "npm-path": "2.0.4", + "which": "1.3.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "nwmatcher": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", + "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + } + } + }, + "object-visit": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, - "optional": true, "requires": { "for-own": "0.1.5", "is-extendable": "0.1.1" } }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -3566,6 +5955,45 @@ "wordwrap": "1.0.0" } }, + "ora": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz", + "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "cli-spinners": "0.1.2", + "object-assign": "4.1.1" + }, + "dependencies": { + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "1.0.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } + } + } + }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -3620,6 +6048,12 @@ "p-limit": "1.2.0" } }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", @@ -3636,7 +6070,6 @@ "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, - "optional": true, "requires": { "glob-base": "0.3.0", "is-dotfile": "1.0.3", @@ -3653,6 +6086,18 @@ "error-ex": "1.3.1" } }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -3713,6 +6158,12 @@ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", "dev": true }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, "pg": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/pg/-/pg-7.4.1.tgz", @@ -3821,12 +6272,30 @@ } } }, + "please-upgrade-node": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.0.1.tgz", + "integrity": "sha1-CmgfLBiRXlQzpcos2U4Lggangts=", + "dev": true + }, "pluralize": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", "dev": true }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, "postgres-array": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-1.0.2.tgz", @@ -3864,8 +6333,34 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "prettier": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.11.1.tgz", + "integrity": "sha512-T/KD65Ot0PB97xTrG8afQ46x3oiVhnfGjGESSI9NWYcG92+OUPZKkwHqGWXH2t9jK1crnQjubECW0FuOth+hxw==", + "dev": true + }, + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", "dev": true, - "optional": true + "requires": { + "ansi-regex": "3.0.0", + "ansi-styles": "3.2.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + } + } }, "private": { "version": "0.1.8", @@ -3890,12 +6385,23 @@ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + }, "randomatic": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", "dev": true, - "optional": true, "requires": { "is-number": "3.0.0", "kind-of": "4.0.0" @@ -3906,7 +6412,6 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, - "optional": true, "requires": { "kind-of": "3.2.2" }, @@ -3916,7 +6421,6 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, - "optional": true, "requires": { "is-buffer": "1.1.6" } @@ -3928,7 +6432,6 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, - "optional": true, "requires": { "is-buffer": "1.1.6" } @@ -4012,11 +6515,26 @@ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, - "optional": true, "requires": { "is-equal-shallow": "0.1.3" } }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + } + }, + "regexpp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.0.1.tgz", + "integrity": "sha512-8Ph721maXiOYSLtaDGKVmDn5wdsNaF6Px85qFNeMPQq0r8K5Y10tgP6YuR65Ws35n4DvzFcCxEnRNBIXQunzLw==", + "dev": true + }, "regexpu-core": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", @@ -4067,8 +6585,7 @@ "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "optional": true + "dev": true }, "repeating": { "version": "2.0.1", @@ -4079,11 +6596,67 @@ "is-finite": "1.0.2" } }, + "request": { + "version": "2.85.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", + "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", + "dev": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + } + }, + "request-promise-core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", + "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", + "dev": true, + "requires": { + "lodash": "4.17.5" + } + }, + "request-promise-native": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", + "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", + "dev": true, + "requires": { + "request-promise-core": "1.1.1", + "stealthy-require": "1.1.1", + "tough-cookie": "2.3.4" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, + "require-from-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.1.tgz", + "integrity": "sha1-xUUjPp19pmFunVmt+zn8n1iGdv8=", + "dev": true + }, "require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", @@ -4100,9 +6673,9 @@ } }, "resolve": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", - "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.6.0.tgz", + "integrity": "sha512-mw7JQNu5ExIkcw4LPih0owX/TZXjD/ZUF/ZQ/pDnkw3ZKhDcZZw5klmBlj6gVMwjQ3Pz5Jgu7F3d0jcDVuEWdw==", "dev": true, "requires": { "path-parse": "1.0.5" @@ -4114,6 +6687,12 @@ "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", "dev": true }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", @@ -4124,6 +6703,12 @@ "signal-exit": "3.0.2" } }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", @@ -4157,18 +6742,50 @@ "rx-lite": "4.0.8" } }, + "rxjs": { + "version": "5.5.8", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.8.tgz", + "integrity": "sha512-Bz7qou7VAIoGiglJZbzbXa4vpX5BmTTN2Dj/se6+SwADtw4SihqBIiEa7VmTXJ8pynvq0iFr5Gx9VLyye1rIxQ==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + }, + "dependencies": { + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + } + } + }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", "dev": true }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "0.1.15" + } + }, "samsam": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", "dev": true }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", @@ -4187,6 +6804,29 @@ "dev": true, "optional": true }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -4206,16 +6846,16 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "sinon": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.4.2.tgz", - "integrity": "sha512-cpOHpnRyY3Dk9dTHBYMfVBB0HUCSKIpxW07X6OGW2NiYPovs4AkcL8Q8MzecbAROjbfRA9esJCmlZgikxDz7DA==", + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.4.9.tgz", + "integrity": "sha512-0T0jXEG897qaZF4I9YHmqQIM7g48I62EQiM/2J1J6C5pIYBFpk8YAECSE/gmXIxLU5xVT3qqsQto2VSByrHXlg==", "dev": true, "requires": { "@sinonjs/formatio": "2.0.0", "diff": "3.5.0", "lodash.get": "4.4.2", "lolex": "2.3.2", - "nise": "1.3.0", + "nise": "1.3.2", "supports-color": "5.3.0", "type-detect": "4.0.8" }, @@ -4231,25 +6871,164 @@ } } }, - "sinon-chai": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.0.0.tgz", - "integrity": "sha512-+cqeKiuMZjZs800fRf4kjJR/Pp4p7bYY3ciZHClFNS8tSzJoAcWni/ZUZD8TrfZ+oFRyLiKWX3fTClDATGy5vQ==", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true + "sinon-chai": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.0.0.tgz", + "integrity": "sha512-+cqeKiuMZjZs800fRf4kjJR/Pp4p7bYY3ciZHClFNS8tSzJoAcWni/ZUZD8TrfZ+oFRyLiKWX3fTClDATGy5vQ==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.1", + "use": "3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0" + "hoek": "4.2.1" } }, "source-map": { @@ -4258,6 +7037,19 @@ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, + "source-map-resolve": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "dev": true, + "requires": { + "atob": "2.0.3", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } + }, "source-map-support": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", @@ -4267,6 +7059,12 @@ "source-map": "0.5.7" } }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, "spdx-correct": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", @@ -4308,12 +7106,142 @@ "through": "2.3.8" } }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2" + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "sshpk": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", + "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + } + }, + "stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=", + "dev": true + }, + "staged-git-files": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/staged-git-files/-/staged-git-files-1.1.0.tgz", + "integrity": "sha1-GpuxMcGIVgECPHqt3T1UwiFCxSY=", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "stream-to-observable": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.2.0.tgz", + "integrity": "sha1-WdbqOT2HwsDdrBCqDVYbxrpvDhA=", + "dev": true, + "requires": { + "any-observable": "0.2.0" + } + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -4332,6 +7260,23 @@ "safe-buffer": "5.1.1" } }, + "stringify-object": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.2.2.tgz", + "integrity": "sha512-O696NF21oLiDy8PhpWu8AEqoZHw++QW6mUv0UvKZe8gWSdSvMXkiLufK7OmnP27Dro4GU5kb9U7JIO0mBuCRQg==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "2.0.1", + "is-obj": "1.0.1", + "is-regexp": "1.0.0" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -4351,6 +7296,12 @@ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -4363,6 +7314,18 @@ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, + "symbol-observable": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-0.2.4.tgz", + "integrity": "sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=", + "dev": true + }, + "symbol-tree": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "dev": true + }, "table": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", @@ -4441,12 +7404,96 @@ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "dev": true }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + } + } + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", + "dev": true + } + } + }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -4468,6 +7515,110 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" + } + } + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, "user-home": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", @@ -4480,6 +7631,12 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "dev": true + }, "v8flags": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", @@ -4499,6 +7656,52 @@ "spdx-expression-parse": "3.0.0" } }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } + }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "dev": true, + "requires": { + "browser-process-hrtime": "0.1.2" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz", + "integrity": "sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.19" + } + }, + "whatwg-url": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz", + "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==", + "dev": true, + "requires": { + "lodash.sortby": "4.7.0", + "tr46": "1.0.1", + "webidl-conversions": "4.0.2" + } + }, "which": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", @@ -4575,6 +7778,22 @@ "mkdirp": "0.5.1" } }, + "ws": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", + "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", + "dev": true, + "requires": { + "async-limiter": "1.0.0", + "safe-buffer": "5.1.1" + } + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", diff --git a/package.json b/package.json index 6e4a24f2..05e76750 100644 --- a/package.json +++ b/package.json @@ -59,10 +59,16 @@ "cross-env": "^5.0.0", "dotenv": ">=1.0.0", "eslint": "^4.8.0", - "eslint-config-airbnb-base": "12.1.0", + "eslint-config-airbnb-base": "^12.1.0", + "eslint-config-prettier": "^2.9.0", "eslint-plugin-import": "^2.7.0", + "eslint-plugin-prettier": "^2.6.0", + "eslint-plugin-security": "^1.4.0", + "husky": "^0.14.3", + "lint-staged": "^7.0.0", "mocha": "^5.0.0", "pg": "^7.3.0", + "prettier": "^1.11.1", "sinon": "^4.0.0", "sinon-chai": "^3.0.0" }, @@ -74,12 +80,23 @@ "dotenv": ">=1.0.0" }, "scripts": { + "precommit": "lint-staged", "compile": "babel lib/ -d dist/ && cp lib/migration-template.* dist/", "test:mocha": "cross-env NODE_ENV=test mocha --opts ./mocha.opts test", "test:migration": "babel-node bin/node-pg-migrate -m test/migrations", "test": "npm run test:mocha && npm run test:migration up && npm run test:migration down 0 -- --timestamp", - "lint": "eslint -c .eslintrc . bin/*", + "lint": "eslint -c eslintrc.js . bin/*", "lintfix": "npm run lint -- --fix", "prepare": "npm run compile" + }, + "lint-staged": { + "*.js": [ + "npm run lintfix", + "git add" + ], + "*.{json,md}": [ + "prettier --write", + "git add" + ] } } diff --git a/test/1414549381268_names.js b/test/1414549381268_names.js index 64b1e40f..be3f0c33 100644 --- a/test/1414549381268_names.js +++ b/test/1414549381268_names.js @@ -1,12 +1,12 @@ exports.up = (pgm, run) => { - pgm.createTable('names', { - id: 'id', - name: { type: 'varchar(10)' }, + pgm.createTable("names", { + id: "id", + name: { type: "varchar(10)" } }); run(); }; exports.down = (pgm, run) => { - pgm.dropTable('names'); + pgm.dropTable("names"); run(); }; diff --git a/test/1414549381268_names_promise.js b/test/1414549381268_names_promise.js index f17b4c7b..dc80d8d8 100644 --- a/test/1414549381268_names_promise.js +++ b/test/1414549381268_names_promise.js @@ -1,7 +1,7 @@ -exports.up = (pgm) => { - pgm.createTable('names', { - id: 'id', - name: { type: 'varchar(10)' }, +exports.up = pgm => { + pgm.createTable("names", { + id: "id", + name: { type: "varchar(10)" } }); return new Promise(resolve => setTimeout(resolve, 10)); }; diff --git a/test/db-test.js b/test/db-test.js index 885ecc8e..f362aa76 100644 --- a/test/db-test.js +++ b/test/db-test.js @@ -1,22 +1,22 @@ /* eslint-disable no-unused-expressions */ -import sinon from 'sinon'; -import { expect } from 'chai'; -import Db, { __RewireAPI__ as DbRewireAPI } from '../lib/db'; // eslint-disable-line import/named +import sinon from "sinon"; +import { expect } from "chai"; +import Db, { __RewireAPI__ as DbRewireAPI } from "../lib/db"; // eslint-disable-line import/named -describe('lib/db', () => { +describe("lib/db", () => { let sandbox; const pgMock = {}; const log = () => null; let client; before(() => { - DbRewireAPI.__Rewire__('pg', pgMock); + DbRewireAPI.__Rewire__("pg", pgMock); }); beforeEach(() => { sandbox = sinon.sandbox.create(); client = { - end: () => null, + end: () => null }; pgMock.Client = sandbox.mock().returns(client); }); @@ -25,7 +25,7 @@ describe('lib/db', () => { sandbox.restore(); }); - describe('.constructor( connection_string )', () => { + describe(".constructor( connection_string )", () => { let db; afterEach(() => { if (db) { @@ -33,13 +33,13 @@ describe('lib/db', () => { } }); - it('pg.Client should be called with connection_string', () => { - db = Db('connection_string'); - expect(pgMock.Client).to.be.calledWith('connection_string'); + it("pg.Client should be called with connection_string", () => { + db = Db("connection_string"); + expect(pgMock.Client).to.be.calledWith("connection_string"); }); }); - describe('.query( query )', () => { + describe(".query( query )", () => { let db; beforeEach(() => { db = Db(undefined, log); @@ -50,58 +50,52 @@ describe('lib/db', () => { db.close(); }); - it('should call client.connect if this is the first query', () => { + it("should call client.connect if this is the first query", () => { client.connect.returns(Promise.resolve()); client.query.returns(Promise.resolve()); - return db.query('query').then(() => { + return db.query("query").then(() => { expect(client.connect).to.be.calledOnce; }); }); - it('should not call client.connect on subsequent queries', () => { + it("should not call client.connect on subsequent queries", () => { client.connect.returns(Promise.resolve()); client.query.returns(Promise.resolve()); - return db.query('query_one') - .then(() => - db.query('query_two') - ) + return db + .query("query_one") + .then(() => db.query("query_two")) .then(() => { expect(client.connect).to.be.calledOnce; }); }); - it('should call client.query with query', () => { + it("should call client.query with query", () => { client.connect.returns(Promise.resolve()); client.query.returns(Promise.resolve()); - return db.query('query') - .then(() => { - expect(client.query.getCall(0).args[0]).to.equal('query'); - }); + return db.query("query").then(() => { + expect(client.query.getCall(0).args[0]).to.equal("query"); + }); }); - it('should not call client.query if client.connect fails', () => { - const error = 'error'; + it("should not call client.query if client.connect fails", () => { + const error = "error"; client.connect.returns(Promise.reject(error)); - return expect(db.query('query')) + return expect(db.query("query")) .to.eventually.be.rejectedWith(error) - .then(() => - expect(client.query).to.not.been.called - ); + .then(() => expect(client.query).to.not.been.called); }); - it('should resolve promise if query throws no error', () => { + it("should resolve promise if query throws no error", () => { client.connect.returns(Promise.resolve()); - const result = 'result'; + const result = "result"; client.query.returns(Promise.resolve(result)); - return expect(db.query('query')) - .to.eventually.equal(result); + return expect(db.query("query")).to.eventually.equal(result); }); - it('should reject promise if query throws error', () => { + it("should reject promise if query throws error", () => { client.connect.returns(Promise.resolve()); - const error = 'error'; + const error = "error"; client.query.returns(Promise.reject(error)); - return expect(db.query('query')) - .to.eventually.be.rejectedWith(error); + return expect(db.query("query")).to.eventually.be.rejectedWith(error); }); }); - describe('.close()', () => { + describe(".close()", () => { let db; beforeEach(() => { db = Db(); @@ -110,12 +104,9 @@ describe('lib/db', () => { db.close(); }); - it('should call client.end', () => { + it("should call client.end", () => { client.end = sinon.spy(); - return db.close() - .then(() => - expect(client.end).to.be.calledOnce - ); + return db.close().then(() => expect(client.end).to.be.calledOnce); }); }); }); diff --git a/test/indexes-test.js b/test/indexes-test.js index 62a88ede..e6903711 100644 --- a/test/indexes-test.js +++ b/test/indexes-test.js @@ -1,11 +1,13 @@ -import { expect } from 'chai'; -import * as Indexes from '../lib/operations/indexes'; +import { expect } from "chai"; +import * as Indexes from "../lib/operations/indexes"; -describe('lib/operations/indexes', () => { - describe('.create', () => { - it('check schema not included in index name', () => { - const sql = Indexes.create({ schema: 'a', name: 'b' }, ['c', 'd']); - expect(sql).to.equal('CREATE INDEX "b_c_d_index" ON "a"."b" ("c", "d");'); +describe("lib/operations/indexes", () => { + describe(".create", () => { + it("check schema not included in index name", () => { + const sql = Indexes.create({ schema: "a", name: "b" }, ["c", "d"]); + expect(sql).to.equal( + 'CREATE INDEX "b_c_d_index" ON "a"."b" ("c", "d");' + ); }); }); }); diff --git a/test/migration-test.js b/test/migration-test.js index dabc8494..a22b3fe8 100644 --- a/test/migration-test.js +++ b/test/migration-test.js @@ -1,16 +1,16 @@ /* eslint-disable no-unused-expressions */ -import sinon from 'sinon'; -import { expect } from 'chai'; -import Migration from '../lib/migration'; +import sinon from "sinon"; +import { expect } from "chai"; +import Migration from "../lib/migration"; -const callbackMigration = '1414549381268_names.js'; -const promiseMigration = '1414549381268_names_promise.js'; -const migrationsTable = 'pgmigrations'; +const callbackMigration = "1414549381268_names.js"; +const promiseMigration = "1414549381268_names_promise.js"; +const migrationsTable = "pgmigrations"; -const actionsCallback = require(`./${callbackMigration}`); // eslint-disable-line import/no-dynamic-require -const actionsPromise = require(`./${promiseMigration}`); // eslint-disable-line import/no-dynamic-require +const actionsCallback = require(`./${callbackMigration}`); // eslint-disable-line import/no-dynamic-require,security/detect-non-literal-require +const actionsPromise = require(`./${promiseMigration}`); // eslint-disable-line import/no-dynamic-require,security/detect-non-literal-require -describe('lib/migration', () => { +describe("lib/migration", () => { const dbMock = {}; const log = () => null; const options = { migrationsTable }; @@ -20,26 +20,34 @@ describe('lib/migration', () => { dbMock.query = sinon.spy(); }); - describe('self.applyUp', () => { - it('normal operations: db.query should be called', () => { - migration = new Migration(dbMock, callbackMigration, actionsCallback, options, log); - return migration - .applyUp() - .then(() => { - expect(dbMock.query).to.be.called; - }); + describe("self.applyUp", () => { + it("normal operations: db.query should be called", () => { + migration = new Migration( + dbMock, + callbackMigration, + actionsCallback, + options, + log + ); + return migration.applyUp().then(() => { + expect(dbMock.query).to.be.called; + }); }); - it('normal operations: db.query should be called when returning promise', () => { - migration = new Migration(dbMock, promiseMigration, actionsPromise, options, log); - return migration - .applyUp() - .then(() => { - expect(dbMock.query).to.be.called; - }); + it("normal operations: db.query should be called when returning promise", () => { + migration = new Migration( + dbMock, + promiseMigration, + actionsPromise, + options, + log + ); + return migration.applyUp().then(() => { + expect(dbMock.query).to.be.called; + }); }); - it('--dry-run option: db.query should not be called', () => { + it("--dry-run option: db.query should not be called", () => { migration = new Migration( dbMock, callbackMigration, @@ -47,38 +55,46 @@ describe('lib/migration', () => { { ...options, dryRun: true }, log ); - return migration - .applyUp() - .then(() => { - expect(dbMock.query).to.not.be.called; - }); + return migration.applyUp().then(() => { + expect(dbMock.query).to.not.be.called; + }); }); - it('should make proper SQL calls', () => { - migration = new Migration(dbMock, promiseMigration, actionsCallback, options, log); - return migration - .applyUp() - .then(() => { - expect(dbMock.query).to.have.callCount(4); - expect(dbMock.query.getCall(0).args[0]).to.equal('BEGIN;'); - expect(dbMock.query.getCall(1).args[0]).to.include('CREATE TABLE'); - expect(dbMock.query.getCall(2).args[0]).to.include(`INSERT INTO "public"."${migrationsTable}"`); - expect(dbMock.query.getCall(3).args[0]).to.equal('COMMIT;'); - }); + it("should make proper SQL calls", () => { + migration = new Migration( + dbMock, + promiseMigration, + actionsCallback, + options, + log + ); + return migration.applyUp().then(() => { + expect(dbMock.query).to.have.callCount(4); + expect(dbMock.query.getCall(0).args[0]).to.equal("BEGIN;"); + expect(dbMock.query.getCall(1).args[0]).to.include("CREATE TABLE"); + expect(dbMock.query.getCall(2).args[0]).to.include( + `INSERT INTO "public"."${migrationsTable}"` + ); + expect(dbMock.query.getCall(3).args[0]).to.equal("COMMIT;"); + }); }); }); - describe('self.applyDown', () => { - it('normal operations: db.query should be called', () => { - migration = new Migration(dbMock, callbackMigration, actionsCallback, options, log); - return migration - .applyDown() - .then(() => { - expect(dbMock.query).to.be.called; - }); + describe("self.applyDown", () => { + it("normal operations: db.query should be called", () => { + migration = new Migration( + dbMock, + callbackMigration, + actionsCallback, + options, + log + ); + return migration.applyDown().then(() => { + expect(dbMock.query).to.be.called; + }); }); - it('--dry-run option: db.query should not be called', () => { + it("--dry-run option: db.query should not be called", () => { migration = new Migration( dbMock, callbackMigration, @@ -86,24 +102,28 @@ describe('lib/migration', () => { { ...options, dryRun: true }, log ); - return migration - .applyDown() - .then(() => { - expect(dbMock.query).to.not.be.called; - }); + return migration.applyDown().then(() => { + expect(dbMock.query).to.not.be.called; + }); }); - it('should make proper SQL calls', () => { - migration = new Migration(dbMock, promiseMigration, actionsCallback, options, log); - return migration - .applyDown() - .then(() => { - expect(dbMock.query).to.have.callCount(4); - expect(dbMock.query.getCall(0).args[0]).to.equal('BEGIN;'); - expect(dbMock.query.getCall(1).args[0]).to.include('DROP TABLE'); - expect(dbMock.query.getCall(2).args[0]).to.include(`DELETE FROM "public"."${migrationsTable}"`); - expect(dbMock.query.getCall(3).args[0]).to.equal('COMMIT;'); - }); + it("should make proper SQL calls", () => { + migration = new Migration( + dbMock, + promiseMigration, + actionsCallback, + options, + log + ); + return migration.applyDown().then(() => { + expect(dbMock.query).to.have.callCount(4); + expect(dbMock.query.getCall(0).args[0]).to.equal("BEGIN;"); + expect(dbMock.query.getCall(1).args[0]).to.include("DROP TABLE"); + expect(dbMock.query.getCall(2).args[0]).to.include( + `DELETE FROM "public"."${migrationsTable}"` + ); + expect(dbMock.query.getCall(3).args[0]).to.equal("COMMIT;"); + }); }); }); }); diff --git a/test/migrations/003_promise.js b/test/migrations/003_promise.js index fff21951..a911369b 100644 --- a/test/migrations/003_promise.js +++ b/test/migrations/003_promise.js @@ -1,4 +1,4 @@ exports.up = () => - new Promise((resolve) => { + new Promise(resolve => { setTimeout(resolve, 10); }); diff --git a/test/migrations/004_table.js b/test/migrations/004_table.js index 13cd56e0..6ea9170e 100644 --- a/test/migrations/004_table.js +++ b/test/migrations/004_table.js @@ -1,16 +1,24 @@ -exports.comment = 'comment on table t2'; +exports.comment = "comment on table t2"; -exports.up = (pgm) => { - pgm.createTable('t1', { - id: 'id', - string: { type: 'text', notNull: true }, - created: { type: 'timestamp', notNull: true, default: pgm.func('current_timestamp') }, - }); - pgm.createTable('t2', { - id1: 'id', - id2: { type: 'integer', primaryKey: true, references: 't1(id)' }, - }, { - ifNotExists: true, - comment: exports.comment, +exports.up = pgm => { + pgm.createTable("t1", { + id: "id", + string: { type: "text", notNull: true }, + created: { + type: "timestamp", + notNull: true, + default: pgm.func("current_timestamp") + } }); + pgm.createTable( + "t2", + { + id1: "id", + id2: { type: "integer", primaryKey: true, references: "t1(id)" } + }, + { + ifNotExists: true, + comment: exports.comment + } + ); }; diff --git a/test/migrations/005_table_test.js b/test/migrations/005_table_test.js index 71f93dc8..0fc5f170 100644 --- a/test/migrations/005_table_test.js +++ b/test/migrations/005_table_test.js @@ -1,29 +1,41 @@ -const table = require('./004_table'); +const table = require("./004_table"); exports.up = pgm => new Promise((resolve, reject) => - pgm.db.select(`SELECT obj_description(c.oid) as "comment" + pgm.db + .select( + `SELECT obj_description(c.oid) as "comment" FROM pg_class c join pg_namespace n ON (c.relnamespace = n.oid) - WHERE c.relname = 't2' and c.relkind = 'r' and n.nspname = 'public'`) - .then(([{ comment }]) => ( - comment === table.comment - ? null - : reject(new Error('Comment not set')) - )) - .then(() => pgm.db.query('SAVEPOINT sp_reference;')) - .then(() => pgm.db.query('INSERT INTO t2(id2) VALUES (1);')) - .then(() => reject(new Error('Missing reference clause'))) - .catch(() => pgm.db.query('ROLLBACK TO SAVEPOINT sp_reference;')) - .then(() => pgm.db.query('SAVEPOINT sp_not_null;')) - .then(() => pgm.db.query('INSERT INTO t1(created) VALUES (current_timestamp); ')) - .then(() => reject(new Error('Missing not null clause'))) - .catch(() => pgm.db.query('ROLLBACK TO SAVEPOINT sp_not_null;')) - .then(() => pgm.db.query('INSERT INTO t1(string) VALUES (\'something\') RETURNING id;')) - .then(({ rows: [{ id }] }) => pgm.db.query(`INSERT INTO t2(id2) VALUES (${id});`)) + WHERE c.relname = 't2' and c.relkind = 'r' and n.nspname = 'public'` + ) + .then( + ([{ comment }]) => + comment === table.comment + ? null + : reject(new Error("Comment not set")) + ) + .then(() => pgm.db.query("SAVEPOINT sp_reference;")) + .then(() => pgm.db.query("INSERT INTO t2(id2) VALUES (1);")) + .then(() => reject(new Error("Missing reference clause"))) + .catch(() => pgm.db.query("ROLLBACK TO SAVEPOINT sp_reference;")) + .then(() => pgm.db.query("SAVEPOINT sp_not_null;")) + .then(() => + pgm.db.query("INSERT INTO t1(created) VALUES (current_timestamp); ") + ) + .then(() => reject(new Error("Missing not null clause"))) + .catch(() => pgm.db.query("ROLLBACK TO SAVEPOINT sp_not_null;")) + .then(() => + pgm.db.query( + "INSERT INTO t1(string) VALUES ('something') RETURNING id;" + ) + ) + .then(({ rows: [{ id }] }) => + pgm.db.query(`INSERT INTO t2(id2) VALUES (${id});`) + ) .then(resolve) ); -exports.down = (pgm) => { - pgm.sql('DELETE from t2'); - pgm.sql('DELETE from t1'); +exports.down = pgm => { + pgm.sql("DELETE from t2"); + pgm.sql("DELETE from t1"); }; diff --git a/test/migrations/006_table_rename.js b/test/migrations/006_table_rename.js index 99958a4d..f1fc6c71 100644 --- a/test/migrations/006_table_rename.js +++ b/test/migrations/006_table_rename.js @@ -1,3 +1,3 @@ -exports.up = (pgm) => { - pgm.renameTable('t2', 't2r'); +exports.up = pgm => { + pgm.renameTable("t2", "t2r"); }; diff --git a/test/migrations/007_table_rename_test.js b/test/migrations/007_table_rename_test.js index d0a03e18..ec8b6059 100644 --- a/test/migrations/007_table_rename_test.js +++ b/test/migrations/007_table_rename_test.js @@ -1,5 +1,8 @@ exports.up = pgm => - pgm.db.query('INSERT INTO t1(string) VALUES (\'something\') RETURNING id;') - .then(({ rows: [{ id }] }) => pgm.db.query(`INSERT INTO t2r(id2) VALUES (${id});`)); + pgm.db + .query("INSERT INTO t1(string) VALUES ('something') RETURNING id;") + .then(({ rows: [{ id }] }) => + pgm.db.query(`INSERT INTO t2r(id2) VALUES (${id});`) + ); exports.down = () => null; diff --git a/test/migrations/008_column_drop.js b/test/migrations/008_column_drop.js index e563ad34..a763d60f 100644 --- a/test/migrations/008_column_drop.js +++ b/test/migrations/008_column_drop.js @@ -1,9 +1,9 @@ -exports.up = (pgm) => { - pgm.dropColumns('t1', 'string'); +exports.up = pgm => { + pgm.dropColumns("t1", "string"); }; -exports.down = (pgm) => { - pgm.addColumns('t1', { - string: { type: 'text', notNull: false }, +exports.down = pgm => { + pgm.addColumns("t1", { + string: { type: "text", notNull: false } }); }; diff --git a/test/migrations/009_column.js b/test/migrations/009_column.js index 3b67deff..e2efc48c 100644 --- a/test/migrations/009_column.js +++ b/test/migrations/009_column.js @@ -1,5 +1,5 @@ -exports.up = (pgm) => { - pgm.addColumns('t1', { - nr: { type: 'integer', unique: true, check: 'nr > 10' }, +exports.up = pgm => { + pgm.addColumns("t1", { + nr: { type: "integer", unique: true, check: "nr > 10" } }); }; diff --git a/test/migrations/010_column_test.js b/test/migrations/010_column_test.js index 0e68ed99..5c0ad0c6 100644 --- a/test/migrations/010_column_test.js +++ b/test/migrations/010_column_test.js @@ -1,14 +1,15 @@ exports.up = pgm => new Promise((resolve, reject) => - pgm.db.query('SAVEPOINT sp_check;') - .then(() => pgm.db.query('INSERT INTO t1(nr) VALUES (1);')) - .then(() => reject(new Error('Missing check clause'))) - .catch(() => pgm.db.query('ROLLBACK TO SAVEPOINT sp_check;')) - .then(() => pgm.db.query('INSERT INTO t1(nr) VALUES (20);')) - .then(() => pgm.db.query('SAVEPOINT sp_unique;')) - .then(() => pgm.db.query('INSERT INTO t1(nr) VALUES (20);')) - .then(() => reject(new Error('Missing not unique clause'))) - .catch(() => pgm.db.query('ROLLBACK TO SAVEPOINT sp_unique;')) + pgm.db + .query("SAVEPOINT sp_check;") + .then(() => pgm.db.query("INSERT INTO t1(nr) VALUES (1);")) + .then(() => reject(new Error("Missing check clause"))) + .catch(() => pgm.db.query("ROLLBACK TO SAVEPOINT sp_check;")) + .then(() => pgm.db.query("INSERT INTO t1(nr) VALUES (20);")) + .then(() => pgm.db.query("SAVEPOINT sp_unique;")) + .then(() => pgm.db.query("INSERT INTO t1(nr) VALUES (20);")) + .then(() => reject(new Error("Missing not unique clause"))) + .catch(() => pgm.db.query("ROLLBACK TO SAVEPOINT sp_unique;")) .then(resolve) ); diff --git a/test/migrations/011_column_rename.js b/test/migrations/011_column_rename.js index 162b2ae0..466449ad 100644 --- a/test/migrations/011_column_rename.js +++ b/test/migrations/011_column_rename.js @@ -1,3 +1,3 @@ -exports.up = (pgm) => { - pgm.renameColumn('t1', 'nr', 'nmbr'); +exports.up = pgm => { + pgm.renameColumn("t1", "nr", "nmbr"); }; diff --git a/test/migrations/012_column_alter.js b/test/migrations/012_column_alter.js index 86b70fe8..cd6ad33a 100644 --- a/test/migrations/012_column_alter.js +++ b/test/migrations/012_column_alter.js @@ -1,11 +1,11 @@ -exports.up = (pgm) => { - pgm.alterColumn('t1', 'nmbr', { - type: 'smallint', +exports.up = pgm => { + pgm.alterColumn("t1", "nmbr", { + type: "smallint" }); }; -exports.down = (pgm) => { - pgm.alterColumn('t1', 'nmbr', { - type: 'integer', +exports.down = pgm => { + pgm.alterColumn("t1", "nmbr", { + type: "integer" }); }; diff --git a/test/migrations/013_column_alter_test.js b/test/migrations/013_column_alter_test.js index b6e37f2d..295faaf1 100644 --- a/test/migrations/013_column_alter_test.js +++ b/test/migrations/013_column_alter_test.js @@ -1,9 +1,10 @@ exports.up = pgm => new Promise((resolve, reject) => - pgm.db.query('SAVEPOINT sp_smallint;') - .then(() => pgm.db.query('INSERT INTO t1(nmbr) VALUES (2147483647);')) - .then(() => reject(new Error('Type not updated'))) - .catch(() => pgm.db.query('ROLLBACK TO SAVEPOINT sp_smallint;')) + pgm.db + .query("SAVEPOINT sp_smallint;") + .then(() => pgm.db.query("INSERT INTO t1(nmbr) VALUES (2147483647);")) + .then(() => reject(new Error("Type not updated"))) + .catch(() => pgm.db.query("ROLLBACK TO SAVEPOINT sp_smallint;")) .then(resolve) ); diff --git a/test/migrations/014_add_constraint.js b/test/migrations/014_add_constraint.js index ce2d3a0d..35fb0af2 100644 --- a/test/migrations/014_add_constraint.js +++ b/test/migrations/014_add_constraint.js @@ -1,7 +1,7 @@ -exports.constraint = 'chck_nmbr'; +exports.constraint = "chck_nmbr"; -exports.up = (pgm) => { - pgm.addConstraint('t1', exports.constraint, { - check: 'nmbr < 30', +exports.up = pgm => { + pgm.addConstraint("t1", exports.constraint, { + check: "nmbr < 30" }); }; diff --git a/test/migrations/015_add_constraint_test.js b/test/migrations/015_add_constraint_test.js index b76541a3..41ac227b 100644 --- a/test/migrations/015_add_constraint_test.js +++ b/test/migrations/015_add_constraint_test.js @@ -1,10 +1,11 @@ exports.up = pgm => new Promise((resolve, reject) => - pgm.db.query('SAVEPOINT sp_check;') - .then(() => pgm.db.query('INSERT INTO t1(nmbr) VALUES (30);')) - .then(() => reject(new Error('Missing check clause'))) - .catch(() => pgm.db.query('ROLLBACK TO SAVEPOINT sp_check;')) - .then(() => pgm.db.query('INSERT INTO t1(nmbr) VALUES (21);')) + pgm.db + .query("SAVEPOINT sp_check;") + .then(() => pgm.db.query("INSERT INTO t1(nmbr) VALUES (30);")) + .then(() => reject(new Error("Missing check clause"))) + .catch(() => pgm.db.query("ROLLBACK TO SAVEPOINT sp_check;")) + .then(() => pgm.db.query("INSERT INTO t1(nmbr) VALUES (21);")) .then(resolve) ); diff --git a/test/migrations/016_rename_constraint.js b/test/migrations/016_rename_constraint.js index a02585b1..a4e099b2 100644 --- a/test/migrations/016_rename_constraint.js +++ b/test/migrations/016_rename_constraint.js @@ -1,7 +1,7 @@ -const constraint = require('./014_add_constraint'); +const constraint = require("./014_add_constraint"); -exports.constraint = 'chck_nmbr_new'; +exports.constraint = "chck_nmbr_new"; -exports.up = (pgm) => { - pgm.renameConstraint('t1', constraint.constraint, exports.constraint); +exports.up = pgm => { + pgm.renameConstraint("t1", constraint.constraint, exports.constraint); }; diff --git a/test/migrations/017_drop_constraint.js b/test/migrations/017_drop_constraint.js index 33cea907..b2793b9a 100644 --- a/test/migrations/017_drop_constraint.js +++ b/test/migrations/017_drop_constraint.js @@ -1,11 +1,11 @@ -const constraint = require('./016_rename_constraint'); +const constraint = require("./016_rename_constraint"); -exports.up = (pgm) => { - pgm.dropConstraint('t1', constraint.constraint); +exports.up = pgm => { + pgm.dropConstraint("t1", constraint.constraint); }; -exports.down = (pgm) => { - pgm.addConstraint('t1', constraint.constraint, { - check: 'true', +exports.down = pgm => { + pgm.addConstraint("t1", constraint.constraint, { + check: "true" }); }; diff --git a/test/migrations/018_drop_constraint_test.js b/test/migrations/018_drop_constraint_test.js index 311383e2..7747680f 100644 --- a/test/migrations/018_drop_constraint_test.js +++ b/test/migrations/018_drop_constraint_test.js @@ -1,4 +1,3 @@ -exports.up = pgm => - pgm.db.query('INSERT INTO t1(nmbr) VALUES (30);'); +exports.up = pgm => pgm.db.query("INSERT INTO t1(nmbr) VALUES (30);"); exports.down = () => null; diff --git a/test/migrations/019_add_index.js b/test/migrations/019_add_index.js index 703d8306..c705eb77 100644 --- a/test/migrations/019_add_index.js +++ b/test/migrations/019_add_index.js @@ -1,3 +1,3 @@ -exports.up = (pgm) => { - pgm.createIndex('t1', ['nmbr'], { unique: true }); +exports.up = pgm => { + pgm.createIndex("t1", ["nmbr"], { unique: true }); }; diff --git a/test/migrations/020_drop_index.js b/test/migrations/020_drop_index.js index 8d49f9c7..dc7dcf0e 100644 --- a/test/migrations/020_drop_index.js +++ b/test/migrations/020_drop_index.js @@ -1,6 +1,6 @@ -exports.up = (pgm) => { - pgm.createIndex('t1', ['nmbr'], { name: 'idx' }); - pgm.dropIndex('t1', [], { name: 'idx' }); +exports.up = pgm => { + pgm.createIndex("t1", ["nmbr"], { name: "idx" }); + pgm.dropIndex("t1", [], { name: "idx" }); }; exports.down = () => null; diff --git a/test/migrations/021_add_type.js b/test/migrations/021_add_type.js index b8b06260..2ce94452 100644 --- a/test/migrations/021_add_type.js +++ b/test/migrations/021_add_type.js @@ -1,6 +1,6 @@ -exports.up = (pgm) => { - pgm.createType('list', ['a', 'b', 'c']); - pgm.createType('obj', { - id: 'integer', +exports.up = pgm => { + pgm.createType("list", ["a", "b", "c"]); + pgm.createType("obj", { + id: "integer" }); }; diff --git a/test/migrations/022_add_type_test.js b/test/migrations/022_add_type_test.js index b62ef694..5a820fe7 100644 --- a/test/migrations/022_add_type_test.js +++ b/test/migrations/022_add_type_test.js @@ -1,7 +1,7 @@ -exports.up = (pgm) => { - pgm.sql('CREATE TEMPORARY TABLE t_list_1 (l list);'); - pgm.sql('INSERT INTO t_list_1 (l) VALUES (\'a\');'); - pgm.sql('select (ROW(1)::obj).id;'); +exports.up = pgm => { + pgm.sql("CREATE TEMPORARY TABLE t_list_1 (l list);"); + pgm.sql("INSERT INTO t_list_1 (l) VALUES ('a');"); + pgm.sql("select (ROW(1)::obj).id;"); }; exports.down = () => null; diff --git a/test/migrations/023_add_type_attribute.js b/test/migrations/023_add_type_attribute.js index 0d6e30fc..108b118f 100644 --- a/test/migrations/023_add_type_attribute.js +++ b/test/migrations/023_add_type_attribute.js @@ -1,3 +1,3 @@ -exports.up = (pgm) => { - pgm.addTypeAttribute('obj', 'string', 'text'); +exports.up = pgm => { + pgm.addTypeAttribute("obj", "string", "text"); }; diff --git a/test/migrations/024_add_type_attribute_test.js b/test/migrations/024_add_type_attribute_test.js index 0406066e..bdfc3c37 100644 --- a/test/migrations/024_add_type_attribute_test.js +++ b/test/migrations/024_add_type_attribute_test.js @@ -1,5 +1,5 @@ -exports.up = (pgm) => { - pgm.sql('select (ROW(1, \'x\')::obj).string;'); +exports.up = pgm => { + pgm.sql("select (ROW(1, 'x')::obj).string;"); }; exports.down = () => null; diff --git a/test/migrations/025_set_type_attribute.js b/test/migrations/025_set_type_attribute.js index 9295fa5e..ead0d0ea 100644 --- a/test/migrations/025_set_type_attribute.js +++ b/test/migrations/025_set_type_attribute.js @@ -1,7 +1,7 @@ -exports.up = (pgm) => { - pgm.setTypeAttribute('obj', 'id', 'smallint'); +exports.up = pgm => { + pgm.setTypeAttribute("obj", "id", "smallint"); }; -exports.down = (pgm) => { - pgm.setTypeAttribute('obj', 'id', 'integer'); +exports.down = pgm => { + pgm.setTypeAttribute("obj", "id", "integer"); }; diff --git a/test/migrations/026_set_type_attribute_test.js b/test/migrations/026_set_type_attribute_test.js index 39cb894c..358cece4 100644 --- a/test/migrations/026_set_type_attribute_test.js +++ b/test/migrations/026_set_type_attribute_test.js @@ -1,9 +1,10 @@ exports.up = pgm => new Promise((resolve, reject) => - pgm.db.query('SAVEPOINT sp_smallint;') - .then(() => pgm.db.query('select (ROW(2147483647, \'x\')::obj).id;')) - .then(() => reject(new Error('Type not updated'))) - .catch(() => pgm.db.query('ROLLBACK TO SAVEPOINT sp_smallint;')) + pgm.db + .query("SAVEPOINT sp_smallint;") + .then(() => pgm.db.query("select (ROW(2147483647, 'x')::obj).id;")) + .then(() => reject(new Error("Type not updated"))) + .catch(() => pgm.db.query("ROLLBACK TO SAVEPOINT sp_smallint;")) .then(resolve) ); diff --git a/test/migrations/027_add_type_value.js b/test/migrations/027_add_type_value.js index d60bca88..6d408e10 100644 --- a/test/migrations/027_add_type_value.js +++ b/test/migrations/027_add_type_value.js @@ -1,6 +1,6 @@ -exports.up = (pgm) => { +exports.up = pgm => { pgm.noTransaction(); - pgm.addTypeValue('list', 'd', { ifNotExists: true }); + pgm.addTypeValue("list", "d", { ifNotExists: true }); }; exports.down = () => null; diff --git a/test/migrations/028_add_type_value_test.js b/test/migrations/028_add_type_value_test.js index 96a4630f..98821b56 100644 --- a/test/migrations/028_add_type_value_test.js +++ b/test/migrations/028_add_type_value_test.js @@ -1,6 +1,6 @@ -exports.up = (pgm) => { - pgm.sql('CREATE TEMPORARY TABLE t_list_2 (l list);'); - pgm.sql('INSERT INTO t_list_2 (l) VALUES (\'d\');'); +exports.up = pgm => { + pgm.sql("CREATE TEMPORARY TABLE t_list_2 (l list);"); + pgm.sql("INSERT INTO t_list_2 (l) VALUES ('d');"); }; exports.down = () => null; diff --git a/test/migrations/029_rename_type_attribute.js b/test/migrations/029_rename_type_attribute.js index afe369c2..04aed986 100644 --- a/test/migrations/029_rename_type_attribute.js +++ b/test/migrations/029_rename_type_attribute.js @@ -1,3 +1,3 @@ -exports.up = (pgm) => { - pgm.renameTypeAttribute('obj', 'string', 'str'); +exports.up = pgm => { + pgm.renameTypeAttribute("obj", "string", "str"); }; diff --git a/test/migrations/030_rename_type_attribute_test.js b/test/migrations/030_rename_type_attribute_test.js index 9ad87def..9388c000 100644 --- a/test/migrations/030_rename_type_attribute_test.js +++ b/test/migrations/030_rename_type_attribute_test.js @@ -1,5 +1,5 @@ -exports.up = (pgm) => { - pgm.sql('select (ROW(1, \'x\')::obj).str;'); +exports.up = pgm => { + pgm.sql("select (ROW(1, 'x')::obj).str;"); }; exports.down = () => null; diff --git a/test/migrations/031_drop_type_attribute.js b/test/migrations/031_drop_type_attribute.js index 72b89c7f..fc190bfa 100644 --- a/test/migrations/031_drop_type_attribute.js +++ b/test/migrations/031_drop_type_attribute.js @@ -1,7 +1,7 @@ -exports.up = (pgm) => { - pgm.dropTypeAttribute('obj', 'str'); +exports.up = pgm => { + pgm.dropTypeAttribute("obj", "str"); }; -exports.down = (pgm) => { - pgm.addTypeAttribute('obj', 'str', 'text'); +exports.down = pgm => { + pgm.addTypeAttribute("obj", "str", "text"); }; diff --git a/test/migrations/032_drop_type_attribute_test.js b/test/migrations/032_drop_type_attribute_test.js index ecf63f6d..dfb25a65 100644 --- a/test/migrations/032_drop_type_attribute_test.js +++ b/test/migrations/032_drop_type_attribute_test.js @@ -1,9 +1,10 @@ exports.up = pgm => new Promise((resolve, reject) => - pgm.db.query('SAVEPOINT sp_attr;') - .then(() => pgm.db.query('select (ROW(1, \'x\')::obj).str;')) - .then(() => reject(new Error('Attribute was not removed'))) - .catch(() => pgm.db.query('ROLLBACK TO SAVEPOINT sp_attr;')) + pgm.db + .query("SAVEPOINT sp_attr;") + .then(() => pgm.db.query("select (ROW(1, 'x')::obj).str;")) + .then(() => reject(new Error("Attribute was not removed"))) + .catch(() => pgm.db.query("ROLLBACK TO SAVEPOINT sp_attr;")) .then(resolve) ); diff --git a/test/migrations/033_drop_type.js b/test/migrations/033_drop_type.js index 76ef955b..ff7cc21c 100644 --- a/test/migrations/033_drop_type.js +++ b/test/migrations/033_drop_type.js @@ -1,6 +1,6 @@ -exports.up = (pgm) => { - pgm.createType('list_for_drop', ['a', 'b', 'c']); - pgm.dropType('list_for_drop'); +exports.up = pgm => { + pgm.createType("list_for_drop", ["a", "b", "c"]); + pgm.dropType("list_for_drop"); }; exports.down = () => null; diff --git a/test/migrations/034_drop_type_test.js b/test/migrations/034_drop_type_test.js index 798db2c4..d7e010ca 100644 --- a/test/migrations/034_drop_type_test.js +++ b/test/migrations/034_drop_type_test.js @@ -1,9 +1,12 @@ exports.up = pgm => new Promise((resolve, reject) => - pgm.db.query('SAVEPOINT sp_drop;') - .then(() => pgm.db.query('CREATE TEMPORARY TABLE t_list_3 (l list_for_drop);')) - .then(() => reject(new Error('Type was not removed'))) - .catch(() => pgm.db.query('ROLLBACK TO SAVEPOINT sp_drop;')) + pgm.db + .query("SAVEPOINT sp_drop;") + .then(() => + pgm.db.query("CREATE TEMPORARY TABLE t_list_3 (l list_for_drop);") + ) + .then(() => reject(new Error("Type was not removed"))) + .catch(() => pgm.db.query("ROLLBACK TO SAVEPOINT sp_drop;")) .then(resolve) ); diff --git a/test/migrations/035_role_add.js b/test/migrations/035_role_add.js index bfd16da9..c20cf3d6 100644 --- a/test/migrations/035_role_add.js +++ b/test/migrations/035_role_add.js @@ -1,3 +1,3 @@ -exports.up = (pgm) => { - pgm.createRole('r', { password: 'p', login: true }); +exports.up = pgm => { + pgm.createRole("r", { password: "p", login: true }); }; diff --git a/test/migrations/036_role_alter.js b/test/migrations/036_role_alter.js index cbecac4c..a16ef479 100644 --- a/test/migrations/036_role_alter.js +++ b/test/migrations/036_role_alter.js @@ -1,7 +1,7 @@ -exports.up = (pgm) => { - pgm.alterRole('r', { login: false }); +exports.up = pgm => { + pgm.alterRole("r", { login: false }); }; -exports.down = (pgm) => { - pgm.alterRole('r', { login: true }); +exports.down = pgm => { + pgm.alterRole("r", { login: true }); }; diff --git a/test/migrations/037_role_rename.js b/test/migrations/037_role_rename.js index 13cc82c8..c59a2263 100644 --- a/test/migrations/037_role_rename.js +++ b/test/migrations/037_role_rename.js @@ -1,3 +1,3 @@ -exports.up = (pgm) => { - pgm.renameRole('r', 'rx'); +exports.up = pgm => { + pgm.renameRole("r", "rx"); }; diff --git a/test/migrations/038_role_drop.js b/test/migrations/038_role_drop.js index 3c074d95..298097b9 100644 --- a/test/migrations/038_role_drop.js +++ b/test/migrations/038_role_drop.js @@ -1,11 +1,11 @@ -const create = require('./035_role_add'); -const rename = require('./037_role_rename'); +const create = require("./035_role_add"); +const rename = require("./037_role_rename"); -exports.up = (pgm) => { - pgm.dropRole('rx'); +exports.up = pgm => { + pgm.dropRole("rx"); }; -exports.down = (pgm) => { +exports.down = pgm => { create.up(pgm); rename.up(pgm); }; diff --git a/test/migrations/039_function_create.js b/test/migrations/039_function_create.js index c9621850..b587b866 100644 --- a/test/migrations/039_function_create.js +++ b/test/migrations/039_function_create.js @@ -1,15 +1,17 @@ -exports.params = [ - 'integer', - { name: 'arg2', mode: 'in', type: 'integer' }, -]; +exports.params = ["integer", { name: "arg2", mode: "in", type: "integer" }]; -exports.up = (pgm) => { - pgm.createFunction('f', exports.params, { - returns: 'integer', - language: 'plpgsql', - }, ` +exports.up = pgm => { + pgm.createFunction( + "f", + exports.params, + { + returns: "integer", + language: "plpgsql" + }, + ` BEGIN return $1 + arg2; END; - `); + ` + ); }; diff --git a/test/migrations/040_function_rename.js b/test/migrations/040_function_rename.js index 7bf7ca38..897854af 100644 --- a/test/migrations/040_function_rename.js +++ b/test/migrations/040_function_rename.js @@ -1,5 +1,5 @@ -const { params } = require('./039_function_create'); +const { params } = require("./039_function_create"); -exports.up = (pgm) => { - pgm.renameFunction('f', params, 'add'); +exports.up = pgm => { + pgm.renameFunction("f", params, "add"); }; diff --git a/test/migrations/041_function_test.js b/test/migrations/041_function_test.js index d36a9493..d2c6bdbe 100644 --- a/test/migrations/041_function_test.js +++ b/test/migrations/041_function_test.js @@ -1,11 +1,11 @@ exports.up = pgm => new Promise((resolve, reject) => - pgm.db.select('SELECT add(1,2) as r') - .then(([{ r }]) => ( - r === 3 - ? resolve() - : reject(new Error('Function does not work')) - )) + pgm.db + .select("SELECT add(1,2) as r") + .then( + ([{ r }]) => + r === 3 ? resolve() : reject(new Error("Function does not work")) + ) ); exports.down = () => null; diff --git a/test/migrations/042_function_drop.js b/test/migrations/042_function_drop.js index 2f3af71b..2f6b2c2b 100644 --- a/test/migrations/042_function_drop.js +++ b/test/migrations/042_function_drop.js @@ -1,11 +1,11 @@ -const create = require('./039_function_create'); -const rename = require('./040_function_rename'); +const create = require("./039_function_create"); +const rename = require("./040_function_rename"); -exports.up = (pgm) => { - pgm.dropFunction('add', create.params); +exports.up = pgm => { + pgm.dropFunction("add", create.params); }; -exports.down = (pgm) => { +exports.down = pgm => { create.up(pgm); rename.up(pgm); }; diff --git a/test/migrations/043_trigger_create_rename.js b/test/migrations/043_trigger_create_rename.js index 44b83b9b..85860369 100644 --- a/test/migrations/043_trigger_create_rename.js +++ b/test/migrations/043_trigger_create_rename.js @@ -1,18 +1,23 @@ -exports.up = (pgm) => { - pgm.createTable('tt', { - a: 'integer', +exports.up = pgm => { + pgm.createTable("tt", { + a: "integer" }); - pgm.createTrigger('tt', 't', { - when: 'before', - operation: 'insert', - level: 'row', - language: 'plpgsql', - }, ` + pgm.createTrigger( + "tt", + "t", + { + when: "before", + operation: "insert", + level: "row", + language: "plpgsql" + }, + ` BEGIN NEW.a := NEW.a + 1; return NEW; END; - `); - pgm.renameTrigger('tt', 't', 'trig'); - pgm.renameFunction('t', [], 'trig'); + ` + ); + pgm.renameTrigger("tt", "t", "trig"); + pgm.renameFunction("t", [], "trig"); }; diff --git a/test/migrations/044_trigger_test.js b/test/migrations/044_trigger_test.js index 3c79e6ad..d8706ed5 100644 --- a/test/migrations/044_trigger_test.js +++ b/test/migrations/044_trigger_test.js @@ -1,11 +1,11 @@ exports.up = pgm => new Promise((resolve, reject) => - pgm.db.select('INSERT INTO tt (a) VALUES (1) RETURNING a') - .then(([{ a }]) => ( - a === 2 - ? resolve() - : reject(new Error('Trigger does not work')) - )) + pgm.db + .select("INSERT INTO tt (a) VALUES (1) RETURNING a") + .then( + ([{ a }]) => + a === 2 ? resolve() : reject(new Error("Trigger does not work")) + ) ); exports.down = () => null; diff --git a/test/migrations/045_trigger_drop.js b/test/migrations/045_trigger_drop.js index 7658f437..30117f07 100644 --- a/test/migrations/045_trigger_drop.js +++ b/test/migrations/045_trigger_drop.js @@ -1,9 +1,9 @@ -const trigger = require('./043_trigger_create_rename'); +const trigger = require("./043_trigger_create_rename"); -exports.up = (pgm) => { - pgm.dropTrigger('tt', 'trig'); - pgm.dropFunction('trig', []); - pgm.dropTable('tt'); +exports.up = pgm => { + pgm.dropTrigger("tt", "trig"); + pgm.dropFunction("trig", []); + pgm.dropTable("tt"); }; exports.down = trigger.up; diff --git a/test/migrations/046_domain_create_rename.js b/test/migrations/046_domain_create_rename.js index fd32c670..d20d90cc 100644 --- a/test/migrations/046_domain_create_rename.js +++ b/test/migrations/046_domain_create_rename.js @@ -1,9 +1,9 @@ -exports.up = (pgm) => { - pgm.createDomain('d', 'integer', { - check: 'VALUE BETWEEN 0 AND 10', +exports.up = pgm => { + pgm.createDomain("d", "integer", { + check: "VALUE BETWEEN 0 AND 10" }); - pgm.renameDomain('d', 'dom'); - pgm.createTable('td', { - d: 'dom', + pgm.renameDomain("d", "dom"); + pgm.createTable("td", { + d: "dom" }); }; diff --git a/test/migrations/047_domain_check.js b/test/migrations/047_domain_check.js index 0e70911c..98dc22f1 100644 --- a/test/migrations/047_domain_check.js +++ b/test/migrations/047_domain_check.js @@ -1,9 +1,10 @@ exports.up = pgm => new Promise((resolve, reject) => - pgm.db.query('SAVEPOINT sp_check;') - .then(() => pgm.db.query('INSERT INTO td (d) VALUES (11);')) - .then(() => reject(new Error('Check on domain was not set'))) - .catch(() => pgm.db.query('ROLLBACK TO SAVEPOINT sp_check;')) + pgm.db + .query("SAVEPOINT sp_check;") + .then(() => pgm.db.query("INSERT INTO td (d) VALUES (11);")) + .then(() => reject(new Error("Check on domain was not set"))) + .catch(() => pgm.db.query("ROLLBACK TO SAVEPOINT sp_check;")) .then(resolve) ); diff --git a/test/migrations/048_domain_drop.js b/test/migrations/048_domain_drop.js index bc8bb5e8..d471cacd 100644 --- a/test/migrations/048_domain_drop.js +++ b/test/migrations/048_domain_drop.js @@ -1,8 +1,8 @@ -const domain = require('./046_domain_create_rename'); +const domain = require("./046_domain_create_rename"); -exports.up = (pgm) => { - pgm.dropTable('td'); - pgm.dropDomain('dom'); +exports.up = pgm => { + pgm.dropTable("td"); + pgm.dropDomain("dom"); }; exports.down = domain.up; diff --git a/test/migrations/049_sequence_create_rename.js b/test/migrations/049_sequence_create_rename.js index 58b7c400..1062f69a 100644 --- a/test/migrations/049_sequence_create_rename.js +++ b/test/migrations/049_sequence_create_rename.js @@ -1,7 +1,7 @@ -exports.up = (pgm) => { - pgm.createSequence('s', { minvalue: 10 }); - pgm.renameSequence('s', 'seq'); - pgm.createTable('ts', { - id: { type: 'integer', default: pgm.func('nextval(\'seq\')') }, +exports.up = pgm => { + pgm.createSequence("s", { minvalue: 10 }); + pgm.renameSequence("s", "seq"); + pgm.createTable("ts", { + id: { type: "integer", default: pgm.func("nextval('seq')") } }); }; diff --git a/test/migrations/050_sequence_test.js b/test/migrations/050_sequence_test.js index c38a3a8b..f988a80c 100644 --- a/test/migrations/050_sequence_test.js +++ b/test/migrations/050_sequence_test.js @@ -1,11 +1,11 @@ exports.up = pgm => new Promise((resolve, reject) => - pgm.db.select('INSERT INTO ts DEFAULT VALUES RETURNING id;') - .then(([{ id }]) => ( - id === 10 - ? resolve() - : reject(new Error('Bad sequence value')) - )) + pgm.db + .select("INSERT INTO ts DEFAULT VALUES RETURNING id;") + .then( + ([{ id }]) => + id === 10 ? resolve() : reject(new Error("Bad sequence value")) + ) ); exports.down = () => null; diff --git a/test/migrations/051_sequence_alter.js b/test/migrations/051_sequence_alter.js index 831337a3..a0a510ff 100644 --- a/test/migrations/051_sequence_alter.js +++ b/test/migrations/051_sequence_alter.js @@ -1,6 +1,5 @@ -exports.up = (pgm) => { - pgm.alterSequence('seq', { restart: 20 }); +exports.up = pgm => { + pgm.alterSequence("seq", { restart: 20 }); }; exports.down = () => null; - diff --git a/test/migrations/052_sequence_alter_test.js b/test/migrations/052_sequence_alter_test.js index b9eea969..d8bf52c0 100644 --- a/test/migrations/052_sequence_alter_test.js +++ b/test/migrations/052_sequence_alter_test.js @@ -1,11 +1,11 @@ exports.up = pgm => new Promise((resolve, reject) => - pgm.db.select('INSERT INTO ts DEFAULT VALUES RETURNING id;') - .then(([{ id }]) => ( - id === 20 - ? resolve() - : reject(new Error('Bad sequence value')) - )) + pgm.db + .select("INSERT INTO ts DEFAULT VALUES RETURNING id;") + .then( + ([{ id }]) => + id === 20 ? resolve() : reject(new Error("Bad sequence value")) + ) ); exports.down = () => null; diff --git a/test/migrations/053_sequence_drop.js b/test/migrations/053_sequence_drop.js index 3e0769b6..495929d2 100644 --- a/test/migrations/053_sequence_drop.js +++ b/test/migrations/053_sequence_drop.js @@ -1,8 +1,8 @@ -const sequence = require('./049_sequence_create_rename'); +const sequence = require("./049_sequence_create_rename"); -exports.up = (pgm) => { - pgm.dropTable('ts'); - pgm.dropSequence('seq'); +exports.up = pgm => { + pgm.dropTable("ts"); + pgm.dropSequence("seq"); }; exports.down = sequence.up; diff --git a/test/migrations/054_operator_create.js b/test/migrations/054_operator_create.js index 1ada2d7d..d36b7b8a 100644 --- a/test/migrations/054_operator_create.js +++ b/test/migrations/054_operator_create.js @@ -1,20 +1,25 @@ -exports.up = (pgm) => { - pgm.createType('complex', { - r: 'integer', - i: 'integer', +exports.up = pgm => { + pgm.createType("complex", { + r: "integer", + i: "integer" }); - pgm.createFunction('complex_add', ['complex', 'complex'], { - returns: 'complex', - language: 'plpgsql', - }, ` + pgm.createFunction( + "complex_add", + ["complex", "complex"], + { + returns: "complex", + language: "plpgsql" + }, + ` BEGIN return ROW($1.r + $2.r, $1.i + $2.i); END; - `); - pgm.createOperator('+', { - left: 'complex', - right: 'complex', - procedure: 'complex_add', - commutator: '+', + ` + ); + pgm.createOperator("+", { + left: "complex", + right: "complex", + procedure: "complex_add", + commutator: "+" }); }; diff --git a/test/migrations/055_operator_test.js b/test/migrations/055_operator_test.js index ae9a9d35..ca47ee73 100644 --- a/test/migrations/055_operator_test.js +++ b/test/migrations/055_operator_test.js @@ -1,11 +1,11 @@ exports.up = pgm => new Promise((resolve, reject) => - pgm.db.select('SELECT ROW(1,2)::complex + ROW(3,4)::complex as sum;') - .then(([{ sum }]) => ( - sum === '(4,6)' - ? resolve() - : reject(new Error('Bad sequence value')) - )) + pgm.db + .select("SELECT ROW(1,2)::complex + ROW(3,4)::complex as sum;") + .then( + ([{ sum }]) => + sum === "(4,6)" ? resolve() : reject(new Error("Bad sequence value")) + ) ); exports.down = () => null; diff --git a/test/migrations/056_operator_drop.js b/test/migrations/056_operator_drop.js index 270953a3..3cf949d1 100644 --- a/test/migrations/056_operator_drop.js +++ b/test/migrations/056_operator_drop.js @@ -1,9 +1,9 @@ -const operator = require('./054_operator_create'); +const operator = require("./054_operator_create"); -exports.up = (pgm) => { - pgm.dropOperator('+', { left: 'complex', right: 'complex' }); - pgm.dropFunction('complex_add', ['complex', 'complex']); - pgm.dropType('complex'); +exports.up = pgm => { + pgm.dropOperator("+", { left: "complex", right: "complex" }); + pgm.dropFunction("complex_add", ["complex", "complex"]); + pgm.dropType("complex"); }; exports.down = operator.up; diff --git a/test/migrations/057_policy_create.js b/test/migrations/057_policy_create.js index d0a785e4..f0490a65 100644 --- a/test/migrations/057_policy_create.js +++ b/test/migrations/057_policy_create.js @@ -1,36 +1,36 @@ -exports.up = (pgm) => { - pgm.createTable('tp', { - user_name: 'varchar(20)', +exports.up = pgm => { + pgm.createTable("tp", { + user_name: "varchar(20)" }); - pgm.alterTable('tp', { - levelSecurity: 'enable', + pgm.alterTable("tp", { + levelSecurity: "enable" }); - pgm.createRole('admin'); - pgm.createRole('alice'); - pgm.createPolicy('tp', 'p', { - role: 'admin', - using: 'true', - check: 'true', + pgm.createRole("admin"); + pgm.createRole("alice"); + pgm.createPolicy("tp", "p", { + role: "admin", + using: "true", + check: "true" }); - pgm.renamePolicy('tp', 'p', 'admin_policy'); - pgm.createPolicy('tp', 'user_select_policy', { - command: 'SELECT', - using: 'current_user = user_name', + pgm.renamePolicy("tp", "p", "admin_policy"); + pgm.createPolicy("tp", "user_select_policy", { + command: "SELECT", + using: "current_user = user_name" }); - pgm.createPolicy('tp', 'user_update_policy', { - command: 'UPDATE', - using: 'current_user = user_name', - check: 'current_user = user_name', + pgm.createPolicy("tp", "user_update_policy", { + command: "UPDATE", + using: "current_user = user_name", + check: "current_user = user_name" }); pgm.sql('GRANT SELECT, INSERT, UPDATE, DELETE ON "tp" TO "admin"'); pgm.sql('GRANT SELECT, INSERT, UPDATE, DELETE ON "tp" TO public'); }; -exports.down = (pgm) => { - pgm.dropPolicy('tp', 'admin_policy'); - pgm.dropPolicy('tp', 'user_select_policy'); - pgm.dropPolicy('tp', 'user_update_policy'); - pgm.dropTable('tp'); - pgm.dropRole('admin'); - pgm.dropRole('alice'); +exports.down = pgm => { + pgm.dropPolicy("tp", "admin_policy"); + pgm.dropPolicy("tp", "user_select_policy"); + pgm.dropPolicy("tp", "user_update_policy"); + pgm.dropTable("tp"); + pgm.dropRole("admin"); + pgm.dropRole("alice"); }; diff --git a/test/migrations/058_policy_test.js b/test/migrations/058_policy_test.js index 0bfc9236..1c4e1ce8 100644 --- a/test/migrations/058_policy_test.js +++ b/test/migrations/058_policy_test.js @@ -1,17 +1,23 @@ exports.up = pgm => new Promise((resolve, reject) => Promise.all([ - pgm.db.query('INSERT INTO tp(user_name) VALUES (\'admin\');'), - pgm.db.query('INSERT INTO tp(user_name) VALUES (\'alice\');'), - pgm.db.query('INSERT INTO tp(user_name) VALUES (\'bob\');'), + pgm.db.query("INSERT INTO tp(user_name) VALUES ('admin');"), + pgm.db.query("INSERT INTO tp(user_name) VALUES ('alice');"), + pgm.db.query("INSERT INTO tp(user_name) VALUES ('bob');") ]) - .then(() => pgm.db.query('set role admin;')) - .then(() => pgm.db.select('SELECT * FROM tp;')) - .then(({ length }) => length === 3 || reject(new Error('Policy is not enforced'))) - .then(() => pgm.db.query('set role alice;')) - .then(() => pgm.db.select('SELECT * FROM tp;')) - .then(({ length }) => length === 1 || reject(new Error('Policy is not enforced'))) - .then(() => pgm.db.query('reset role;')) + .then(() => pgm.db.query("set role admin;")) + .then(() => pgm.db.select("SELECT * FROM tp;")) + .then( + ({ length }) => + length === 3 || reject(new Error("Policy is not enforced")) + ) + .then(() => pgm.db.query("set role alice;")) + .then(() => pgm.db.select("SELECT * FROM tp;")) + .then( + ({ length }) => + length === 1 || reject(new Error("Policy is not enforced")) + ) + .then(() => pgm.db.query("reset role;")) .then(resolve) ); diff --git a/test/migrations/059_policy_drop.js b/test/migrations/059_policy_drop.js index 31a1d956..accc83cf 100644 --- a/test/migrations/059_policy_drop.js +++ b/test/migrations/059_policy_drop.js @@ -1,4 +1,4 @@ -const policy = require('./057_policy_create'); +const policy = require("./057_policy_create"); exports.up = policy.down; diff --git a/test/migrations/060_column_comment.js b/test/migrations/060_column_comment.js index 07755e7b..898aa92c 100644 --- a/test/migrations/060_column_comment.js +++ b/test/migrations/060_column_comment.js @@ -1,8 +1,11 @@ -exports.comment = 'comment on column id'; +exports.comment = "comment on column id"; -exports.up = (pgm) => { - pgm.createSchema('test'); - pgm.createTable({ schema: 'test', name: 'tcc' }, { - id: { type: 'id', comment: exports.comment }, - }); +exports.up = pgm => { + pgm.createSchema("test"); + pgm.createTable( + { schema: "test", name: "tcc" }, + { + id: { type: "id", comment: exports.comment } + } + ); }; diff --git a/test/migrations/061_column_comment_test.js b/test/migrations/061_column_comment_test.js index 39b4025d..87818532 100644 --- a/test/migrations/061_column_comment_test.js +++ b/test/migrations/061_column_comment_test.js @@ -1,15 +1,19 @@ -const column = require('./060_column_comment'); +const column = require("./060_column_comment"); exports.up = pgm => new Promise((resolve, reject) => - pgm.db.select(`SELECT d.description as "comment" + pgm.db + .select( + `SELECT d.description as "comment" FROM pg_description d join information_schema.columns c on (d.objsubid = c.ordinal_position) - WHERE c.table_schema = 'test' and c.table_name = 'tcc';`) - .then(([{ comment }]) => ( - comment === column.comment - ? null - : reject(new Error('Comment not set')) - )) + WHERE c.table_schema = 'test' and c.table_name = 'tcc';` + ) + .then( + ([{ comment }]) => + comment === column.comment + ? null + : reject(new Error("Comment not set")) + ) .then(resolve) ); diff --git a/test/roles-test.js b/test/roles-test.js index 5bb23452..c8668c62 100644 --- a/test/roles-test.js +++ b/test/roles-test.js @@ -1,11 +1,13 @@ -import { expect } from 'chai'; -import * as Roles from '../lib/operations/roles'; +import { expect } from "chai"; +import * as Roles from "../lib/operations/roles"; -describe('lib/operations/roles', () => { - describe('.create', () => { - it('check defaults', () => { - const sql = Roles.create('role'); - expect(sql).to.equal('CREATE ROLE "role" WITH NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOLOGIN NOREPLICATION;'); +describe("lib/operations/roles", () => { + describe(".create", () => { + it("check defaults", () => { + const sql = Roles.create("role"); + expect(sql).to.equal( + 'CREATE ROLE "role" WITH NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOLOGIN NOREPLICATION;' + ); }); }); }); diff --git a/test/tables-test.js b/test/tables-test.js index 9df13929..8780c4ae 100644 --- a/test/tables-test.js +++ b/test/tables-test.js @@ -1,66 +1,77 @@ -import { expect } from 'chai'; -import * as Tables from '../lib/operations/tables'; +import { expect } from "chai"; +import * as Tables from "../lib/operations/tables"; -describe('lib/operations/tables', () => { - describe('.create', () => { - it('check schemas can be used', () => { - const sql = Tables.create()({ schema: 'my_schema', name: 'my_table_name' }, { id: 'serial' }); +describe("lib/operations/tables", () => { + describe(".create", () => { + it("check schemas can be used", () => { + const sql = Tables.create()( + { schema: "my_schema", name: "my_table_name" }, + { id: "serial" } + ); expect(sql).to.equal(`CREATE TABLE "my_schema"."my_table_name" ( "id" serial );`); }); - it('check shorthands work', () => { - const sql = Tables.create()('my_table_name', { id: 'id' }); + it("check shorthands work", () => { + const sql = Tables.create()("my_table_name", { id: "id" }); expect(sql).to.equal(`CREATE TABLE "my_table_name" ( "id" serial PRIMARY KEY );`); }); - it('check custom shorthands can be used', () => { - const sql = Tables.create({ id: { type: 'uuid', primaryKey: true } })('my_table_name', { id: 'id' }); + it("check custom shorthands can be used", () => { + const sql = Tables.create({ id: { type: "uuid", primaryKey: true } })( + "my_table_name", + { id: "id" } + ); expect(sql).to.equal(`CREATE TABLE "my_table_name" ( "id" uuid PRIMARY KEY );`); }); - it('check schemas can be used for foreign keys', () => { - const sql = Tables.create()('my_table_name', { + it("check schemas can be used for foreign keys", () => { + const sql = Tables.create()("my_table_name", { parent_id: { - type: 'integer', - references: { schema: 'a', name: 'b' }, - }, + type: "integer", + references: { schema: "a", name: "b" } + } }); expect(sql).to.equal(`CREATE TABLE "my_table_name" ( "parent_id" integer REFERENCES "a"."b" );`); }); - it('check match clause can be used for foreign keys', () => { - const sql = Tables.create()('my_table_name', { + it("check match clause can be used for foreign keys", () => { + const sql = Tables.create()("my_table_name", { parent_id: { - type: 'integer', - references: { schema: 'a', name: 'b' }, - match: 'SIMPLE', - }, + type: "integer", + references: { schema: "a", name: "b" }, + match: "SIMPLE" + } }); expect(sql).to.equal(`CREATE TABLE "my_table_name" ( "parent_id" integer REFERENCES "a"."b" MATCH SIMPLE );`); }); - it('check defining column can be used for foreign keys', () => { - const sql = Tables.create()('my_table_name', { parent_id: { type: 'integer', references: 'a.b(id)' } }); + it("check defining column can be used for foreign keys", () => { + const sql = Tables.create()("my_table_name", { + parent_id: { type: "integer", references: "a.b(id)" } + }); expect(sql).to.equal(`CREATE TABLE "my_table_name" ( "parent_id" integer REFERENCES a.b(id) );`); }); - it('check multicolumn primary key name does not include schema', () => { - const sql = Tables.create()({ schema: 's', name: 'my_table_name' }, { - a: { type: 'integer', primaryKey: true }, - b: { type: 'varchar', primaryKey: true }, - }); + it("check multicolumn primary key name does not include schema", () => { + const sql = Tables.create()( + { schema: "s", name: "my_table_name" }, + { + a: { type: "integer", primaryKey: true }, + b: { type: "varchar", primaryKey: true } + } + ); expect(sql).to.equal(`CREATE TABLE "s"."my_table_name" ( "a" integer, "b" varchar, @@ -68,22 +79,22 @@ describe('lib/operations/tables', () => { );`); }); - it('check table references work correctly', () => { + it("check table references work correctly", () => { const sql = Tables.create()( - 'my_table_name', + "my_table_name", { - a: { type: 'integer' }, - b: { type: 'varchar' }, + a: { type: "integer" }, + b: { type: "varchar" } }, { constraints: { foreignKeys: [ { - columns: ['a', 'b'], - references: 'otherTable (A, B)', - }, - ], - }, + columns: ["a", "b"], + references: "otherTable (A, B)" + } + ] + } } ); expect(sql).to.equal(`CREATE TABLE "my_table_name" ( @@ -93,17 +104,17 @@ describe('lib/operations/tables', () => { );`); }); - it('check table unique constraint work correctly', () => { + it("check table unique constraint work correctly", () => { const sql = Tables.create()( - 'my_table_name', + "my_table_name", { - a: { type: 'integer' }, - b: { type: 'varchar' }, + a: { type: "integer" }, + b: { type: "varchar" } }, { constraints: { - unique: ['a', 'b'], - }, + unique: ["a", "b"] + } } ); expect(sql).to.equal(`CREATE TABLE "my_table_name" ( @@ -113,21 +124,18 @@ describe('lib/operations/tables', () => { );`); }); - it('check table unique constraint work correctly for array of arrays', () => { + it("check table unique constraint work correctly for array of arrays", () => { const sql = Tables.create()( - 'my_table_name', + "my_table_name", { - a: { type: 'integer' }, - b: { type: 'varchar' }, - c: { type: 'varchar' }, + a: { type: "integer" }, + b: { type: "varchar" }, + c: { type: "varchar" } }, { constraints: { - unique: [ - ['a', 'b'], - 'c', - ], - }, + unique: [["a", "b"], "c"] + } } ); expect(sql).to.equal(`CREATE TABLE "my_table_name" ( @@ -140,9 +148,9 @@ describe('lib/operations/tables', () => { }); }); - describe('.dropColumns', () => { - it('check multiple columns can be dropped', () => { - const sql = Tables.dropColumns('my_table_name', ['c1', 'c2']); + describe(".dropColumns", () => { + it("check multiple columns can be dropped", () => { + const sql = Tables.dropColumns("my_table_name", ["c1", "c2"]); expect(sql).to.equal(`ALTER TABLE "my_table_name" DROP "c1", DROP "c2";`); diff --git a/test/utils-test.js b/test/utils-test.js index b405cc66..e2fa14d7 100644 --- a/test/utils-test.js +++ b/test/utils-test.js @@ -1,50 +1,52 @@ -import { expect } from 'chai'; -import { escapeValue, PgLiteral } from '../lib/utils'; +import { expect } from "chai"; +import { escapeValue, PgLiteral } from "../lib/utils"; -describe('lib/utils', () => { - describe('.escapeValue', () => { - it('parse null to \'NULL\'', () => { +describe("lib/utils", () => { + describe(".escapeValue", () => { + it("parse null to 'NULL'", () => { const value = null; - expect(escapeValue(value)).to.equal('NULL'); + expect(escapeValue(value)).to.equal("NULL"); }); - it('parse boolean to string', () => { + it("parse boolean to string", () => { const value = true; - expect(escapeValue(value)).to.equal('true'); + expect(escapeValue(value)).to.equal("true"); }); - it('escape string', () => { - const value = '#escape_me'; + it("escape string", () => { + const value = "#escape_me"; - expect(escapeValue(value)).to.equal('$pg1$#escape_me$pg1$'); + expect(escapeValue(value)).to.equal("$pg1$#escape_me$pg1$"); }); - it('keep number as is', () => { + it("keep number as is", () => { const value = 77.7; expect(escapeValue(value)).to.equal(77.7); }); - it('parse array to ARRAY constructor syntax string', () => { + it("parse array to ARRAY constructor syntax string", () => { const value = [[1], [2]]; - const value2 = [['a'], ['b']]; + const value2 = [["a"], ["b"]]; - expect(escapeValue(value)).to.equal('ARRAY[[1],[2]]'); - expect(escapeValue(value2)).to.equal('ARRAY[[$pg1$a$pg1$],[$pg1$b$pg1$]]'); + expect(escapeValue(value)).to.equal("ARRAY[[1],[2]]"); + expect(escapeValue(value2)).to.equal( + "ARRAY[[$pg1$a$pg1$],[$pg1$b$pg1$]]" + ); }); - it('parse PgLiteral to unescaped string', () => { - const value = PgLiteral.create('@l| { + const value = PgLiteral.create("@l| { + it("parse unexpected type to empty string", () => { const value = undefined; - expect(escapeValue(value)).to.equal(''); + expect(escapeValue(value)).to.equal(""); }); }); });