From 47b984dc626c97b2588310c5c0876cbdaaed533b Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Fri, 1 Nov 2019 12:06:22 +0100 Subject: [PATCH 01/57] Add typescript to devDependencies --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 7c57b5d5..3261037a 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,8 @@ "prettier": "1.18.2", "proxyquire": "2.1.3", "sinon": "7.5.0", - "sinon-chai": "3.3.0" + "sinon-chai": "3.3.0", + "typescript": "3.6.4" }, "peerDependencies": { "pg": ">=4.3.0 <8.0.0" From 2067f8a3e56c4317d38a0807f51d0a377a3b4e39 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Fri, 1 Nov 2019 12:13:22 +0100 Subject: [PATCH 02/57] Initiate tsconfig --- tsconfig.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 tsconfig.json diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..e5557fef --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "es5", + "moduleResolution": "node", + "rootDir": "src", + "outDir": "lib", + "lib": ["es2017"], + "declaration": true, + "sourceMap": false, + "removeComments": true, + "strict": false + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "lib", "dist", "bin"] +} From 7f4b307c9c000c76d4e5844fe4e8c1d77287222c Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Fri, 1 Nov 2019 12:20:37 +0100 Subject: [PATCH 03/57] Copy content from lib to src --- .eslintignore | 1 + src/db.js | 89 +++++ src/migration-builder.js | 202 +++++++++++ src/migration-template.js | 7 + src/migration-template.sql | 1 + src/migration-template.ts | 10 + src/migration.js | 181 ++++++++++ src/operations/domains.js | 109 ++++++ src/operations/extensions.js | 33 ++ src/operations/functions.js | 84 +++++ src/operations/indexes.js | 87 +++++ src/operations/operators.js | 218 +++++++++++ src/operations/other.js | 18 + src/operations/policies.js | 72 ++++ src/operations/roles.js | 116 ++++++ src/operations/schemas.js | 39 ++ src/operations/sequences.js | 110 ++++++ src/operations/tables.js | 539 ++++++++++++++++++++++++++++ src/operations/triggers.js | 120 +++++++ src/operations/types.js | 125 +++++++ src/operations/views.js | 94 +++++ src/operations/viewsMaterialized.js | 125 +++++++ src/runner.js | 248 +++++++++++++ src/utils.js | 189 ++++++++++ 24 files changed, 2817 insertions(+) create mode 100644 src/db.js create mode 100644 src/migration-builder.js create mode 100644 src/migration-template.js create mode 100644 src/migration-template.sql create mode 100644 src/migration-template.ts create mode 100644 src/migration.js create mode 100644 src/operations/domains.js create mode 100644 src/operations/extensions.js create mode 100644 src/operations/functions.js create mode 100644 src/operations/indexes.js create mode 100644 src/operations/operators.js create mode 100644 src/operations/other.js create mode 100644 src/operations/policies.js create mode 100644 src/operations/roles.js create mode 100644 src/operations/schemas.js create mode 100644 src/operations/sequences.js create mode 100644 src/operations/tables.js create mode 100644 src/operations/triggers.js create mode 100644 src/operations/types.js create mode 100644 src/operations/views.js create mode 100644 src/operations/viewsMaterialized.js create mode 100644 src/runner.js create mode 100644 src/utils.js diff --git a/.eslintignore b/.eslintignore index d479a95c..fb5ad414 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,3 +2,4 @@ lib/migration-template.js lib/migration-template.ts node_modules dist +src diff --git a/src/db.js b/src/db.js new file mode 100644 index 00000000..794ab81b --- /dev/null +++ b/src/db.js @@ -0,0 +1,89 @@ +/* + This file just manages the database connection and provides a query method + */ + +const pg = require('pg'); +// or native libpq bindings +// const pg = require('pg/native'); + +module.exports = (connection, log = console.error) => { + const isExternalClient = connection instanceof pg.Client; + let clientActive = false; + + const client = isExternalClient ? connection : new pg.Client(connection); + + const beforeCloseListeners = []; + + const createConnection = () => + new Promise((resolve, reject) => + clientActive || isExternalClient + ? resolve() + : client.connect(err => { + if (err) { + log('could not connect to postgres', err); + return reject(err); + } + clientActive = true; + return resolve(); + }) + ); + + const query = async (...args) => { + await createConnection(); + try { + return await 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 stringStart = string.substring(0, endLineWrapPos); + const stringEnd = string.substr(endLineWrapPos); + const startLineWrapPos = stringStart.lastIndexOf('\n') + 1; + const padding = ' '.repeat(position - startLineWrapPos - 1); + log(`Error executing: +${stringStart} +${padding}^^^^${stringEnd} + +${message} +`); + } else { + log(`Error executing: +${string} +${err} +`); + } + throw err; + } + }; + + const select = async (...args) => { + const { rows } = await query(...args); + return rows; + }; + const column = async (columnName, ...args) => + (await select(...args)).map(r => r[columnName]); + + return { + createConnection, + query, + select, + column, + + addBeforeCloseListener: listener => beforeCloseListeners.push(listener), + + close: async () => { + await beforeCloseListeners.reduce( + (promise, listener) => + promise.then(listener).catch(err => log(err.stack || err)), + Promise.resolve() + ); + if (!isExternalClient) { + clientActive = false; + client.end(); + } + } + }; +}; diff --git a/src/migration-builder.js b/src/migration-builder.js new file mode 100644 index 00000000..b6f1d063 --- /dev/null +++ b/src/migration-builder.js @@ -0,0 +1,202 @@ +/* + The migration builder is used to actually create a migration from instructions + + A new instance of MigrationBuilder is instantiated and passed to the up or down block + of each migration when it is being run. + + It makes the methods available via the pgm variable and stores up the sql commands. + This is what makes it possible to do this without making everything async + and it makes inference of down migrations possible. + */ + +const { PgLiteral, createSchemalize } = require('./utils'); + +const extensions = require('./operations/extensions'); +const indexes = require('./operations/indexes'); +const tables = require('./operations/tables'); +const types = require('./operations/types'); +const roles = require('./operations/roles'); +const functions = require('./operations/functions'); +const triggers = require('./operations/triggers'); +const schemas = require('./operations/schemas'); +const domains = require('./operations/domains'); +const sequences = require('./operations/sequences'); +const operators = require('./operations/operators'); +const policies = require('./operations/policies'); +const views = require('./operations/views'); +const mViews = require('./operations/viewsMaterialized'); +const other = require('./operations/other'); + +/* eslint-disable security/detect-non-literal-fs-filename */ +module.exports = class MigrationBuilder { + constructor(db, typeShorthands, shouldDecamelize) { + this._steps = []; + this._REVERSE_MODE = false; + // by default, all migrations are wrapped in a transaction + this._use_transaction = true; + + // this function wraps each operation within a function that either + // 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') { + const name = `pgm.${operation.name}()`; + throw new Error( + `Impossible to automatically infer down migration for "${name}"` + ); + } + this._steps = this._steps.concat( + this._REVERSE_MODE ? operation.reverse(...args) : operation(...args) + ); + }; + + const options = { + typeShorthands, + schemalize: createSchemalize(shouldDecamelize, false), + literal: createSchemalize(shouldDecamelize, true) + }; + + // defines the methods that are accessible via pgm in each migrations + // there are some convenience aliases to make usage easier + this.createExtension = wrap(extensions.createExtension(options)); + this.dropExtension = wrap(extensions.dropExtension(options)); + this.addExtension = this.createExtension; + + this.createTable = wrap(tables.createTable(options)); + this.dropTable = wrap(tables.dropTable(options)); + this.renameTable = wrap(tables.renameTable(options)); + this.alterTable = wrap(tables.alterTable(options)); + + this.addColumns = wrap(tables.addColumns(options)); + this.dropColumns = wrap(tables.dropColumns(options)); + this.renameColumn = wrap(tables.renameColumn(options)); + this.alterColumn = wrap(tables.alterColumn(options)); + this.addColumn = this.addColumns; + this.dropColumn = this.dropColumns; + + this.addConstraint = wrap(tables.addConstraint(options)); + this.dropConstraint = wrap(tables.dropConstraint(options)); + this.renameConstraint = wrap(tables.renameConstraint(options)); + this.createConstraint = this.addConstraint; + + this.createType = wrap(types.createType(options)); + this.dropType = wrap(types.dropType(options)); + this.addType = this.createType; + this.renameType = wrap(types.renameType(options)); + this.renameTypeAttribute = wrap(types.renameTypeAttribute(options)); + this.renameTypeValue = wrap(types.renameTypeValue(options)); + this.addTypeAttribute = wrap(types.addTypeAttribute(options)); + this.dropTypeAttribute = wrap(types.dropTypeAttribute(options)); + this.setTypeAttribute = wrap(types.setTypeAttribute(options)); + this.addTypeValue = wrap(types.addTypeValue(options)); + + this.createIndex = wrap(indexes.createIndex(options)); + this.dropIndex = wrap(indexes.dropIndex(options)); + this.addIndex = this.createIndex; + + this.createRole = wrap(roles.createRole(options)); + this.dropRole = wrap(roles.dropRole(options)); + this.alterRole = wrap(roles.alterRole(options)); + this.renameRole = wrap(roles.renameRole(options)); + + this.createFunction = wrap(functions.createFunction(options)); + this.dropFunction = wrap(functions.dropFunction(options)); + this.renameFunction = wrap(functions.renameFunction(options)); + + this.createTrigger = wrap(triggers.createTrigger(options)); + this.dropTrigger = wrap(triggers.dropTrigger(options)); + this.renameTrigger = wrap(triggers.renameTrigger(options)); + + this.createSchema = wrap(schemas.createSchema(options)); + this.dropSchema = wrap(schemas.dropSchema(options)); + this.renameSchema = wrap(schemas.renameSchema(options)); + + this.createDomain = wrap(domains.createDomain(options)); + this.dropDomain = wrap(domains.dropDomain(options)); + this.alterDomain = wrap(domains.alterDomain(options)); + this.renameDomain = wrap(domains.renameDomain(options)); + + this.createSequence = wrap(sequences.createSequence(options)); + this.dropSequence = wrap(sequences.dropSequence(options)); + this.alterSequence = wrap(sequences.alterSequence(options)); + this.renameSequence = wrap(sequences.renameSequence(options)); + + this.createOperator = wrap(operators.createOperator(options)); + this.dropOperator = wrap(operators.dropOperator(options)); + this.createOperatorClass = wrap(operators.createOperatorClass(options)); + this.dropOperatorClass = wrap(operators.dropOperatorClass(options)); + this.renameOperatorClass = wrap(operators.renameOperatorClass(options)); + this.createOperatorFamily = wrap(operators.createOperatorFamily(options)); + this.dropOperatorFamily = wrap(operators.dropOperatorFamily(options)); + this.renameOperatorFamily = wrap(operators.renameOperatorFamily(options)); + this.addToOperatorFamily = wrap(operators.addToOperatorFamily(options)); + this.removeFromOperatorFamily = wrap( + operators.removeFromOperatorFamily(options) + ); + + this.createPolicy = wrap(policies.createPolicy(options)); + this.dropPolicy = wrap(policies.dropPolicy(options)); + this.alterPolicy = wrap(policies.alterPolicy(options)); + this.renamePolicy = wrap(policies.renamePolicy(options)); + + this.createView = wrap(views.createView(options)); + this.dropView = wrap(views.dropView(options)); + this.alterView = wrap(views.alterView(options)); + this.alterViewColumn = wrap(views.alterViewColumn(options)); + this.renameView = wrap(views.renameView(options)); + + this.createMaterializedView = wrap(mViews.createMaterializedView(options)); + this.dropMaterializedView = wrap(mViews.dropMaterializedView(options)); + this.alterMaterializedView = wrap(mViews.alterMaterializedView(options)); + this.renameMaterializedView = wrap(mViews.renameMaterializedView(options)); + this.renameMaterializedViewColumn = wrap( + mViews.renameMaterializedViewColumn(options) + ); + this.refreshMaterializedView = wrap( + mViews.refreshMaterializedView(options) + ); + + this.sql = wrap(other.sql(options)); + + // Other utilities which may be useful + // .func creates a string which will not be escaped + // common uses are for PG functions, ex: { ... default: pgm.func('NOW()') } + this.func = PgLiteral.create; + + // 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'); + } + return operation(...args); + }; + this.db = { + query: wrapDB(db.query), + select: wrapDB(db.select) + }; + } + + enableReverseMode() { + this._REVERSE_MODE = true; + return this; + } + + noTransaction() { + this._use_transaction = false; + return this; + } + + isUsingTransaction() { + return this._use_transaction; + } + + getSql() { + return `${this.getSqlSteps().join('\n')}\n`; + } + + getSqlSteps() { + // in reverse mode, we flip the order of the statements + return this._REVERSE_MODE ? this._steps.slice().reverse() : this._steps; + } +}; +/* eslint-enable security/detect-non-literal-fs-filename */ diff --git a/src/migration-template.js b/src/migration-template.js new file mode 100644 index 00000000..fbce4d40 --- /dev/null +++ b/src/migration-template.js @@ -0,0 +1,7 @@ +/* eslint-disable camelcase */ + +exports.shorthands = undefined; + +exports.up = pgm => {}; + +exports.down = pgm => {}; diff --git a/src/migration-template.sql b/src/migration-template.sql new file mode 100644 index 00000000..aed00f2e --- /dev/null +++ b/src/migration-template.sql @@ -0,0 +1 @@ +-- up migration \ No newline at end of file diff --git a/src/migration-template.ts b/src/migration-template.ts new file mode 100644 index 00000000..9d2731e4 --- /dev/null +++ b/src/migration-template.ts @@ -0,0 +1,10 @@ +/* eslint-disable @typescript-eslint/camelcase */ +import { MigrationBuilder } from 'node-pg-migrate'; + +export const shorthands = undefined; + +export async function up(pgm: MigrationBuilder): Promise { +} + +export async function down(pgm: MigrationBuilder): Promise { +} diff --git a/src/migration.js b/src/migration.js new file mode 100644 index 00000000..9d2ae0b5 --- /dev/null +++ b/src/migration.js @@ -0,0 +1,181 @@ +/* + A new Migration is instantiated for each migration file. + + It is responsible for storing the name of the file and knowing how to execute + the up and down migrations defined in the file. + + */ + +const fs = require('fs'); +const mkdirp = require('mkdirp'); +const path = require('path'); + +const MigrationBuilder = require('./migration-builder'); +const { getMigrationTableSchema, promisify } = require('./utils'); + +const readdir = promisify(fs.readdir); // eslint-disable-line security/detect-non-literal-fs-filename +const lstat = promisify(fs.lstat); // eslint-disable-line security/detect-non-literal-fs-filename + +const SEPARATOR = '_'; + +const loadMigrationFiles = async (dir, ignorePattern) => { + const dirContent = await readdir(`${dir}/`); + const files = await Promise.all( + dirContent.map(async file => { + const stats = await lstat(`${dir}/${file}`); + return stats.isFile() ? file : null; + }) + ); + const filter = new RegExp(`^(${ignorePattern})$`); // eslint-disable-line security/detect-non-literal-regexp + return files.filter(i => i && !filter.test(i)).sort(); +}; + +const getLastSuffix = async (dir, ignorePattern) => { + try { + const files = await loadMigrationFiles(dir, ignorePattern); + return files.length > 0 + ? path.extname(files[files.length - 1]).substr(1) + : undefined; + } catch (err) { + return undefined; + } +}; + +module.exports = class Migration { + // class method that creates a new migration file by cloning the migration template + static async create(name, directory, language, ignorePattern) { + // ensure the migrations directory exists + mkdirp.sync(directory); + + const suffix = + language || (await getLastSuffix(directory, ignorePattern)) || 'js'; + + // file name looks like migrations/1391877300255_migration-title.js + const newFile = `${directory}/${Date.now()}${SEPARATOR}${name}.${suffix}`; + + // copy the default migration template to the new file location + await new Promise(resolve => { + // eslint-disable-next-line security/detect-non-literal-fs-filename + fs.createReadStream( + path.resolve(__dirname, `./migration-template.${suffix}`) + ) + // eslint-disable-next-line security/detect-non-literal-fs-filename + .pipe(fs.createWriteStream(newFile)) + .on('end', resolve); + }); + + return new Migration(null, newFile); + } + + constructor( + db, + migrationPath, + { up, down } = {}, + options = {}, + typeShorthands, + log = console.log + ) { + this.db = db; + this.path = migrationPath; + this.name = path.basename(migrationPath, path.extname(migrationPath)); + this.timestamp = Number(this.name.split(SEPARATOR)[0]) || 0; + this.up = up; + this.down = down; + this.options = options; + this.typeShorthands = typeShorthands; + this.log = log; + } + + _getMarkAsRun(action) { + const schema = getMigrationTableSchema(this.options); + const { migrationsTable } = this.options; + const { name } = this; + switch (action) { + case this.down: + this.log(`### MIGRATION ${this.name} (DOWN) ###`); + return `DELETE FROM "${schema}"."${migrationsTable}" WHERE name='${name}';`; + case this.up: + this.log(`### MIGRATION ${this.name} (UP) ###`); + return `INSERT INTO "${schema}"."${migrationsTable}" (name, run_on) VALUES ('${name}', NOW());`; + default: + throw new Error('Unknown direction'); + } + } + + async _apply(action, pgm) { + if (action.length === 2) { + await new Promise(resolve => action(pgm, resolve)); + } else { + await action(pgm); + } + + const sqlSteps = pgm.getSqlSteps(); + + sqlSteps.push(this._getMarkAsRun(action)); + + if (!this.options.singleTransaction && pgm.isUsingTransaction()) { + // if not in singleTransaction mode we need to create our own transaction + 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;'); + } else if (!this.options.singleTransaction || !pgm.isUsingTransaction()) { + this.log('#> WARNING: This migration is not wrapped in a transaction! <'); + } + + this.log(`${sqlSteps.join('\n')}\n\n`); + + return sqlSteps.reduce( + (promise, sql) => + promise.then(() => this.options.dryRun || this.db.query(sql)), + Promise.resolve() + ); + } + + _getAction(direction) { + if (direction === 'down') { + if (this.down === false) { + throw new Error( + `User has disabled down migration on file: ${this.name}` + ); + } + + if (this.down === undefined) { + this.down = this.up; + } + } + + const action = this[direction]; + + if (typeof action !== 'function') { + throw new Error(`Unknown value for direction: ${direction}`); + } + + return action; + } + + apply(direction) { + const pgm = new MigrationBuilder( + this.db, + this.typeShorthands, + this.options.decamelize + ); + const action = this._getAction(direction); + + if (this.down === this.up) { + // automatically infer the down migration by running the up migration in reverse mode... + pgm.enableReverseMode(); + } + + return this._apply(action, pgm); + } + + markAsRun(direction) { + return this.db.query(this._getMarkAsRun(this._getAction(direction))); + } +}; + +module.exports.loadMigrationFiles = loadMigrationFiles; diff --git a/src/operations/domains.js b/src/operations/domains.js new file mode 100644 index 00000000..77c7d2a6 --- /dev/null +++ b/src/operations/domains.js @@ -0,0 +1,109 @@ +const { applyType, escapeValue } = require('../utils'); + +function dropDomain(mOptions) { + const _drop = (domainName, { ifExists, cascade } = {}) => { + const ifExistsStr = ifExists ? ' IF EXISTS' : ''; + const cascadeStr = cascade ? ' CASCADE' : ''; + const domainNameStr = mOptions.literal(domainName); + return `DROP DOMAIN${ifExistsStr} ${domainNameStr}${cascadeStr};`; + }; + return _drop; +} + +function createDomain(mOptions) { + const _create = (domainName, type, options = {}) => { + const { + default: defaultValue, + collation, + notNull, + check, + constraintName + } = options; + const constraints = []; + if (collation) { + constraints.push(`COLLATE ${collation}`); + } + if (defaultValue !== undefined) { + constraints.push(`DEFAULT ${escapeValue(defaultValue)}`); + } + if (notNull && check) { + throw new Error('"notNull" and "check" can\'t be specified together'); + } else if (notNull || check) { + if (constraintName) { + constraints.push(`CONSTRAINT ${mOptions.literal(constraintName)}`); + } + if (notNull) { + constraints.push('NOT NULL'); + } else if (check) { + constraints.push(`CHECK (${check})`); + } + } + + const constraintsStr = constraints.length + ? ` ${constraints.join(' ')}` + : ''; + + const typeStr = applyType(type, mOptions.typeShorthands).type; + const domainNameStr = mOptions.literal(domainName); + + return `CREATE DOMAIN ${domainNameStr} AS ${typeStr}${constraintsStr};`; + }; + _create.reverse = (domainName, type, options) => + dropDomain(mOptions)(domainName, options); + return _create; +} + +function alterDomain(mOptions) { + const _alter = (domainName, options) => { + const { + default: defaultValue, + notNull, + allowNull, + check, + constraintName + } = options; + const actions = []; + if (defaultValue === null) { + actions.push('DROP DEFAULT'); + } else if (defaultValue !== undefined) { + actions.push(`SET DEFAULT ${escapeValue(defaultValue)}`); + } + if (notNull) { + actions.push('SET NOT NULL'); + } else if (notNull === false || allowNull) { + actions.push('DROP NOT NULL'); + } + if (check) { + actions.push( + `${ + constraintName + ? `CONSTRAINT ${mOptions.literal(constraintName)} ` + : '' + }CHECK (${check})` + ); + } + + return `${actions + .map(action => `ALTER DOMAIN ${mOptions.literal(domainName)} ${action}`) + .join(';\n')};`; + }; + return _alter; +} + +function renameDomain(mOptions) { + const _rename = (domainName, newDomainName) => { + const domainNameStr = mOptions.literal(domainName); + const newDomainNameStr = mOptions.literal(newDomainName); + return `ALTER DOMAIN ${domainNameStr} RENAME TO ${newDomainNameStr};`; + }; + _rename.reverse = (domainName, newDomainName) => + _rename(newDomainName, domainName); + return _rename; +} + +module.exports = { + dropDomain, + createDomain, + alterDomain, + renameDomain +}; diff --git a/src/operations/extensions.js b/src/operations/extensions.js new file mode 100644 index 00000000..4fda4723 --- /dev/null +++ b/src/operations/extensions.js @@ -0,0 +1,33 @@ +const _ = require('lodash'); + +function dropExtension(mOptions) { + const _drop = (extensions, { ifExists, cascade } = {}) => { + if (!_.isArray(extensions)) extensions = [extensions]; // eslint-disable-line no-param-reassign + const ifExistsStr = ifExists ? ' IF EXISTS' : ''; + const cascadeStr = cascade ? ' CASCADE' : ''; + return _.map(extensions, extension => { + const extensionStr = mOptions.literal(extension); + return `DROP EXTENSION${ifExistsStr} ${extensionStr}${cascadeStr};`; + }); + }; + return _drop; +} + +function createExtension(mOptions) { + const _create = (extensions, { ifNotExists, schema } = {}) => { + if (!_.isArray(extensions)) extensions = [extensions]; // eslint-disable-line no-param-reassign + const ifNotExistsStr = ifNotExists ? ' IF NOT EXISTS' : ''; + const schemaStr = schema ? ` SCHEMA ${mOptions.literal(schema)}` : ''; + return _.map(extensions, extension => { + const extensionStr = mOptions.literal(extension); + return `CREATE EXTENSION${ifNotExistsStr} ${extensionStr}${schemaStr};`; + }); + }; + _create.reverse = dropExtension(mOptions); + return _create; +} + +module.exports = { + createExtension, + dropExtension +}; diff --git a/src/operations/functions.js b/src/operations/functions.js new file mode 100644 index 00000000..33783d83 --- /dev/null +++ b/src/operations/functions.js @@ -0,0 +1,84 @@ +const { escapeValue, formatParams } = require('../utils'); + +function dropFunction(mOptions) { + const _drop = ( + functionName, + functionParams = [], + { ifExists, cascade } = {} + ) => { + const ifExistsStr = ifExists ? ' IF EXISTS' : ''; + const cascadeStr = cascade ? ' CASCADE' : ''; + const paramsStr = formatParams(functionParams, mOptions); + const functionNameStr = mOptions.literal(functionName); + return `DROP FUNCTION${ifExistsStr} ${functionNameStr}${paramsStr}${cascadeStr};`; + }; + return _drop; +} + +function createFunction(mOptions) { + const _create = ( + functionName, + functionParams = [], + functionOptions = {}, + definition + ) => { + const { + replace, + returns = 'void', + language, + window, + behavior = 'VOLATILE', + onNull, + parallel + } = functionOptions; + const options = []; + if (behavior) { + options.push(behavior); + } + if (language) { + options.push(`LANGUAGE ${language}`); + } else { + throw new Error( + `Language for function ${functionName} have to be specified` + ); + } + if (window) { + options.push('WINDOW'); + } + if (onNull) { + options.push('RETURNS NULL ON NULL INPUT'); + } + if (parallel) { + options.push(`PARALLEL ${parallel}`); + } + + const replaceStr = replace ? ' OR REPLACE' : ''; + const paramsStr = formatParams(functionParams, mOptions); + const functionNameStr = mOptions.literal(functionName); + + return `CREATE${replaceStr} FUNCTION ${functionNameStr}${paramsStr} + RETURNS ${returns} + AS ${escapeValue(definition)} + ${options.join('\n ')};`; + }; + _create.reverse = dropFunction(mOptions); + return _create; +} + +function renameFunction(mOptions) { + const _rename = (oldFunctionName, functionParams = [], newFunctionName) => { + const paramsStr = formatParams(functionParams, mOptions); + const oldFunctionNameStr = mOptions.literal(oldFunctionName); + const newFunctionNameStr = mOptions.literal(newFunctionName); + return `ALTER FUNCTION ${oldFunctionNameStr}${paramsStr} RENAME TO ${newFunctionNameStr};`; + }; + _rename.reverse = (oldFunctionName, functionParams, newFunctionName) => + _rename(newFunctionName, functionParams, oldFunctionName); + return _rename; +} + +module.exports = { + createFunction, + dropFunction, + renameFunction +}; diff --git a/src/operations/indexes.js b/src/operations/indexes.js new file mode 100644 index 00000000..b33fce47 --- /dev/null +++ b/src/operations/indexes.js @@ -0,0 +1,87 @@ +const _ = require('lodash'); + +function generateIndexName(table, columns, options) { + if (options.name) { + return typeof table === 'object' + ? { schema: table.schema, name: options.name } + : options.name; + } + const cols = _.isArray(columns) ? columns.join('_') : columns; + const uniq = options.unique ? '_unique' : ''; + return typeof table === 'object' + ? { + schema: table.schema, + name: `${table.name}_${cols}${uniq}_index` + } + : `${table}_${cols}${uniq}_index`; +} + +function generateColumnString(column, literal) { + const openingBracketPos = column.indexOf('('); + const closingBracketPos = column.indexOf(')'); + const isFunction = + openingBracketPos >= 0 && closingBracketPos > openingBracketPos; + return isFunction + ? column // expression + : literal(column); // single column +} + +function generateColumnsString(columns, literal) { + return _.isArray(columns) + ? columns.map(column => generateColumnString(column, literal)).join(', ') + : generateColumnString(columns, literal); +} + +function dropIndex(mOptions) { + const _drop = (tableName, columns, options = {}) => { + const { concurrently, ifExists, cascade } = options; + const concurrentlyStr = concurrently ? ' CONCURRENTLY' : ''; + const ifExistsStr = ifExists ? ' IF EXISTS' : ''; + const indexName = generateIndexName(tableName, columns, options); + const cascadeStr = cascade ? ' CASCADE' : ''; + const indexNameStr = mOptions.literal(indexName); + + return `DROP INDEX${concurrentlyStr}${ifExistsStr} ${indexNameStr}${cascadeStr};`; + }; + return _drop; +} + +function createIndex(mOptions) { + const _create = (tableName, columns, options = {}) => { + /* + columns - the column, columns, or expression to create the index on + + Options + name - explicitly specify the name for the index + unique - is this a unique index + where - where clause + concurrently - + opclass - name of an operator class + options.method - [ btree | hash | gist | spgist | gin ] + */ + const indexName = generateIndexName( + typeof tableName === 'object' ? tableName.name : tableName, + columns, + options + ); + const columnsString = generateColumnsString(columns, mOptions.literal); + 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 opclass = options.opclass + ? ` ${mOptions.schemalize(options.opclass)}` + : ''; + const indexNameStr = mOptions.literal(indexName); + const tableNameStr = mOptions.literal(tableName); + + return `CREATE ${unique} INDEX ${concurrently} ${indexNameStr} ON ${tableNameStr}${method} (${columnsString}${opclass})${where};`; + }; + _create.reverse = dropIndex(mOptions); + return _create; +} + +module.exports = { + createIndex, + dropIndex +}; diff --git a/src/operations/operators.js b/src/operations/operators.js new file mode 100644 index 00000000..a985de84 --- /dev/null +++ b/src/operations/operators.js @@ -0,0 +1,218 @@ +const { formatParams, applyType } = require('../utils'); + +function dropOperator(mOptions) { + const _drop = (operatorName, options = {}) => { + const { ifExists, cascade, left, right } = options; + + const operatorNameStr = mOptions.schemalize(operatorName); + const leftStr = mOptions.literal(left || 'none'); + const rightStr = mOptions.literal(right || 'none'); + + const ifExistsStr = ifExists ? ' IF EXISTS' : ''; + const cascadeStr = cascade ? ' CASCADE' : ''; + + return `DROP OPERATOR${ifExistsStr} ${operatorNameStr}(${leftStr}, ${rightStr})${cascadeStr};`; + }; + return _drop; +} + +function createOperator(mOptions) { + const _create = (operatorName, options = {}) => { + const { + procedure, + left, + right, + commutator, + negator, + restrict, + join, + hashes, + merges + } = options; + + const defs = []; + defs.push(`PROCEDURE = ${mOptions.literal(procedure)}`); + if (left) { + defs.push(`LEFTARG = ${mOptions.literal(left)}`); + } + if (right) { + defs.push(`RIGHTARG = ${mOptions.literal(right)}`); + } + if (commutator) { + defs.push(`COMMUTATOR = ${mOptions.schemalize(commutator)}`); + } + if (negator) { + defs.push(`NEGATOR = ${mOptions.schemalize(negator)}`); + } + if (restrict) { + defs.push(`RESTRICT = ${mOptions.literal(restrict)}`); + } + if (join) { + defs.push(`JOIN = ${mOptions.literal(join)}`); + } + if (hashes) { + defs.push('HASHES'); + } + if (merges) { + defs.push('MERGES'); + } + const operatorNameStr = mOptions.schemalize(operatorName); + return `CREATE OPERATOR ${operatorNameStr} (${defs.join(', ')});`; + }; + _create.reverse = dropOperator(mOptions); + return _create; +} + +function dropOperatorFamily(mOptions) { + const _drop = ( + operatorFamilyName, + indexMethod, + { ifExists, cascade } = {} + ) => { + const operatorFamilyNameStr = mOptions.literal(operatorFamilyName); + const ifExistsStr = ifExists ? ' IF EXISTS' : ''; + const cascadeStr = cascade ? ' CASCADE' : ''; + return `DROP OPERATOR FAMILY ${ifExistsStr} ${operatorFamilyNameStr} USING ${indexMethod}${cascadeStr};`; + }; + return _drop; +} + +function createOperatorFamily(mOptions) { + const _create = (operatorFamilyName, indexMethod) => { + const operatorFamilyNameStr = mOptions.literal(operatorFamilyName); + return `CREATE OPERATOR FAMILY ${operatorFamilyNameStr} USING ${indexMethod};`; + }; + _create.reverse = dropOperatorFamily(mOptions); + return _create; +} + +const operatorMap = mOptions => ({ type = '', number, name, params = [] }) => { + const nameStr = mOptions.literal(name); + if (String(type).toLowerCase() === 'function') { + if (params.length > 2) { + throw new Error("Operator can't have more than 2 parameters"); + } + const paramsStr = params.length > 0 ? formatParams(params, mOptions) : ''; + + return `OPERATOR ${number} ${nameStr}${paramsStr}`; + } + + if (String(type).toLowerCase() === 'operator') { + const paramsStr = formatParams(params, mOptions); + return `FUNCTION ${number} ${nameStr}${paramsStr}`; + } + + throw new Error('Operator "type" must be either "function" or "operator"'); +}; + +const changeOperatorFamily = (op, reverse) => mOptions => { + const method = (operatorFamilyName, indexMethod, operatorList) => { + const operatorFamilyNameStr = mOptions.literal(operatorFamilyName); + const operatorListStr = operatorList + .map(operatorMap(mOptions)) + .join(',\n '); + + return `ALTER OPERATOR FAMILY ${operatorFamilyNameStr} USING ${indexMethod} ${op} + ${operatorListStr};`; + }; + if (reverse) { + method.reverse = reverse(mOptions); + } + return method; +}; + +const removeFromOperatorFamily = changeOperatorFamily('DROP'); +const addToOperatorFamily = changeOperatorFamily( + 'ADD', + removeFromOperatorFamily +); + +function renameOperatorFamily(mOptions) { + const _rename = ( + oldOperatorFamilyName, + indexMethod, + newOperatorFamilyName + ) => { + const oldOperatorFamilyNameStr = mOptions.literal(oldOperatorFamilyName); + const newOperatorFamilyNameStr = mOptions.literal(newOperatorFamilyName); + + return `ALTER OPERATOR FAMILY ${oldOperatorFamilyNameStr} USING ${indexMethod} RENAME TO ${newOperatorFamilyNameStr};`; + }; + _rename.reverse = ( + oldOperatorFamilyName, + indexMethod, + newOperatorFamilyName + ) => _rename(newOperatorFamilyName, indexMethod, oldOperatorFamilyName); + return _rename; +} + +function dropOperatorClass(mOptions) { + const _drop = ( + operatorClassName, + indexMethod, + { ifExists, cascade } = {} + ) => { + const operatorClassNameStr = mOptions.literal(operatorClassName); + const ifExistsStr = ifExists ? ' IF EXISTS' : ''; + const cascadeStr = cascade ? ' CASCADE' : ''; + + return `DROP OPERATOR CLASS ${ifExistsStr} ${operatorClassNameStr} USING ${indexMethod}${cascadeStr};`; + }; + return _drop; +} + +function createOperatorClass(mOptions) { + const _create = ( + operatorClassName, + type, + indexMethod, + operatorList, + options + ) => { + const { default: isDefault, family } = options; + const operatorClassNameStr = mOptions.literal(operatorClassName); + const defaultStr = isDefault ? ' DEFAULT' : ''; + const typeStr = mOptions.literal(applyType(type).type); + const indexMethodStr = mOptions.literal(indexMethod); + const familyStr = family ? ` FAMILY ${family}` : ''; + const operatorListStr = operatorList + .map(operatorMap(mOptions)) + .join(',\n '); + + return `CREATE OPERATOR CLASS ${operatorClassNameStr}${defaultStr} FOR TYPE ${typeStr} USING ${indexMethodStr} ${familyStr} AS + ${operatorListStr};`; + }; + _create.reverse = ( + operatorClassName, + type, + indexMethod, + operatorList, + options + ) => dropOperatorClass(mOptions)(operatorClassName, indexMethod, options); + return _create; +} + +function renameOperatorClass(mOptions) { + const _rename = (oldOperatorClassName, indexMethod, newOperatorClassName) => { + const oldOperatorClassNameStr = mOptions.literal(oldOperatorClassName); + const newOperatorClassNameStr = mOptions.literal(newOperatorClassName); + + return `ALTER OPERATOR CLASS ${oldOperatorClassNameStr} USING ${indexMethod} RENAME TO ${newOperatorClassNameStr};`; + }; + _rename.reverse = (oldOperatorClassName, indexMethod, newOperatorClassName) => + _rename(newOperatorClassName, indexMethod, oldOperatorClassName); + return _rename; +} + +module.exports = { + createOperator, + dropOperator, + createOperatorFamily, + dropOperatorFamily, + removeFromOperatorFamily, + addToOperatorFamily, + renameOperatorFamily, + dropOperatorClass, + createOperatorClass, + renameOperatorClass +}; diff --git a/src/operations/other.js b/src/operations/other.js new file mode 100644 index 00000000..0181acb9 --- /dev/null +++ b/src/operations/other.js @@ -0,0 +1,18 @@ +const { createTransformer } = require('../utils'); + +function sql(mOptions) { + const t = createTransformer(mOptions.literal); + return (...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 += ';'; + } + return s; + }; +} + +module.exports = { + sql +}; diff --git a/src/operations/policies.js b/src/operations/policies.js new file mode 100644 index 00000000..f268a801 --- /dev/null +++ b/src/operations/policies.js @@ -0,0 +1,72 @@ +const makeClauses = ({ role, using, check }) => { + const roles = (Array.isArray(role) ? role : [role]).join(', '); + const clauses = []; + if (roles) { + clauses.push(`TO ${roles}`); + } + if (using) { + clauses.push(`USING (${using})`); + } + if (check) { + clauses.push(`WITH CHECK (${check})`); + } + return clauses; +}; + +function dropPolicy(mOptions) { + const _drop = (tableName, policyName, { ifExists } = {}) => { + const ifExistsStr = ifExists ? ' IF EXISTS' : ''; + const policyNameStr = mOptions.literal(policyName); + const tableNameStr = mOptions.literal(tableName); + return `DROP POLICY${ifExistsStr} ${policyNameStr} ON ${tableNameStr};`; + }; + return _drop; +} + +function createPolicy(mOptions) { + const _create = (tableName, policyName, options = {}) => { + const createOptions = { + ...options, + role: options.role || 'PUBLIC' + }; + const clauses = [ + `FOR ${options.command || 'ALL'}`, + ...makeClauses(createOptions) + ]; + const clausesStr = clauses.join(' '); + const policyNameStr = mOptions.literal(policyName); + const tableNameStr = mOptions.literal(tableName); + return `CREATE POLICY ${policyNameStr} ON ${tableNameStr} ${clausesStr};`; + }; + _create.reverse = dropPolicy(mOptions); + return _create; +} + +function alterPolicy(mOptions) { + const _alter = (tableName, policyName, options = {}) => { + const clausesStr = makeClauses(options).join(' '); + const policyNameStr = mOptions.literal(policyName); + const tableNameStr = mOptions.literal(tableName); + return `ALTER POLICY ${policyNameStr} ON ${tableNameStr} ${clausesStr};`; + }; + return _alter; +} + +function renamePolicy(mOptions) { + const _rename = (tableName, policyName, newPolicyName) => { + const policyNameStr = mOptions.literal(policyName); + const newPolicyNameStr = mOptions.literal(newPolicyName); + const tableNameStr = mOptions.literal(tableName); + return `ALTER POLICY ${policyNameStr} ON ${tableNameStr} RENAME TO ${newPolicyNameStr};`; + }; + _rename.reverse = (tableName, policyName, newPolicyName) => + _rename(tableName, newPolicyName, policyName); + return _rename; +} + +module.exports = { + createPolicy, + dropPolicy, + alterPolicy, + renamePolicy +}; diff --git a/src/operations/roles.js b/src/operations/roles.js new file mode 100644 index 00000000..37ad5c57 --- /dev/null +++ b/src/operations/roles.js @@ -0,0 +1,116 @@ +const { isArray } = require('lodash'); +const { escapeValue } = require('../utils'); + +const formatRoleOptions = (roleOptions = {}) => { + const options = []; + if (roleOptions.superuser !== undefined) { + options.push(roleOptions.superuser ? 'SUPERUSER' : 'NOSUPERUSER'); + } + if (roleOptions.createdb !== undefined) { + options.push(roleOptions.createdb ? 'CREATEDB' : 'NOCREATEDB'); + } + if (roleOptions.createrole !== undefined) { + options.push(roleOptions.createrole ? 'CREATEROLE' : 'NOCREATEROLE'); + } + if (roleOptions.inherit !== undefined) { + options.push(roleOptions.inherit ? 'INHERIT' : 'NOINHERIT'); + } + if (roleOptions.login !== undefined) { + options.push(roleOptions.login ? 'LOGIN' : 'NOLOGIN'); + } + if (roleOptions.replication !== undefined) { + options.push(roleOptions.replication ? 'REPLICATION' : 'NOREPLICATION'); + } + if (roleOptions.bypassrls !== undefined) { + options.push(roleOptions.bypassrls ? 'BYPASSRLS' : 'NOBYPASSRLS'); + } + if (roleOptions.limit) { + options.push(`CONNECTION LIMIT ${Number(roleOptions.limit)}`); + } + if (roleOptions.password !== undefined) { + const encrypted = + roleOptions.encrypted === false ? 'UNENCRYPTED' : 'ENCRYPTED'; + options.push(`${encrypted} PASSWORD ${escapeValue(roleOptions.password)}`); + } + if (roleOptions.valid !== undefined) { + const valid = roleOptions.valid + ? escapeValue(roleOptions.valid) + : "'infinity'"; + options.push(`VALID UNTIL ${valid}`); + } + if (roleOptions.inRole) { + const inRole = isArray(roleOptions.inRole) + ? roleOptions.inRole.join(',') + : roleOptions.inRole; + options.push(`IN ROLE ${inRole}`); + } + if (roleOptions.role) { + const role = isArray(roleOptions.role) + ? roleOptions.role.join(',') + : roleOptions.role; + options.push(`ROLE ${role}`); + } + if (roleOptions.admin) { + const admin = isArray(roleOptions.admin) + ? roleOptions.admin.join(',') + : roleOptions.admin; + options.push(`ADMIN ${admin}`); + } + + return options.join(' '); +}; + +function dropRole(mOptions) { + const _drop = (roleName, { ifExists } = {}) => { + const ifExistsStr = ifExists ? ' IF EXISTS' : ''; + const roleNameStr = mOptions.literal(roleName); + return `DROP ROLE${ifExistsStr} ${roleNameStr};`; + }; + return _drop; +} + +function createRole(mOptions) { + const _create = (roleName, roleOptions = {}) => { + const options = formatRoleOptions({ + ...roleOptions, + superuser: roleOptions.superuser || false, + createdb: roleOptions.createdb || false, + createrole: roleOptions.createrole || false, + inherit: roleOptions.inherit !== false, + login: roleOptions.login || false, + replication: roleOptions.replication || false + }); + const optionsStr = options ? ` WITH ${options}` : ''; + return `CREATE ROLE ${mOptions.literal(roleName)}${optionsStr};`; + }; + _create.reverse = dropRole(mOptions); + return _create; +} + +function alterRole(mOptions) { + const _alter = (roleName, roleOptions = {}) => { + const options = formatRoleOptions(roleOptions); + return options + ? `ALTER ROLE ${mOptions.literal(roleName)} WITH ${options};` + : ''; + }; + return _alter; +} + +function renameRole(mOptions) { + const _rename = (oldRoleName, newRoleName) => { + const oldRoleNameStr = mOptions.literal(oldRoleName); + const newRoleNameStr = mOptions.literal(newRoleName); + return `ALTER ROLE ${oldRoleNameStr} RENAME TO ${newRoleNameStr};`; + }; + _rename.reverse = (oldRoleName, newRoleName) => + _rename(newRoleName, oldRoleName); + return _rename; +} + +module.exports = { + createRole, + dropRole, + alterRole, + renameRole +}; diff --git a/src/operations/schemas.js b/src/operations/schemas.js new file mode 100644 index 00000000..f632daab --- /dev/null +++ b/src/operations/schemas.js @@ -0,0 +1,39 @@ +function dropSchema(mOptions) { + const _drop = (schemaName, { ifExists, cascade } = {}) => { + const ifExistsStr = ifExists ? ' IF EXISTS' : ''; + const cascadeStr = cascade ? ' CASCADE' : ''; + const schemaNameStr = mOptions.literal(schemaName); + return `DROP SCHEMA${ifExistsStr} ${schemaNameStr}${cascadeStr};`; + }; + return _drop; +} + +function createSchema(mOptions) { + const _create = (schemaName, { ifNotExists, authorization } = {}) => { + const ifNotExistsStr = ifNotExists ? ' IF NOT EXISTS' : ''; + const schemaNameStr = mOptions.literal(schemaName); + const authorizationStr = authorization + ? ` AUTHORIZATION ${authorization}` + : ''; + return `CREATE SCHEMA${ifNotExistsStr} ${schemaNameStr}${authorizationStr};`; + }; + _create.reverse = dropSchema(mOptions); + return _create; +} + +function renameSchema(mOptions) { + const _rename = (schemaName, newSchemaName) => { + const schemaNameStr = mOptions.literal(schemaName); + const newSchemaNameStr = mOptions.literal(newSchemaName); + return `ALTER SCHEMA ${schemaNameStr} RENAME TO ${newSchemaNameStr};`; + }; + _rename.reverse = (schemaName, newSchemaName) => + _rename(newSchemaName, schemaName); + return _rename; +} + +module.exports = { + createSchema, + dropSchema, + renameSchema +}; diff --git a/src/operations/sequences.js b/src/operations/sequences.js new file mode 100644 index 00000000..106b4c1b --- /dev/null +++ b/src/operations/sequences.js @@ -0,0 +1,110 @@ +const { applyType } = require('../utils'); + +const parseSequenceOptions = (typeShorthands, options) => { + const { + type, + increment, + minvalue, + maxvalue, + start, + cache, + cycle, + owner + } = options; + const clauses = []; + if (type) { + clauses.push(`AS ${applyType(type, typeShorthands).type}`); + } + if (increment) { + clauses.push(`INCREMENT BY ${increment}`); + } + if (minvalue) { + clauses.push(`MINVALUE ${minvalue}`); + } else if (minvalue === null || minvalue === false) { + clauses.push('NO MINVALUE'); + } + if (maxvalue) { + clauses.push(`MAXVALUE ${maxvalue}`); + } else if (maxvalue === null || maxvalue === false) { + clauses.push('NO MAXVALUE'); + } + if (start) { + clauses.push(`START WITH ${start}`); + } + if (cache) { + clauses.push(`CACHE ${cache}`); + } + if (cycle) { + clauses.push('CYCLE'); + } else if (cycle === false) { + clauses.push('NO CYCLE'); + } + if (owner) { + clauses.push(`OWNED BY ${owner}`); + } else if (owner === null || owner === false) { + clauses.push('OWNED BY NONE'); + } + return clauses; +}; + +function dropSequence(mOptions) { + const _drop = (sequenceName, { ifExists, cascade } = {}) => { + const ifExistsStr = ifExists ? ' IF EXISTS' : ''; + const cascadeStr = cascade ? ' CASCADE' : ''; + const sequenceNameStr = mOptions.literal(sequenceName); + return `DROP SEQUENCE${ifExistsStr} ${sequenceNameStr}${cascadeStr};`; + }; + return _drop; +} + +function createSequence(mOptions) { + const _create = (sequenceName, options = {}) => { + const { temporary, ifNotExists } = options; + const temporaryStr = temporary ? ' TEMPORARY' : ''; + const ifNotExistsStr = ifNotExists ? ' IF NOT EXISTS' : ''; + const sequenceNameStr = mOptions.literal(sequenceName); + const clausesStr = parseSequenceOptions( + mOptions.typeShorthands, + options + ).join('\n '); + return `CREATE${temporaryStr} SEQUENCE${ifNotExistsStr} ${sequenceNameStr} + ${clausesStr};`; + }; + _create.reverse = dropSequence(mOptions); + return _create; +} + +function alterSequence(mOptions) { + return (sequenceName, options) => { + const { restart } = options; + const clauses = parseSequenceOptions(mOptions.typeShorthands, options); + if (restart) { + if (restart === true) { + clauses.push('RESTART'); + } else { + clauses.push(`RESTART WITH ${restart}`); + } + } + return `ALTER SEQUENCE ${mOptions.literal(sequenceName)} + ${clauses.join('\n ')};`; + }; +} + +function renameSequence(mOptions) { + const _rename = (sequenceName, newSequenceName) => { + const sequenceNameStr = mOptions.literal(sequenceName); + const newSequenceNameStr = mOptions.literal(newSequenceName); + return `ALTER SEQUENCE ${sequenceNameStr} RENAME TO ${newSequenceNameStr};`; + }; + _rename.reverse = (sequenceName, newSequenceName) => + _rename(newSequenceName, sequenceName); + return _rename; +} + +module.exports = { + createSequence, + dropSequence, + alterSequence, + renameSequence, + parseSequenceOptions +}; diff --git a/src/operations/tables.js b/src/operations/tables.js new file mode 100644 index 00000000..bf56a700 --- /dev/null +++ b/src/operations/tables.js @@ -0,0 +1,539 @@ +const _ = require('lodash'); +const { + escapeValue, + applyType, + applyTypeAdapters, + comment, + formatLines +} = require('../utils'); +const { parseSequenceOptions } = require('./sequences'); + +const parseReferences = (options, literal) => { + const { references, match, onDelete, onUpdate } = options; + const clauses = []; + clauses.push( + typeof references === 'string' && + (references.startsWith('"') || references.endsWith(')')) + ? `REFERENCES ${references}` + : `REFERENCES ${literal(references)}` + ); + if (match) { + clauses.push(`MATCH ${match}`); + } + if (onDelete) { + clauses.push(`ON DELETE ${onDelete}`); + } + if (onUpdate) { + clauses.push(`ON UPDATE ${onUpdate}`); + } + return clauses.join(' '); +}; + +const parseDeferrable = options => + `DEFERRABLE INITIALLY ${options.deferred ? 'DEFERRED' : 'IMMEDIATE'}`; + +const parseColumns = (tableName, columns, mOptions) => { + const extendingTypeShorthands = mOptions.typeShorthands; + let columnsWithOptions = _.mapValues(columns, column => + applyType(column, extendingTypeShorthands) + ); + + const primaryColumns = _.chain(columnsWithOptions) + .map((options, columnName) => (options.primaryKey ? columnName : null)) + .filter() + .value(); + const multiplePrimaryColumns = primaryColumns.length > 1; + + if (multiplePrimaryColumns) { + columnsWithOptions = _.mapValues(columnsWithOptions, options => ({ + ...options, + primaryKey: false + })); + } + + const comments = _.chain(columnsWithOptions) + .map( + (options, columnName) => + typeof options.comment !== 'undefined' && + comment( + 'COLUMN', + `${mOptions.literal(tableName)}.${mOptions.literal(columnName)}`, + options.comment + ) + ) + .filter() + .value(); + + return { + columns: _.map(columnsWithOptions, (options, columnName) => { + const { + type, + collation, + default: defaultValue, + unique, + primaryKey, + notNull, + check, + references, + referencesConstraintName, + referencesConstraintComment, + deferrable, + generated + } = options; + const constraints = []; + if (collation) { + constraints.push(`COLLATE ${collation}`); + } + if (defaultValue !== undefined) { + constraints.push(`DEFAULT ${escapeValue(defaultValue)}`); + } + if (unique) { + constraints.push('UNIQUE'); + } + if (primaryKey) { + constraints.push('PRIMARY KEY'); + } + if (notNull) { + constraints.push('NOT NULL'); + } + if (check) { + constraints.push(`CHECK (${check})`); + } + if (references) { + const name = + referencesConstraintName || + (referencesConstraintComment ? `${tableName}_fk_${columnName}` : ''); + const constraintName = name + ? `CONSTRAINT ${mOptions.literal(name)} ` + : ''; + constraints.push( + `${constraintName}${parseReferences(options, mOptions.literal)}` + ); + if (referencesConstraintComment) { + comments.push( + comment( + `CONSTRAINT ${mOptions.literal(name)} ON`, + mOptions.literal(tableName), + referencesConstraintComment + ) + ); + } + } + if (deferrable) { + constraints.push(parseDeferrable(options)); + } + if (generated) { + const sequenceOptions = parseSequenceOptions( + extendingTypeShorthands, + generated + ).join(' '); + constraints.push( + `GENERATED ${generated.precedence} AS IDENTITY${ + sequenceOptions ? ` (${sequenceOptions})` : '' + }` + ); + } + + const constraintsStr = constraints.length + ? ` ${constraints.join(' ')}` + : ''; + + const sType = typeof type === 'object' ? mOptions.literal(type) : type; + + return `${mOptions.literal(columnName)} ${sType}${constraintsStr}`; + }), + constraints: multiplePrimaryColumns ? { primaryKey: primaryColumns } : {}, + comments + }; +}; + +const parseConstraints = (table, options, optionName, literal) => { + const { + check, + unique, + primaryKey, + foreignKeys, + exclude, + deferrable, + comment: optionComment + } = options; + const tableName = typeof table === 'object' ? table.name : table; + let constraints = []; + const comments = []; + if (check) { + if (_.isArray(check)) { + check.forEach((ch, i) => { + const name = literal(optionName || `${tableName}_chck_${i + 1}`); + constraints.push(`CONSTRAINT ${name} CHECK (${ch})`); + }); + } else { + const name = literal(optionName || `${tableName}_chck`); + constraints.push(`CONSTRAINT ${name} 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]; + const name = literal(optionName || `${tableName}_uniq_${cols.join('_')}`); + constraints.push( + `CONSTRAINT ${name} UNIQUE (${cols.map(literal).join(', ')})` + ); + }); + } + if (primaryKey) { + const name = literal(optionName || `${tableName}_pkey`); + const key = (_.isArray(primaryKey) ? primaryKey : [primaryKey]) + .map(literal) + .join(', '); + constraints.push(`CONSTRAINT ${name} PRIMARY KEY (${key})`); + } + if (foreignKeys) { + (_.isArray(foreignKeys) ? foreignKeys : [foreignKeys]).forEach(fk => { + const { + columns, + referencesConstraintName, + referencesConstraintComment + } = fk; + const cols = _.isArray(columns) ? columns : [columns]; + const name = literal( + referencesConstraintName || + optionName || + `${tableName}_fk_${cols.join('_')}` + ); + const key = cols.map(literal).join(', '); + const referencesStr = parseReferences(fk, literal); + constraints.push( + `CONSTRAINT ${name} FOREIGN KEY (${key}) ${referencesStr}` + ); + if (referencesConstraintComment) { + comments.push( + comment( + `CONSTRAINT ${name} ON`, + literal(tableName), + referencesConstraintComment + ) + ); + } + }); + } + if (exclude) { + const name = literal(optionName || `${tableName}_excl`); + constraints.push(`CONSTRAINT ${name} EXCLUDE ${exclude}`); + } + + if (deferrable) { + constraints = constraints.map( + constraint => `${constraint} ${parseDeferrable(options)}` + ); + } + if (optionComment) { + if (!optionName) + throw new Error('cannot comment on unspecified constraints'); + comments.push( + comment( + `CONSTRAINT ${literal(optionName)} ON`, + literal(tableName), + optionComment + ) + ); + } + return { + constraints, + comments + }; +}; + +const parseLike = (like, literal) => { + const formatOptions = (name, options) => + (_.isArray(options) ? options : [options]) + .map(option => ` ${name} ${option}`) + .join(''); + + const table = typeof like === 'string' || !like.table ? like : like.table; + const options = like.options + ? [ + formatOptions('INCLUDING', like.options.including), + formatOptions('EXCLUDING', like.options.excluding) + ].join('') + : ''; + return `LIKE ${literal(table)}${options}`; +}; + +// TABLE +function dropTable(mOptions) { + const _drop = (tableName, { ifExists, cascade } = {}) => { + const ifExistsStr = ifExists ? ' IF EXISTS' : ''; + const cascadeStr = cascade ? ' CASCADE' : ''; + const tableNameStr = mOptions.literal(tableName); + return `DROP TABLE${ifExistsStr} ${tableNameStr}${cascadeStr};`; + }; + return _drop; +} + +function createTable(mOptions) { + const _create = (tableName, columns, options = {}) => { + const { + temporary, + ifNotExists, + inherits, + like, + constraints: optionsConstraints = {}, + comment: tableComment + } = options; + const { + columns: columnLines, + constraints: crossColumnConstraints, + comments: columnComments = [] + } = parseColumns(tableName, columns, mOptions); + const dupes = _.intersection( + Object.keys(optionsConstraints), + Object.keys(crossColumnConstraints) + ); + if (dupes.length > 0) { + const dupesStr = dupes.join(', '); + throw new Error( + `There is duplicate constraint definition in table and columns options: ${dupesStr}` + ); + } + + const constraints = { ...optionsConstraints, ...crossColumnConstraints }; + const { + constraints: constraintLines, + comments: constraintComments + } = parseConstraints(tableName, constraints, '', mOptions.literal); + const tableDefinition = [...columnLines, ...constraintLines].concat( + like ? [parseLike(like, mOptions.literal)] : [] + ); + + const temporaryStr = temporary ? ' TEMPORARY' : ''; + const ifNotExistsStr = ifNotExists ? ' IF NOT EXISTS' : ''; + const inheritsStr = inherits + ? ` INHERITS (${mOptions.literal(inherits)})` + : ''; + const tableNameStr = mOptions.literal(tableName); + + const createTableQuery = `CREATE TABLE${temporaryStr}${ifNotExistsStr} ${tableNameStr} ( +${formatLines(tableDefinition)} +)${inheritsStr};`; + const comments = [...columnComments, ...constraintComments]; + if (typeof tableComment !== 'undefined') { + comments.push( + comment('TABLE', mOptions.literal(tableName), tableComment) + ); + } + return `${createTableQuery}${ + comments.length > 0 ? `\n${comments.join('\n')}` : '' + }`; + }; + _create.reverse = dropTable(mOptions); + return _create; +} + +function alterTable(mOptions) { + const _alter = (tableName, options) => { + const alterDefinition = []; + if (options.levelSecurity) { + alterDefinition.push(`${options.levelSecurity} ROW LEVEL SECURITY`); + } + return `ALTER TABLE ${mOptions.literal(tableName)} + ${formatLines(alterDefinition)};`; + }; + return _alter; +} + +// COLUMNS +function dropColumns(mOptions) { + const _drop = (tableName, columns, { ifExists, cascade } = {}) => { + if (typeof columns === 'string') { + columns = [columns]; // eslint-disable-line no-param-reassign + } else if (!_.isArray(columns) && typeof columns === 'object') { + columns = _.keys(columns); // eslint-disable-line no-param-reassign + } + const columnsStr = formatLines( + columns.map(mOptions.literal), + ` DROP ${ifExists ? ' IF EXISTS' : ''}`, + `${cascade ? ' CASCADE' : ''},` + ); + return `ALTER TABLE ${mOptions.literal(tableName)} +${columnsStr};`; + }; + return _drop; +} + +function addColumns(mOptions) { + const _add = (tableName, columns, { ifNotExists } = {}) => { + const { + columns: columnLines, + comments: columnComments = [] + } = parseColumns(tableName, columns, mOptions); + const columnsStr = formatLines( + columnLines, + ` ADD ${ifNotExists ? 'IF NOT EXISTS ' : ''}` + ); + const tableNameStr = mOptions.literal(tableName); + const alterTableQuery = `ALTER TABLE ${tableNameStr}\n${columnsStr};`; + const columnCommentsStr = + columnComments.length > 0 ? `\n${columnComments.join('\n')}` : ''; + return `${alterTableQuery}${columnCommentsStr}`; + }; + _add.reverse = dropColumns(mOptions); + return _add; +} + +function alterColumn(mOptions) { + return (tableName, columnName, options) => { + const { + default: defaultValue, + type, + collation, + using, + notNull, + allowNull, + comment: columnComment, + generated + } = options; + const actions = []; + if (defaultValue === null) { + actions.push('DROP DEFAULT'); + } else if (defaultValue !== undefined) { + actions.push(`SET DEFAULT ${escapeValue(defaultValue)}`); + } + if (type) { + const typeStr = applyTypeAdapters(type); + const collationStr = collation ? `COLLATE ${collation}` : ''; + const usingStr = using ? ` USING ${using}` : ''; + actions.push(`SET DATA TYPE ${typeStr}${collationStr}${usingStr}`); + } + if (notNull) { + actions.push('SET NOT NULL'); + } else if (notNull === false || allowNull) { + actions.push('DROP NOT NULL'); + } + if (generated !== undefined) { + if (!generated) { + actions.push('DROP IDENTITY'); + } else { + const sequenceOptions = parseSequenceOptions( + mOptions.typeShorthands, + generated + ).join(' '); + actions.push( + `SET GENERATED ${generated.precedence} AS IDENTITY${ + sequenceOptions ? ` (${sequenceOptions})` : '' + }` + ); + } + } + + const queries = []; + if (actions.length > 0) { + const columnsStr = formatLines( + actions, + ` ALTER ${mOptions.literal(columnName)} ` + ); + queries.push( + `ALTER TABLE ${mOptions.literal(tableName)}\n${columnsStr};` + ); + } + if (typeof columnComment !== 'undefined') { + queries.push( + comment( + 'COLUMN', + `${mOptions.literal(tableName)}.${mOptions.literal(columnName)}`, + columnComment + ) + ); + } + return queries.join('\n'); + }; +} + +function renameTable(mOptions) { + const _rename = (tableName, newName) => { + const tableNameStr = mOptions.literal(tableName); + const newNameStr = mOptions.literal(newName); + return `ALTER TABLE ${tableNameStr} RENAME TO ${newNameStr};`; + }; + _rename.reverse = (tableName, newName) => _rename(newName, tableName); + return _rename; +} + +function renameColumn(mOptions) { + const _rename = (tableName, columnName, newName) => { + const tableNameStr = mOptions.literal(tableName); + const columnNameStr = mOptions.literal(columnName); + const newNameStr = mOptions.literal(newName); + return `ALTER TABLE ${tableNameStr} RENAME ${columnNameStr} TO ${newNameStr};`; + }; + _rename.reverse = (tableName, columnName, newName) => + _rename(tableName, newName, columnName); + return _rename; +} + +function renameConstraint(mOptions) { + const _rename = (tableName, constraintName, newName) => { + const tableNameStr = mOptions.literal(tableName); + const constraintNameStr = mOptions.literal(constraintName); + const newNameStr = mOptions.literal(newName); + return `ALTER TABLE ${tableNameStr} RENAME CONSTRAINT ${constraintNameStr} TO ${newNameStr};`; + }; + _rename.reverse = (tableName, constraintName, newName) => + _rename(tableName, newName, constraintName); + return _rename; +} + +function dropConstraint(mOptions) { + const _drop = (tableName, constraintName, { ifExists, cascade } = {}) => { + const ifExistsStr = ifExists ? ' IF EXISTS' : ''; + const cascadeStr = cascade ? ' CASCADE' : ''; + const tableNameStr = mOptions.literal(tableName); + const constraintNameStr = mOptions.literal(constraintName); + return `ALTER TABLE ${tableNameStr} DROP CONSTRAINT${ifExistsStr} ${constraintNameStr}${cascadeStr};`; + }; + return _drop; +} +function addConstraint(mOptions) { + const _add = (tableName, constraintName, expression) => { + const { constraints, comments } = + typeof expression === 'string' + ? { + constraints: [ + `${ + constraintName + ? `CONSTRAINT ${mOptions.literal(constraintName)} ` + : '' + }${expression}` + ], + comments: [] + } + : parseConstraints( + tableName, + expression, + constraintName, + mOptions.literal + ); + const constraintStr = formatLines(constraints, ' ADD '); + return [ + `ALTER TABLE ${mOptions.literal(tableName)}\n${constraintStr};`, + ...comments + ].join('\n'); + }; + _add.reverse = dropConstraint(mOptions); + return _add; +} + +module.exports = { + createTable, + dropTable, + alterTable, + renameTable, + addColumns, + dropColumns, + alterColumn, + renameColumn, + addConstraint, + dropConstraint, + renameConstraint +}; diff --git a/src/operations/triggers.js b/src/operations/triggers.js new file mode 100644 index 00000000..a6bdef58 --- /dev/null +++ b/src/operations/triggers.js @@ -0,0 +1,120 @@ +const { isArray } = require('lodash'); +const { escapeValue } = require('../utils'); +const { createFunction, dropFunction } = require('./functions'); + +function dropTrigger(mOptions) { + const _drop = (tableName, triggerName, { ifExists, cascade } = {}) => { + const ifExistsStr = ifExists ? ' IF EXISTS' : ''; + const cascadeStr = cascade ? ' CASCADE' : ''; + const triggerNameStr = mOptions.literal(triggerName); + const tableNameStr = mOptions.literal(tableName); + return `DROP TRIGGER${ifExistsStr} ${triggerNameStr} ON ${tableNameStr}${cascadeStr};`; + }; + return _drop; +} + +function createTrigger(mOptions) { + const _create = (tableName, triggerName, triggerOptions = {}, definition) => { + const { + constraint, + condition, + operation, + deferrable, + deferred, + functionArgs = [] + } = triggerOptions; + let { when, level = 'STATEMENT', function: functionName } = triggerOptions; + const operations = isArray(operation) ? operation.join(' OR ') : operation; + if (constraint) { + when = 'AFTER'; + } + const isInsteadOf = /instead\s+of/i.test(when); + if (isInsteadOf) { + level = 'ROW'; + } + if (definition) { + functionName = functionName || triggerName; + } + + 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"); + } + if (!operations) { + throw new Error( + '"operation" (INSERT/UPDATE[ OF ...]/DELETE/TRUNCATE) have to be specified' + ); + } + + const defferStr = constraint + ? `${ + deferrable + ? `DEFERRABLE INITIALLY ${deferred ? 'DEFERRED' : 'IMMEDIATE'}` + : 'NOT DEFERRABLE' + }\n ` + : ''; + const conditionClause = condition ? `WHEN (${condition})\n ` : ''; + const constraintStr = constraint ? ' CONSTRAINT' : ''; + const paramsStr = functionArgs.map(escapeValue).join(', '); + const triggerNameStr = mOptions.literal(triggerName); + const tableNameStr = mOptions.literal(tableName); + const functionNameStr = mOptions.literal(functionName); + + const triggerSQL = `CREATE${constraintStr} TRIGGER ${triggerNameStr} + ${when} ${operations} ON ${tableNameStr} + ${defferStr}FOR EACH ${level} + ${conditionClause}EXECUTE PROCEDURE ${functionNameStr}(${paramsStr});`; + + const fnSQL = definition + ? `${createFunction(mOptions)( + functionName, + [], + { ...triggerOptions, returns: 'trigger' }, + definition + )}\n` + : ''; + return `${fnSQL}${triggerSQL}`; + }; + + _create.reverse = ( + tableName, + triggerName, + triggerOptions = {}, + definition + ) => { + const triggerSQL = dropTrigger(mOptions)( + tableName, + triggerName, + triggerOptions + ); + const fnSQL = definition + ? `\n${dropFunction(mOptions)( + triggerOptions.function || triggerName, + [], + triggerOptions + )}` + : ''; + return `${triggerSQL}${fnSQL}`; + }; + + return _create; +} + +function renameTrigger(mOptions) { + const _rename = (tableName, oldTriggerName, newTriggerName) => { + const oldTriggerNameStr = mOptions.literal(oldTriggerName); + const tableNameStr = mOptions.literal(tableName); + const newTriggerNameStr = mOptions.literal(newTriggerName); + return `ALTER TRIGGER ${oldTriggerNameStr} ON ${tableNameStr} RENAME TO ${newTriggerNameStr};`; + }; + _rename.reverse = (tableName, oldTriggerName, newTriggerName) => + _rename(tableName, newTriggerName, oldTriggerName); + return _rename; +} + +module.exports = { + createTrigger, + dropTrigger, + renameTrigger +}; diff --git a/src/operations/types.js b/src/operations/types.js new file mode 100644 index 00000000..7f2748d2 --- /dev/null +++ b/src/operations/types.js @@ -0,0 +1,125 @@ +const _ = require('lodash'); +const { applyType, escapeValue } = require('../utils'); + +function dropType(mOptions) { + const _drop = (typeName, { ifExists, cascade } = {}) => { + const ifExistsStr = ifExists ? ' IF EXISTS' : ''; + const cascadeStr = cascade ? ' CASCADE' : ''; + const typeNameStr = mOptions.literal(typeName); + return `DROP TYPE${ifExistsStr} ${typeNameStr}${cascadeStr};`; + }; + return _drop; +} + +function createType(mOptions) { + const _create = (typeName, options) => { + if (_.isArray(options)) { + const optionsStr = options.map(escapeValue).join(', '); + const typeNameStr = mOptions.literal(typeName); + return `CREATE TYPE ${typeNameStr} AS ENUM (${optionsStr});`; + } + const attributes = _.map(options, (attribute, attributeName) => { + const typeStr = applyType(attribute, mOptions.typeShorthands).type; + return `${mOptions.literal(attributeName)} ${typeStr}`; + }).join(',\n'); + return `CREATE TYPE ${mOptions.literal(typeName)} AS (\n${attributes}\n);`; + }; + _create.reverse = dropType(mOptions); + return _create; +} + +function dropTypeAttribute(mOptions) { + const _drop = (typeName, attributeName, { ifExists } = {}) => { + const ifExistsStr = ifExists ? ' IF EXISTS' : ''; + const typeNameStr = mOptions.literal(typeName); + const attributeNameStr = mOptions.literal(attributeName); + return `ALTER TYPE ${typeNameStr} DROP ATTRIBUTE ${attributeNameStr}${ifExistsStr};`; + }; + return _drop; +} + +function addTypeAttribute(mOptions) { + const _alterAttributeAdd = (typeName, attributeName, attributeType) => { + const typeStr = applyType(attributeType, mOptions.typeShorthands).type; + const typeNameStr = mOptions.literal(typeName); + const attributeNameStr = mOptions.literal(attributeName); + + return `ALTER TYPE ${typeNameStr} ADD ATTRIBUTE ${attributeNameStr} ${typeStr};`; + }; + _alterAttributeAdd.reverse = dropTypeAttribute(mOptions); + return _alterAttributeAdd; +} + +function setTypeAttribute(mOptions) { + return (typeName, attributeName, attributeType) => { + const typeStr = applyType(attributeType, mOptions.typeShorthands).type; + const typeNameStr = mOptions.literal(typeName); + const attributeNameStr = mOptions.literal(attributeName); + + return `ALTER TYPE ${typeNameStr} ALTER ATTRIBUTE ${attributeNameStr} SET DATA TYPE ${typeStr};`; + }; +} + +function addTypeValue(mOptions) { + const _add = (typeName, value, options = {}) => { + const { ifNotExists, before, after } = options; + + if (before && after) { + throw new Error('"before" and "after" can\'t be specified together'); + } + const beforeStr = before ? ` BEFORE ${mOptions.literal(before)}` : ''; + const afterStr = after ? ` AFTER ${mOptions.literal(after)}` : ''; + const ifNotExistsStr = ifNotExists ? ' IF NOT EXISTS' : ''; + const valueStr = escapeValue(value); + const typeNameStr = mOptions.literal(typeName); + + return `ALTER TYPE ${typeNameStr} ADD VALUE${ifNotExistsStr} ${valueStr}${beforeStr}${afterStr};`; + }; + return _add; +} + +function renameType(mOptions) { + const _rename = (typeName, newTypeName) => { + const typeNameStr = mOptions.literal(typeName); + const newTypeNameStr = mOptions.literal(newTypeName); + return `ALTER TYPE ${typeNameStr} RENAME TO ${newTypeNameStr};`; + }; + _rename.reverse = (typeName, newTypeName) => _rename(newTypeName, typeName); + return _rename; +} + +function renameTypeAttribute(mOptions) { + const _rename = (typeName, attributeName, newAttributeName) => { + const typeNameStr = mOptions.literal(typeName); + const attributeNameStr = mOptions.literal(attributeName); + const newAttributeNameStr = mOptions.literal(newAttributeName); + return `ALTER TYPE ${typeNameStr} RENAME ATTRIBUTE ${attributeNameStr} TO ${newAttributeNameStr};`; + }; + _rename.reverse = (typeName, attributeName, newAttributeName) => + _rename(typeName, newAttributeName, attributeName); + return _rename; +} + +function renameTypeValue(mOptions) { + const _rename = (typeName, value, newValue) => { + const valueStr = escapeValue(value); + const newValueStr = escapeValue(newValue); + const typeNameStr = mOptions.literal(typeName); + return `ALTER TYPE ${typeNameStr} RENAME VALUE ${valueStr} TO ${newValueStr};`; + }; + _rename.reverse = (typeName, value, newValue) => + _rename(typeName, newValue, value); + return _rename; +} + +module.exports = { + createType, + dropType, + renameType, + addTypeAttribute, + dropTypeAttribute, + setTypeAttribute, + renameTypeAttribute, + renameTypeValue, + addTypeValue +}; diff --git a/src/operations/views.js b/src/operations/views.js new file mode 100644 index 00000000..d0b6233c --- /dev/null +++ b/src/operations/views.js @@ -0,0 +1,94 @@ +const { escapeValue } = require('../utils'); + +function dropView(mOptions) { + const _drop = (viewName, { ifExists, cascade } = {}) => { + const ifExistsStr = ifExists ? ' IF EXISTS' : ''; + const cascadeStr = cascade ? ' CASCADE' : ''; + const viewNameStr = mOptions.literal(viewName); + return `DROP VIEW${ifExistsStr} ${viewNameStr}${cascadeStr};`; + }; + return _drop; +} + +function createView(mOptions) { + const _create = (viewName, options, definition) => { + const { + temporary, + replace, + recursive, + columns = [], + checkOption + } = options; + // prettier-ignore + const columnNames = (Array.isArray(columns) ? columns : [columns]).map(mOptions.literal).join(", "); + const replaceStr = replace ? ' OR REPLACE' : ''; + const temporaryStr = temporary ? ' TEMPORARY' : ''; + const recursiveStr = recursive ? ' RECURSIVE' : ''; + const columnStr = columnNames ? `(${columnNames})` : ''; + const checkOptionStr = checkOption + ? ` WITH ${checkOption} CHECK OPTION` + : ''; + const viewNameStr = mOptions.literal(viewName); + + return `CREATE${replaceStr}${temporaryStr}${recursiveStr} VIEW ${viewNameStr}${columnStr} AS ${definition}${checkOptionStr};`; + }; + _create.reverse = dropView(mOptions); + return _create; +} + +function alterView(mOptions) { + const _alter = (viewName, options) => { + const { checkOption } = options; + const clauses = []; + if (checkOption !== undefined) { + if (checkOption) { + clauses.push(`SET check_option = ${checkOption}`); + } else { + clauses.push(`RESET check_option`); + } + } + return clauses + .map(clause => `ALTER VIEW ${mOptions.literal(viewName)} ${clause};`) + .join('\n'); + }; + return _alter; +} + +function alterViewColumn(mOptions) { + const _alter = (viewName, columnName, options) => { + const { default: defaultValue } = options; + const actions = []; + if (defaultValue === null) { + actions.push('DROP DEFAULT'); + } else if (defaultValue !== undefined) { + actions.push(`SET DEFAULT ${escapeValue(defaultValue)}`); + } + const viewNameStr = mOptions.literal(viewName); + const columnNameStr = mOptions.literal(columnName); + return actions + .map( + action => + `ALTER VIEW ${viewNameStr} ALTER COLUMN ${columnNameStr} ${action};` + ) + .join('\n'); + }; + return _alter; +} + +function renameView(mOptions) { + const _rename = (viewName, newViewName) => { + const viewNameStr = mOptions.literal(viewName); + const newViewNameStr = mOptions.literal(newViewName); + return `ALTER VIEW ${viewNameStr} RENAME TO ${newViewNameStr};`; + }; + _rename.reverse = (viewName, newViewName) => _rename(newViewName, viewName); + return _rename; +} + +module.exports = { + createView, + dropView, + alterView, + alterViewColumn, + renameView +}; diff --git a/src/operations/viewsMaterialized.js b/src/operations/viewsMaterialized.js new file mode 100644 index 00000000..2d0ee044 --- /dev/null +++ b/src/operations/viewsMaterialized.js @@ -0,0 +1,125 @@ +const { formatLines } = require('../utils'); + +const dataClause = data => + data !== undefined ? ` WITH${data ? '' : ' NO'} DATA` : ''; +const storageParameterStr = storageParameters => key => { + const value = + storageParameters[key] === true ? '' : ` = ${storageParameters[key]}`; + return `${key}${value}`; +}; + +function dropMaterializedView(mOptions) { + const _drop = (viewName, { ifExists, cascade } = {}) => { + const ifExistsStr = ifExists ? ' IF EXISTS' : ''; + const cascadeStr = cascade ? ' CASCADE' : ''; + const viewNameStr = mOptions.literal(viewName); + return `DROP MATERIALIZED VIEW${ifExistsStr} ${viewNameStr}${cascadeStr};`; + }; + return _drop; +} + +function createMaterializedView(mOptions) { + const _create = (viewName, options, definition) => { + const { + ifNotExists, + columns = [], + tablespace, + storageParameters = {}, + data + } = options; + // prettier-ignore + const columnNames = (Array.isArray(columns) ? columns : [columns]).map(mOptions.literal).join(", "); + const withOptions = Object.keys(storageParameters) + .map(storageParameterStr(storageParameters)) + .join(', '); + + const ifNotExistsStr = ifNotExists ? ' IF NOT EXISTS' : ''; + const columnsStr = columnNames ? `(${columnNames})` : ''; + const withOptionsStr = withOptions ? ` WITH (${withOptions})` : ''; + const tablespaceStr = tablespace + ? `TABLESPACE ${mOptions.literal(tablespace)}` + : ''; + const dataStr = dataClause(data); + const viewNameStr = mOptions.literal(viewName); + + return `CREATE MATERIALIZED VIEW${ifNotExistsStr} ${viewNameStr}${columnsStr}${withOptionsStr}${tablespaceStr} AS ${definition}${dataStr};`; + }; + _create.reverse = dropMaterializedView(mOptions); + return _create; +} + +function alterMaterializedView(mOptions) { + const _alter = (viewName, options) => { + const { cluster, extension, storageParameters = {} } = options; + const clauses = []; + if (cluster !== undefined) { + if (cluster) { + clauses.push(`CLUSTER ON ${mOptions.literal(cluster)}`); + } else { + clauses.push(`SET WITHOUT CLUSTER`); + } + } + if (extension) { + clauses.push(`DEPENDS ON EXTENSION ${mOptions.literal(extension)}`); + } + const withOptions = Object.keys(storageParameters) + .filter(key => storageParameters[key]) + .map(storageParameterStr(storageParameters)) + .join(', '); + if (withOptions) { + clauses.push(`SET (${withOptions})`); + } + const resetOptions = Object.keys(storageParameters) + .filter(key => !storageParameters[key]) + .join(', '); + if (resetOptions) { + clauses.push(`RESET (${resetOptions})`); + } + const clausesStr = formatLines(clauses); + const viewNameStr = mOptions.literal(viewName); + return `ALTER MATERIALIZED VIEW ${viewNameStr}\n${clausesStr};`; + }; + return _alter; +} + +function renameMaterializedView(mOptions) { + const _rename = (viewName, newViewName) => { + const viewNameStr = mOptions.literal(viewName); + const newViewNameStr = mOptions.literal(newViewName); + return `ALTER MATERIALIZED VIEW ${viewNameStr} RENAME TO ${newViewNameStr};`; + }; + _rename.reverse = (viewName, newViewName) => _rename(newViewName, viewName); + return _rename; +} + +function renameMaterializedViewColumn(mOptions) { + const _rename = (viewName, columnName, newColumnName) => { + const viewNameStr = mOptions.literal(viewName); + const columnNameStr = mOptions.literal(columnName); + const newColumnNameStr = mOptions.literal(newColumnName); + return `ALTER MATERIALIZED VIEW ${viewNameStr} RENAME COLUMN ${columnNameStr} TO ${newColumnNameStr};`; + }; + _rename.reverse = (viewName, columnName, newColumnName) => + _rename(viewName, newColumnName, columnName); + return _rename; +} + +function refreshMaterializedView(mOptions) { + const _refresh = (viewName, { concurrently, data } = {}) => { + const concurrentlyStr = concurrently ? ' CONCURRENTLY' : ''; + const dataStr = dataClause(data); + const viewNameStr = mOptions.literal(viewName); + return `REFRESH MATERIALIZED VIEW${concurrentlyStr} ${viewNameStr}${dataStr};`; + }; + _refresh.reverse = _refresh; + return _refresh; +} + +module.exports = { + createMaterializedView, + dropMaterializedView, + alterMaterializedView, + renameMaterializedView, + renameMaterializedViewColumn, + refreshMaterializedView +}; diff --git a/src/runner.js b/src/runner.js new file mode 100644 index 00000000..b84277b5 --- /dev/null +++ b/src/runner.js @@ -0,0 +1,248 @@ +const path = require('path'); +const fs = require('fs'); +const Db = require('./db'); +const Migration = require('./migration'); +const { + getSchemas, + getMigrationTableSchema, + promisify, + PgLiteral, + createSchemalize +} = require('./utils'); + +// Random but well-known identifier shared by all instances of node-pg-migrate +const PG_MIGRATE_LOCK_ID = 7241865325823964; + +const readFile = promisify(fs.readFile); // eslint-disable-line security/detect-non-literal-fs-filename + +const idColumn = 'id'; +const nameColumn = 'name'; +const runOnColumn = 'run_on'; + +const loadMigrations = async (db, options, log) => { + try { + let shorthands = {}; + const files = await Migration.loadMigrationFiles( + options.dir, + options.ignorePattern + ); + return files.map(file => { + const filePath = `${options.dir}/${file}`; + const actions = + path.extname(filePath) === '.sql' + ? // eslint-disable-next-line security/detect-non-literal-fs-filename + { up: async pgm => pgm.sql(await readFile(filePath, 'utf8')) } + : // eslint-disable-next-line global-require,import/no-dynamic-require,security/detect-non-literal-require + require(path.relative(__dirname, filePath)); + shorthands = { ...shorthands, ...actions.shorthands }; + return new Migration( + db, + filePath, + actions, + options, + { + ...shorthands + }, + log + ); + }); + } catch (err) { + throw new Error(`Can't get migration files: ${err.stack}`); + } +}; + +const lock = async db => { + const { + rows: [lockObtained] + } = await db.query( + `select pg_try_advisory_lock(${PG_MIGRATE_LOCK_ID}) as "lockObtained"` + ); + if (!lockObtained) { + throw new Error('Another migration is already running'); + } +}; + +const ensureMigrationsTable = async (db, options) => { + try { + const schema = getMigrationTableSchema(options); + const { migrationsTable } = options; + const fullTableName = createSchemalize(options.decamelize, true)({ + schema, + name: migrationsTable + }); + + const migrationTables = await db.select( + `SELECT table_name FROM information_schema.tables WHERE table_schema = '${schema}' AND table_name = '${migrationsTable}'` + ); + + if (migrationTables && migrationTables.length === 1) { + const primaryKeyConstraints = await db.select( + `SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = '${schema}' AND table_name = '${migrationsTable}' AND constraint_type = 'PRIMARY KEY'` + ); + if (!primaryKeyConstraints || primaryKeyConstraints.length !== 1) { + await db.query( + `ALTER TABLE ${fullTableName} ADD PRIMARY KEY (${idColumn})` + ); + } + } else { + await db.query( + `CREATE TABLE ${fullTableName} ( ${idColumn} SERIAL PRIMARY KEY, ${nameColumn} varchar(255) NOT NULL, ${runOnColumn} timestamp NOT NULL)` + ); + } + } catch (err) { + throw new Error(`Unable to ensure migrations table: ${err.stack}`); + } +}; + +const getRunMigrations = async (db, options) => { + const schema = getMigrationTableSchema(options); + const { migrationsTable } = options; + const fullTableName = createSchemalize(options.decamelize, true)({ + schema, + name: migrationsTable + }); + return db.column( + nameColumn, + `SELECT ${nameColumn} FROM ${fullTableName} ORDER BY ${runOnColumn}, ${idColumn}` + ); +}; + +const getMigrationsToRun = (options, runNames, migrations) => { + if (options.direction === 'down') { + const downMigrations = runNames + .filter(migrationName => !options.file || options.file === 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) + ) + ).reverse(); + const deletedMigrations = toRun.filter( + migration => typeof migration === 'string' + ); + if (deletedMigrations.length) { + const deletedMigrationsStr = deletedMigrations.join(', '); + throw new Error( + `Definitions of migrations ${deletedMigrationsStr} have been deleted.` + ); + } + return toRun; + } + 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) + ); +}; + +const checkOrder = (runNames, migrations) => { + const len = Math.min(runNames.length, migrations.length); + for (let i = 0; i < len; i += 1) { + const runName = runNames[i]; + const migrationName = migrations[i].name; + if (runName !== migrationName) { + throw new Error( + `Not run migration ${migrationName} is preceding already run migration ${runName}` + ); + } + } +}; + +const runMigrations = (toRun, method, direction) => + toRun.reduce( + (promise, migration) => promise.then(() => migration[method](direction)), + Promise.resolve() + ); + +const runner = async options => { + const log = options.log || console.log; + const db = Db(options.dbClient || options.databaseUrl, log); + try { + await db.createConnection(); + if (options.schema) { + const schemas = getSchemas(options.schema); + if (options.createSchema) { + await Promise.all( + schemas.map(schema => + db.query(`CREATE SCHEMA IF NOT EXISTS "${schema}"`) + ) + ); + } + await db.query( + `SET search_path TO ${schemas.map(s => `"${s}"`).join(', ')}` + ); + } + if (options.migrationsSchema && options.createMigrationsSchema) { + await db.query( + `CREATE SCHEMA IF NOT EXISTS "${options.migrationsSchema}"` + ); + } + + await ensureMigrationsTable(db, options); + + if (!options.noLock) { + await lock(db, options); + } + + const [migrations, runNames] = await Promise.all([ + loadMigrations(db, options, log), + getRunMigrations(db, options) + ]); + + if (options.checkOrder) { + checkOrder(runNames, migrations); + } + + const toRun = getMigrationsToRun(options, runNames, migrations); + + if (!toRun.length) { + log('No migrations to run!'); + return []; + } + + // TODO: add some fancy colors to logging + log('> Migrating files:'); + toRun.forEach(m => { + log(`> - ${m.name}`); + }); + + if (options.fake) { + await runMigrations(toRun, 'markAsRun', options.direction); + } else if (options.singleTransaction) { + await db.query('BEGIN'); + try { + await runMigrations(toRun, 'apply', options.direction); + await db.query('COMMIT'); + } catch (err) { + log('> Rolling back attempted migration ...'); + await db.query('ROLLBACK'); + throw err; + } + } else { + await runMigrations(toRun, 'apply', options.direction); + } + + return toRun.map(m => ({ + path: m.path, + name: m.name, + timestamp: m.timestamp + })); + } finally { + db.close(); + } +}; + +runner.default = runner; // workaround for transpilers +runner.PgLiteral = PgLiteral; +runner.Migration = Migration; + +module.exports = runner; diff --git a/src/utils.js b/src/utils.js new file mode 100644 index 00000000..684f539b --- /dev/null +++ b/src/utils.js @@ -0,0 +1,189 @@ +const decamelize = require('decamelize'); + +// This is used to create unescaped strings +// exposed in the migrations via pgm.func +class PgLiteral { + static create(str) { + return new PgLiteral(str); + } + + constructor(str) { + this._str = str; + } + + toString() { + return this._str; + } +} + +const identity = v => v; +const quote = str => `"${str}"`; + +const createSchemalize = (shouldDecamelize, shouldQuote) => { + const transform = [ + shouldDecamelize ? decamelize : identity, + shouldQuote ? quote : identity + ].reduce((acc, fn) => (fn === identity ? acc : x => acc(fn(x)))); + return v => { + if (typeof v === 'object') { + const { schema, name } = v; + return (schema ? `${transform(schema)}.` : '') + transform(name); + } + return transform(v); + }; +}; + +const createTransformer = literal => (s, d) => + Object.keys(d || {}).reduce( + (str, p) => str.replace(new RegExp(`{${p}}`, 'g'), literal(d[p])), // eslint-disable-line security/detect-non-literal-regexp + s + ); + +const escapeValue = val => { + if (val === null) { + return 'NULL'; + } + if (typeof val === 'boolean') { + return val.toString(); + } + if (typeof val === 'string') { + let dollars; + let index = 0; + do { + index += 1; + dollars = `$pg${index}$`; + } while (val.indexOf(dollars) >= 0); + return `${dollars}${val}${dollars}`; + } + if (typeof val === 'number') { + return val; + } + if (Array.isArray(val)) { + const arrayStr = val + .map(escapeValue) + .join(',') + .replace(/ARRAY/g, ''); + return `ARRAY[${arrayStr}]`; + } + if (val instanceof PgLiteral) { + return val.toString(); + } + return ''; +}; + +const getSchemas = schema => { + const schemas = (Array.isArray(schema) ? schema : [schema]).filter( + s => typeof s === 'string' && s.length > 0 + ); + return schemas.length > 0 ? schemas : ['public']; +}; + +const getMigrationTableSchema = options => + options.migrationsSchema !== undefined + ? options.migrationsSchema + : getSchemas(options.schema)[0]; + +const typeAdapters = { + 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 +}; + +// some convenience adapters -- see above +const applyTypeAdapters = type => + typeAdapters[type] ? typeAdapters[type] : type; + +const applyType = (type, extendingTypeShorthands = {}) => { + const typeShorthands = { + ...defaultTypeShorthands, + ...extendingTypeShorthands + }; + const options = typeof type === 'string' ? { type } : type; + let ext = null; + const types = [options.type]; + while (typeShorthands[types[types.length - 1]]) { + if (ext) { + delete ext.type; + } + ext = { ...typeShorthands[types[types.length - 1]], ...ext }; + if (types.includes(ext.type)) { + throw new Error( + `Shorthands contain cyclic dependency: ${types.join(', ')}, ${ext.type}` + ); + } else { + types.push(ext.type); + } + } + if (!ext) { + ext = { type: options.type }; + } + return { + ...ext, + ...options, + type: applyTypeAdapters(ext.type) + }; +}; + +const formatParam = mOptions => param => { + const { mode, name, type, default: defaultValue } = applyType( + param, + mOptions.typeShorthands + ); + const options = []; + if (mode) { + options.push(mode); + } + if (name) { + options.push(mOptions.literal(name)); + } + if (type) { + options.push(type); + } + if (defaultValue) { + options.push(`DEFAULT ${escapeValue(defaultValue)}`); + } + return options.join(' '); +}; + +const formatParams = (params = [], mOptions) => + `(${params.map(formatParam(mOptions)).join(', ')})`; + +const comment = (object, name, text) => { + const cmt = escapeValue(text || null); + return `COMMENT ON ${object} ${name} IS ${cmt};`; +}; + +const formatLines = (lines, replace = ' ', separator = ',') => + lines + .map(line => line.replace(/(?:\r\n|\r|\n)+/g, ' ')) + .join(`${separator}\n`) + .replace(/^/gm, replace); + +const promisify = fn => (...args) => + new Promise((resolve, reject) => + fn.call(this, ...args, (err, ...result) => + err ? reject(err) : resolve(...result) + ) + ); + +module.exports = { + PgLiteral, + createSchemalize, + createTransformer, + escapeValue, + getSchemas, + getMigrationTableSchema, + applyTypeAdapters, + applyType, + formatParams, + comment, + formatLines, + promisify +}; From 86a98fab01dc9ba6ec76790159de1b2dedfc134a Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Fri, 1 Nov 2019 12:32:19 +0100 Subject: [PATCH 04/57] Change file extensions to ts --- src/{db.js => db.ts} | 0 src/{migration-builder.js => migration-builder.ts} | 0 src/{migration.js => migration.ts} | 0 src/operations/{domains.js => domains.ts} | 0 src/operations/{extensions.js => extensions.ts} | 0 src/operations/{functions.js => functions.ts} | 0 src/operations/{indexes.js => indexes.ts} | 0 src/operations/{operators.js => operators.ts} | 0 src/operations/{other.js => other.ts} | 0 src/operations/{policies.js => policies.ts} | 0 src/operations/{roles.js => roles.ts} | 0 src/operations/{schemas.js => schemas.ts} | 0 src/operations/{sequences.js => sequences.ts} | 0 src/operations/{tables.js => tables.ts} | 0 src/operations/{triggers.js => triggers.ts} | 0 src/operations/{types.js => types.ts} | 0 src/operations/{views.js => views.ts} | 0 src/operations/{viewsMaterialized.js => viewsMaterialized.ts} | 0 src/{runner.js => runner.ts} | 0 src/{utils.js => utils.ts} | 0 20 files changed, 0 insertions(+), 0 deletions(-) rename src/{db.js => db.ts} (100%) rename src/{migration-builder.js => migration-builder.ts} (100%) rename src/{migration.js => migration.ts} (100%) rename src/operations/{domains.js => domains.ts} (100%) rename src/operations/{extensions.js => extensions.ts} (100%) rename src/operations/{functions.js => functions.ts} (100%) rename src/operations/{indexes.js => indexes.ts} (100%) rename src/operations/{operators.js => operators.ts} (100%) rename src/operations/{other.js => other.ts} (100%) rename src/operations/{policies.js => policies.ts} (100%) rename src/operations/{roles.js => roles.ts} (100%) rename src/operations/{schemas.js => schemas.ts} (100%) rename src/operations/{sequences.js => sequences.ts} (100%) rename src/operations/{tables.js => tables.ts} (100%) rename src/operations/{triggers.js => triggers.ts} (100%) rename src/operations/{types.js => types.ts} (100%) rename src/operations/{views.js => views.ts} (100%) rename src/operations/{viewsMaterialized.js => viewsMaterialized.ts} (100%) rename src/{runner.js => runner.ts} (100%) rename src/{utils.js => utils.ts} (100%) diff --git a/src/db.js b/src/db.ts similarity index 100% rename from src/db.js rename to src/db.ts diff --git a/src/migration-builder.js b/src/migration-builder.ts similarity index 100% rename from src/migration-builder.js rename to src/migration-builder.ts diff --git a/src/migration.js b/src/migration.ts similarity index 100% rename from src/migration.js rename to src/migration.ts diff --git a/src/operations/domains.js b/src/operations/domains.ts similarity index 100% rename from src/operations/domains.js rename to src/operations/domains.ts diff --git a/src/operations/extensions.js b/src/operations/extensions.ts similarity index 100% rename from src/operations/extensions.js rename to src/operations/extensions.ts diff --git a/src/operations/functions.js b/src/operations/functions.ts similarity index 100% rename from src/operations/functions.js rename to src/operations/functions.ts diff --git a/src/operations/indexes.js b/src/operations/indexes.ts similarity index 100% rename from src/operations/indexes.js rename to src/operations/indexes.ts diff --git a/src/operations/operators.js b/src/operations/operators.ts similarity index 100% rename from src/operations/operators.js rename to src/operations/operators.ts diff --git a/src/operations/other.js b/src/operations/other.ts similarity index 100% rename from src/operations/other.js rename to src/operations/other.ts diff --git a/src/operations/policies.js b/src/operations/policies.ts similarity index 100% rename from src/operations/policies.js rename to src/operations/policies.ts diff --git a/src/operations/roles.js b/src/operations/roles.ts similarity index 100% rename from src/operations/roles.js rename to src/operations/roles.ts diff --git a/src/operations/schemas.js b/src/operations/schemas.ts similarity index 100% rename from src/operations/schemas.js rename to src/operations/schemas.ts diff --git a/src/operations/sequences.js b/src/operations/sequences.ts similarity index 100% rename from src/operations/sequences.js rename to src/operations/sequences.ts diff --git a/src/operations/tables.js b/src/operations/tables.ts similarity index 100% rename from src/operations/tables.js rename to src/operations/tables.ts diff --git a/src/operations/triggers.js b/src/operations/triggers.ts similarity index 100% rename from src/operations/triggers.js rename to src/operations/triggers.ts diff --git a/src/operations/types.js b/src/operations/types.ts similarity index 100% rename from src/operations/types.js rename to src/operations/types.ts diff --git a/src/operations/views.js b/src/operations/views.ts similarity index 100% rename from src/operations/views.js rename to src/operations/views.ts diff --git a/src/operations/viewsMaterialized.js b/src/operations/viewsMaterialized.ts similarity index 100% rename from src/operations/viewsMaterialized.js rename to src/operations/viewsMaterialized.ts diff --git a/src/runner.js b/src/runner.ts similarity index 100% rename from src/runner.js rename to src/runner.ts diff --git a/src/utils.js b/src/utils.ts similarity index 100% rename from src/utils.js rename to src/utils.ts From 7f1dcd6db6432c8d486d35748a9bc4b4b2a3daf9 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Fri, 1 Nov 2019 13:11:45 +0100 Subject: [PATCH 05/57] Use import/export statements --- package.json | 1 + src/db.ts | 4 +-- src/migration-builder.ts | 34 +++++++++++----------- src/migration.ts | 8 ++---- src/operations/domains.ts | 17 ++++------- src/operations/extensions.ts | 11 ++------ src/operations/functions.ts | 14 +++------ src/operations/indexes.ts | 11 ++------ src/operations/operators.ts | 35 ++++++++--------------- src/operations/other.ts | 8 ++---- src/operations/policies.ts | 15 +++------- src/operations/roles.ts | 19 ++++--------- src/operations/schemas.ts | 12 ++------ src/operations/sequences.ts | 20 ++++--------- src/operations/tables.ts | 44 ++++++++++------------------- src/operations/triggers.ts | 18 ++++-------- src/operations/types.ts | 34 ++++++++-------------- src/operations/views.ts | 20 ++++--------- src/operations/viewsMaterialized.ts | 23 +++++---------- src/runner.ts | 17 +++++------ src/utils.ts | 41 +++++++++------------------ 21 files changed, 135 insertions(+), 271 deletions(-) diff --git a/package.json b/package.json index 3261037a..3bb414bc 100644 --- a/package.json +++ b/package.json @@ -56,6 +56,7 @@ "@babel/core": "7.6.4", "@babel/plugin-proposal-object-rest-spread": "7.6.2", "@babel/preset-env": "7.6.3", + "@types/lodash": "4.14.144", "babel-eslint": "10.0.3", "chai": "4.2.0", "chai-as-promised": "7.1.1", diff --git a/src/db.ts b/src/db.ts index 794ab81b..27359882 100644 --- a/src/db.ts +++ b/src/db.ts @@ -2,11 +2,11 @@ This file just manages the database connection and provides a query method */ -const pg = require('pg'); +import * as pg from 'pg'; // or native libpq bindings // const pg = require('pg/native'); -module.exports = (connection, log = console.error) => { +export default (connection, log = console.error) => { const isExternalClient = connection instanceof pg.Client; let clientActive = false; diff --git a/src/migration-builder.ts b/src/migration-builder.ts index b6f1d063..247cdc0c 100644 --- a/src/migration-builder.ts +++ b/src/migration-builder.ts @@ -9,23 +9,23 @@ and it makes inference of down migrations possible. */ -const { PgLiteral, createSchemalize } = require('./utils'); - -const extensions = require('./operations/extensions'); -const indexes = require('./operations/indexes'); -const tables = require('./operations/tables'); -const types = require('./operations/types'); -const roles = require('./operations/roles'); -const functions = require('./operations/functions'); -const triggers = require('./operations/triggers'); -const schemas = require('./operations/schemas'); -const domains = require('./operations/domains'); -const sequences = require('./operations/sequences'); -const operators = require('./operations/operators'); -const policies = require('./operations/policies'); -const views = require('./operations/views'); -const mViews = require('./operations/viewsMaterialized'); -const other = require('./operations/other'); +import { PgLiteral, createSchemalize } 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 views from './operations/views'; +import * as mViews from './operations/viewsMaterialized'; +import * as other from './operations/other'; /* eslint-disable security/detect-non-literal-fs-filename */ module.exports = class MigrationBuilder { diff --git a/src/migration.ts b/src/migration.ts index 9d2ae0b5..925cea48 100644 --- a/src/migration.ts +++ b/src/migration.ts @@ -18,7 +18,7 @@ const lstat = promisify(fs.lstat); // eslint-disable-line security/detect-non-li const SEPARATOR = '_'; -const loadMigrationFiles = async (dir, ignorePattern) => { +export const loadMigrationFiles = async (dir, ignorePattern) => { const dirContent = await readdir(`${dir}/`); const files = await Promise.all( dirContent.map(async file => { @@ -41,7 +41,7 @@ const getLastSuffix = async (dir, ignorePattern) => { } }; -module.exports = class Migration { +export default class Migration { // class method that creates a new migration file by cloning the migration template static async create(name, directory, language, ignorePattern) { // ensure the migrations directory exists @@ -176,6 +176,4 @@ module.exports = class Migration { markAsRun(direction) { return this.db.query(this._getMarkAsRun(this._getAction(direction))); } -}; - -module.exports.loadMigrationFiles = loadMigrationFiles; +} diff --git a/src/operations/domains.ts b/src/operations/domains.ts index 77c7d2a6..e69ee1c1 100644 --- a/src/operations/domains.ts +++ b/src/operations/domains.ts @@ -1,6 +1,6 @@ -const { applyType, escapeValue } = require('../utils'); +import { applyType, escapeValue } from '../utils'; -function dropDomain(mOptions) { +export function dropDomain(mOptions) { const _drop = (domainName, { ifExists, cascade } = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; @@ -10,7 +10,7 @@ function dropDomain(mOptions) { return _drop; } -function createDomain(mOptions) { +export function createDomain(mOptions) { const _create = (domainName, type, options = {}) => { const { default: defaultValue, @@ -53,7 +53,7 @@ function createDomain(mOptions) { return _create; } -function alterDomain(mOptions) { +export function alterDomain(mOptions) { const _alter = (domainName, options) => { const { default: defaultValue, @@ -90,7 +90,7 @@ function alterDomain(mOptions) { return _alter; } -function renameDomain(mOptions) { +export function renameDomain(mOptions) { const _rename = (domainName, newDomainName) => { const domainNameStr = mOptions.literal(domainName); const newDomainNameStr = mOptions.literal(newDomainName); @@ -100,10 +100,3 @@ function renameDomain(mOptions) { _rename(newDomainName, domainName); return _rename; } - -module.exports = { - dropDomain, - createDomain, - alterDomain, - renameDomain -}; diff --git a/src/operations/extensions.ts b/src/operations/extensions.ts index 4fda4723..cd8edce0 100644 --- a/src/operations/extensions.ts +++ b/src/operations/extensions.ts @@ -1,6 +1,6 @@ -const _ = require('lodash'); +import * as _ from 'lodash'; -function dropExtension(mOptions) { +export function dropExtension(mOptions) { const _drop = (extensions, { ifExists, cascade } = {}) => { if (!_.isArray(extensions)) extensions = [extensions]; // eslint-disable-line no-param-reassign const ifExistsStr = ifExists ? ' IF EXISTS' : ''; @@ -13,7 +13,7 @@ function dropExtension(mOptions) { return _drop; } -function createExtension(mOptions) { +export function createExtension(mOptions) { const _create = (extensions, { ifNotExists, schema } = {}) => { if (!_.isArray(extensions)) extensions = [extensions]; // eslint-disable-line no-param-reassign const ifNotExistsStr = ifNotExists ? ' IF NOT EXISTS' : ''; @@ -26,8 +26,3 @@ function createExtension(mOptions) { _create.reverse = dropExtension(mOptions); return _create; } - -module.exports = { - createExtension, - dropExtension -}; diff --git a/src/operations/functions.ts b/src/operations/functions.ts index 33783d83..2c8cd309 100644 --- a/src/operations/functions.ts +++ b/src/operations/functions.ts @@ -1,6 +1,6 @@ -const { escapeValue, formatParams } = require('../utils'); +import { escapeValue, formatParams } from '../utils'; -function dropFunction(mOptions) { +export function dropFunction(mOptions) { const _drop = ( functionName, functionParams = [], @@ -15,7 +15,7 @@ function dropFunction(mOptions) { return _drop; } -function createFunction(mOptions) { +export function createFunction(mOptions) { const _create = ( functionName, functionParams = [], @@ -65,7 +65,7 @@ function createFunction(mOptions) { return _create; } -function renameFunction(mOptions) { +export function renameFunction(mOptions) { const _rename = (oldFunctionName, functionParams = [], newFunctionName) => { const paramsStr = formatParams(functionParams, mOptions); const oldFunctionNameStr = mOptions.literal(oldFunctionName); @@ -76,9 +76,3 @@ function renameFunction(mOptions) { _rename(newFunctionName, functionParams, oldFunctionName); return _rename; } - -module.exports = { - createFunction, - dropFunction, - renameFunction -}; diff --git a/src/operations/indexes.ts b/src/operations/indexes.ts index b33fce47..0cd982c5 100644 --- a/src/operations/indexes.ts +++ b/src/operations/indexes.ts @@ -1,4 +1,4 @@ -const _ = require('lodash'); +import * as _ from 'lodash'; function generateIndexName(table, columns, options) { if (options.name) { @@ -32,7 +32,7 @@ function generateColumnsString(columns, literal) { : generateColumnString(columns, literal); } -function dropIndex(mOptions) { +export function dropIndex(mOptions) { const _drop = (tableName, columns, options = {}) => { const { concurrently, ifExists, cascade } = options; const concurrentlyStr = concurrently ? ' CONCURRENTLY' : ''; @@ -46,7 +46,7 @@ function dropIndex(mOptions) { return _drop; } -function createIndex(mOptions) { +export function createIndex(mOptions) { const _create = (tableName, columns, options = {}) => { /* columns - the column, columns, or expression to create the index on @@ -80,8 +80,3 @@ function createIndex(mOptions) { _create.reverse = dropIndex(mOptions); return _create; } - -module.exports = { - createIndex, - dropIndex -}; diff --git a/src/operations/operators.ts b/src/operations/operators.ts index a985de84..962c817e 100644 --- a/src/operations/operators.ts +++ b/src/operations/operators.ts @@ -1,6 +1,6 @@ -const { formatParams, applyType } = require('../utils'); +import { formatParams, applyType } from '../utils'; -function dropOperator(mOptions) { +export function dropOperator(mOptions) { const _drop = (operatorName, options = {}) => { const { ifExists, cascade, left, right } = options; @@ -16,7 +16,7 @@ function dropOperator(mOptions) { return _drop; } -function createOperator(mOptions) { +export function createOperator(mOptions) { const _create = (operatorName, options = {}) => { const { procedure, @@ -63,7 +63,7 @@ function createOperator(mOptions) { return _create; } -function dropOperatorFamily(mOptions) { +export function dropOperatorFamily(mOptions) { const _drop = ( operatorFamilyName, indexMethod, @@ -77,7 +77,7 @@ function dropOperatorFamily(mOptions) { return _drop; } -function createOperatorFamily(mOptions) { +export function createOperatorFamily(mOptions) { const _create = (operatorFamilyName, indexMethod) => { const operatorFamilyNameStr = mOptions.literal(operatorFamilyName); return `CREATE OPERATOR FAMILY ${operatorFamilyNameStr} USING ${indexMethod};`; @@ -121,13 +121,13 @@ const changeOperatorFamily = (op, reverse) => mOptions => { return method; }; -const removeFromOperatorFamily = changeOperatorFamily('DROP'); -const addToOperatorFamily = changeOperatorFamily( +export const removeFromOperatorFamily = changeOperatorFamily('DROP'); +export const addToOperatorFamily = changeOperatorFamily( 'ADD', removeFromOperatorFamily ); -function renameOperatorFamily(mOptions) { +export function renameOperatorFamily(mOptions) { const _rename = ( oldOperatorFamilyName, indexMethod, @@ -146,7 +146,7 @@ function renameOperatorFamily(mOptions) { return _rename; } -function dropOperatorClass(mOptions) { +export function dropOperatorClass(mOptions) { const _drop = ( operatorClassName, indexMethod, @@ -161,7 +161,7 @@ function dropOperatorClass(mOptions) { return _drop; } -function createOperatorClass(mOptions) { +export function createOperatorClass(mOptions) { const _create = ( operatorClassName, type, @@ -192,7 +192,7 @@ function createOperatorClass(mOptions) { return _create; } -function renameOperatorClass(mOptions) { +export function renameOperatorClass(mOptions) { const _rename = (oldOperatorClassName, indexMethod, newOperatorClassName) => { const oldOperatorClassNameStr = mOptions.literal(oldOperatorClassName); const newOperatorClassNameStr = mOptions.literal(newOperatorClassName); @@ -203,16 +203,3 @@ function renameOperatorClass(mOptions) { _rename(newOperatorClassName, indexMethod, oldOperatorClassName); return _rename; } - -module.exports = { - createOperator, - dropOperator, - createOperatorFamily, - dropOperatorFamily, - removeFromOperatorFamily, - addToOperatorFamily, - renameOperatorFamily, - dropOperatorClass, - createOperatorClass, - renameOperatorClass -}; diff --git a/src/operations/other.ts b/src/operations/other.ts index 0181acb9..04f2100d 100644 --- a/src/operations/other.ts +++ b/src/operations/other.ts @@ -1,6 +1,6 @@ -const { createTransformer } = require('../utils'); +import { createTransformer } from '../utils'; -function sql(mOptions) { +export function sql(mOptions) { const t = createTransformer(mOptions.literal); return (...args) => { // applies some very basic templating using the utils.p @@ -12,7 +12,3 @@ function sql(mOptions) { return s; }; } - -module.exports = { - sql -}; diff --git a/src/operations/policies.ts b/src/operations/policies.ts index f268a801..97513936 100644 --- a/src/operations/policies.ts +++ b/src/operations/policies.ts @@ -13,7 +13,7 @@ const makeClauses = ({ role, using, check }) => { return clauses; }; -function dropPolicy(mOptions) { +export function dropPolicy(mOptions) { const _drop = (tableName, policyName, { ifExists } = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const policyNameStr = mOptions.literal(policyName); @@ -23,7 +23,7 @@ function dropPolicy(mOptions) { return _drop; } -function createPolicy(mOptions) { +export function createPolicy(mOptions) { const _create = (tableName, policyName, options = {}) => { const createOptions = { ...options, @@ -42,7 +42,7 @@ function createPolicy(mOptions) { return _create; } -function alterPolicy(mOptions) { +export function alterPolicy(mOptions) { const _alter = (tableName, policyName, options = {}) => { const clausesStr = makeClauses(options).join(' '); const policyNameStr = mOptions.literal(policyName); @@ -52,7 +52,7 @@ function alterPolicy(mOptions) { return _alter; } -function renamePolicy(mOptions) { +export function renamePolicy(mOptions) { const _rename = (tableName, policyName, newPolicyName) => { const policyNameStr = mOptions.literal(policyName); const newPolicyNameStr = mOptions.literal(newPolicyName); @@ -63,10 +63,3 @@ function renamePolicy(mOptions) { _rename(tableName, newPolicyName, policyName); return _rename; } - -module.exports = { - createPolicy, - dropPolicy, - alterPolicy, - renamePolicy -}; diff --git a/src/operations/roles.ts b/src/operations/roles.ts index 37ad5c57..a1fcf7df 100644 --- a/src/operations/roles.ts +++ b/src/operations/roles.ts @@ -1,5 +1,5 @@ -const { isArray } = require('lodash'); -const { escapeValue } = require('../utils'); +import { isArray } from 'lodash'; +import { escapeValue } from '../utils'; const formatRoleOptions = (roleOptions = {}) => { const options = []; @@ -60,7 +60,7 @@ const formatRoleOptions = (roleOptions = {}) => { return options.join(' '); }; -function dropRole(mOptions) { +export function dropRole(mOptions) { const _drop = (roleName, { ifExists } = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const roleNameStr = mOptions.literal(roleName); @@ -69,7 +69,7 @@ function dropRole(mOptions) { return _drop; } -function createRole(mOptions) { +export function createRole(mOptions) { const _create = (roleName, roleOptions = {}) => { const options = formatRoleOptions({ ...roleOptions, @@ -87,7 +87,7 @@ function createRole(mOptions) { return _create; } -function alterRole(mOptions) { +export function alterRole(mOptions) { const _alter = (roleName, roleOptions = {}) => { const options = formatRoleOptions(roleOptions); return options @@ -97,7 +97,7 @@ function alterRole(mOptions) { return _alter; } -function renameRole(mOptions) { +export function renameRole(mOptions) { const _rename = (oldRoleName, newRoleName) => { const oldRoleNameStr = mOptions.literal(oldRoleName); const newRoleNameStr = mOptions.literal(newRoleName); @@ -107,10 +107,3 @@ function renameRole(mOptions) { _rename(newRoleName, oldRoleName); return _rename; } - -module.exports = { - createRole, - dropRole, - alterRole, - renameRole -}; diff --git a/src/operations/schemas.ts b/src/operations/schemas.ts index f632daab..f8f85d70 100644 --- a/src/operations/schemas.ts +++ b/src/operations/schemas.ts @@ -1,4 +1,4 @@ -function dropSchema(mOptions) { +export function dropSchema(mOptions) { const _drop = (schemaName, { ifExists, cascade } = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; @@ -8,7 +8,7 @@ function dropSchema(mOptions) { return _drop; } -function createSchema(mOptions) { +export function createSchema(mOptions) { const _create = (schemaName, { ifNotExists, authorization } = {}) => { const ifNotExistsStr = ifNotExists ? ' IF NOT EXISTS' : ''; const schemaNameStr = mOptions.literal(schemaName); @@ -21,7 +21,7 @@ function createSchema(mOptions) { return _create; } -function renameSchema(mOptions) { +export function renameSchema(mOptions) { const _rename = (schemaName, newSchemaName) => { const schemaNameStr = mOptions.literal(schemaName); const newSchemaNameStr = mOptions.literal(newSchemaName); @@ -31,9 +31,3 @@ function renameSchema(mOptions) { _rename(newSchemaName, schemaName); return _rename; } - -module.exports = { - createSchema, - dropSchema, - renameSchema -}; diff --git a/src/operations/sequences.ts b/src/operations/sequences.ts index 106b4c1b..13847419 100644 --- a/src/operations/sequences.ts +++ b/src/operations/sequences.ts @@ -1,6 +1,6 @@ -const { applyType } = require('../utils'); +import { applyType } from '../utils'; -const parseSequenceOptions = (typeShorthands, options) => { +export const parseSequenceOptions = (typeShorthands, options) => { const { type, increment, @@ -47,7 +47,7 @@ const parseSequenceOptions = (typeShorthands, options) => { return clauses; }; -function dropSequence(mOptions) { +export function dropSequence(mOptions) { const _drop = (sequenceName, { ifExists, cascade } = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; @@ -57,7 +57,7 @@ function dropSequence(mOptions) { return _drop; } -function createSequence(mOptions) { +export function createSequence(mOptions) { const _create = (sequenceName, options = {}) => { const { temporary, ifNotExists } = options; const temporaryStr = temporary ? ' TEMPORARY' : ''; @@ -74,7 +74,7 @@ function createSequence(mOptions) { return _create; } -function alterSequence(mOptions) { +export function alterSequence(mOptions) { return (sequenceName, options) => { const { restart } = options; const clauses = parseSequenceOptions(mOptions.typeShorthands, options); @@ -90,7 +90,7 @@ function alterSequence(mOptions) { }; } -function renameSequence(mOptions) { +export function renameSequence(mOptions) { const _rename = (sequenceName, newSequenceName) => { const sequenceNameStr = mOptions.literal(sequenceName); const newSequenceNameStr = mOptions.literal(newSequenceName); @@ -100,11 +100,3 @@ function renameSequence(mOptions) { _rename(newSequenceName, sequenceName); return _rename; } - -module.exports = { - createSequence, - dropSequence, - alterSequence, - renameSequence, - parseSequenceOptions -}; diff --git a/src/operations/tables.ts b/src/operations/tables.ts index bf56a700..71786fa2 100644 --- a/src/operations/tables.ts +++ b/src/operations/tables.ts @@ -1,12 +1,12 @@ -const _ = require('lodash'); -const { +import * as _ from 'lodash'; +import { escapeValue, applyType, applyTypeAdapters, comment, formatLines -} = require('../utils'); -const { parseSequenceOptions } = require('./sequences'); +} from '../utils'; +import { parseSequenceOptions } from './sequences'; const parseReferences = (options, literal) => { const { references, match, onDelete, onUpdate } = options; @@ -262,7 +262,7 @@ const parseLike = (like, literal) => { }; // TABLE -function dropTable(mOptions) { +export function dropTable(mOptions) { const _drop = (tableName, { ifExists, cascade } = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; @@ -272,7 +272,7 @@ function dropTable(mOptions) { return _drop; } -function createTable(mOptions) { +export function createTable(mOptions) { const _create = (tableName, columns, options = {}) => { const { temporary, @@ -331,7 +331,7 @@ ${formatLines(tableDefinition)} return _create; } -function alterTable(mOptions) { +export function alterTable(mOptions) { const _alter = (tableName, options) => { const alterDefinition = []; if (options.levelSecurity) { @@ -344,7 +344,7 @@ function alterTable(mOptions) { } // COLUMNS -function dropColumns(mOptions) { +export function dropColumns(mOptions) { const _drop = (tableName, columns, { ifExists, cascade } = {}) => { if (typeof columns === 'string') { columns = [columns]; // eslint-disable-line no-param-reassign @@ -362,7 +362,7 @@ ${columnsStr};`; return _drop; } -function addColumns(mOptions) { +export function addColumns(mOptions) { const _add = (tableName, columns, { ifNotExists } = {}) => { const { columns: columnLines, @@ -382,7 +382,7 @@ function addColumns(mOptions) { return _add; } -function alterColumn(mOptions) { +export function alterColumn(mOptions) { return (tableName, columnName, options) => { const { default: defaultValue, @@ -450,7 +450,7 @@ function alterColumn(mOptions) { }; } -function renameTable(mOptions) { +export function renameTable(mOptions) { const _rename = (tableName, newName) => { const tableNameStr = mOptions.literal(tableName); const newNameStr = mOptions.literal(newName); @@ -460,7 +460,7 @@ function renameTable(mOptions) { return _rename; } -function renameColumn(mOptions) { +export function renameColumn(mOptions) { const _rename = (tableName, columnName, newName) => { const tableNameStr = mOptions.literal(tableName); const columnNameStr = mOptions.literal(columnName); @@ -472,7 +472,7 @@ function renameColumn(mOptions) { return _rename; } -function renameConstraint(mOptions) { +export function renameConstraint(mOptions) { const _rename = (tableName, constraintName, newName) => { const tableNameStr = mOptions.literal(tableName); const constraintNameStr = mOptions.literal(constraintName); @@ -484,7 +484,7 @@ function renameConstraint(mOptions) { return _rename; } -function dropConstraint(mOptions) { +export function dropConstraint(mOptions) { const _drop = (tableName, constraintName, { ifExists, cascade } = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; @@ -494,7 +494,7 @@ function dropConstraint(mOptions) { }; return _drop; } -function addConstraint(mOptions) { +export function addConstraint(mOptions) { const _add = (tableName, constraintName, expression) => { const { constraints, comments } = typeof expression === 'string' @@ -523,17 +523,3 @@ function addConstraint(mOptions) { _add.reverse = dropConstraint(mOptions); return _add; } - -module.exports = { - createTable, - dropTable, - alterTable, - renameTable, - addColumns, - dropColumns, - alterColumn, - renameColumn, - addConstraint, - dropConstraint, - renameConstraint -}; diff --git a/src/operations/triggers.ts b/src/operations/triggers.ts index a6bdef58..e3374005 100644 --- a/src/operations/triggers.ts +++ b/src/operations/triggers.ts @@ -1,8 +1,8 @@ -const { isArray } = require('lodash'); -const { escapeValue } = require('../utils'); -const { createFunction, dropFunction } = require('./functions'); +import { isArray } from 'lodash'; +import { escapeValue } from '../utils'; +import { createFunction, dropFunction } from './functions'; -function dropTrigger(mOptions) { +export function dropTrigger(mOptions) { const _drop = (tableName, triggerName, { ifExists, cascade } = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; @@ -13,7 +13,7 @@ function dropTrigger(mOptions) { return _drop; } -function createTrigger(mOptions) { +export function createTrigger(mOptions) { const _create = (tableName, triggerName, triggerOptions = {}, definition) => { const { constraint, @@ -101,7 +101,7 @@ function createTrigger(mOptions) { return _create; } -function renameTrigger(mOptions) { +export function renameTrigger(mOptions) { const _rename = (tableName, oldTriggerName, newTriggerName) => { const oldTriggerNameStr = mOptions.literal(oldTriggerName); const tableNameStr = mOptions.literal(tableName); @@ -112,9 +112,3 @@ function renameTrigger(mOptions) { _rename(tableName, newTriggerName, oldTriggerName); return _rename; } - -module.exports = { - createTrigger, - dropTrigger, - renameTrigger -}; diff --git a/src/operations/types.ts b/src/operations/types.ts index 7f2748d2..fa66c0ad 100644 --- a/src/operations/types.ts +++ b/src/operations/types.ts @@ -1,7 +1,7 @@ -const _ = require('lodash'); -const { applyType, escapeValue } = require('../utils'); +import * as _ from 'lodash'; +import { applyType, escapeValue } from '../utils'; -function dropType(mOptions) { +export function dropType(mOptions) { const _drop = (typeName, { ifExists, cascade } = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; @@ -11,7 +11,7 @@ function dropType(mOptions) { return _drop; } -function createType(mOptions) { +export function createType(mOptions) { const _create = (typeName, options) => { if (_.isArray(options)) { const optionsStr = options.map(escapeValue).join(', '); @@ -28,7 +28,7 @@ function createType(mOptions) { return _create; } -function dropTypeAttribute(mOptions) { +export function dropTypeAttribute(mOptions) { const _drop = (typeName, attributeName, { ifExists } = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const typeNameStr = mOptions.literal(typeName); @@ -38,7 +38,7 @@ function dropTypeAttribute(mOptions) { return _drop; } -function addTypeAttribute(mOptions) { +export function addTypeAttribute(mOptions) { const _alterAttributeAdd = (typeName, attributeName, attributeType) => { const typeStr = applyType(attributeType, mOptions.typeShorthands).type; const typeNameStr = mOptions.literal(typeName); @@ -50,7 +50,7 @@ function addTypeAttribute(mOptions) { return _alterAttributeAdd; } -function setTypeAttribute(mOptions) { +export function setTypeAttribute(mOptions) { return (typeName, attributeName, attributeType) => { const typeStr = applyType(attributeType, mOptions.typeShorthands).type; const typeNameStr = mOptions.literal(typeName); @@ -60,7 +60,7 @@ function setTypeAttribute(mOptions) { }; } -function addTypeValue(mOptions) { +export function addTypeValue(mOptions) { const _add = (typeName, value, options = {}) => { const { ifNotExists, before, after } = options; @@ -78,7 +78,7 @@ function addTypeValue(mOptions) { return _add; } -function renameType(mOptions) { +export function renameType(mOptions) { const _rename = (typeName, newTypeName) => { const typeNameStr = mOptions.literal(typeName); const newTypeNameStr = mOptions.literal(newTypeName); @@ -88,7 +88,7 @@ function renameType(mOptions) { return _rename; } -function renameTypeAttribute(mOptions) { +export function renameTypeAttribute(mOptions) { const _rename = (typeName, attributeName, newAttributeName) => { const typeNameStr = mOptions.literal(typeName); const attributeNameStr = mOptions.literal(attributeName); @@ -100,7 +100,7 @@ function renameTypeAttribute(mOptions) { return _rename; } -function renameTypeValue(mOptions) { +export function renameTypeValue(mOptions) { const _rename = (typeName, value, newValue) => { const valueStr = escapeValue(value); const newValueStr = escapeValue(newValue); @@ -111,15 +111,3 @@ function renameTypeValue(mOptions) { _rename(typeName, newValue, value); return _rename; } - -module.exports = { - createType, - dropType, - renameType, - addTypeAttribute, - dropTypeAttribute, - setTypeAttribute, - renameTypeAttribute, - renameTypeValue, - addTypeValue -}; diff --git a/src/operations/views.ts b/src/operations/views.ts index d0b6233c..cf0a207f 100644 --- a/src/operations/views.ts +++ b/src/operations/views.ts @@ -1,6 +1,6 @@ -const { escapeValue } = require('../utils'); +import { escapeValue } from '../utils'; -function dropView(mOptions) { +export function dropView(mOptions) { const _drop = (viewName, { ifExists, cascade } = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; @@ -10,7 +10,7 @@ function dropView(mOptions) { return _drop; } -function createView(mOptions) { +export function createView(mOptions) { const _create = (viewName, options, definition) => { const { temporary, @@ -36,7 +36,7 @@ function createView(mOptions) { return _create; } -function alterView(mOptions) { +export function alterView(mOptions) { const _alter = (viewName, options) => { const { checkOption } = options; const clauses = []; @@ -54,7 +54,7 @@ function alterView(mOptions) { return _alter; } -function alterViewColumn(mOptions) { +export function alterViewColumn(mOptions) { const _alter = (viewName, columnName, options) => { const { default: defaultValue } = options; const actions = []; @@ -75,7 +75,7 @@ function alterViewColumn(mOptions) { return _alter; } -function renameView(mOptions) { +export function renameView(mOptions) { const _rename = (viewName, newViewName) => { const viewNameStr = mOptions.literal(viewName); const newViewNameStr = mOptions.literal(newViewName); @@ -84,11 +84,3 @@ function renameView(mOptions) { _rename.reverse = (viewName, newViewName) => _rename(newViewName, viewName); return _rename; } - -module.exports = { - createView, - dropView, - alterView, - alterViewColumn, - renameView -}; diff --git a/src/operations/viewsMaterialized.ts b/src/operations/viewsMaterialized.ts index 2d0ee044..302ecff1 100644 --- a/src/operations/viewsMaterialized.ts +++ b/src/operations/viewsMaterialized.ts @@ -1,4 +1,4 @@ -const { formatLines } = require('../utils'); +import { formatLines } from '../utils'; const dataClause = data => data !== undefined ? ` WITH${data ? '' : ' NO'} DATA` : ''; @@ -8,7 +8,7 @@ const storageParameterStr = storageParameters => key => { return `${key}${value}`; }; -function dropMaterializedView(mOptions) { +export function dropMaterializedView(mOptions) { const _drop = (viewName, { ifExists, cascade } = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; @@ -18,7 +18,7 @@ function dropMaterializedView(mOptions) { return _drop; } -function createMaterializedView(mOptions) { +export function createMaterializedView(mOptions) { const _create = (viewName, options, definition) => { const { ifNotExists, @@ -48,7 +48,7 @@ function createMaterializedView(mOptions) { return _create; } -function alterMaterializedView(mOptions) { +export function alterMaterializedView(mOptions) { const _alter = (viewName, options) => { const { cluster, extension, storageParameters = {} } = options; const clauses = []; @@ -82,7 +82,7 @@ function alterMaterializedView(mOptions) { return _alter; } -function renameMaterializedView(mOptions) { +export function renameMaterializedView(mOptions) { const _rename = (viewName, newViewName) => { const viewNameStr = mOptions.literal(viewName); const newViewNameStr = mOptions.literal(newViewName); @@ -92,7 +92,7 @@ function renameMaterializedView(mOptions) { return _rename; } -function renameMaterializedViewColumn(mOptions) { +export function renameMaterializedViewColumn(mOptions) { const _rename = (viewName, columnName, newColumnName) => { const viewNameStr = mOptions.literal(viewName); const columnNameStr = mOptions.literal(columnName); @@ -104,7 +104,7 @@ function renameMaterializedViewColumn(mOptions) { return _rename; } -function refreshMaterializedView(mOptions) { +export function refreshMaterializedView(mOptions) { const _refresh = (viewName, { concurrently, data } = {}) => { const concurrentlyStr = concurrently ? ' CONCURRENTLY' : ''; const dataStr = dataClause(data); @@ -114,12 +114,3 @@ function refreshMaterializedView(mOptions) { _refresh.reverse = _refresh; return _refresh; } - -module.exports = { - createMaterializedView, - dropMaterializedView, - alterMaterializedView, - renameMaterializedView, - renameMaterializedViewColumn, - refreshMaterializedView -}; diff --git a/src/runner.ts b/src/runner.ts index b84277b5..f3ab48d8 100644 --- a/src/runner.ts +++ b/src/runner.ts @@ -1,14 +1,14 @@ -const path = require('path'); -const fs = require('fs'); -const Db = require('./db'); -const Migration = require('./migration'); -const { +import * as path from 'path'; +import * as fs from 'fs'; +import Db from './db'; +import Migration, { loadMigrationFiles } from './migration'; +import { getSchemas, getMigrationTableSchema, promisify, PgLiteral, createSchemalize -} = require('./utils'); +} from './utils'; // Random but well-known identifier shared by all instances of node-pg-migrate const PG_MIGRATE_LOCK_ID = 7241865325823964; @@ -22,10 +22,7 @@ const runOnColumn = 'run_on'; const loadMigrations = async (db, options, log) => { try { let shorthands = {}; - const files = await Migration.loadMigrationFiles( - options.dir, - options.ignorePattern - ); + const files = await loadMigrationFiles(options.dir, options.ignorePattern); return files.map(file => { const filePath = `${options.dir}/${file}`; const actions = diff --git a/src/utils.ts b/src/utils.ts index 684f539b..e4382075 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,8 +1,8 @@ -const decamelize = require('decamelize'); +import decamelize from 'decamelize'; // This is used to create unescaped strings // exposed in the migrations via pgm.func -class PgLiteral { +export class PgLiteral { static create(str) { return new PgLiteral(str); } @@ -19,7 +19,7 @@ class PgLiteral { const identity = v => v; const quote = str => `"${str}"`; -const createSchemalize = (shouldDecamelize, shouldQuote) => { +export const createSchemalize = (shouldDecamelize, shouldQuote) => { const transform = [ shouldDecamelize ? decamelize : identity, shouldQuote ? quote : identity @@ -33,13 +33,13 @@ const createSchemalize = (shouldDecamelize, shouldQuote) => { }; }; -const createTransformer = literal => (s, d) => +export const createTransformer = literal => (s, d) => Object.keys(d || {}).reduce( (str, p) => str.replace(new RegExp(`{${p}}`, 'g'), literal(d[p])), // eslint-disable-line security/detect-non-literal-regexp s ); -const escapeValue = val => { +export const escapeValue = val => { if (val === null) { return 'NULL'; } @@ -71,14 +71,14 @@ const escapeValue = val => { return ''; }; -const getSchemas = schema => { +export const getSchemas = schema => { const schemas = (Array.isArray(schema) ? schema : [schema]).filter( s => typeof s === 'string' && s.length > 0 ); return schemas.length > 0 ? schemas : ['public']; }; -const getMigrationTableSchema = options => +export const getMigrationTableSchema = options => options.migrationsSchema !== undefined ? options.migrationsSchema : getSchemas(options.schema)[0]; @@ -97,10 +97,10 @@ const defaultTypeShorthands = { }; // some convenience adapters -- see above -const applyTypeAdapters = type => +export const applyTypeAdapters = type => typeAdapters[type] ? typeAdapters[type] : type; -const applyType = (type, extendingTypeShorthands = {}) => { +export const applyType = (type, extendingTypeShorthands = {}) => { const typeShorthands = { ...defaultTypeShorthands, ...extendingTypeShorthands @@ -152,38 +152,23 @@ const formatParam = mOptions => param => { return options.join(' '); }; -const formatParams = (params = [], mOptions) => +export const formatParams = (params = [], mOptions) => `(${params.map(formatParam(mOptions)).join(', ')})`; -const comment = (object, name, text) => { +export const comment = (object, name, text) => { const cmt = escapeValue(text || null); return `COMMENT ON ${object} ${name} IS ${cmt};`; }; -const formatLines = (lines, replace = ' ', separator = ',') => +export const formatLines = (lines, replace = ' ', separator = ',') => lines .map(line => line.replace(/(?:\r\n|\r|\n)+/g, ' ')) .join(`${separator}\n`) .replace(/^/gm, replace); -const promisify = fn => (...args) => +export const promisify = fn => (...args) => new Promise((resolve, reject) => fn.call(this, ...args, (err, ...result) => err ? reject(err) : resolve(...result) ) ); - -module.exports = { - PgLiteral, - createSchemalize, - createTransformer, - escapeValue, - getSchemas, - getMigrationTableSchema, - applyTypeAdapters, - applyType, - formatParams, - comment, - formatLines, - promisify -}; From 82618185ebc9e1a3249572f41060a0b06717a95e Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Fri, 1 Nov 2019 13:26:26 +0100 Subject: [PATCH 06/57] Use import/export statements --- src/migration-builder.ts | 4 ++-- src/migration.ts | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/migration-builder.ts b/src/migration-builder.ts index 247cdc0c..589a733b 100644 --- a/src/migration-builder.ts +++ b/src/migration-builder.ts @@ -28,7 +28,7 @@ import * as mViews from './operations/viewsMaterialized'; import * as other from './operations/other'; /* eslint-disable security/detect-non-literal-fs-filename */ -module.exports = class MigrationBuilder { +export default class MigrationBuilder { constructor(db, typeShorthands, shouldDecamelize) { this._steps = []; this._REVERSE_MODE = false; @@ -198,5 +198,5 @@ module.exports = class MigrationBuilder { // in reverse mode, we flip the order of the statements return this._REVERSE_MODE ? this._steps.slice().reverse() : this._steps; } -}; +} /* eslint-enable security/detect-non-literal-fs-filename */ diff --git a/src/migration.ts b/src/migration.ts index 925cea48..a1dd8094 100644 --- a/src/migration.ts +++ b/src/migration.ts @@ -6,12 +6,12 @@ */ -const fs = require('fs'); -const mkdirp = require('mkdirp'); -const path = require('path'); +import * as fs from 'fs'; +import mkdirp from 'mkdirp'; +import * as path from 'path'; -const MigrationBuilder = require('./migration-builder'); -const { getMigrationTableSchema, promisify } = require('./utils'); +import MigrationBuilder from './migration-builder'; +import { getMigrationTableSchema, promisify } from './utils'; const readdir = promisify(fs.readdir); // eslint-disable-line security/detect-non-literal-fs-filename const lstat = promisify(fs.lstat); // eslint-disable-line security/detect-non-literal-fs-filename From 002617fa02bc0a1c4cf4604593e6d0eb0411e703 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Fri, 1 Nov 2019 13:27:30 +0100 Subject: [PATCH 07/57] Override prettier config for ts --- .prettierrc.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.prettierrc.js b/.prettierrc.js index 225da3f1..95ab40f5 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -10,6 +10,10 @@ module.exports = { { files: '*.md', options: { parser: 'markdown' } + }, + { + files: '*.ts', + options: { parser: 'typescript' } } ] }; From 3aa300ed12e417391b4798d6244275f98b9b1935 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Fri, 1 Nov 2019 14:42:35 +0100 Subject: [PATCH 08/57] Define class members --- src/migration-builder.ts | 87 ++++++++++++++++++++++++++++++++++++++++ src/migration.ts | 10 +++++ src/utils.ts | 2 + 3 files changed, 99 insertions(+) diff --git a/src/migration-builder.ts b/src/migration-builder.ts index 589a733b..8bb83e02 100644 --- a/src/migration-builder.ts +++ b/src/migration-builder.ts @@ -29,6 +29,93 @@ import * as other from './operations/other'; /* eslint-disable security/detect-non-literal-fs-filename */ export default class MigrationBuilder { + public readonly createExtension: (...args: any[]) => void; + public readonly dropExtension: (...args: any[]) => void; + public readonly addExtension: any; + public readonly createTable: (...args: any[]) => void; + public readonly dropTable: (...args: any[]) => void; + public readonly renameTable: (...args: any[]) => void; + public readonly alterTable: (...args: any[]) => void; + public readonly addColumns: (...args: any[]) => void; + public readonly dropColumns: (...args: any[]) => void; + public readonly renameColumn: (...args: any[]) => void; + public readonly alterColumn: (...args: any[]) => void; + public readonly addColumn: any; + public readonly dropColumn: any; + public readonly addConstraint: (...args: any[]) => void; + public readonly dropConstraint: (...args: any[]) => void; + public readonly renameConstraint: (...args: any[]) => void; + public readonly createConstraint: any; + public readonly createType: (...args: any[]) => void; + public readonly dropType: (...args: any[]) => void; + public readonly addType: any; + public readonly renameType: (...args: any[]) => void; + public readonly renameTypeAttribute: (...args: any[]) => void; + public readonly renameTypeValue: (...args: any[]) => void; + public readonly addTypeAttribute: (...args: any[]) => void; + public readonly dropTypeAttribute: (...args: any[]) => void; + public readonly setTypeAttribute: (...args: any[]) => void; + public readonly addTypeValue: (...args: any[]) => void; + public readonly createIndex: (...args: any[]) => void; + public readonly dropIndex: (...args: any[]) => void; + public readonly addIndex: any; + public readonly createRole: (...args: any[]) => void; + public readonly dropRole: (...args: any[]) => void; + public readonly alterRole: (...args: any[]) => void; + public readonly renameRole: (...args: any[]) => void; + public readonly createFunction: (...args: any[]) => void; + public readonly dropFunction: (...args: any[]) => void; + public readonly renameFunction: (...args: any[]) => void; + public readonly createTrigger: (...args: any[]) => void; + public readonly dropTrigger: (...args: any[]) => void; + public readonly renameTrigger: (...args: any[]) => void; + public readonly createSchema: (...args: any[]) => void; + public readonly dropSchema: (...args: any[]) => void; + public readonly renameSchema: (...args: any[]) => void; + public readonly createDomain: (...args: any[]) => void; + public readonly dropDomain: (...args: any[]) => void; + public readonly alterDomain: (...args: any[]) => void; + public readonly renameDomain: (...args: any[]) => void; + public readonly createSequence: (...args: any[]) => void; + public readonly dropSequence: (...args: any[]) => void; + public readonly alterSequence: (...args: any[]) => void; + public readonly renameSequence: (...args: any[]) => void; + public readonly createOperator: (...args: any[]) => void; + public readonly dropOperator: (...args: any[]) => void; + public readonly createOperatorClass: (...args: any[]) => void; + public readonly dropOperatorClass: (...args: any[]) => void; + public readonly renameOperatorClass: (...args: any[]) => void; + public readonly createOperatorFamily: (...args: any[]) => void; + public readonly dropOperatorFamily: (...args: any[]) => void; + public readonly renameOperatorFamily: (...args: any[]) => void; + public readonly addToOperatorFamily: (...args: any[]) => void; + public readonly removeFromOperatorFamily: (...args: any[]) => void; + public readonly createPolicy: (...args: any[]) => void; + public readonly dropPolicy: (...args: any[]) => void; + public readonly alterPolicy: (...args: any[]) => void; + public readonly renamePolicy: (...args: any[]) => void; + public readonly createView: (...args: any[]) => void; + public readonly dropView: (...args: any[]) => void; + public readonly alterView: (...args: any[]) => void; + public readonly alterViewColumn: (...args: any[]) => void; + public readonly renameView: (...args: any[]) => void; + public readonly createMaterializedView: (...args: any[]) => void; + public readonly dropMaterializedView: (...args: any[]) => void; + public readonly alterMaterializedView: (...args: any[]) => void; + public readonly renameMaterializedView: (...args: any[]) => void; + public readonly renameMaterializedViewColumn: (...args: any[]) => void; + public readonly refreshMaterializedView: (...args: any[]) => void; + public readonly sql: (...args: any[]) => void; + public readonly func: (str: any) => PgLiteral; + public readonly db: { + query: (...args: any[]) => any; + select: (...args: any[]) => any; + }; + + private _steps: any[]; + private _REVERSE_MODE: boolean; + private _use_transaction: boolean; + constructor(db, typeShorthands, shouldDecamelize) { this._steps = []; this._REVERSE_MODE = false; diff --git a/src/migration.ts b/src/migration.ts index a1dd8094..c306cc8b 100644 --- a/src/migration.ts +++ b/src/migration.ts @@ -67,6 +67,16 @@ export default class Migration { return new Migration(null, newFile); } + public readonly db: any; + public readonly path: any; + public readonly name: string; + public readonly timestamp: number; + public readonly up: any; + public down: any; + public readonly options: {}; + public readonly typeShorthands: any; + public readonly log: (message?: any, ...optionalParams: any[]) => void; + constructor( db, migrationPath, diff --git a/src/utils.ts b/src/utils.ts index e4382075..1e964142 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -7,6 +7,8 @@ export class PgLiteral { return new PgLiteral(str); } + private readonly _str: string; + constructor(str) { this._str = str; } From d23de9fc30298a754fcd0a6a96aff1a41f218487 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Fri, 1 Nov 2019 14:44:29 +0100 Subject: [PATCH 09/57] Export runner --- src/runner.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runner.ts b/src/runner.ts index f3ab48d8..8a5f13f8 100644 --- a/src/runner.ts +++ b/src/runner.ts @@ -242,4 +242,4 @@ runner.default = runner; // workaround for transpilers runner.PgLiteral = PgLiteral; runner.Migration = Migration; -module.exports = runner; +export default runner; From 770be358378be9b40486347891110f3b28662b38 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Fri, 1 Nov 2019 15:05:22 +0100 Subject: [PATCH 10/57] Ignore template files --- tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index e5557fef..18dbc41a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,5 +11,5 @@ "strict": false }, "include": ["src/**/*"], - "exclude": ["node_modules", "lib", "dist", "bin"] + "exclude": ["src/migration-template.*", "node_modules", "lib", "dist", "bin"] } From 12c9a7bb29df0e1304215bc262d1c9a2153f6d14 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Fri, 1 Nov 2019 15:07:19 +0100 Subject: [PATCH 11/57] Add types for mkdirp --- package.json | 1 + src/migration.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 3bb414bc..d10a8e41 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,7 @@ "@babel/plugin-proposal-object-rest-spread": "7.6.2", "@babel/preset-env": "7.6.3", "@types/lodash": "4.14.144", + "@types/mkdirp": "0.5.2", "babel-eslint": "10.0.3", "chai": "4.2.0", "chai-as-promised": "7.1.1", diff --git a/src/migration.ts b/src/migration.ts index c306cc8b..f31d4f71 100644 --- a/src/migration.ts +++ b/src/migration.ts @@ -7,7 +7,7 @@ */ import * as fs from 'fs'; -import mkdirp from 'mkdirp'; +import * as mkdirp from 'mkdirp'; import * as path from 'path'; import MigrationBuilder from './migration-builder'; From 725ea4a424affde4ba0103523236424975a9038b Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Fri, 1 Nov 2019 17:31:24 +0100 Subject: [PATCH 12/57] Move type defs to appropriate implementations --- src/definitions.ts | 78 +++++ src/migration-builder.ts | 504 +++++++++++++++++++++++----- src/operations/domains.ts | 20 ++ src/operations/extensions.ts | 52 +++ src/operations/functions.ts | 20 ++ src/operations/indexes.ts | 17 + src/operations/operators.ts | 33 ++ src/operations/policies.ts | 12 + src/operations/roles.ts | 18 + src/operations/sequences.ts | 25 ++ src/operations/tables.ts | 43 +++ src/operations/triggers.ts | 13 + src/operations/views.ts | 17 + src/operations/viewsMaterialized.ts | 19 ++ src/utils.ts | 6 +- 15 files changed, 790 insertions(+), 87 deletions(-) create mode 100644 src/definitions.ts diff --git a/src/definitions.ts b/src/definitions.ts new file mode 100644 index 00000000..5436cafc --- /dev/null +++ b/src/definitions.ts @@ -0,0 +1,78 @@ +import { PgLiteral } from './utils'; +import { SequenceOptions } from './operations/sequences'; + +export type LiteralUnion = + | T + | (U & { zz_IGNORE_ME?: never }); + +interface ValueArray extends Array {} + +export type Value = null | boolean | string | number | PgLiteral | ValueArray; + +export type Type = string | { type: string }; + +export type Name = string | { schema?: string; name: string }; + +export type Action = + | 'NO ACTION' + | 'RESTRICT' + | 'CASCADE' + | 'SET NULL' + | 'SET DEFAULT'; + +export interface ReferencesOptions { + referencesConstraintName?: string; + referencesConstraintComment?: string; + references?: Name; + onDelete?: Action; + onUpdate?: Action; + match?: 'FULL' | 'SIMPLE'; +} + +export interface ColumnDefinition extends ReferencesOptions { + type: string; + collation?: string; + unique?: boolean; + primaryKey?: boolean; + notNull?: boolean; + default?: Value; + check?: string; + deferrable?: boolean; + deferred?: boolean; + comment?: string | null; + generated?: { precedence: 'ALWAYS' | 'BY DEFAULT' } & SequenceOptions; +} + +export interface ColumnDefinitions { + [name: string]: ColumnDefinition | string; +} + +export type Like = + | 'COMMENTS' + | 'CONSTRAINTS' + | 'DEFAULTS' + | 'IDENTITY' + | 'INDEXES' + | 'STATISTICS' + | 'STORAGE' + | 'ALL'; + +export interface LikeOptions { + including?: Like | Like[]; + excluding?: Like | Like[]; +} + +export interface IfNotExistsOption { + ifNotExists?: boolean; +} + +export interface IfExistsOption { + ifExists?: boolean; +} + +export interface CascadeOption { + cascade?: boolean; +} + +export type AddOptions = IfNotExistsOption; +export type DropOptions = IfExistsOption & CascadeOption; diff --git a/src/migration-builder.ts b/src/migration-builder.ts index 8bb83e02..0e55167a 100644 --- a/src/migration-builder.ts +++ b/src/migration-builder.ts @@ -11,6 +11,50 @@ import { PgLiteral, createSchemalize } from './utils'; +import { + Name, + ColumnDefinitions, + DropOptions, + LiteralUnion, + AddOptions, + Value, + Type, + IfExistsOption +} from './definitions'; +import { + TableOptions, + AlterTableOptions, + AlterColumnOptions, + ConstraintOptions +} from './operations/tables'; +import { Extension, CreateExtensionOptions } from './operations/extensions'; +import { RoleOptions } from './operations/roles'; +import { FunctionParam, FunctionOptions } from './operations/functions'; +import { TriggerOptions } from './operations/triggers'; +import { DomainOptionsCreate, DomainOptionsAlter } from './operations/domains'; +import { + SequenceOptionsCreate, + SequenceOptionsAlter +} from './operations/sequences'; +import { + CreateOperatorOptions, + DropOperatorOptions, + OperatorListDefinition, + CreateOperatorClassOptions +} from './operations/operators'; +import { PolicyOptions, CreatePolicyOptions } from './operations/policies'; +import { + AlterViewColumnOptions, + AlterViewOptions, + CreateViewOptions +} from './operations/views'; +import { + AlterMaterializedViewOptions, + RefreshMaterializedViewOptions, + CreateMaterializedViewOptions +} from './operations/viewsMaterialized'; +import { CreateIndexOptions, DropIndexOptions } from './operations/indexes'; + import * as extensions from './operations/extensions'; import * as indexes from './operations/indexes'; import * as tables from './operations/tables'; @@ -27,96 +71,388 @@ import * as views from './operations/views'; import * as mViews from './operations/viewsMaterialized'; import * as other from './operations/other'; +import { QueryConfig, QueryResult } from 'pg'; + +// see ClientBase in @types/pg +export interface DB { + query(queryConfig: QueryConfig): Promise; + query( + queryTextOrConfig: string | QueryConfig, + values?: any[] + ): Promise; + + select(queryConfig: QueryConfig): Promise; + select( + queryTextOrConfig: string | QueryConfig, + values?: any[] + ): Promise; +} + /* eslint-disable security/detect-non-literal-fs-filename */ export default class MigrationBuilder { - public readonly createExtension: (...args: any[]) => void; - public readonly dropExtension: (...args: any[]) => void; - public readonly addExtension: any; - public readonly createTable: (...args: any[]) => void; - public readonly dropTable: (...args: any[]) => void; - public readonly renameTable: (...args: any[]) => void; - public readonly alterTable: (...args: any[]) => void; - public readonly addColumns: (...args: any[]) => void; - public readonly dropColumns: (...args: any[]) => void; - public readonly renameColumn: (...args: any[]) => void; - public readonly alterColumn: (...args: any[]) => void; - public readonly addColumn: any; - public readonly dropColumn: any; - public readonly addConstraint: (...args: any[]) => void; - public readonly dropConstraint: (...args: any[]) => void; - public readonly renameConstraint: (...args: any[]) => void; - public readonly createConstraint: any; - public readonly createType: (...args: any[]) => void; - public readonly dropType: (...args: any[]) => void; - public readonly addType: any; - public readonly renameType: (...args: any[]) => void; - public readonly renameTypeAttribute: (...args: any[]) => void; - public readonly renameTypeValue: (...args: any[]) => void; - public readonly addTypeAttribute: (...args: any[]) => void; - public readonly dropTypeAttribute: (...args: any[]) => void; - public readonly setTypeAttribute: (...args: any[]) => void; - public readonly addTypeValue: (...args: any[]) => void; - public readonly createIndex: (...args: any[]) => void; - public readonly dropIndex: (...args: any[]) => void; - public readonly addIndex: any; - public readonly createRole: (...args: any[]) => void; - public readonly dropRole: (...args: any[]) => void; - public readonly alterRole: (...args: any[]) => void; - public readonly renameRole: (...args: any[]) => void; - public readonly createFunction: (...args: any[]) => void; - public readonly dropFunction: (...args: any[]) => void; - public readonly renameFunction: (...args: any[]) => void; - public readonly createTrigger: (...args: any[]) => void; - public readonly dropTrigger: (...args: any[]) => void; - public readonly renameTrigger: (...args: any[]) => void; - public readonly createSchema: (...args: any[]) => void; - public readonly dropSchema: (...args: any[]) => void; - public readonly renameSchema: (...args: any[]) => void; - public readonly createDomain: (...args: any[]) => void; - public readonly dropDomain: (...args: any[]) => void; - public readonly alterDomain: (...args: any[]) => void; - public readonly renameDomain: (...args: any[]) => void; - public readonly createSequence: (...args: any[]) => void; - public readonly dropSequence: (...args: any[]) => void; - public readonly alterSequence: (...args: any[]) => void; - public readonly renameSequence: (...args: any[]) => void; - public readonly createOperator: (...args: any[]) => void; - public readonly dropOperator: (...args: any[]) => void; - public readonly createOperatorClass: (...args: any[]) => void; - public readonly dropOperatorClass: (...args: any[]) => void; - public readonly renameOperatorClass: (...args: any[]) => void; - public readonly createOperatorFamily: (...args: any[]) => void; - public readonly dropOperatorFamily: (...args: any[]) => void; - public readonly renameOperatorFamily: (...args: any[]) => void; - public readonly addToOperatorFamily: (...args: any[]) => void; - public readonly removeFromOperatorFamily: (...args: any[]) => void; - public readonly createPolicy: (...args: any[]) => void; - public readonly dropPolicy: (...args: any[]) => void; - public readonly alterPolicy: (...args: any[]) => void; - public readonly renamePolicy: (...args: any[]) => void; - public readonly createView: (...args: any[]) => void; - public readonly dropView: (...args: any[]) => void; - public readonly alterView: (...args: any[]) => void; - public readonly alterViewColumn: (...args: any[]) => void; - public readonly renameView: (...args: any[]) => void; - public readonly createMaterializedView: (...args: any[]) => void; - public readonly dropMaterializedView: (...args: any[]) => void; - public readonly alterMaterializedView: (...args: any[]) => void; - public readonly renameMaterializedView: (...args: any[]) => void; - public readonly renameMaterializedViewColumn: (...args: any[]) => void; - public readonly refreshMaterializedView: (...args: any[]) => void; - public readonly sql: (...args: any[]) => void; - public readonly func: (str: any) => PgLiteral; - public readonly db: { - query: (...args: any[]) => any; - select: (...args: any[]) => any; - }; + public readonly createExtension: ( + extension: LiteralUnion | Array>, + options?: CreateExtensionOptions + ) => void; + public readonly dropExtension: ( + extension: LiteralUnion | Array>, + dropOptions?: DropOptions + ) => void; + public readonly addExtension: ( + extension: LiteralUnion | Array>, + options?: CreateExtensionOptions + ) => void; + + public readonly createTable: ( + tableName: Name, + columns: ColumnDefinitions, + options?: TableOptions + ) => void; + public readonly dropTable: ( + tableName: Name, + dropOptions?: DropOptions + ) => void; + public readonly renameTable: (tableName: Name, newtableName: Name) => void; + public readonly alterTable: ( + tableName: Name, + alterOptions: AlterTableOptions + ) => void; + + public readonly addColumns: ( + tableName: Name, + newColumns: ColumnDefinitions, + addOptions?: AddOptions + ) => void; + public readonly dropColumns: ( + tableName: Name, + columns: string | string[] | { [name: string]: any }, + dropOptions?: DropOptions + ) => void; + public readonly renameColumn: ( + tableName: Name, + oldColumnName: string, + newColumnName: string + ) => void; + public readonly alterColumn: ( + tableName: Name, + columnName: string, + options: AlterColumnOptions + ) => void; + public readonly addColumn: ( + tableName: Name, + newColumns: ColumnDefinitions, + addOptions?: AddOptions + ) => void; + public readonly dropColumn: ( + tableName: Name, + columns: string | string[] | { [name: string]: any }, + dropOptions?: DropOptions + ) => void; + + public readonly addConstraint: ( + tableName: Name, + constraintName: string | null, + expression: string | ConstraintOptions + ) => void; + public readonly dropConstraint: ( + tableName: Name, + constraintName: string, + options?: DropOptions + ) => void; + public readonly renameConstraint: ( + tableName: Name, + oldConstraintName: string, + newConstraintName: string + ) => void; + public readonly createConstraint: ( + tableName: Name, + constraintName: string | null, + expression: string | ConstraintOptions + ) => void; + + public readonly createType: ( + typeName: Name, + values: Value[] | { [name: string]: Type } + ) => void; + public readonly dropType: (typeName: Name, dropOptions?: DropOptions) => void; + public readonly addType: ( + typeName: Name, + values: Value[] | { [name: string]: Type } + ) => void; + public readonly renameType: (typeName: Name, newTypeName: Name) => void; + public readonly renameTypeAttribute: ( + typeName: Name, + attributeName: string, + newAttributeName: string + ) => void; + public readonly renameTypeValue: ( + typeName: Name, + value: string, + newValue: string + ) => void; + public readonly addTypeAttribute: ( + typeName: Name, + attributeName: string, + attributeType: Type + ) => void; + public readonly dropTypeAttribute: ( + typeName: Name, + attributeName: string, + options: IfExistsOption + ) => void; + public readonly setTypeAttribute: ( + typeName: Name, + attributeName: string, + attributeType: Type + ) => void; + public readonly addTypeValue: ( + typeName: Name, + value: Value, + options?: { + ifNotExists?: boolean; + before?: string; + after?: string; + } + ) => void; + + public readonly createIndex: ( + tableName: Name, + columns: string | string[], + options?: CreateIndexOptions + ) => void; + public readonly dropIndex: ( + tableName: Name, + columns: string | string[], + options?: DropIndexOptions + ) => void; + public readonly addIndex: ( + tableName: Name, + columns: string | string[], + options?: CreateIndexOptions + ) => void; + + public readonly createRole: ( + roleName: Name, + roleOptions?: RoleOptions + ) => void; + public readonly dropRole: (roleName: Name, options?: IfExistsOption) => void; + public readonly alterRole: (roleName: Name, roleOptions: RoleOptions) => void; + public readonly renameRole: (oldRoleName: Name, newRoleName: Name) => void; + + public readonly createFunction: ( + functionName: Name, + functionParams: FunctionParam[], + functionOptions: FunctionOptions, + definition: Value + ) => void; + public readonly dropFunction: ( + functionName: Name, + functionParams: FunctionParam[], + dropOptions?: DropOptions + ) => void; + public readonly renameFunction: ( + oldFunctionName: Name, + functionParams: FunctionParam[], + newFunctionName: Name + ) => void; + + public readonly createTrigger: + | (( + tableName: Name, + triggerName: Name, + triggerOptions: TriggerOptions + ) => void) + | (( + tableName: Name, + triggerName: Name, + triggerOptions: TriggerOptions & FunctionOptions, + definition: Value + ) => void); + public readonly dropTrigger: ( + tableName: Name, + triggerName: Name, + dropOptions?: DropOptions + ) => void; + public readonly renameTrigger: ( + tableName: Name, + oldTriggerName: Name, + newTriggerName: Name + ) => void; + + public readonly createSchema: ( + schemaName: string, + schemaOptions?: { + ifNotExists?: boolean; + authorization?: string; + } + ) => void; + public readonly dropSchema: ( + schemaName: string, + dropOptions?: DropOptions + ) => void; + public readonly renameSchema: ( + oldSchemaName: string, + newSchemaName: string + ) => void; + + public readonly createDomain: ( + domainName: Name, + type: Type, + domainOptions?: DomainOptionsCreate + ) => void; + public readonly dropDomain: ( + domainName: Name, + dropOptions?: DropOptions + ) => void; + public readonly alterDomain: ( + domainName: Name, + domainOptions: DomainOptionsAlter + ) => void; + public readonly renameDomain: ( + oldDomainName: Name, + newDomainName: Name + ) => void; + + public readonly createSequence: ( + sequenceName: Name, + sequenceOptions?: SequenceOptionsCreate + ) => void; + public readonly dropSequence: ( + sequenceName: Name, + dropOptions?: DropOptions + ) => void; + public readonly alterSequence: ( + sequenceName: Name, + sequenceOptions: SequenceOptionsAlter + ) => void; + public readonly renameSequence: ( + oldSequenceName: Name, + newSequenceName: Name + ) => void; + + public readonly createOperator: ( + operatorName: Name, + options?: CreateOperatorOptions + ) => void; + public readonly dropOperator: ( + operatorName: Name, + dropOptions?: DropOperatorOptions + ) => void; + public readonly createOperatorClass: ( + operatorClassName: Name, + type: Type, + indexMethod: Name, + operatorList: OperatorListDefinition, + options: CreateOperatorClassOptions + ) => void; + public readonly dropOperatorClass: ( + operatorClassName: Name, + indexMethod: Name, + dropOptions?: DropOptions + ) => void; + public readonly renameOperatorClass: ( + oldOperatorClassName: Name, + indexMethod: Name, + newOperatorClassName: Name + ) => void; + public readonly createOperatorFamily: ( + operatorFamilyName: Name, + indexMethod: Name + ) => void; + public readonly dropOperatorFamily: ( + operatorFamilyName: Name, + newSchemaName: Name, + dropOptions?: DropOptions + ) => void; + public readonly renameOperatorFamily: ( + oldOperatorFamilyName: Name, + indexMethod: Name, + newOperatorFamilyName: Name + ) => void; + public readonly addToOperatorFamily: ( + operatorFamilyName: Name, + indexMethod: Name, + operatorList: OperatorListDefinition + ) => void; + public readonly removeFromOperatorFamily: ( + operatorFamilyName: Name, + indexMethod: Name, + operatorList: OperatorListDefinition + ) => void; + + public readonly createPolicy: ( + tableName: Name, + policyName: string, + options?: CreatePolicyOptions + ) => void; + public readonly dropPolicy: ( + tableName: Name, + policyName: string, + options?: IfExistsOption + ) => void; + public readonly alterPolicy: ( + tableName: Name, + policyName: string, + options: PolicyOptions + ) => void; + public readonly renamePolicy: ( + tableName: Name, + policyName: string, + newPolicyName: string + ) => void; + + public readonly createView: ( + viewName: Name, + options: CreateViewOptions, + definition: string + ) => void; + public readonly dropView: (viewName: Name, options?: DropOptions) => void; + public readonly alterView: ( + viewName: Name, + options: AlterViewOptions + ) => void; + public readonly alterViewColumn: ( + viewName: Name, + options: AlterViewColumnOptions + ) => void; + public readonly renameView: (viewName: Name, newViewName: Name) => void; + + public readonly createMaterializedView: ( + viewName: Name, + options: CreateMaterializedViewOptions, + definition: string + ) => void; + public readonly dropMaterializedView: ( + viewName: Name, + options?: DropOptions + ) => void; + public readonly alterMaterializedView: ( + viewName: Name, + options: AlterMaterializedViewOptions + ) => void; + public readonly renameMaterializedView: ( + viewName: Name, + newViewName: Name + ) => void; + public readonly renameMaterializedViewColumn: ( + viewName: Name, + columnName: string, + newColumnName: string + ) => void; + public readonly refreshMaterializedView: ( + viewName: Name, + options?: RefreshMaterializedViewOptions + ) => void; + + public readonly sql: (sql: string, args?: object) => void; + public readonly func: (sql: string) => PgLiteral; + public readonly db: DB; private _steps: any[]; private _REVERSE_MODE: boolean; private _use_transaction: boolean; - constructor(db, typeShorthands, shouldDecamelize) { + constructor(db: DB, typeShorthands, shouldDecamelize: boolean) { this._steps = []; this._REVERSE_MODE = false; // by default, all migrations are wrapped in a transaction @@ -268,7 +604,7 @@ export default class MigrationBuilder { return this; } - noTransaction() { + public noTransaction(): this { this._use_transaction = false; return this; } diff --git a/src/operations/domains.ts b/src/operations/domains.ts index e69ee1c1..93b301e4 100644 --- a/src/operations/domains.ts +++ b/src/operations/domains.ts @@ -1,4 +1,24 @@ import { applyType, escapeValue } from '../utils'; +import { Value } from '../definitions'; + +export interface DomainOptions { + default?: Value; + notNull?: boolean; + check?: string; + constraintName?: string; +} + +export interface DomainOptionsCreateEn { + collation?: string; +} + +export type DomainOptionsCreate = DomainOptionsCreateEn & DomainOptions; + +export interface DomainOptionsAlterEn { + allowNull?: boolean; +} + +export type DomainOptionsAlter = DomainOptionsAlterEn & DomainOptions; export function dropDomain(mOptions) { const _drop = (domainName, { ifExists, cascade } = {}) => { diff --git a/src/operations/extensions.ts b/src/operations/extensions.ts index cd8edce0..c929a485 100644 --- a/src/operations/extensions.ts +++ b/src/operations/extensions.ts @@ -1,5 +1,57 @@ import * as _ from 'lodash'; +export type Extension = + | 'adminpack' + | 'amcheck' + | 'auth_delay' + | 'auto_explain' + | 'bloom' + | 'btree_gin' + | 'btree_gist' + | 'citext' + | 'cube' + | 'dblink' + | 'dict_int' + | 'dict_xsyn' + | 'earthdistance' + | 'file_fdw' + | 'fuzzystrmatch' + | 'hstore' + | 'intagg' + | 'intarray' + | 'isn' + | 'lo' + | 'ltree' + | 'pageinspect' + | 'passwordcheck' + | 'pg_buffercache' + | 'pgcrypto' + | 'pg_freespacemap' + | 'pg_prewarm' + | 'pgrowlocks' + | 'pg_stat_statements' + | 'pgstattuple' + | 'pg_trgm' + | 'pg_visibility' + | 'postgres_fdw' + | 'seg' + | 'sepgsql' + | 'spi' + | 'sslinfo' + | 'tablefunc' + | 'tcn' + | 'test_decoding' + | 'tsm_system_rows' + | 'tsm_system_time' + | 'unaccent' + | 'uuid-ossp' + | 'xml2'; + +export interface CreateExtensionOptions { + ifNotExists?: boolean; + schema?: string; +} + export function dropExtension(mOptions) { const _drop = (extensions, { ifExists, cascade } = {}) => { if (!_.isArray(extensions)) extensions = [extensions]; // eslint-disable-line no-param-reassign diff --git a/src/operations/functions.ts b/src/operations/functions.ts index 2c8cd309..d547eaf3 100644 --- a/src/operations/functions.ts +++ b/src/operations/functions.ts @@ -1,4 +1,24 @@ import { escapeValue, formatParams } from '../utils'; +import { Value } from '../definitions'; + +export interface FunctionParamType { + mode?: 'IN' | 'OUT' | 'INOUT' | 'VARIADIC'; + name?: string; + type: string; + default?: Value; +} + +export type FunctionParam = string | FunctionParamType; + +export interface FunctionOptions { + returns?: string; + language: string; + replace?: boolean; + window?: boolean; + behavior?: 'IMMUTABLE' | 'STABLE' | 'VOLATILE'; + onNull?: boolean; + parallel?: 'UNSAFE' | 'RESTRICTED' | 'SAFE'; +} export function dropFunction(mOptions) { const _drop = ( diff --git a/src/operations/indexes.ts b/src/operations/indexes.ts index 0cd982c5..cb486463 100644 --- a/src/operations/indexes.ts +++ b/src/operations/indexes.ts @@ -1,4 +1,21 @@ import * as _ from 'lodash'; +import { DropOptions } from '../definitions'; + +export interface CreateIndexOptions { + name?: string; + unique?: boolean; + where?: string; + concurrently?: boolean; + opclass?: string; + method?: 'btree' | 'hash' | 'gist' | 'spgist' | 'gin'; +} + +export interface DropIndexOptionsEn { + name?: string; + concurrently?: boolean; +} + +export type DropIndexOptions = DropIndexOptionsEn & DropOptions; function generateIndexName(table, columns, options) { if (options.name) { diff --git a/src/operations/operators.ts b/src/operations/operators.ts index 962c817e..11be9720 100644 --- a/src/operations/operators.ts +++ b/src/operations/operators.ts @@ -1,4 +1,37 @@ import { formatParams, applyType } from '../utils'; +import { FunctionParam } from './functions'; +import { Name } from '../definitions'; + +export interface CreateOperatorOptions { + procedure: Name; + left?: Name; + right?: Name; + commutator?: Name; + negator?: Name; + restrict?: Name; + join?: Name; + hashes?: boolean; + merges?: boolean; +} + +export interface DropOperatorOptions { + left?: Name; + right?: Name; + ifExists?: boolean; + cascade?: boolean; +} + +export interface CreateOperatorClassOptions { + default?: boolean; + family?: string; +} + +export interface OperatorListDefinition { + type: 'function' | 'operator'; + number: number; + name: Name; + params?: FunctionParam[]; +} export function dropOperator(mOptions) { const _drop = (operatorName, options = {}) => { diff --git a/src/operations/policies.ts b/src/operations/policies.ts index 97513936..51a5b8ad 100644 --- a/src/operations/policies.ts +++ b/src/operations/policies.ts @@ -1,3 +1,15 @@ +export interface PolicyOptions { + role: string | string[]; + using: string; + check: string; +} + +export interface CreatePolicyOptionsEn { + command: 'ALL' | 'SELECT' | 'INSERT' | 'UPDATE' | 'DELETE'; +} + +export type CreatePolicyOptions = CreatePolicyOptionsEn & PolicyOptions; + const makeClauses = ({ role, using, check }) => { const roles = (Array.isArray(role) ? role : [role]).join(', '); const clauses = []; diff --git a/src/operations/roles.ts b/src/operations/roles.ts index a1fcf7df..20050ca8 100644 --- a/src/operations/roles.ts +++ b/src/operations/roles.ts @@ -1,5 +1,23 @@ import { isArray } from 'lodash'; import { escapeValue } from '../utils'; +import { Value } from '../definitions'; + +export interface RoleOptions { + superuser?: boolean; + createdb?: boolean; + createrole?: boolean; + inherit?: boolean; + login?: boolean; + replication?: boolean; + bypassrls?: boolean; + limit?: number; + password?: Value; + encrypted?: boolean; + valid?: Value; + inRole?: string | string[]; + role?: string | string[]; + admin?: string | string[]; +} const formatRoleOptions = (roleOptions = {}) => { const options = []; diff --git a/src/operations/sequences.ts b/src/operations/sequences.ts index 13847419..c06a2aaa 100644 --- a/src/operations/sequences.ts +++ b/src/operations/sequences.ts @@ -1,4 +1,29 @@ import { applyType } from '../utils'; +import { Type } from '../definitions'; + +export interface SequenceOptions { + type?: Type; + increment?: number; + minvalue?: number | null | false; + maxvalue?: number | null | false; + start?: number; + cache?: number; + cycle?: boolean; + owner?: string | null | false; +} + +export interface SequenceOptionsCreateEn { + temporary?: boolean; + ifNotExists?: boolean; +} + +export interface SequenceOptionsAlterEn { + restart?: number | true; +} + +export type SequenceOptionsCreate = SequenceOptionsCreateEn & SequenceOptions; + +export type SequenceOptionsAlter = SequenceOptionsAlterEn & SequenceOptions; export const parseSequenceOptions = (typeShorthands, options) => { const { diff --git a/src/operations/tables.ts b/src/operations/tables.ts index 71786fa2..e36cadf6 100644 --- a/src/operations/tables.ts +++ b/src/operations/tables.ts @@ -7,6 +7,35 @@ import { formatLines } from '../utils'; import { parseSequenceOptions } from './sequences'; +import { Name, Value, LikeOptions, ReferencesOptions } from '../definitions'; + +export interface ForeignKeyOptions extends ReferencesOptions { + columns: Name | Name[]; +} + +export interface ConstraintOptions { + check?: string | string[]; + unique?: Name[] | Name[][]; + primaryKey?: Name | Name[]; + foreignKeys?: ForeignKeyOptions | ForeignKeyOptions[]; + exclude?: string; + deferrable?: boolean; + deferred?: boolean; + comment?: string; +} + +export interface TableOptions { + temporary?: boolean; + ifNotExists?: boolean; + inherits?: Name; + like?: Name | { table: Name; options?: LikeOptions }; + constraints?: ConstraintOptions; + comment?: string | null; +} + +export interface AlterTableOptions { + levelSecurity: 'DISABLE' | 'ENABLE' | 'FORCE' | 'NO FORCE'; +} const parseReferences = (options, literal) => { const { references, match, onDelete, onUpdate } = options; @@ -344,6 +373,20 @@ export function alterTable(mOptions) { } // COLUMNS +export interface AlterColumnOptions { + type?: string; + default?: Value; + notNull?: boolean; + allowNull?: boolean; + collation?: string; + using?: string; + comment?: string | null; + generated?: + | null + | false + | ({ precedence: 'ALWAYS' | 'BY DEFAULT' } & SequenceOptions); +} + export function dropColumns(mOptions) { const _drop = (tableName, columns, { ifExists, cascade } = {}) => { if (typeof columns === 'string') { diff --git a/src/operations/triggers.ts b/src/operations/triggers.ts index e3374005..acfb45cd 100644 --- a/src/operations/triggers.ts +++ b/src/operations/triggers.ts @@ -1,6 +1,19 @@ import { isArray } from 'lodash'; import { escapeValue } from '../utils'; import { createFunction, dropFunction } from './functions'; +import { Name, Value } from '../definitions'; + +export interface TriggerOptions { + when?: 'BEFORE' | 'AFTER' | 'INSTEAD OF'; + operation: string | string[]; + constraint?: boolean; + function?: Name; + functionParams?: Value[]; + level?: 'STATEMENT' | 'ROW'; + condition?: string; + deferrable?: boolean; + deferred?: boolean; +} export function dropTrigger(mOptions) { const _drop = (tableName, triggerName, { ifExists, cascade } = {}) => { diff --git a/src/operations/views.ts b/src/operations/views.ts index cf0a207f..a1ff8f09 100644 --- a/src/operations/views.ts +++ b/src/operations/views.ts @@ -1,4 +1,21 @@ import { escapeValue } from '../utils'; +import { Value } from '../definitions'; + +export interface CreateViewOptions { + temporary?: boolean; + replace?: boolean; + recursive?: boolean; + columns?: string | string[]; + checkOption?: 'CASCADED' | 'LOCAL'; +} + +export interface AlterViewOptions { + checkOption?: null | false | 'CASCADED' | 'LOCAL'; +} + +export interface AlterViewColumnOptions { + default?: Value; +} export function dropView(mOptions) { const _drop = (viewName, { ifExists, cascade } = {}) => { diff --git a/src/operations/viewsMaterialized.ts b/src/operations/viewsMaterialized.ts index 302ecff1..e8e4552f 100644 --- a/src/operations/viewsMaterialized.ts +++ b/src/operations/viewsMaterialized.ts @@ -1,5 +1,24 @@ import { formatLines } from '../utils'; +export interface CreateMaterializedViewOptions { + ifNotExists?: boolean; + columns?: string | string[]; + tablespace?: string; + storageParameters?: object; + data?: boolean; +} + +export interface AlterMaterializedViewOptions { + cluster?: null | false | string; + extension?: string; + storageParameters?: object; +} + +export interface RefreshMaterializedViewOptions { + concurrently?: boolean; + data?: boolean; +} + const dataClause = data => data !== undefined ? ` WITH${data ? '' : ' NO'} DATA` : ''; const storageParameterStr = storageParameters => key => { diff --git a/src/utils.ts b/src/utils.ts index 1e964142..ca500b67 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -3,17 +3,17 @@ import decamelize from 'decamelize'; // This is used to create unescaped strings // exposed in the migrations via pgm.func export class PgLiteral { - static create(str) { + static create(str: string): PgLiteral { return new PgLiteral(str); } private readonly _str: string; - constructor(str) { + constructor(str: string) { this._str = str; } - toString() { + toString(): string { return this._str; } } From cc13e163685241e31d23ae66f87de8f711be59e9 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Fri, 1 Nov 2019 17:47:29 +0100 Subject: [PATCH 13/57] Move DB definition to db --- src/db.ts | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/db.ts b/src/db.ts index 27359882..a4083e10 100644 --- a/src/db.ts +++ b/src/db.ts @@ -2,15 +2,30 @@ This file just manages the database connection and provides a query method */ -import * as pg from 'pg'; +import { Client, QueryConfig, QueryResult } from 'pg'; // or native libpq bindings // const pg = require('pg/native'); +// see ClientBase in @types/pg +export interface DB { + query(queryConfig: QueryConfig): Promise; + query( + queryTextOrConfig: string | QueryConfig, + values?: any[] + ): Promise; + + select(queryConfig: QueryConfig): Promise; + select( + queryTextOrConfig: string | QueryConfig, + values?: any[] + ): Promise; +} + export default (connection, log = console.error) => { - const isExternalClient = connection instanceof pg.Client; + const isExternalClient = connection instanceof Client; let clientActive = false; - const client = isExternalClient ? connection : new pg.Client(connection); + const client = isExternalClient ? connection : new Client(connection); const beforeCloseListeners = []; From 22c383fc1c513986fd6e5d7f45c778623415bc0d Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Fri, 1 Nov 2019 17:47:43 +0100 Subject: [PATCH 14/57] Organize imports --- src/migration-builder.ts | 92 +++++++++++++++------------------------- 1 file changed, 35 insertions(+), 57 deletions(-) diff --git a/src/migration-builder.ts b/src/migration-builder.ts index 0e55167a..45aad7cd 100644 --- a/src/migration-builder.ts +++ b/src/migration-builder.ts @@ -9,84 +9,62 @@ and it makes inference of down migrations possible. */ -import { PgLiteral, createSchemalize } from './utils'; - +import { DB } from './db'; import { - Name, + AddOptions, ColumnDefinitions, DropOptions, + IfExistsOption, LiteralUnion, - AddOptions, - Value, + Name, Type, - IfExistsOption + Value } from './definitions'; +import { DomainOptionsAlter, DomainOptionsCreate } from './operations/domains'; +import { CreateExtensionOptions, Extension } from './operations/extensions'; +import { FunctionOptions, FunctionParam } from './operations/functions'; +import { CreateIndexOptions, DropIndexOptions } from './operations/indexes'; import { - TableOptions, - AlterTableOptions, - AlterColumnOptions, - ConstraintOptions -} from './operations/tables'; -import { Extension, CreateExtensionOptions } from './operations/extensions'; + CreateOperatorClassOptions, + CreateOperatorOptions, + DropOperatorOptions, + OperatorListDefinition +} from './operations/operators'; +import { CreatePolicyOptions, PolicyOptions } from './operations/policies'; import { RoleOptions } from './operations/roles'; -import { FunctionParam, FunctionOptions } from './operations/functions'; -import { TriggerOptions } from './operations/triggers'; -import { DomainOptionsCreate, DomainOptionsAlter } from './operations/domains'; import { - SequenceOptionsCreate, - SequenceOptionsAlter + SequenceOptionsAlter, + SequenceOptionsCreate } from './operations/sequences'; import { - CreateOperatorOptions, - DropOperatorOptions, - OperatorListDefinition, - CreateOperatorClassOptions -} from './operations/operators'; -import { PolicyOptions, CreatePolicyOptions } from './operations/policies'; + AlterColumnOptions, + AlterTableOptions, + ConstraintOptions, + TableOptions +} from './operations/tables'; +import { TriggerOptions } from './operations/triggers'; import { AlterViewColumnOptions, AlterViewOptions, CreateViewOptions } from './operations/views'; -import { - AlterMaterializedViewOptions, - RefreshMaterializedViewOptions, - CreateMaterializedViewOptions -} from './operations/viewsMaterialized'; -import { CreateIndexOptions, DropIndexOptions } from './operations/indexes'; +import { createSchemalize, PgLiteral } from './utils'; +import * as domains from './operations/domains'; import * as extensions from './operations/extensions'; +import * as functions from './operations/functions'; import * as indexes from './operations/indexes'; -import * as tables from './operations/tables'; -import * as types from './operations/types'; +import * as operators from './operations/operators'; +import * as other from './operations/other'; +import * as policies from './operations/policies'; 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 tables from './operations/tables'; +import * as triggers from './operations/triggers'; +import * as types from './operations/types'; import * as views from './operations/views'; import * as mViews from './operations/viewsMaterialized'; -import * as other from './operations/other'; - -import { QueryConfig, QueryResult } from 'pg'; - -// see ClientBase in @types/pg -export interface DB { - query(queryConfig: QueryConfig): Promise; - query( - queryTextOrConfig: string | QueryConfig, - values?: any[] - ): Promise; - - select(queryConfig: QueryConfig): Promise; - select( - queryTextOrConfig: string | QueryConfig, - values?: any[] - ): Promise; -} /* eslint-disable security/detect-non-literal-fs-filename */ export default class MigrationBuilder { @@ -419,7 +397,7 @@ export default class MigrationBuilder { public readonly createMaterializedView: ( viewName: Name, - options: CreateMaterializedViewOptions, + options: mViews.CreateMaterializedViewOptions, definition: string ) => void; public readonly dropMaterializedView: ( @@ -428,7 +406,7 @@ export default class MigrationBuilder { ) => void; public readonly alterMaterializedView: ( viewName: Name, - options: AlterMaterializedViewOptions + options: mViews.AlterMaterializedViewOptions ) => void; public readonly renameMaterializedView: ( viewName: Name, @@ -441,7 +419,7 @@ export default class MigrationBuilder { ) => void; public readonly refreshMaterializedView: ( viewName: Name, - options?: RefreshMaterializedViewOptions + options?: mViews.RefreshMaterializedViewOptions ) => void; public readonly sql: (sql: string, args?: object) => void; From c0b21f7b13455559f669057e08b04d5fc4898371 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Fri, 1 Nov 2019 17:48:23 +0100 Subject: [PATCH 15/57] Init definitions for createSchemalize --- src/utils.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/utils.ts b/src/utils.ts index ca500b67..e47126b5 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -21,8 +21,11 @@ export class PgLiteral { const identity = v => v; const quote = str => `"${str}"`; -export const createSchemalize = (shouldDecamelize, shouldQuote) => { - const transform = [ +export const createSchemalize = ( + shouldDecamelize: boolean, + shouldQuote: boolean +) => { + const transform: (v: any) => any = [ shouldDecamelize ? decamelize : identity, shouldQuote ? quote : identity ].reduce((acc, fn) => (fn === identity ? acc : x => acc(fn(x)))); From 26aefc91571c2cd7d009e621c8a298a8f081f65c Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Fri, 1 Nov 2019 17:55:23 +0100 Subject: [PATCH 16/57] Move RunnerOption to runner file --- src/runner.ts | 57 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 52 insertions(+), 5 deletions(-) diff --git a/src/runner.ts b/src/runner.ts index 8a5f13f8..ae1b77d5 100644 --- a/src/runner.ts +++ b/src/runner.ts @@ -1,13 +1,15 @@ -import * as path from 'path'; import * as fs from 'fs'; +import * as path from 'path'; +import { Client } from 'pg'; +import { TlsOptions } from 'tls'; import Db from './db'; import Migration, { loadMigrationFiles } from './migration'; import { - getSchemas, + createSchemalize, getMigrationTableSchema, - promisify, + getSchemas, PgLiteral, - createSchemalize + promisify } from './utils'; // Random but well-known identifier shared by all instances of node-pg-migrate @@ -160,7 +162,52 @@ const runMigrations = (toRun, method, direction) => Promise.resolve() ); -const runner = async options => { +export interface RunnerOptionConfig { + migrationsTable: string; + migrationsSchema?: string; + schema?: string | string[]; + dir: string; + checkOrder?: boolean; + direction: 'up' | 'down'; + count: number; + timestamp?: boolean; + ignorePattern: string; + file?: string; + dryRun?: boolean; + createSchema?: boolean; + createMigrationsSchema?: boolean; + singleTransaction?: boolean; + noLock?: boolean; + fake?: boolean; + decamelize?: boolean; + log?: (msg: string) => void; +} + +export interface ConnectionConfig { + user?: string; + database?: string; + password?: string; + port?: number; + host?: string; + connectionString?: string; +} + +export interface ClientConfig extends ConnectionConfig { + ssl?: boolean | TlsOptions; +} + +export interface RunnerOptionUrl { + databaseUrl: string | ClientConfig; +} + +export interface RunnerOptionClient { + dbClient: Client; +} + +export type RunnerOption = RunnerOptionConfig & + (RunnerOptionClient | RunnerOptionUrl); + +const runner = async (options: RunnerOption): Promise => { const log = options.log || console.log; const db = Db(options.dbClient || options.databaseUrl, log); try { From 1ca70fe0fd5b85ec88b9b455787d3e35fc545e1c Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Fri, 1 Nov 2019 17:56:27 +0100 Subject: [PATCH 17/57] Add PgType to definitions --- src/definitions.ts | 62 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/src/definitions.ts b/src/definitions.ts index 5436cafc..d1768a48 100644 --- a/src/definitions.ts +++ b/src/definitions.ts @@ -20,6 +20,68 @@ export type Action = | 'SET NULL' | 'SET DEFAULT'; +// Note these currently don't contain the parameterized types like +// bit(n), varchar(n) and so on, they have to be specified as strings +export enum PgType { + BIGINT = 'bigint', // signed eight-byte integer + INT8 = 'int8', // alias for bigint + BIGSERIAL = 'bigserial', // autoincrementing eight-byte integer + BIT_1 = 'bit', // fixed-length bit string + BIT_VARYING = 'bit varying', // variable-length bit string + VARBIT = 'varbit', // alias for bit varying + SERIAL8 = 'serial8', // alias for bigserial + BOOLEAN = 'boolean', // logical Boolean (true/false) + BOOL = 'bool', // alias for boolean + BOX = 'box', // rectangular box on a plane + BYTEA = 'bytea', // binary data ("byte array") + CHARACTER = 'character', // fixed-length character string + CHAR = 'char', // alias for character + CHARACTER_VARYING = 'character varying', // variable-length character string + VARCHAR = 'varchar', // alias for character varying + CIDR = 'cidr', // IPv4 or IPv6 network address + CIRCLE = 'circle', // circle on a plane + DATE = 'date', // calendar date (year, month, day) + DOUBLE_PRECISION = 'double precision', // float8 double precision floating-point number (8 bytes) + INET = 'inet', // IPv4 or IPv6 host address + INTEGER = 'integer', // signed four-byte integer + INT = 'int', // alias for int + INT4 = 'int4', // alias for int + INTERVAL = 'interval', // time span + JSON = 'json', // textual JSON data + JSONB = 'jsonb', // binary JSON data, decomposed + LINE = 'line', // infinite line on a plane + LSEG = 'lseg', // line segment on a plane + MACADDR = 'macaddr', // MAC (Media Access Control) address + MONEY = 'money', // currency amount + NUMERIC = 'numeric', // exact numeric of selectable precision + PATH = 'path', // geometric path on a plane + PG_LSN = 'pg_lsn', // PostgreSQL Log Sequence Number + POINT = 'point', // geometric point on a plane + POLYGON = 'polygon', // closed geometric path on a plane + REAL = 'real', // single precision floating-point number (4 bytes) + FLOAT4 = 'float4', // alias for REAL + SMALLINT = 'smallint', // signed two-byte integer + INT2 = 'int2', // alias for smallint + SMALLSERIAL = 'smallserial', // autoincrementing two-byte integer + SERIAL2 = 'serial2', // alias for smallserial + SERIAL = 'serial', // autoincrementing four-byte integer + SERIAL4 = 'serial4', // alias for serial + TEXT = 'text', // variable-length character string + TIME = 'time', // time of day (no time zone) + TIME_WITHOUT_TIME_ZONE = 'without time zone', // alias of time + TIME_WITH_TIME_ZONE = 'time with time zone', // time of day, including time zone + TIMETZ = 'timetz', // alias of time with time zone + TIMESTAMP = 'timestamp', // date and time (no time zone) + TIMESTAMP_WITHOUT_TIME_ZONE = 'timestamp without time zone', // alias of timestamp + TIMESTAMP_WITH_TIME_ZONE = 'timestamp with time zone', // date and time, including time zone + TIMESTAMPTZ = 'timestamptz', // alias of timestamp with time zone + TSQUERY = 'tsquery', // text search query + TSVECTOR = 'tsvector', // text search document + TXID_SNAPSHOT = 'txid_snapshot', // user-level transaction ID snapshot + UUID = 'uuid', // universally unique identifier + XML = 'xml' // XML data +} + export interface ReferencesOptions { referencesConstraintName?: string; referencesConstraintComment?: string; From cf2e9e374529219f40482796002958b1d92b0ede Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Fri, 1 Nov 2019 18:44:43 +0100 Subject: [PATCH 18/57] Improve type definitions --- src/db.ts | 6 ++++-- src/migration-builder.ts | 6 ++++++ src/migration.ts | 22 ++++++++++++---------- src/runner.ts | 18 ++++++++++++------ src/utils.ts | 14 ++++++++------ 5 files changed, 42 insertions(+), 24 deletions(-) diff --git a/src/db.ts b/src/db.ts index a4083e10..ca7360ad 100644 --- a/src/db.ts +++ b/src/db.ts @@ -8,6 +8,7 @@ import { Client, QueryConfig, QueryResult } from 'pg'; // see ClientBase in @types/pg export interface DB { + createConnection(): Promise; query(queryConfig: QueryConfig): Promise; query( queryTextOrConfig: string | QueryConfig, @@ -19,9 +20,10 @@ export interface DB { queryTextOrConfig: string | QueryConfig, values?: any[] ): Promise; + close(): Promise; } -export default (connection, log = console.error) => { +export default (connection, log = console.error): DB => { const isExternalClient = connection instanceof Client; let clientActive = false; @@ -29,7 +31,7 @@ export default (connection, log = console.error) => { const beforeCloseListeners = []; - const createConnection = () => + const createConnection: () => Promise = () => new Promise((resolve, reject) => clientActive || isExternalClient ? resolve() diff --git a/src/migration-builder.ts b/src/migration-builder.ts index 45aad7cd..4fab526f 100644 --- a/src/migration-builder.ts +++ b/src/migration-builder.ts @@ -66,6 +66,12 @@ import * as types from './operations/types'; import * as views from './operations/views'; import * as mViews from './operations/viewsMaterialized'; +export interface MigrationBuilderActions { + up?: (pgm: MigrationBuilder) => Promise; + down?: (pgm: MigrationBuilder) => Promise; + shorthands?: ColumnDefinitions; +} + /* eslint-disable security/detect-non-literal-fs-filename */ export default class MigrationBuilder { public readonly createExtension: ( diff --git a/src/migration.ts b/src/migration.ts index f31d4f71..9e235d51 100644 --- a/src/migration.ts +++ b/src/migration.ts @@ -10,15 +10,17 @@ import * as fs from 'fs'; import * as mkdirp from 'mkdirp'; import * as path from 'path'; -import MigrationBuilder from './migration-builder'; +import MigrationBuilder, { MigrationBuilderActions } from './migration-builder'; import { getMigrationTableSchema, promisify } from './utils'; +import { DB } from './db'; +import { ColumnDefinitions } from './definitions'; -const readdir = promisify(fs.readdir); // eslint-disable-line security/detect-non-literal-fs-filename -const lstat = promisify(fs.lstat); // eslint-disable-line security/detect-non-literal-fs-filename +const readdir = promisify(fs.readdir); // eslint-disable-line security/detect-non-literal-fs-filename +const lstat = promisify(fs.lstat); // eslint-disable-line security/detect-non-literal-fs-filename const SEPARATOR = '_'; -export const loadMigrationFiles = async (dir, ignorePattern) => { +export const loadMigrationFiles = async (dir: string, ignorePattern) => { const dirContent = await readdir(`${dir}/`); const files = await Promise.all( dirContent.map(async file => { @@ -67,8 +69,8 @@ export default class Migration { return new Migration(null, newFile); } - public readonly db: any; - public readonly path: any; + public readonly db: DB; + public readonly path: string; public readonly name: string; public readonly timestamp: number; public readonly up: any; @@ -78,11 +80,11 @@ export default class Migration { public readonly log: (message?: any, ...optionalParams: any[]) => void; constructor( - db, - migrationPath, - { up, down } = {}, + db: DB | null, + migrationPath: string, + { up, down }: MigrationBuilderActions = {}, options = {}, - typeShorthands, + typeShorthands?: ColumnDefinitions, log = console.log ) { this.db = db; diff --git a/src/runner.ts b/src/runner.ts index ae1b77d5..74886de1 100644 --- a/src/runner.ts +++ b/src/runner.ts @@ -2,8 +2,10 @@ import * as fs from 'fs'; import * as path from 'path'; import { Client } from 'pg'; import { TlsOptions } from 'tls'; -import Db from './db'; +import Db, { DB } from './db'; +import { ColumnDefinitions } from './definitions'; import Migration, { loadMigrationFiles } from './migration'; +import { MigrationBuilderActions } from './migration-builder'; import { createSchemalize, getMigrationTableSchema, @@ -15,19 +17,19 @@ import { // Random but well-known identifier shared by all instances of node-pg-migrate const PG_MIGRATE_LOCK_ID = 7241865325823964; -const readFile = promisify(fs.readFile); // eslint-disable-line security/detect-non-literal-fs-filename +const readFile = promisify(fs.readFile); // eslint-disable-line security/detect-non-literal-fs-filename const idColumn = 'id'; const nameColumn = 'name'; const runOnColumn = 'run_on'; -const loadMigrations = async (db, options, log) => { +const loadMigrations = async (db: DB, options, log) => { try { - let shorthands = {}; + let shorthands: ColumnDefinitions = {}; const files = await loadMigrationFiles(options.dir, options.ignorePattern); return files.map(file => { const filePath = `${options.dir}/${file}`; - const actions = + const actions: MigrationBuilderActions = path.extname(filePath) === '.sql' ? // eslint-disable-next-line security/detect-non-literal-fs-filename { up: async pgm => pgm.sql(await readFile(filePath, 'utf8')) } @@ -209,7 +211,11 @@ export type RunnerOption = RunnerOptionConfig & const runner = async (options: RunnerOption): Promise => { const log = options.log || console.log; - const db = Db(options.dbClient || options.databaseUrl, log); + const db = Db( + (options as RunnerOptionClient).dbClient || + (options as RunnerOptionUrl).databaseUrl, + log + ); try { await db.createConnection(); if (options.schema) { diff --git a/src/utils.ts b/src/utils.ts index e47126b5..90246561 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -171,9 +171,11 @@ export const formatLines = (lines, replace = ' ', separator = ',') => .join(`${separator}\n`) .replace(/^/gm, replace); -export const promisify = fn => (...args) => - new Promise((resolve, reject) => - fn.call(this, ...args, (err, ...result) => - err ? reject(err) : resolve(...result) - ) - ); +export function promisify(fn: (...args) => any): (...args) => Promise { + return (...args) => + new Promise((resolve, reject) => + fn.call(this, ...args, (err, ...result) => + err ? reject(err) : resolve(...result) + ) + ); +} From eb4a432caba9c4a59975edbc188d289d3fe123e3 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Fri, 1 Nov 2019 20:18:48 +0100 Subject: [PATCH 19/57] Use esModuleInterop --- src/migration.ts | 6 +++--- src/operations/extensions.ts | 2 +- src/operations/indexes.ts | 2 +- src/operations/tables.ts | 2 +- src/operations/types.ts | 2 +- src/runner.ts | 4 ++-- tsconfig.json | 1 + 7 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/migration.ts b/src/migration.ts index 9e235d51..09b5934b 100644 --- a/src/migration.ts +++ b/src/migration.ts @@ -6,9 +6,9 @@ */ -import * as fs from 'fs'; -import * as mkdirp from 'mkdirp'; -import * as path from 'path'; +import fs from 'fs'; +import mkdirp from 'mkdirp'; +import path from 'path'; import MigrationBuilder, { MigrationBuilderActions } from './migration-builder'; import { getMigrationTableSchema, promisify } from './utils'; diff --git a/src/operations/extensions.ts b/src/operations/extensions.ts index c929a485..2d0a4688 100644 --- a/src/operations/extensions.ts +++ b/src/operations/extensions.ts @@ -1,4 +1,4 @@ -import * as _ from 'lodash'; +import _ from 'lodash'; export type Extension = | 'adminpack' diff --git a/src/operations/indexes.ts b/src/operations/indexes.ts index cb486463..a167e6b1 100644 --- a/src/operations/indexes.ts +++ b/src/operations/indexes.ts @@ -1,4 +1,4 @@ -import * as _ from 'lodash'; +import _ from 'lodash'; import { DropOptions } from '../definitions'; export interface CreateIndexOptions { diff --git a/src/operations/tables.ts b/src/operations/tables.ts index e36cadf6..2e70a9b6 100644 --- a/src/operations/tables.ts +++ b/src/operations/tables.ts @@ -1,4 +1,4 @@ -import * as _ from 'lodash'; +import _ from 'lodash'; import { escapeValue, applyType, diff --git a/src/operations/types.ts b/src/operations/types.ts index fa66c0ad..900dc0fd 100644 --- a/src/operations/types.ts +++ b/src/operations/types.ts @@ -1,4 +1,4 @@ -import * as _ from 'lodash'; +import _ from 'lodash'; import { applyType, escapeValue } from '../utils'; export function dropType(mOptions) { diff --git a/src/runner.ts b/src/runner.ts index 74886de1..e63c0720 100644 --- a/src/runner.ts +++ b/src/runner.ts @@ -1,5 +1,5 @@ -import * as fs from 'fs'; -import * as path from 'path'; +import fs from 'fs'; +import path from 'path'; import { Client } from 'pg'; import { TlsOptions } from 'tls'; import Db, { DB } from './db'; diff --git a/tsconfig.json b/tsconfig.json index 18dbc41a..0ca39d98 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,6 +5,7 @@ "rootDir": "src", "outDir": "lib", "lib": ["es2017"], + "esModuleInterop": true, "declaration": true, "sourceMap": false, "removeComments": true, From 8d53b9902e344f03469f4ed26b6573870d222cfa Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Fri, 1 Nov 2019 20:25:21 +0100 Subject: [PATCH 20/57] Use module.exports for Migration --- src/migration.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/migration.ts b/src/migration.ts index 09b5934b..8e548d6e 100644 --- a/src/migration.ts +++ b/src/migration.ts @@ -43,7 +43,7 @@ const getLastSuffix = async (dir, ignorePattern) => { } }; -export default class Migration { +export class Migration { // class method that creates a new migration file by cloning the migration template static async create(name, directory, language, ignorePattern) { // ensure the migrations directory exists @@ -189,3 +189,5 @@ export default class Migration { return this.db.query(this._getMarkAsRun(this._getAction(direction))); } } + +module.exports = Migration; From f21569aa70bef4878d0e13ad291f1c6e83808ba4 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Fri, 1 Nov 2019 20:27:05 +0100 Subject: [PATCH 21/57] Use module.exports for db --- src/db.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/db.ts b/src/db.ts index ca7360ad..d53feff4 100644 --- a/src/db.ts +++ b/src/db.ts @@ -23,7 +23,7 @@ export interface DB { close(): Promise; } -export default (connection, log = console.error): DB => { +module.exports = (connection, log = console.error): DB => { const isExternalClient = connection instanceof Client; let clientActive = false; From 36d1d42f61fcbdf759f1cd7e00b4bdcf6525975c Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Fri, 1 Nov 2019 21:16:43 +0100 Subject: [PATCH 22/57] Use module.exports for runner --- src/runner.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runner.ts b/src/runner.ts index e63c0720..fc23a339 100644 --- a/src/runner.ts +++ b/src/runner.ts @@ -295,4 +295,4 @@ runner.default = runner; // workaround for transpilers runner.PgLiteral = PgLiteral; runner.Migration = Migration; -export default runner; +module.exports = runner; From 96d2702dba6cb87a4004cc19b80a4db368858fef Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Fri, 1 Nov 2019 21:38:30 +0100 Subject: [PATCH 23/57] Seems we need both: export default and module.exports --- src/db.ts | 5 ++++- src/migration.ts | 7 ++++--- src/runner.ts | 1 + 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/db.ts b/src/db.ts index d53feff4..5a83e642 100644 --- a/src/db.ts +++ b/src/db.ts @@ -23,7 +23,7 @@ export interface DB { close(): Promise; } -module.exports = (connection, log = console.error): DB => { +const db = (connection, log = console.error): DB => { const isExternalClient = connection instanceof Client; let clientActive = false; @@ -104,3 +104,6 @@ ${err} } }; }; + +export default db; +module.exports = db; diff --git a/src/migration.ts b/src/migration.ts index 8e548d6e..70e45675 100644 --- a/src/migration.ts +++ b/src/migration.ts @@ -75,8 +75,8 @@ export class Migration { public readonly timestamp: number; public readonly up: any; public down: any; - public readonly options: {}; - public readonly typeShorthands: any; + public readonly options: any; + public readonly typeShorthands: ColumnDefinitions; public readonly log: (message?: any, ...optionalParams: any[]) => void; constructor( @@ -114,7 +114,7 @@ export class Migration { } } - async _apply(action, pgm) { + async _apply(action, pgm: MigrationBuilder) { if (action.length === 2) { await new Promise(resolve => action(pgm, resolve)); } else { @@ -190,4 +190,5 @@ export class Migration { } } +export default Migration; module.exports = Migration; diff --git a/src/runner.ts b/src/runner.ts index fc23a339..3002dfb9 100644 --- a/src/runner.ts +++ b/src/runner.ts @@ -295,4 +295,5 @@ runner.default = runner; // workaround for transpilers runner.PgLiteral = PgLiteral; runner.Migration = Migration; +export default runner; module.exports = runner; From 5bac45bbba86c1c6d487274781557979f73e69fd Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Fri, 1 Nov 2019 21:38:50 +0100 Subject: [PATCH 24/57] Improve type definitions --- src/migration-builder.ts | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/migration-builder.ts b/src/migration-builder.ts index 4fab526f..dbe77676 100644 --- a/src/migration-builder.ts +++ b/src/migration-builder.ts @@ -430,13 +430,17 @@ export default class MigrationBuilder { public readonly sql: (sql: string, args?: object) => void; public readonly func: (sql: string) => PgLiteral; - public readonly db: DB; + public readonly db: Partial; - private _steps: any[]; + private _steps: string[]; private _REVERSE_MODE: boolean; private _use_transaction: boolean; - constructor(db: DB, typeShorthands, shouldDecamelize: boolean) { + constructor( + db: DB, + typeShorthands: ColumnDefinitions, + shouldDecamelize: boolean + ) { this._steps = []; this._REVERSE_MODE = false; // by default, all migrations are wrapped in a transaction @@ -583,7 +587,7 @@ export default class MigrationBuilder { }; } - enableReverseMode() { + enableReverseMode(): this { this._REVERSE_MODE = true; return this; } @@ -593,15 +597,15 @@ export default class MigrationBuilder { return this; } - isUsingTransaction() { + isUsingTransaction(): boolean { return this._use_transaction; } - getSql() { + getSql(): string { return `${this.getSqlSteps().join('\n')}\n`; } - getSqlSteps() { + getSqlSteps(): string[] { // in reverse mode, we flip the order of the statements return this._REVERSE_MODE ? this._steps.slice().reverse() : this._steps; } From bf25520f1526d5bce12d6d565a33fdb505f084e7 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Sat, 2 Nov 2019 12:59:12 +0100 Subject: [PATCH 25/57] Improve type definitions --- src/db.ts | 3 ++- src/runner.ts | 9 ++++++--- src/utils.ts | 32 ++++++++++++++++++++------------ 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/db.ts b/src/db.ts index 5a83e642..86b9b3cd 100644 --- a/src/db.ts +++ b/src/db.ts @@ -14,12 +14,13 @@ export interface DB { queryTextOrConfig: string | QueryConfig, values?: any[] ): Promise; - select(queryConfig: QueryConfig): Promise; select( queryTextOrConfig: string | QueryConfig, values?: any[] ): Promise; + column(columnName: 'name', ...args: string[]): Promise; + addBeforeCloseListener: (listener: any) => number; close(): Promise; } diff --git a/src/runner.ts b/src/runner.ts index 3002dfb9..0e770717 100644 --- a/src/runner.ts +++ b/src/runner.ts @@ -52,7 +52,7 @@ const loadMigrations = async (db: DB, options, log) => { } }; -const lock = async db => { +const lock = async (db: DB): Promise => { const { rows: [lockObtained] } = await db.query( @@ -63,7 +63,10 @@ const lock = async db => { } }; -const ensureMigrationsTable = async (db, options) => { +const ensureMigrationsTable = async ( + db: DB, + options: RunnerOption +): Promise => { try { const schema = getMigrationTableSchema(options); const { migrationsTable } = options; @@ -95,7 +98,7 @@ const ensureMigrationsTable = async (db, options) => { } }; -const getRunMigrations = async (db, options) => { +const getRunMigrations = async (db: DB, options: RunnerOption) => { const schema = getMigrationTableSchema(options); const { migrationsTable } = options; const fullTableName = createSchemalize(options.decamelize, true)({ diff --git a/src/utils.ts b/src/utils.ts index 90246561..1450e1d2 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,4 +1,6 @@ import decamelize from 'decamelize'; +import { ColumnDefinitions, Name, Type, Value } from './definitions'; +import { RunnerOption } from './runner'; // This is used to create unescaped strings // exposed in the migrations via pgm.func @@ -25,11 +27,11 @@ export const createSchemalize = ( shouldDecamelize: boolean, shouldQuote: boolean ) => { - const transform: (v: any) => any = [ + const transform: (v: Name) => string = [ shouldDecamelize ? decamelize : identity, shouldQuote ? quote : identity ].reduce((acc, fn) => (fn === identity ? acc : x => acc(fn(x)))); - return v => { + return (v: Name) => { if (typeof v === 'object') { const { schema, name } = v; return (schema ? `${transform(schema)}.` : '') + transform(name); @@ -38,13 +40,16 @@ export const createSchemalize = ( }; }; -export const createTransformer = literal => (s, d) => +export const createTransformer = (literal: (v: Name) => string) => ( + s: string, + d +) => Object.keys(d || {}).reduce( - (str, p) => str.replace(new RegExp(`{${p}}`, 'g'), literal(d[p])), // eslint-disable-line security/detect-non-literal-regexp + (str: string, p) => str.replace(new RegExp(`{${p}}`, 'g'), literal(d[p])), // eslint-disable-line security/detect-non-literal-regexp s ); -export const escapeValue = val => { +export const escapeValue = (val: Value): string | number => { if (val === null) { return 'NULL'; } @@ -76,14 +81,14 @@ export const escapeValue = val => { return ''; }; -export const getSchemas = schema => { +export const getSchemas = (schema: string | string[]): string[] => { const schemas = (Array.isArray(schema) ? schema : [schema]).filter( s => typeof s === 'string' && s.length > 0 ); return schemas.length > 0 ? schemas : ['public']; }; -export const getMigrationTableSchema = options => +export const getMigrationTableSchema = (options: RunnerOption): string => options.migrationsSchema !== undefined ? options.migrationsSchema : getSchemas(options.schema)[0]; @@ -97,22 +102,25 @@ const typeAdapters = { bool: 'boolean' }; -const defaultTypeShorthands = { +const defaultTypeShorthands: ColumnDefinitions = { id: { type: 'serial', primaryKey: true } // convenience type for serial primary keys }; // some convenience adapters -- see above -export const applyTypeAdapters = type => +export const applyTypeAdapters = (type: string): string => typeAdapters[type] ? typeAdapters[type] : type; -export const applyType = (type, extendingTypeShorthands = {}) => { - const typeShorthands = { +export const applyType = ( + type: Type, + extendingTypeShorthands: ColumnDefinitions = {} +) => { + const typeShorthands: ColumnDefinitions = { ...defaultTypeShorthands, ...extendingTypeShorthands }; const options = typeof type === 'string' ? { type } : type; let ext = null; - const types = [options.type]; + const types: string[] = [options.type]; while (typeShorthands[types[types.length - 1]]) { if (ext) { delete ext.type; From fa1851f2de4eb44b02bfd2cb1c4a0da1208803d3 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Sat, 2 Nov 2019 12:59:33 +0100 Subject: [PATCH 26/57] Add MigrationOptions --- src/migration-builder.ts | 8 ++++++- src/operations/domains.ts | 11 +++++---- src/operations/extensions.ts | 5 ++-- src/operations/functions.ts | 9 +++---- src/operations/indexes.ts | 5 ++-- src/operations/operators.ts | 37 ++++++++++++++++++----------- src/operations/other.ts | 5 ++-- src/operations/policies.ts | 10 ++++---- src/operations/roles.ts | 11 +++++---- src/operations/schemas.ts | 8 ++++--- src/operations/sequences.ts | 11 +++++---- src/operations/tables.ts | 34 ++++++++++++++------------ src/operations/triggers.ts | 9 +++---- src/operations/types.ts | 19 ++++++++------- src/operations/views.ts | 13 +++++----- src/operations/viewsMaterialized.ts | 13 +++++----- 16 files changed, 121 insertions(+), 87 deletions(-) diff --git a/src/migration-builder.ts b/src/migration-builder.ts index dbe77676..7db4c72c 100644 --- a/src/migration-builder.ts +++ b/src/migration-builder.ts @@ -72,6 +72,12 @@ export interface MigrationBuilderActions { shorthands?: ColumnDefinitions; } +export interface MigrationOptions { + typeShorthands: ColumnDefinitions; + schemalize: (v: Name) => string; + literal: (v: Name) => string; +} + /* eslint-disable security/detect-non-literal-fs-filename */ export default class MigrationBuilder { public readonly createExtension: ( @@ -461,7 +467,7 @@ export default class MigrationBuilder { ); }; - const options = { + const options: MigrationOptions = { typeShorthands, schemalize: createSchemalize(shouldDecamelize, false), literal: createSchemalize(shouldDecamelize, true) diff --git a/src/operations/domains.ts b/src/operations/domains.ts index 93b301e4..2ddcdb31 100644 --- a/src/operations/domains.ts +++ b/src/operations/domains.ts @@ -1,5 +1,6 @@ -import { applyType, escapeValue } from '../utils'; import { Value } from '../definitions'; +import { MigrationOptions } from '../migration-builder'; +import { applyType, escapeValue } from '../utils'; export interface DomainOptions { default?: Value; @@ -20,7 +21,7 @@ export interface DomainOptionsAlterEn { export type DomainOptionsAlter = DomainOptionsAlterEn & DomainOptions; -export function dropDomain(mOptions) { +export function dropDomain(mOptions: MigrationOptions) { const _drop = (domainName, { ifExists, cascade } = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; @@ -30,7 +31,7 @@ export function dropDomain(mOptions) { return _drop; } -export function createDomain(mOptions) { +export function createDomain(mOptions: MigrationOptions) { const _create = (domainName, type, options = {}) => { const { default: defaultValue, @@ -73,7 +74,7 @@ export function createDomain(mOptions) { return _create; } -export function alterDomain(mOptions) { +export function alterDomain(mOptions: MigrationOptions) { const _alter = (domainName, options) => { const { default: defaultValue, @@ -110,7 +111,7 @@ export function alterDomain(mOptions) { return _alter; } -export function renameDomain(mOptions) { +export function renameDomain(mOptions: MigrationOptions) { const _rename = (domainName, newDomainName) => { const domainNameStr = mOptions.literal(domainName); const newDomainNameStr = mOptions.literal(newDomainName); diff --git a/src/operations/extensions.ts b/src/operations/extensions.ts index 2d0a4688..38c4a37d 100644 --- a/src/operations/extensions.ts +++ b/src/operations/extensions.ts @@ -1,4 +1,5 @@ import _ from 'lodash'; +import { MigrationOptions } from '../migration-builder'; export type Extension = | 'adminpack' @@ -52,7 +53,7 @@ export interface CreateExtensionOptions { schema?: string; } -export function dropExtension(mOptions) { +export function dropExtension(mOptions: MigrationOptions) { const _drop = (extensions, { ifExists, cascade } = {}) => { if (!_.isArray(extensions)) extensions = [extensions]; // eslint-disable-line no-param-reassign const ifExistsStr = ifExists ? ' IF EXISTS' : ''; @@ -65,7 +66,7 @@ export function dropExtension(mOptions) { return _drop; } -export function createExtension(mOptions) { +export function createExtension(mOptions: MigrationOptions) { const _create = (extensions, { ifNotExists, schema } = {}) => { if (!_.isArray(extensions)) extensions = [extensions]; // eslint-disable-line no-param-reassign const ifNotExistsStr = ifNotExists ? ' IF NOT EXISTS' : ''; diff --git a/src/operations/functions.ts b/src/operations/functions.ts index d547eaf3..c3794afe 100644 --- a/src/operations/functions.ts +++ b/src/operations/functions.ts @@ -1,5 +1,6 @@ -import { escapeValue, formatParams } from '../utils'; import { Value } from '../definitions'; +import { MigrationOptions } from '../migration-builder'; +import { escapeValue, formatParams } from '../utils'; export interface FunctionParamType { mode?: 'IN' | 'OUT' | 'INOUT' | 'VARIADIC'; @@ -20,7 +21,7 @@ export interface FunctionOptions { parallel?: 'UNSAFE' | 'RESTRICTED' | 'SAFE'; } -export function dropFunction(mOptions) { +export function dropFunction(mOptions: MigrationOptions) { const _drop = ( functionName, functionParams = [], @@ -35,7 +36,7 @@ export function dropFunction(mOptions) { return _drop; } -export function createFunction(mOptions) { +export function createFunction(mOptions: MigrationOptions) { const _create = ( functionName, functionParams = [], @@ -85,7 +86,7 @@ export function createFunction(mOptions) { return _create; } -export function renameFunction(mOptions) { +export function renameFunction(mOptions: MigrationOptions) { const _rename = (oldFunctionName, functionParams = [], newFunctionName) => { const paramsStr = formatParams(functionParams, mOptions); const oldFunctionNameStr = mOptions.literal(oldFunctionName); diff --git a/src/operations/indexes.ts b/src/operations/indexes.ts index a167e6b1..638aedd5 100644 --- a/src/operations/indexes.ts +++ b/src/operations/indexes.ts @@ -1,5 +1,6 @@ import _ from 'lodash'; import { DropOptions } from '../definitions'; +import { MigrationOptions } from '../migration-builder'; export interface CreateIndexOptions { name?: string; @@ -49,7 +50,7 @@ function generateColumnsString(columns, literal) { : generateColumnString(columns, literal); } -export function dropIndex(mOptions) { +export function dropIndex(mOptions: MigrationOptions) { const _drop = (tableName, columns, options = {}) => { const { concurrently, ifExists, cascade } = options; const concurrentlyStr = concurrently ? ' CONCURRENTLY' : ''; @@ -63,7 +64,7 @@ export function dropIndex(mOptions) { return _drop; } -export function createIndex(mOptions) { +export function createIndex(mOptions: MigrationOptions) { const _create = (tableName, columns, options = {}) => { /* columns - the column, columns, or expression to create the index on diff --git a/src/operations/operators.ts b/src/operations/operators.ts index 11be9720..7191e6ad 100644 --- a/src/operations/operators.ts +++ b/src/operations/operators.ts @@ -1,6 +1,7 @@ -import { formatParams, applyType } from '../utils'; -import { FunctionParam } from './functions'; import { Name } from '../definitions'; +import { MigrationOptions } from '../migration-builder'; +import { applyType, formatParams } from '../utils'; +import { FunctionParam } from './functions'; export interface CreateOperatorOptions { procedure: Name; @@ -33,8 +34,8 @@ export interface OperatorListDefinition { params?: FunctionParam[]; } -export function dropOperator(mOptions) { - const _drop = (operatorName, options = {}) => { +export function dropOperator(mOptions: MigrationOptions) { + const _drop = (operatorName, options: DropOperatorOptions = {}) => { const { ifExists, cascade, left, right } = options; const operatorNameStr = mOptions.schemalize(operatorName); @@ -49,8 +50,8 @@ export function dropOperator(mOptions) { return _drop; } -export function createOperator(mOptions) { - const _create = (operatorName, options = {}) => { +export function createOperator(mOptions: MigrationOptions) { + const _create = (operatorName, options: CreateOperatorOptions = {}) => { const { procedure, left, @@ -96,7 +97,7 @@ export function createOperator(mOptions) { return _create; } -export function dropOperatorFamily(mOptions) { +export function dropOperatorFamily(mOptions: MigrationOptions) { const _drop = ( operatorFamilyName, indexMethod, @@ -110,7 +111,7 @@ export function dropOperatorFamily(mOptions) { return _drop; } -export function createOperatorFamily(mOptions) { +export function createOperatorFamily(mOptions: MigrationOptions) { const _create = (operatorFamilyName, indexMethod) => { const operatorFamilyNameStr = mOptions.literal(operatorFamilyName); return `CREATE OPERATOR FAMILY ${operatorFamilyNameStr} USING ${indexMethod};`; @@ -119,7 +120,12 @@ export function createOperatorFamily(mOptions) { return _create; } -const operatorMap = mOptions => ({ type = '', number, name, params = [] }) => { +const operatorMap = (mOptions: MigrationOptions) => ({ + type = '', + number, + name, + params = [] +}) => { const nameStr = mOptions.literal(name); if (String(type).toLowerCase() === 'function') { if (params.length > 2) { @@ -138,7 +144,10 @@ const operatorMap = mOptions => ({ type = '', number, name, params = [] }) => { throw new Error('Operator "type" must be either "function" or "operator"'); }; -const changeOperatorFamily = (op, reverse) => mOptions => { +const changeOperatorFamily = ( + op, + reverse?: (mOptions: MigrationOptions) => any +) => (mOptions: MigrationOptions) => { const method = (operatorFamilyName, indexMethod, operatorList) => { const operatorFamilyNameStr = mOptions.literal(operatorFamilyName); const operatorListStr = operatorList @@ -160,7 +169,7 @@ export const addToOperatorFamily = changeOperatorFamily( removeFromOperatorFamily ); -export function renameOperatorFamily(mOptions) { +export function renameOperatorFamily(mOptions: MigrationOptions) { const _rename = ( oldOperatorFamilyName, indexMethod, @@ -179,7 +188,7 @@ export function renameOperatorFamily(mOptions) { return _rename; } -export function dropOperatorClass(mOptions) { +export function dropOperatorClass(mOptions: MigrationOptions) { const _drop = ( operatorClassName, indexMethod, @@ -194,7 +203,7 @@ export function dropOperatorClass(mOptions) { return _drop; } -export function createOperatorClass(mOptions) { +export function createOperatorClass(mOptions: MigrationOptions) { const _create = ( operatorClassName, type, @@ -225,7 +234,7 @@ export function createOperatorClass(mOptions) { return _create; } -export function renameOperatorClass(mOptions) { +export function renameOperatorClass(mOptions: MigrationOptions) { const _rename = (oldOperatorClassName, indexMethod, newOperatorClassName) => { const oldOperatorClassNameStr = mOptions.literal(oldOperatorClassName); const newOperatorClassNameStr = mOptions.literal(newOperatorClassName); diff --git a/src/operations/other.ts b/src/operations/other.ts index 04f2100d..f8faf694 100644 --- a/src/operations/other.ts +++ b/src/operations/other.ts @@ -1,10 +1,11 @@ +import { MigrationOptions } from '../migration-builder'; import { createTransformer } from '../utils'; -export function sql(mOptions) { +export function sql(mOptions: MigrationOptions) { const t = createTransformer(mOptions.literal); return (...args) => { // applies some very basic templating using the utils.p - let s = t(...args); + let s: string = t(...args); // add trailing ; if not present if (s.lastIndexOf(';') !== s.length - 1) { s += ';'; diff --git a/src/operations/policies.ts b/src/operations/policies.ts index 51a5b8ad..3bf74c7d 100644 --- a/src/operations/policies.ts +++ b/src/operations/policies.ts @@ -1,3 +1,5 @@ +import { MigrationOptions } from '../migration-builder'; + export interface PolicyOptions { role: string | string[]; using: string; @@ -25,7 +27,7 @@ const makeClauses = ({ role, using, check }) => { return clauses; }; -export function dropPolicy(mOptions) { +export function dropPolicy(mOptions: MigrationOptions) { const _drop = (tableName, policyName, { ifExists } = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const policyNameStr = mOptions.literal(policyName); @@ -35,7 +37,7 @@ export function dropPolicy(mOptions) { return _drop; } -export function createPolicy(mOptions) { +export function createPolicy(mOptions: MigrationOptions) { const _create = (tableName, policyName, options = {}) => { const createOptions = { ...options, @@ -54,7 +56,7 @@ export function createPolicy(mOptions) { return _create; } -export function alterPolicy(mOptions) { +export function alterPolicy(mOptions: MigrationOptions) { const _alter = (tableName, policyName, options = {}) => { const clausesStr = makeClauses(options).join(' '); const policyNameStr = mOptions.literal(policyName); @@ -64,7 +66,7 @@ export function alterPolicy(mOptions) { return _alter; } -export function renamePolicy(mOptions) { +export function renamePolicy(mOptions: MigrationOptions) { const _rename = (tableName, policyName, newPolicyName) => { const policyNameStr = mOptions.literal(policyName); const newPolicyNameStr = mOptions.literal(newPolicyName); diff --git a/src/operations/roles.ts b/src/operations/roles.ts index 20050ca8..4a461727 100644 --- a/src/operations/roles.ts +++ b/src/operations/roles.ts @@ -1,6 +1,7 @@ import { isArray } from 'lodash'; -import { escapeValue } from '../utils'; import { Value } from '../definitions'; +import { MigrationOptions } from '../migration-builder'; +import { escapeValue } from '../utils'; export interface RoleOptions { superuser?: boolean; @@ -78,7 +79,7 @@ const formatRoleOptions = (roleOptions = {}) => { return options.join(' '); }; -export function dropRole(mOptions) { +export function dropRole(mOptions: MigrationOptions) { const _drop = (roleName, { ifExists } = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const roleNameStr = mOptions.literal(roleName); @@ -87,7 +88,7 @@ export function dropRole(mOptions) { return _drop; } -export function createRole(mOptions) { +export function createRole(mOptions: MigrationOptions) { const _create = (roleName, roleOptions = {}) => { const options = formatRoleOptions({ ...roleOptions, @@ -105,7 +106,7 @@ export function createRole(mOptions) { return _create; } -export function alterRole(mOptions) { +export function alterRole(mOptions: MigrationOptions) { const _alter = (roleName, roleOptions = {}) => { const options = formatRoleOptions(roleOptions); return options @@ -115,7 +116,7 @@ export function alterRole(mOptions) { return _alter; } -export function renameRole(mOptions) { +export function renameRole(mOptions: MigrationOptions) { const _rename = (oldRoleName, newRoleName) => { const oldRoleNameStr = mOptions.literal(oldRoleName); const newRoleNameStr = mOptions.literal(newRoleName); diff --git a/src/operations/schemas.ts b/src/operations/schemas.ts index f8f85d70..7cf1c072 100644 --- a/src/operations/schemas.ts +++ b/src/operations/schemas.ts @@ -1,4 +1,6 @@ -export function dropSchema(mOptions) { +import { MigrationOptions } from '../migration-builder'; + +export function dropSchema(mOptions: MigrationOptions) { const _drop = (schemaName, { ifExists, cascade } = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; @@ -8,7 +10,7 @@ export function dropSchema(mOptions) { return _drop; } -export function createSchema(mOptions) { +export function createSchema(mOptions: MigrationOptions) { const _create = (schemaName, { ifNotExists, authorization } = {}) => { const ifNotExistsStr = ifNotExists ? ' IF NOT EXISTS' : ''; const schemaNameStr = mOptions.literal(schemaName); @@ -21,7 +23,7 @@ export function createSchema(mOptions) { return _create; } -export function renameSchema(mOptions) { +export function renameSchema(mOptions: MigrationOptions) { const _rename = (schemaName, newSchemaName) => { const schemaNameStr = mOptions.literal(schemaName); const newSchemaNameStr = mOptions.literal(newSchemaName); diff --git a/src/operations/sequences.ts b/src/operations/sequences.ts index c06a2aaa..58c6128a 100644 --- a/src/operations/sequences.ts +++ b/src/operations/sequences.ts @@ -1,5 +1,6 @@ -import { applyType } from '../utils'; import { Type } from '../definitions'; +import { MigrationOptions } from '../migration-builder'; +import { applyType } from '../utils'; export interface SequenceOptions { type?: Type; @@ -72,7 +73,7 @@ export const parseSequenceOptions = (typeShorthands, options) => { return clauses; }; -export function dropSequence(mOptions) { +export function dropSequence(mOptions: MigrationOptions) { const _drop = (sequenceName, { ifExists, cascade } = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; @@ -82,7 +83,7 @@ export function dropSequence(mOptions) { return _drop; } -export function createSequence(mOptions) { +export function createSequence(mOptions: MigrationOptions) { const _create = (sequenceName, options = {}) => { const { temporary, ifNotExists } = options; const temporaryStr = temporary ? ' TEMPORARY' : ''; @@ -99,7 +100,7 @@ export function createSequence(mOptions) { return _create; } -export function alterSequence(mOptions) { +export function alterSequence(mOptions: MigrationOptions) { return (sequenceName, options) => { const { restart } = options; const clauses = parseSequenceOptions(mOptions.typeShorthands, options); @@ -115,7 +116,7 @@ export function alterSequence(mOptions) { }; } -export function renameSequence(mOptions) { +export function renameSequence(mOptions: MigrationOptions) { const _rename = (sequenceName, newSequenceName) => { const sequenceNameStr = mOptions.literal(sequenceName); const newSequenceNameStr = mOptions.literal(newSequenceName); diff --git a/src/operations/tables.ts b/src/operations/tables.ts index 2e70a9b6..fe20c4db 100644 --- a/src/operations/tables.ts +++ b/src/operations/tables.ts @@ -1,13 +1,14 @@ import _ from 'lodash'; +import { LikeOptions, Name, ReferencesOptions, Value } from '../definitions'; +import { MigrationOptions } from '../migration-builder'; import { - escapeValue, applyType, applyTypeAdapters, comment, + escapeValue, formatLines } from '../utils'; import { parseSequenceOptions } from './sequences'; -import { Name, Value, LikeOptions, ReferencesOptions } from '../definitions'; export interface ForeignKeyOptions extends ReferencesOptions { columns: Name | Name[]; @@ -61,7 +62,7 @@ const parseReferences = (options, literal) => { const parseDeferrable = options => `DEFERRABLE INITIALLY ${options.deferred ? 'DEFERRED' : 'IMMEDIATE'}`; -const parseColumns = (tableName, columns, mOptions) => { +const parseColumns = (tableName, columns, mOptions: MigrationOptions) => { const extendingTypeShorthands = mOptions.typeShorthands; let columnsWithOptions = _.mapValues(columns, column => applyType(column, extendingTypeShorthands) @@ -291,7 +292,7 @@ const parseLike = (like, literal) => { }; // TABLE -export function dropTable(mOptions) { +export function dropTable(mOptions: MigrationOptions) { const _drop = (tableName, { ifExists, cascade } = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; @@ -301,7 +302,7 @@ export function dropTable(mOptions) { return _drop; } -export function createTable(mOptions) { +export function createTable(mOptions: MigrationOptions) { const _create = (tableName, columns, options = {}) => { const { temporary, @@ -327,7 +328,10 @@ export function createTable(mOptions) { ); } - const constraints = { ...optionsConstraints, ...crossColumnConstraints }; + const constraints = { + ...optionsConstraints, + ...crossColumnConstraints + }; const { constraints: constraintLines, comments: constraintComments @@ -360,7 +364,7 @@ ${formatLines(tableDefinition)} return _create; } -export function alterTable(mOptions) { +export function alterTable(mOptions: MigrationOptions) { const _alter = (tableName, options) => { const alterDefinition = []; if (options.levelSecurity) { @@ -387,7 +391,7 @@ export interface AlterColumnOptions { | ({ precedence: 'ALWAYS' | 'BY DEFAULT' } & SequenceOptions); } -export function dropColumns(mOptions) { +export function dropColumns(mOptions: MigrationOptions) { const _drop = (tableName, columns, { ifExists, cascade } = {}) => { if (typeof columns === 'string') { columns = [columns]; // eslint-disable-line no-param-reassign @@ -405,7 +409,7 @@ ${columnsStr};`; return _drop; } -export function addColumns(mOptions) { +export function addColumns(mOptions: MigrationOptions) { const _add = (tableName, columns, { ifNotExists } = {}) => { const { columns: columnLines, @@ -425,7 +429,7 @@ export function addColumns(mOptions) { return _add; } -export function alterColumn(mOptions) { +export function alterColumn(mOptions: MigrationOptions) { return (tableName, columnName, options) => { const { default: defaultValue, @@ -493,7 +497,7 @@ export function alterColumn(mOptions) { }; } -export function renameTable(mOptions) { +export function renameTable(mOptions: MigrationOptions) { const _rename = (tableName, newName) => { const tableNameStr = mOptions.literal(tableName); const newNameStr = mOptions.literal(newName); @@ -503,7 +507,7 @@ export function renameTable(mOptions) { return _rename; } -export function renameColumn(mOptions) { +export function renameColumn(mOptions: MigrationOptions) { const _rename = (tableName, columnName, newName) => { const tableNameStr = mOptions.literal(tableName); const columnNameStr = mOptions.literal(columnName); @@ -515,7 +519,7 @@ export function renameColumn(mOptions) { return _rename; } -export function renameConstraint(mOptions) { +export function renameConstraint(mOptions: MigrationOptions) { const _rename = (tableName, constraintName, newName) => { const tableNameStr = mOptions.literal(tableName); const constraintNameStr = mOptions.literal(constraintName); @@ -527,7 +531,7 @@ export function renameConstraint(mOptions) { return _rename; } -export function dropConstraint(mOptions) { +export function dropConstraint(mOptions: MigrationOptions) { const _drop = (tableName, constraintName, { ifExists, cascade } = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; @@ -537,7 +541,7 @@ export function dropConstraint(mOptions) { }; return _drop; } -export function addConstraint(mOptions) { +export function addConstraint(mOptions: MigrationOptions) { const _add = (tableName, constraintName, expression) => { const { constraints, comments } = typeof expression === 'string' diff --git a/src/operations/triggers.ts b/src/operations/triggers.ts index acfb45cd..3b1e0256 100644 --- a/src/operations/triggers.ts +++ b/src/operations/triggers.ts @@ -1,7 +1,8 @@ import { isArray } from 'lodash'; +import { Name, Value } from '../definitions'; +import { MigrationOptions } from '../migration-builder'; import { escapeValue } from '../utils'; import { createFunction, dropFunction } from './functions'; -import { Name, Value } from '../definitions'; export interface TriggerOptions { when?: 'BEFORE' | 'AFTER' | 'INSTEAD OF'; @@ -15,7 +16,7 @@ export interface TriggerOptions { deferred?: boolean; } -export function dropTrigger(mOptions) { +export function dropTrigger(mOptions: MigrationOptions) { const _drop = (tableName, triggerName, { ifExists, cascade } = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; @@ -26,7 +27,7 @@ export function dropTrigger(mOptions) { return _drop; } -export function createTrigger(mOptions) { +export function createTrigger(mOptions: MigrationOptions) { const _create = (tableName, triggerName, triggerOptions = {}, definition) => { const { constraint, @@ -114,7 +115,7 @@ export function createTrigger(mOptions) { return _create; } -export function renameTrigger(mOptions) { +export function renameTrigger(mOptions: MigrationOptions) { const _rename = (tableName, oldTriggerName, newTriggerName) => { const oldTriggerNameStr = mOptions.literal(oldTriggerName); const tableNameStr = mOptions.literal(tableName); diff --git a/src/operations/types.ts b/src/operations/types.ts index 900dc0fd..36ff2682 100644 --- a/src/operations/types.ts +++ b/src/operations/types.ts @@ -1,7 +1,8 @@ import _ from 'lodash'; +import { MigrationOptions } from '../migration-builder'; import { applyType, escapeValue } from '../utils'; -export function dropType(mOptions) { +export function dropType(mOptions: MigrationOptions) { const _drop = (typeName, { ifExists, cascade } = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; @@ -11,7 +12,7 @@ export function dropType(mOptions) { return _drop; } -export function createType(mOptions) { +export function createType(mOptions: MigrationOptions) { const _create = (typeName, options) => { if (_.isArray(options)) { const optionsStr = options.map(escapeValue).join(', '); @@ -28,7 +29,7 @@ export function createType(mOptions) { return _create; } -export function dropTypeAttribute(mOptions) { +export function dropTypeAttribute(mOptions: MigrationOptions) { const _drop = (typeName, attributeName, { ifExists } = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const typeNameStr = mOptions.literal(typeName); @@ -38,7 +39,7 @@ export function dropTypeAttribute(mOptions) { return _drop; } -export function addTypeAttribute(mOptions) { +export function addTypeAttribute(mOptions: MigrationOptions) { const _alterAttributeAdd = (typeName, attributeName, attributeType) => { const typeStr = applyType(attributeType, mOptions.typeShorthands).type; const typeNameStr = mOptions.literal(typeName); @@ -50,7 +51,7 @@ export function addTypeAttribute(mOptions) { return _alterAttributeAdd; } -export function setTypeAttribute(mOptions) { +export function setTypeAttribute(mOptions: MigrationOptions) { return (typeName, attributeName, attributeType) => { const typeStr = applyType(attributeType, mOptions.typeShorthands).type; const typeNameStr = mOptions.literal(typeName); @@ -60,7 +61,7 @@ export function setTypeAttribute(mOptions) { }; } -export function addTypeValue(mOptions) { +export function addTypeValue(mOptions: MigrationOptions) { const _add = (typeName, value, options = {}) => { const { ifNotExists, before, after } = options; @@ -78,7 +79,7 @@ export function addTypeValue(mOptions) { return _add; } -export function renameType(mOptions) { +export function renameType(mOptions: MigrationOptions) { const _rename = (typeName, newTypeName) => { const typeNameStr = mOptions.literal(typeName); const newTypeNameStr = mOptions.literal(newTypeName); @@ -88,7 +89,7 @@ export function renameType(mOptions) { return _rename; } -export function renameTypeAttribute(mOptions) { +export function renameTypeAttribute(mOptions: MigrationOptions) { const _rename = (typeName, attributeName, newAttributeName) => { const typeNameStr = mOptions.literal(typeName); const attributeNameStr = mOptions.literal(attributeName); @@ -100,7 +101,7 @@ export function renameTypeAttribute(mOptions) { return _rename; } -export function renameTypeValue(mOptions) { +export function renameTypeValue(mOptions: MigrationOptions) { const _rename = (typeName, value, newValue) => { const valueStr = escapeValue(value); const newValueStr = escapeValue(newValue); diff --git a/src/operations/views.ts b/src/operations/views.ts index a1ff8f09..6d0c8765 100644 --- a/src/operations/views.ts +++ b/src/operations/views.ts @@ -1,5 +1,6 @@ -import { escapeValue } from '../utils'; import { Value } from '../definitions'; +import { MigrationOptions } from '../migration-builder'; +import { escapeValue } from '../utils'; export interface CreateViewOptions { temporary?: boolean; @@ -17,7 +18,7 @@ export interface AlterViewColumnOptions { default?: Value; } -export function dropView(mOptions) { +export function dropView(mOptions: MigrationOptions) { const _drop = (viewName, { ifExists, cascade } = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; @@ -27,7 +28,7 @@ export function dropView(mOptions) { return _drop; } -export function createView(mOptions) { +export function createView(mOptions: MigrationOptions) { const _create = (viewName, options, definition) => { const { temporary, @@ -53,7 +54,7 @@ export function createView(mOptions) { return _create; } -export function alterView(mOptions) { +export function alterView(mOptions: MigrationOptions) { const _alter = (viewName, options) => { const { checkOption } = options; const clauses = []; @@ -71,7 +72,7 @@ export function alterView(mOptions) { return _alter; } -export function alterViewColumn(mOptions) { +export function alterViewColumn(mOptions: MigrationOptions) { const _alter = (viewName, columnName, options) => { const { default: defaultValue } = options; const actions = []; @@ -92,7 +93,7 @@ export function alterViewColumn(mOptions) { return _alter; } -export function renameView(mOptions) { +export function renameView(mOptions: MigrationOptions) { const _rename = (viewName, newViewName) => { const viewNameStr = mOptions.literal(viewName); const newViewNameStr = mOptions.literal(newViewName); diff --git a/src/operations/viewsMaterialized.ts b/src/operations/viewsMaterialized.ts index e8e4552f..89b3e9b3 100644 --- a/src/operations/viewsMaterialized.ts +++ b/src/operations/viewsMaterialized.ts @@ -1,3 +1,4 @@ +import { MigrationOptions } from '../migration-builder'; import { formatLines } from '../utils'; export interface CreateMaterializedViewOptions { @@ -27,7 +28,7 @@ const storageParameterStr = storageParameters => key => { return `${key}${value}`; }; -export function dropMaterializedView(mOptions) { +export function dropMaterializedView(mOptions: MigrationOptions) { const _drop = (viewName, { ifExists, cascade } = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; @@ -37,7 +38,7 @@ export function dropMaterializedView(mOptions) { return _drop; } -export function createMaterializedView(mOptions) { +export function createMaterializedView(mOptions: MigrationOptions) { const _create = (viewName, options, definition) => { const { ifNotExists, @@ -67,7 +68,7 @@ export function createMaterializedView(mOptions) { return _create; } -export function alterMaterializedView(mOptions) { +export function alterMaterializedView(mOptions: MigrationOptions) { const _alter = (viewName, options) => { const { cluster, extension, storageParameters = {} } = options; const clauses = []; @@ -101,7 +102,7 @@ export function alterMaterializedView(mOptions) { return _alter; } -export function renameMaterializedView(mOptions) { +export function renameMaterializedView(mOptions: MigrationOptions) { const _rename = (viewName, newViewName) => { const viewNameStr = mOptions.literal(viewName); const newViewNameStr = mOptions.literal(newViewName); @@ -111,7 +112,7 @@ export function renameMaterializedView(mOptions) { return _rename; } -export function renameMaterializedViewColumn(mOptions) { +export function renameMaterializedViewColumn(mOptions: MigrationOptions) { const _rename = (viewName, columnName, newColumnName) => { const viewNameStr = mOptions.literal(viewName); const columnNameStr = mOptions.literal(columnName); @@ -123,7 +124,7 @@ export function renameMaterializedViewColumn(mOptions) { return _rename; } -export function refreshMaterializedView(mOptions) { +export function refreshMaterializedView(mOptions: MigrationOptions) { const _refresh = (viewName, { concurrently, data } = {}) => { const concurrentlyStr = concurrently ? ' CONCURRENTLY' : ''; const dataStr = dataClause(data); From 8d3931e6e5fc6351142dcf5234e81a9f6f42af07 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Sat, 2 Nov 2019 13:33:51 +0100 Subject: [PATCH 27/57] Add build command --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index d10a8e41..f8f669d4 100644 --- a/package.json +++ b/package.json @@ -88,6 +88,7 @@ "dotenv": ">=1.0.0" }, "scripts": { + "build": "(tsc || true) && cp src/migration-template.* lib/", "compile": "babel lib/ -d dist/ && cp lib/migration-template.* dist/", "test": "cross-env NODE_ENV=test mocha --opts ./mocha.opts test", "migrate": "node bin/node-pg-migrate", From 1c4b9ed1b8a3e9b60c67b0c99b4972abc90584ff Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Sat, 2 Nov 2019 13:34:17 +0100 Subject: [PATCH 28/57] Undo formatting From 2fadf9dfa7f5db90684e9c13ce6e26cd0828225e Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Sat, 2 Nov 2019 13:34:48 +0100 Subject: [PATCH 29/57] Add type MigrationDirection --- src/migration.ts | 7 ++++--- src/runner.ts | 6 ++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/migration.ts b/src/migration.ts index 70e45675..997b327e 100644 --- a/src/migration.ts +++ b/src/migration.ts @@ -14,6 +14,7 @@ import MigrationBuilder, { MigrationBuilderActions } from './migration-builder'; import { getMigrationTableSchema, promisify } from './utils'; import { DB } from './db'; import { ColumnDefinitions } from './definitions'; +import { MigrationDirection } from './runner'; const readdir = promisify(fs.readdir); // eslint-disable-line security/detect-non-literal-fs-filename const lstat = promisify(fs.lstat); // eslint-disable-line security/detect-non-literal-fs-filename @@ -147,7 +148,7 @@ export class Migration { ); } - _getAction(direction) { + _getAction(direction: MigrationDirection) { if (direction === 'down') { if (this.down === false) { throw new Error( @@ -169,7 +170,7 @@ export class Migration { return action; } - apply(direction) { + apply(direction: MigrationDirection) { const pgm = new MigrationBuilder( this.db, this.typeShorthands, @@ -185,7 +186,7 @@ export class Migration { return this._apply(action, pgm); } - markAsRun(direction) { + markAsRun(direction: MigrationDirection) { return this.db.query(this._getMarkAsRun(this._getAction(direction))); } } diff --git a/src/runner.ts b/src/runner.ts index 0e770717..798208e1 100644 --- a/src/runner.ts +++ b/src/runner.ts @@ -161,7 +161,9 @@ const checkOrder = (runNames, migrations) => { } }; -const runMigrations = (toRun, method, direction) => +export type MigrationDirection = 'up' | 'down'; + +const runMigrations = (toRun, method, direction: MigrationDirection) => toRun.reduce( (promise, migration) => promise.then(() => migration[method](direction)), Promise.resolve() @@ -173,7 +175,7 @@ export interface RunnerOptionConfig { schema?: string | string[]; dir: string; checkOrder?: boolean; - direction: 'up' | 'down'; + direction: MigrationDirection; count: number; timestamp?: boolean; ignorePattern: string; From 4af4c95cc20a17a4a4d788a41c802ab3ce773362 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Sat, 2 Nov 2019 13:39:28 +0100 Subject: [PATCH 30/57] Add build before compile --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f8f669d4..0243a5f1 100644 --- a/package.json +++ b/package.json @@ -94,7 +94,7 @@ "migrate": "node bin/node-pg-migrate", "lint": "eslint . bin/*", "lintfix": "npm run lint -- --fix && prettier --write *.json *.md docs/*.md", - "prepare": "npm run compile" + "prepare": "npm run build && npm run compile" }, "husky": { "hooks": { From b0b49b1dc877899959dea857be740bdc06c1588f Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Sat, 2 Nov 2019 13:53:45 +0100 Subject: [PATCH 31/57] Add interface RunMigration --- src/migration.ts | 8 +- src/runner.ts | 18 +- yarn.lock | 4529 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 4549 insertions(+), 6 deletions(-) create mode 100644 yarn.lock diff --git a/src/migration.ts b/src/migration.ts index 997b327e..5b4af40e 100644 --- a/src/migration.ts +++ b/src/migration.ts @@ -44,7 +44,13 @@ const getLastSuffix = async (dir, ignorePattern) => { } }; -export class Migration { +export interface RunMigration { + readonly path: string; + readonly name: string; + readonly timestamp: number; +} + +export class Migration implements RunMigration { // class method that creates a new migration file by cloning the migration template static async create(name, directory, language, ignorePattern) { // ensure the migrations directory exists diff --git a/src/runner.ts b/src/runner.ts index 798208e1..0ae4a2d6 100644 --- a/src/runner.ts +++ b/src/runner.ts @@ -4,7 +4,7 @@ import { Client } from 'pg'; import { TlsOptions } from 'tls'; import Db, { DB } from './db'; import { ColumnDefinitions } from './definitions'; -import Migration, { loadMigrationFiles } from './migration'; +import Migration, { loadMigrationFiles, RunMigration } from './migration'; import { MigrationBuilderActions } from './migration-builder'; import { createSchemalize, @@ -111,9 +111,13 @@ const getRunMigrations = async (db: DB, options: RunnerOption) => { ); }; -const getMigrationsToRun = (options, runNames, migrations) => { +const getMigrationsToRun = ( + options: RunnerOption, + runNames: string[], + migrations: Migration[] +): Migration[] => { if (options.direction === 'down') { - const downMigrations = runNames + const downMigrations: Migration[] = runNames .filter(migrationName => !options.file || options.file === migrationName) .map( migrationName => @@ -214,7 +218,7 @@ export interface RunnerOptionClient { export type RunnerOption = RunnerOptionConfig & (RunnerOptionClient | RunnerOptionUrl); -const runner = async (options: RunnerOption): Promise => { +const runner = async (options: RunnerOption): Promise => { const log = options.log || console.log; const db = Db( (options as RunnerOptionClient).dbClient || @@ -257,7 +261,11 @@ const runner = async (options: RunnerOption): Promise => { checkOrder(runNames, migrations); } - const toRun = getMigrationsToRun(options, runNames, migrations); + const toRun: Migration[] = getMigrationsToRun( + options, + runNames, + migrations + ); if (!toRun.length) { log('No migrations to run!'); diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..18bff212 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4529 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/cli@7.6.4": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.6.4.tgz#9b35a4e15fa7d8f487418aaa8229c8b0bc815f20" + integrity sha512-tqrDyvPryBM6xjIyKKUwr3s8CzmmYidwgdswd7Uc/Cv0ogZcuS1TYQTLx/eWKP3UbJ6JxZAiYlBZabXm/rtRsQ== + dependencies: + commander "^2.8.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.1.0" + glob "^7.0.0" + lodash "^4.17.13" + mkdirp "^0.5.1" + output-file-sync "^2.0.0" + slash "^2.0.0" + source-map "^0.5.0" + optionalDependencies: + chokidar "^2.1.8" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" + integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/core@7.6.4": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.6.4.tgz#6ebd9fe00925f6c3e177bb726a188b5f578088ff" + integrity sha512-Rm0HGw101GY8FTzpWSyRbki/jzq+/PkNQJ+nSulrdY6gFGOsNseCqD6KHRYe2E+EdzuBdr2pxCp6s4Uk6eJ+XQ== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.6.4" + "@babel/helpers" "^7.6.2" + "@babel/parser" "^7.6.4" + "@babel/template" "^7.6.0" + "@babel/traverse" "^7.6.3" + "@babel/types" "^7.6.3" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.6.3", "@babel/generator@^7.6.4": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.4.tgz#a4f8437287bf9671b07f483b76e3bb731bc97671" + integrity sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w== + dependencies: + "@babel/types" "^7.6.3" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-call-delegate@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" + integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ== + dependencies: + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/helper-define-map@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz#3dec32c2046f37e09b28c93eb0b103fd2a25d369" + integrity sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.5.5" + lodash "^4.17.13" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-hoist-variables@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" + integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/helper-member-expression-to-functions@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz#1fb5b8ec4453a93c439ee9fe3aeea4a84b76b590" + integrity sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA== + dependencies: + "@babel/types" "^7.5.5" + +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz#f84ff8a09038dcbca1fd4355661a500937165b4a" + integrity sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/template" "^7.4.4" + "@babel/types" "^7.5.5" + lodash "^4.17.13" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" + integrity sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw== + dependencies: + lodash "^4.17.13" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz#f84ce43df031222d2bad068d2626cb5799c34bc2" + integrity sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.5.5" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.5.5" + "@babel/types" "^7.5.5" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" + integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/helper-wrap-function@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" + integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.2.0" + +"@babel/helpers@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.6.2.tgz#681ffe489ea4dcc55f23ce469e58e59c1c045153" + integrity sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA== + dependencies: + "@babel/template" "^7.6.0" + "@babel/traverse" "^7.6.2" + "@babel/types" "^7.6.0" + +"@babel/highlight@^7.0.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" + integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.0.0", "@babel/parser@^7.6.0", "@babel/parser@^7.6.3", "@babel/parser@^7.6.4": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.4.tgz#cb9b36a7482110282d5cb6dd424ec9262b473d81" + integrity sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A== + +"@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" + integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + +"@babel/plugin-proposal-dynamic-import@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz#e532202db4838723691b10a67b8ce509e397c506" + integrity sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.2.0" + +"@babel/plugin-proposal-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" + integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + +"@babel/plugin-proposal-object-rest-spread@7.6.2", "@babel/plugin-proposal-object-rest-spread@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz#8ffccc8f3a6545e9f78988b6bf4fe881b88e8096" + integrity sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" + integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz#05413762894f41bfe42b9a5e80919bd575dcc802" + integrity sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.6.0" + +"@babel/plugin-syntax-async-generators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" + integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-dynamic-import@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" + integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" + integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" + integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" + integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz#89a3848a0166623b5bc481164b5936ab947e887e" + integrity sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" + integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.6.3": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz#6e854e51fbbaa84351b15d4ddafe342f3a5d542a" + integrity sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.13" + +"@babel/plugin-transform-classes@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz#d094299d9bd680a14a2a0edae38305ad60fb4de9" + integrity sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.5.5" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.5.5" + "@babel/helper-split-export-declaration" "^7.4.4" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" + integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz#44bbe08b57f4480094d57d9ffbcd96d309075ba6" + integrity sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-dotall-regex@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.6.2.tgz#44abb948b88f0199a627024e1508acaf8dc9b2f9" + integrity sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.6.0" + +"@babel/plugin-transform-duplicate-keys@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz#c5dbf5106bf84cdf691222c0974c12b1df931853" + integrity sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" + integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-for-of@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" + integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" + integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" + integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-member-expression-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" + integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz#ef00435d46da0a5961aa728a1d2ecff063e4fb91" + integrity sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-commonjs@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz#39dfe957de4420445f1fcf88b68a2e4aa4515486" + integrity sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g== + dependencies: + "@babel/helper-module-transforms" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-systemjs@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz#e75266a13ef94202db2a0620977756f51d52d249" + integrity sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg== + dependencies: + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-umd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" + integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.6.3": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.3.tgz#aaa6e409dd4fb2e50b6e2a91f7e3a3149dbce0cf" + integrity sha512-jTkk7/uE6H2s5w6VlMHeWuH+Pcy2lmdwFoeWCVnvIrDUnB5gQqTVI8WfmEAhF2CDEarGrknZcmSFg1+bkfCoSw== + dependencies: + regexpu-core "^4.6.0" + +"@babel/plugin-transform-new-target@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" + integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz#c70021df834073c65eb613b8679cc4a381d1a9f9" + integrity sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.5.5" + +"@babel/plugin-transform-parameters@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" + integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw== + dependencies: + "@babel/helper-call-delegate" "^7.4.4" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-property-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" + integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-regenerator@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" + integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== + dependencies: + regenerator-transform "^0.14.0" + +"@babel/plugin-transform-reserved-words@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" + integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-shorthand-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" + integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz#fc77cf798b24b10c46e1b51b1b88c2bf661bb8dd" + integrity sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" + integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" + integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" + integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-unicode-regex@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz#b692aad888a7e8d8b1b214be6b9dc03d5031f698" + integrity sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.6.0" + +"@babel/preset-env@7.6.3": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.6.3.tgz#9e1bf05a2e2d687036d24c40e4639dc46cef2271" + integrity sha512-CWQkn7EVnwzlOdR5NOm2+pfgSNEZmvGjOhlCHBDq0J8/EStr+G+FvPEiz9B56dR6MoiUFjXhfE4hjLoAKKJtIQ== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-dynamic-import" "^7.5.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.6.2" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.6.2" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-dynamic-import" "^7.2.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.5.0" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.6.3" + "@babel/plugin-transform-classes" "^7.5.5" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.6.0" + "@babel/plugin-transform-dotall-regex" "^7.6.2" + "@babel/plugin-transform-duplicate-keys" "^7.5.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.4.4" + "@babel/plugin-transform-function-name" "^7.4.4" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-member-expression-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.5.0" + "@babel/plugin-transform-modules-commonjs" "^7.6.0" + "@babel/plugin-transform-modules-systemjs" "^7.5.0" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.6.3" + "@babel/plugin-transform-new-target" "^7.4.4" + "@babel/plugin-transform-object-super" "^7.5.5" + "@babel/plugin-transform-parameters" "^7.4.4" + "@babel/plugin-transform-property-literals" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.4.5" + "@babel/plugin-transform-reserved-words" "^7.2.0" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.6.2" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.4.4" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.6.2" + "@babel/types" "^7.6.3" + browserslist "^4.6.0" + core-js-compat "^3.1.1" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.5.0" + +"@babel/runtime-corejs2@^7.2.0": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.6.3.tgz#de3f446b3fb688b98cbd220474d1a7cad909bcb8" + integrity sha512-nuA2o+rgX2+PrNTZ063ehncVcg7sn+tU71BB81SaWRVUbGwCOlb0+yQA1e0QqmzOfRSYOxfvf8cosYqFbJEiwQ== + dependencies: + core-js "^2.6.5" + regenerator-runtime "^0.13.2" + +"@babel/template@^7.1.0", "@babel/template@^7.4.4", "@babel/template@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6" + integrity sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.6.0" + "@babel/types" "^7.6.0" + +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5", "@babel/traverse@^7.6.2", "@babel/traverse@^7.6.3": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.3.tgz#66d7dba146b086703c0fb10dd588b7364cec47f9" + integrity sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.6.3" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/parser" "^7.6.3" + "@babel/types" "^7.6.3" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5", "@babel/types@^7.6.0", "@babel/types@^7.6.3": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.3.tgz#3f07d96f854f98e2fbd45c64b0cb942d11e8ba09" + integrity sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@nodelib/fs.scandir@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" + integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== + dependencies: + "@nodelib/fs.stat" "2.0.3" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" + integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" + integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + dependencies: + "@nodelib/fs.scandir" "2.1.3" + fastq "^1.6.0" + +"@samverschueren/stream-to-observable@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" + integrity sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg== + dependencies: + any-observable "^0.3.0" + +"@sinonjs/commons@^1", "@sinonjs/commons@^1.3.0", "@sinonjs/commons@^1.4.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.6.0.tgz#ec7670432ae9c8eb710400d112c201a362d83393" + integrity sha512-w4/WHG7C4WWFyE5geCieFJF6MZkbW4VAriol5KlmQXpAQdxvV0p26sqNZOW6Qyw6Y0l9K4g+cHvvczR2sEEpqg== + dependencies: + type-detect "4.0.8" + +"@sinonjs/formatio@^3.2.1": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.2.2.tgz#771c60dfa75ea7f2d68e3b94c7e888a78781372c" + integrity sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ== + dependencies: + "@sinonjs/commons" "^1" + "@sinonjs/samsam" "^3.1.0" + +"@sinonjs/samsam@^3.1.0", "@sinonjs/samsam@^3.3.3": + version "3.3.3" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.3.tgz#46682efd9967b259b81136b9f120fd54585feb4a" + integrity sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ== + dependencies: + "@sinonjs/commons" "^1.3.0" + array-from "^2.1.1" + lodash "^4.17.15" + +"@sinonjs/text-encoding@^0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" + integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== + +"@types/events@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== + +"@types/glob@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" + +"@types/lodash@4.14.144": + version "4.14.144" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.144.tgz#12e57fc99064bce45e5ab3c8bc4783feb75eab8e" + integrity sha512-ogI4g9W5qIQQUhXAclq6zhqgqNUr7UlFaqDHbch7WLSLeeM/7d3CRaw7GLajxvyFvhJqw4Rpcz5bhoaYtIx6Tg== + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/mkdirp@0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" + integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg== + dependencies: + "@types/node" "*" + +"@types/node@*": + version "12.12.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.3.tgz#ebfe83507ac506bc3486314a8aa395be66af8d23" + integrity sha512-opgSsy+cEF9N8MgaVPnWVtdJ3o4mV2aMHvDq7thkQUFt0EuOHJon4rQpJfhjmNHB+ikl0Cd6WhWIErOyQ+f7tw== + +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + +"@types/pg-types@*": + version "1.11.4" + resolved "https://registry.yarnpkg.com/@types/pg-types/-/pg-types-1.11.4.tgz#8d7c59fb509ce3dca3f8bae589252051c639a9a8" + integrity sha512-WdIiQmE347LGc1Vq3Ki8sk3iyCuLgnccqVzgxek6gEHp2H0p3MQ3jniIHt+bRODXKju4kNQ+mp53lmP5+/9moQ== + dependencies: + moment ">=2.14.0" + +"@types/pg@^7.4.0": + version "7.11.2" + resolved "https://registry.yarnpkg.com/@types/pg/-/pg-7.11.2.tgz#199dec09426c9359574dedede37313805ba3fca2" + integrity sha512-4+rj7fnidA77jFURNanuPPc1HrQv+RkhI6s+K18G9zOKbOUUpChA/rbNMqFukNuZ89LoIt/I9dAlxf329TjCNw== + dependencies: + "@types/node" "*" + "@types/pg-types" "*" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +acorn-jsx@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" + integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== + +acorn@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" + integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== + +aggregate-error@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" + integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv@^6.10.0, ajv@^6.10.2: + version "6.10.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" + integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-colors@3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" + integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== + +ansi-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-escapes@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.2.1.tgz#4dccdb846c3eee10f6d64dea66273eab90c37228" + integrity sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q== + dependencies: + type-fest "^0.5.2" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +any-observable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" + integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-from@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" + integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= + +array-includes@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" + integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +babel-eslint@10.0.3: + version "10.0.3" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.3.tgz#81a2c669be0f205e19462fed2482d33e4687a88a" + integrity sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + +babel-plugin-dynamic-import-node@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" + integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== + dependencies: + object.assign "^4.1.0" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserslist@^4.6.0, browserslist@^4.7.2: + version "4.7.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.2.tgz#1bb984531a476b5d389cedecb195b2cd69fb1348" + integrity sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw== + dependencies: + caniuse-lite "^1.0.30001004" + electron-to-chromium "^1.3.295" + node-releases "^1.1.38" + +buffer-writer@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04" + integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw== + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + 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" + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-lite@^1.0.30001004: + version "1.0.30001006" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001006.tgz#5b6e8288792cfa275f007b2819a00ccad7112655" + integrity sha512-MXnUVX27aGs/QINz+QG1sWSLDr3P1A3Hq5EUWoIt0T7K24DuvMxZEnh3Y5aHlJW6Bz2aApJdSewdYLd8zQnUuw== + +chai-as-promised@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" + integrity sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA== + dependencies: + check-error "^1.0.2" + +chai@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" + integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + pathval "^1.1.0" + type-detect "^4.0.5" + +chalk@^1.0.0, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= + +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chownr@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" + integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^2.0.0, cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-truncate@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" + integrity sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ= + dependencies: + slice-ansi "0.0.4" + string-width "^1.0.1" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +commander@^2.20.0, commander@^2.8.1: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +config@>=1.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/config/-/config-3.2.4.tgz#e60a908582991e800852f9cb60fcf424f3274a6c" + integrity sha512-H1XIGfnU1EAkfjSLn9ZvYDRx9lOezDViuzLDgiJ/lMeqjYe3q6iQfpcLt2NInckJgpAeekbNhQkmnnbdEDs9rw== + dependencies: + json5 "^1.0.1" + +confusing-browser-globals@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz#72bc13b483c0276801681871d4898516f8f54fdd" + integrity sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw== + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + +convert-source-map@^1.1.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== + dependencies: + safe-buffer "~5.1.1" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js-compat@^3.1.1: + version "3.3.6" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.3.6.tgz#70c30dbeb582626efe9ecd6f49daa9ff4aeb136c" + integrity sha512-YnwZG/+0/f7Pf6Lr3jxtVAFjtGBW9lsLYcqrxhYJai1GfvrP8DEyEpnNzj/FRQfIkOOfk1j5tTBvPBLWVVJm4A== + dependencies: + browserslist "^4.7.2" + semver "^6.3.0" + +core-js@^2.6.5: + version "2.6.10" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.10.tgz#8a5b8391f8cc7013da703411ce5b585706300d7f" + integrity sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA== + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +cross-env@6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-6.0.3.tgz#4256b71e49b3a40637a0ce70768a6ef5c72ae941" + integrity sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag== + dependencies: + cross-spawn "^7.0.0" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" + integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +date-fns@^1.27.2: + version "1.30.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" + integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== + +debug@3.2.6, debug@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decamelize@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-3.2.0.tgz#84b8e8f4f8c579f938e35e2cc7024907e0090851" + integrity sha512-4TgkVUsmmu7oCSyGBm5FvfMoACuoh9EOidm7V5/J2X2djAwwt57qb3F2KMP2ITqODTCSwb+YRV+0Zqrv18k/hw== + dependencies: + xregexp "^4.2.4" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== + dependencies: + type-detect "^4.0.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7" + integrity sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA== + dependencies: + globby "^10.0.1" + graceful-fs "^4.2.2" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.1" + p-map "^3.0.0" + rimraf "^3.0.0" + slash "^3.0.0" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +diff@3.5.0, diff@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dotenv@>=1.0.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" + integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== + +electron-to-chromium@^1.3.295: + version "1.3.298" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.298.tgz#6f2b09c9b4ffca6a6745d80272dad987bcf5689c" + integrity sha512-IcgwlR5x4qtsVr1X+GDnbDEp0bAAqRA9EHP+bvIn3g5KF59Eiqjm59p27tg8b4YmgmpjfKWgec3trDRTWiVJgg== + +elegant-spinner@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" + integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.12.0, es-abstract@^1.5.1, es-abstract@^1.7.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.0.tgz#d3a26dc9c3283ac9750dca569586e976d9dcc06d" + integrity sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg== + dependencies: + es-to-primitive "^1.2.0" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.0" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-inspect "^1.6.0" + object-keys "^1.1.1" + string.prototype.trimleft "^2.1.0" + string.prototype.trimright "^2.1.0" + +es-to-primitive@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +eslint-config-airbnb-base@14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.0.0.tgz#8a7bcb9643d13c55df4dd7444f138bf4efa61e17" + integrity sha512-2IDHobw97upExLmsebhtfoD3NAKhV4H0CJWP3Uprd/uk+cHuWYOczPVxQ8PxLFUAw7o3Th1RAU8u1DoUpr+cMA== + dependencies: + confusing-browser-globals "^1.0.7" + object.assign "^4.1.0" + object.entries "^1.1.0" + +eslint-config-prettier@6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.5.0.tgz#aaf9a495e2a816865e541bfdbb73a65cc162b3eb" + integrity sha512-cjXp8SbO9VFGW/Z7mbTydqS9to8Z58E5aYhj3e1+Hx7lS9s6gL5ILKNpCqZAFOVYRcSkWPFYljHrEh8QFEK5EQ== + dependencies: + get-stdin "^6.0.0" + +eslint-import-resolver-node@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" + integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== + dependencies: + debug "^2.6.9" + resolve "^1.5.0" + +eslint-module-utils@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz#7b4675875bf96b0dbf1b21977456e5bb1f5e018c" + integrity sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw== + dependencies: + debug "^2.6.8" + pkg-dir "^2.0.0" + +eslint-plugin-import@2.18.2: + version "2.18.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz#02f1180b90b077b33d447a17a2326ceb400aceb6" + integrity sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ== + dependencies: + array-includes "^3.0.3" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.2" + eslint-module-utils "^2.4.0" + has "^1.0.3" + minimatch "^3.0.4" + object.values "^1.1.0" + read-pkg-up "^2.0.0" + resolve "^1.11.0" + +eslint-plugin-prettier@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.1.tgz#507b8562410d02a03f0ddc949c616f877852f2ba" + integrity sha512-A+TZuHZ0KU0cnn56/9mfR7/KjUJ9QNVXUhwvRFSR7PGPe0zQR6PTkmyqg1AtUUEOzTqeRsUwyKFh0oVZKVCrtA== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-security@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-security/-/eslint-plugin-security-1.4.0.tgz#d4f314484a80b1b613b8c8886e84f52efe1526c2" + integrity sha512-xlS7P2PLMXeqfhyf3NpqbvbnW04kN8M9NtmhpR3XGyOvt/vNKS7XPXT5EDbwKW9vCjWH4PpfQvgD/+JgN0VJKA== + dependencies: + safe-regex "^1.1.0" + +eslint-scope@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" + integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + +eslint@6.6.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.6.0.tgz#4a01a2fb48d32aacef5530ee9c5a78f11a8afd04" + integrity sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.0.0" + eslint-utils "^1.4.3" + eslint-visitor-keys "^1.1.0" + espree "^6.1.2" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^11.7.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^7.0.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.14" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" + integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== + dependencies: + acorn "^7.1.0" + acorn-jsx "^5.1.0" + eslint-visitor-keys "^1.1.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-2.1.0.tgz#e5d3ecd837d2a60ec50f3da78fd39767747bbe99" + integrity sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^3.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + 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.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-glob@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.1.0.tgz#77375a7e3e6f6fc9b18f061cddd28b8d1eec75ae" + integrity sha512-TrUz3THiq2Vy3bjfQUB2wNyPdGBeGmdjbzzBLhfHN4YFurYptCKwGq/TfiRavbGywFRzY6U2CdmQ1zmsY5yYaw== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastq@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.6.0.tgz#4ec8a38f4ac25f21492673adb7eae9cfef47d1c2" + integrity sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA== + dependencies: + reusify "^1.0.0" + +figures@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +figures@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" + integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + +fill-keys@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fill-keys/-/fill-keys-1.0.2.tgz#9a8fa36f4e8ad634e3bf6b4f3c8882551452eb20" + integrity sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA= + dependencies: + is-object "~1.0.1" + merge-descriptors "~1.0.0" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@3.0.0, find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flat@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" + integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== + dependencies: + is-buffer "~2.0.3" + +flatted@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" + integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fs-minipass@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + +fs-readdir-recursive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.9" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" + integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== + dependencies: + nan "^2.12.1" + node-pre-gyp "^0.12.0" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.1.tgz#6f7764f88ea11e0b514bd9bd860a132259992ca4" + integrity sha512-09/VS4iek66Dh2bctjRkowueRJbY1JDGR1L/zRxO1Qk8Uxs6PnqaNSqalpizPT+CDjre3hnEsuzvhgomz9qYrA== + +get-stdin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" + integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== + +get-stdin@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-7.0.0.tgz#8d5de98f15171a125c5e516643c7a6d0ea8a96f6" + integrity sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ== + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" + integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.0.0, glob-parent@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + dependencies: + is-glob "^4.0.1" + +glob@7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.1.3: + version "7.1.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.5.tgz#6714c69bee20f3c3e64c4dd905553e532b40cdc0" + integrity sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0, globals@^11.7.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globby@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.1.tgz#4782c34cb75dd683351335c5829cc3420e606b22" + integrity sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A== + dependencies: + "@types/glob" "^7.1.1" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.0.3" + glob "^7.1.3" + ignore "^5.1.1" + merge2 "^1.2.3" + slash "^3.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.2.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.1, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hosted-git-info@^2.1.4: + version "2.8.5" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" + integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== + +husky@3.0.9: + version "3.0.9" + resolved "https://registry.yarnpkg.com/husky/-/husky-3.0.9.tgz#a2c3e9829bfd6b4957509a9500d2eef5dbfc8044" + integrity sha512-Yolhupm7le2/MqC1VYLk/cNmYxsSsqKkTyBhzQHhPK1jFnC89mmmNVuGtLNabjDI6Aj8UNIr0KpRNuBkiC4+sg== + dependencies: + chalk "^2.4.2" + ci-info "^2.0.0" + cosmiconfig "^5.2.1" + execa "^1.0.0" + get-stdin "^7.0.0" + opencollective-postinstall "^2.0.2" + pkg-dir "^4.2.0" + please-upgrade-node "^3.2.0" + read-pkg "^5.2.0" + run-node "^1.0.0" + slash "^3.0.0" + +iconv-lite@^0.4.24, iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore-walk@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" + integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== + dependencies: + minimatch "^3.0.4" + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.1: + version "5.1.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" + integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118" + integrity sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +inquirer@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.0.tgz#9e2b032dde77da1db5db804758b8fea3a970519a" + integrity sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.2" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^4.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-buffer@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" + integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== + +is-callable@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-object@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" + integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= + +is-observable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" + integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== + dependencies: + symbol-observable "^1.1.0" + +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-inside@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" + integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== + +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= + dependencies: + has "^1.0.1" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + dependencies: + has-symbols "^1.0.0" + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +js-levenshtein@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@3.13.1, js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" + integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== + dependencies: + minimist "^1.2.0" + +just-extend@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc" + integrity sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw== + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +lint-staged@9.4.2: + version "9.4.2" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-9.4.2.tgz#14cb577a9512f520691f8b5aefce6a8f7ead6c04" + integrity sha512-OFyGokJSWTn2M6vngnlLXjaHhi8n83VIZZ5/1Z26SULRUWgR3ITWpAEQC9Pnm3MC/EpCxlwts/mQWDHNji2+zA== + dependencies: + chalk "^2.4.2" + commander "^2.20.0" + cosmiconfig "^5.2.1" + debug "^4.1.1" + dedent "^0.7.0" + del "^5.0.0" + execa "^2.0.3" + listr "^0.14.3" + log-symbols "^3.0.0" + micromatch "^4.0.2" + normalize-path "^3.0.0" + please-upgrade-node "^3.1.1" + string-argv "^0.3.0" + stringify-object "^3.3.0" + +listr-silent-renderer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" + integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4= + +listr-update-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" + integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA== + dependencies: + chalk "^1.1.3" + cli-truncate "^0.2.1" + elegant-spinner "^1.0.1" + figures "^1.7.0" + indent-string "^3.0.0" + log-symbols "^1.0.2" + log-update "^2.3.0" + strip-ansi "^3.0.1" + +listr-verbose-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db" + integrity sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw== + dependencies: + chalk "^2.4.1" + cli-cursor "^2.1.0" + date-fns "^1.27.2" + figures "^2.0.0" + +listr@^0.14.3: + version "0.14.3" + resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" + integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA== + dependencies: + "@samverschueren/stream-to-observable" "^0.3.0" + is-observable "^1.1.0" + is-promise "^2.1.0" + is-stream "^1.1.0" + listr-silent-renderer "^1.1.1" + listr-update-renderer "^0.5.0" + listr-verbose-renderer "^0.5.0" + p-map "^2.0.0" + rxjs "^6.3.3" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@~4.17.0: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +log-symbols@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + +log-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + integrity sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg= + dependencies: + chalk "^1.0.0" + +log-symbols@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" + integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== + dependencies: + chalk "^2.4.2" + +log-update@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" + integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= + dependencies: + ansi-escapes "^3.0.0" + cli-cursor "^2.0.0" + wrap-ansi "^3.0.1" + +lolex@^4.1.0, lolex@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-4.2.0.tgz#ddbd7f6213ca1ea5826901ab1222b65d714b3cd7" + integrity sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg== + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +merge-descriptors@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.2.3, merge2@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" + integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + 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.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +mocha@6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.2.tgz#5d8987e28940caf8957a7d7664b910dc5b2fea20" + integrity sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A== + dependencies: + ansi-colors "3.2.3" + browser-stdout "1.3.1" + debug "3.2.6" + diff "3.5.0" + escape-string-regexp "1.0.5" + find-up "3.0.0" + glob "7.1.3" + growl "1.10.5" + he "1.2.0" + js-yaml "3.13.1" + log-symbols "2.2.0" + minimatch "3.0.4" + mkdirp "0.5.1" + ms "2.1.1" + node-environment-flags "1.0.5" + object.assign "4.1.0" + strip-json-comments "2.0.1" + supports-color "6.0.0" + which "1.3.1" + wide-align "1.1.3" + yargs "13.3.0" + yargs-parser "13.1.1" + yargs-unparser "1.6.0" + +module-not-found-error@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/module-not-found-error/-/module-not-found-error-1.0.1.tgz#cf8b4ff4f29640674d6cdd02b0e3bc523c2bbdc0" + integrity sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA= + +moment@>=2.14.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" + integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nan@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + 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-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +needle@^2.2.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" + integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +nise@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/nise/-/nise-1.5.2.tgz#b6d29af10e48b321b307e10e065199338eeb2652" + integrity sha512-/6RhOUlicRCbE9s+94qCUsyE+pKlVJ5AhIv+jEE7ESKwnbXqulKZ1FYU+XAtHHWE9TinYvAxDUJAb912PwPoWA== + dependencies: + "@sinonjs/formatio" "^3.2.1" + "@sinonjs/text-encoding" "^0.7.1" + just-extend "^4.0.2" + lolex "^4.1.0" + path-to-regexp "^1.7.0" + +node-environment-flags@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.5.tgz#fa930275f5bf5dae188d6192b24b4c8bbac3d76a" + integrity sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ== + dependencies: + object.getownpropertydescriptors "^2.0.3" + semver "^5.7.0" + +node-pre-gyp@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" + integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +node-releases@^1.1.38: + version "1.1.39" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.39.tgz#c1011f30343aff5b633153b10ff691d278d08e8d" + integrity sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA== + dependencies: + semver "^6.3.0" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-bundled@^1.0.1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== + +npm-packlist@^1.1.6: + version "1.4.6" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.6.tgz#53ba3ed11f8523079f1457376dd379ee4ea42ff4" + integrity sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npm-run-path@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-3.1.0.tgz#7f91be317f6a466efed3c9f2980ad8a4ee8b0fa5" + integrity sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg== + dependencies: + path-key "^3.0.0" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" + integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@4.1.0, object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.entries@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519" + integrity sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.12.0" + function-bind "^1.1.1" + has "^1.0.3" + +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" + integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.12.0" + function-bind "^1.1.1" + has "^1.0.3" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +onetime@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + dependencies: + mimic-fn "^2.1.0" + +opencollective-postinstall@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz#5657f1bede69b6e33a45939b061eb53d3c6c3a89" + integrity sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw== + +optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +output-file-sync@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-2.0.1.tgz#f53118282f5f553c2799541792b723a4c71430c0" + integrity sha512-mDho4qm7WgIXIGf4eYU1RHN2UU5tPfVYVSRwDJw0uTmj35DQUt/eNp19N7v6T3SrR0ESTEf2up2CGO73qI35zQ== + dependencies: + graceful-fs "^4.1.11" + is-plain-obj "^1.1.0" + mkdirp "^0.5.1" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-finally@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" + integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" + integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +packet-reader@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-1.0.0.tgz#9238e5480dedabacfe1fe3f2771063f164157d74" + integrity sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" + integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + lines-and-columns "^1.1.6" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.0.tgz#99a10d870a803bdd5ee6f0470e58dfcd2f9a54d3" + integrity sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg== + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-to-regexp@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" + integrity sha1-Wf3g9DW62suhA6hOnTvGTpa5k30= + dependencies: + isarray "0.0.1" + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pathval@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" + integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= + +pg-connection-string@0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-0.1.3.tgz#da1847b20940e42ee1492beaf65d49d91b245df7" + integrity sha1-2hhHsglA5C7hSSvq9l1J2RskXfc= + +pg-int8@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" + integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== + +pg-pool@^2.0.4: + version "2.0.7" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-2.0.7.tgz#f14ecab83507941062c313df23f6adcd9fd0ce54" + integrity sha512-UiJyO5B9zZpu32GSlP0tXy8J2NsJ9EFGFfz5v6PSbdz/1hBLX1rNiiy5+mAm5iJJYwfCv4A0EBcQLGWwjbpzZw== + +pg-types@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" + integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== + dependencies: + pg-int8 "1.0.1" + postgres-array "~2.0.0" + postgres-bytea "~1.0.0" + postgres-date "~1.0.4" + postgres-interval "^1.1.0" + +pg@7.12.1: + version "7.12.1" + resolved "https://registry.yarnpkg.com/pg/-/pg-7.12.1.tgz#880636d46d2efbe0968e64e9fe0eeece8ef72a7e" + integrity sha512-l1UuyfEvoswYfcUe6k+JaxiN+5vkOgYcVSbSuw3FvdLqDbaoa2RJo1zfJKfPsSYPFVERd4GHvX3s2PjG1asSDA== + dependencies: + buffer-writer "2.0.0" + packet-reader "1.0.0" + pg-connection-string "0.1.3" + pg-pool "^2.0.4" + pg-types "^2.1.0" + pgpass "1.x" + semver "4.3.2" + +pgpass@1.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.2.tgz#2a7bb41b6065b67907e91da1b07c1847c877b306" + integrity sha1-Knu0G2BltnkH6R2hsHwYR8h3swY= + dependencies: + split "^1.0.0" + +picomatch@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.1.0.tgz#0fd042f568d08b1ad9ff2d3ec0f0bfb3cb80e177" + integrity sha512-uhnEDzAbrcJ8R3g2fANnSuXZMBtkpSjxTTgn2LeSiQlfmq72enQJWdQllXW24MBLYnA1SBD2vfvx2o0Zw3Ielw== + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +please-upgrade-node@^3.1.1, please-upgrade-node@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" + integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== + dependencies: + semver-compare "^1.0.0" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postgres-array@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" + integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== + +postgres-bytea@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" + integrity sha1-AntTPAqokOJtFy1Hz5zOzFIazTU= + +postgres-date@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.4.tgz#1c2728d62ef1bff49abdd35c1f86d4bdf118a728" + integrity sha512-bESRvKVuTrjoBluEcpv2346+6kgB7UlnqWZsnbnCccTNq/pqfj1j6oBaN5+b/NrDXepYUT/HKadqv3iS9lJuVA== + +postgres-interval@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" + integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== + dependencies: + xtend "^4.0.0" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@1.18.2: + version "1.18.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" + integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== + +private@^0.1.6: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +proxyquire@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/proxyquire/-/proxyquire-2.1.3.tgz#2049a7eefa10a9a953346a18e54aab2b4268df39" + integrity sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg== + dependencies: + fill-keys "^1.0.2" + module-not-found-error "^1.0.1" + resolve "^1.11.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +readable-stream@^2.0.2, readable-stream@^2.0.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +regenerate-unicode-properties@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" + integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + +regenerator-runtime@^0.13.2: + version "0.13.3" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" + integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== + +regenerator-transform@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb" + integrity sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ== + dependencies: + private "^0.1.6" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +regexpu-core@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" + integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.1.0" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.1.0" + +regjsgen@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" + integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== + +regjsparser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" + integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@^1.10.0, resolve@^1.11.0, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.3.2, resolve@^1.5.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" + integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== + dependencies: + path-parse "^1.0.6" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +reusify@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rimraf@^2.6.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b" + integrity sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg== + dependencies: + glob "^7.1.3" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + dependencies: + is-promise "^2.1.0" + +run-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e" + integrity sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A== + +run-parallel@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" + integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + +rxjs@^6.3.3, rxjs@^6.4.0: + version "6.5.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" + integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== + dependencies: + tslib "^1.9.0" + +safe-buffer@^5.1.2: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= + +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.7.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7" + integrity sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c= + +semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +sinon-chai@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-3.3.0.tgz#8084ff99451064910fbe2c2cb8ab540c00b740ea" + integrity sha512-r2JhDY7gbbmh5z3Q62pNbrjxZdOAjpsqW/8yxAZRSqLZqowmfGZPGUZPFf3UX36NLis0cv8VEM5IJh9HgkSOAA== + +sinon@7.5.0: + version "7.5.0" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.5.0.tgz#e9488ea466070ea908fd44a3d6478fd4923c67ec" + integrity sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q== + dependencies: + "@sinonjs/commons" "^1.4.0" + "@sinonjs/formatio" "^3.2.1" + "@sinonjs/samsam" "^3.3.3" + diff "^3.5.0" + lolex "^4.2.0" + nise "^1.5.2" + supports-color "^5.5.0" + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +split@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" + integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== + dependencies: + through "2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +string-argv@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.1.0.tgz#ba846d1daa97c3c596155308063e075ed1c99aff" + integrity sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^5.2.0" + +string.prototype.trimleft@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634" + integrity sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string.prototype.trimright@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58" + integrity sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@2.0.1, strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +strip-json-comments@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" + integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + +supports-color@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" + integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== + dependencies: + has-flag "^3.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +symbol-observable@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== + +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +tar@^4: + version "4.4.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" + integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.8.6" + minizlib "^1.2.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.3" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +through@2, through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +tslib@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" + integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +typescript@3.6.4: + version "3.6.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.4.tgz#b18752bb3792bc1a0281335f7f6ebf1bbfc5b91d" + integrity sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg== + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" + integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" + integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +v8-compile-cache@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" + integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@1.3.1, which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.1.tgz#f1cf94d07a8e571b6ff006aeb91d0300c47ef0a4" + integrity sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w== + dependencies: + isexe "^2.0.0" + +wide-align@1.1.3, wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + +wrap-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" + integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo= + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + +xregexp@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.2.4.tgz#02a4aea056d65a42632c02f0233eab8e4d7e57ed" + integrity sha512-sO0bYdYeJAJBcJA8g7MJJX7UrOZIfJPd8U2SC7B2Dd/J24U0aQNoGp33shCaBSWeb0rD5rh6VBUIXOkGal1TZA== + dependencies: + "@babel/runtime-corejs2" "^7.2.0" + +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yallist@^3.0.0, yallist@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yargs-parser@13.1.1, yargs-parser@^13.1.1: + version "13.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.0.tgz#cdd7a97490ec836195f59f3f4dbe5ea9e8f75f08" + integrity sha512-xLTUnCMc4JhxrPEPUYD5IBR1mWCK/aT6+RJ/K29JY2y1vD+FhtgKK0AXRWvI262q3QSffAQuTouFIKUuHX89wQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-unparser@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" + integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== + dependencies: + flat "^4.1.0" + lodash "^4.17.15" + yargs "^13.3.0" + +yargs@13.3.0, yargs@^13.3.0: + version "13.3.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" + integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.1" + +yargs@~14.2.0: + version "14.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.0.tgz#f116a9242c4ed8668790b40759b4906c276e76c3" + integrity sha512-/is78VKbKs70bVZH7w4YaZea6xcJWOAwkhbR0CFuZBmYtfTYF0xjGJF43AYd8g2Uii1yJwmS5GR2vBmrc32sbg== + dependencies: + cliui "^5.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^15.0.0" From e93b4cbb72015ab60135a25b2e7b55b9cc1cb7e2 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Sat, 2 Nov 2019 13:54:07 +0100 Subject: [PATCH 32/57] Add interface RunMigration --- src/migration.ts | 8 +++++++- src/runner.ts | 18 +++++++++++++----- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/migration.ts b/src/migration.ts index 997b327e..5b4af40e 100644 --- a/src/migration.ts +++ b/src/migration.ts @@ -44,7 +44,13 @@ const getLastSuffix = async (dir, ignorePattern) => { } }; -export class Migration { +export interface RunMigration { + readonly path: string; + readonly name: string; + readonly timestamp: number; +} + +export class Migration implements RunMigration { // class method that creates a new migration file by cloning the migration template static async create(name, directory, language, ignorePattern) { // ensure the migrations directory exists diff --git a/src/runner.ts b/src/runner.ts index 798208e1..0ae4a2d6 100644 --- a/src/runner.ts +++ b/src/runner.ts @@ -4,7 +4,7 @@ import { Client } from 'pg'; import { TlsOptions } from 'tls'; import Db, { DB } from './db'; import { ColumnDefinitions } from './definitions'; -import Migration, { loadMigrationFiles } from './migration'; +import Migration, { loadMigrationFiles, RunMigration } from './migration'; import { MigrationBuilderActions } from './migration-builder'; import { createSchemalize, @@ -111,9 +111,13 @@ const getRunMigrations = async (db: DB, options: RunnerOption) => { ); }; -const getMigrationsToRun = (options, runNames, migrations) => { +const getMigrationsToRun = ( + options: RunnerOption, + runNames: string[], + migrations: Migration[] +): Migration[] => { if (options.direction === 'down') { - const downMigrations = runNames + const downMigrations: Migration[] = runNames .filter(migrationName => !options.file || options.file === migrationName) .map( migrationName => @@ -214,7 +218,7 @@ export interface RunnerOptionClient { export type RunnerOption = RunnerOptionConfig & (RunnerOptionClient | RunnerOptionUrl); -const runner = async (options: RunnerOption): Promise => { +const runner = async (options: RunnerOption): Promise => { const log = options.log || console.log; const db = Db( (options as RunnerOptionClient).dbClient || @@ -257,7 +261,11 @@ const runner = async (options: RunnerOption): Promise => { checkOrder(runNames, migrations); } - const toRun = getMigrationsToRun(options, runNames, migrations); + const toRun: Migration[] = getMigrationsToRun( + options, + runNames, + migrations + ); if (!toRun.length) { log('No migrations to run!'); From d870d2b3bccd79eeebea9ee98b0762fbb9b62ebc Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Sat, 2 Nov 2019 13:55:33 +0100 Subject: [PATCH 33/57] Merge branch 'typescript' of github.com:Shinigami92/node-pg-migrate into typescript --- yarn.lock | 4529 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 4529 insertions(+) create mode 100644 yarn.lock diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..18bff212 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4529 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/cli@7.6.4": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.6.4.tgz#9b35a4e15fa7d8f487418aaa8229c8b0bc815f20" + integrity sha512-tqrDyvPryBM6xjIyKKUwr3s8CzmmYidwgdswd7Uc/Cv0ogZcuS1TYQTLx/eWKP3UbJ6JxZAiYlBZabXm/rtRsQ== + dependencies: + commander "^2.8.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.1.0" + glob "^7.0.0" + lodash "^4.17.13" + mkdirp "^0.5.1" + output-file-sync "^2.0.0" + slash "^2.0.0" + source-map "^0.5.0" + optionalDependencies: + chokidar "^2.1.8" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" + integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/core@7.6.4": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.6.4.tgz#6ebd9fe00925f6c3e177bb726a188b5f578088ff" + integrity sha512-Rm0HGw101GY8FTzpWSyRbki/jzq+/PkNQJ+nSulrdY6gFGOsNseCqD6KHRYe2E+EdzuBdr2pxCp6s4Uk6eJ+XQ== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.6.4" + "@babel/helpers" "^7.6.2" + "@babel/parser" "^7.6.4" + "@babel/template" "^7.6.0" + "@babel/traverse" "^7.6.3" + "@babel/types" "^7.6.3" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.6.3", "@babel/generator@^7.6.4": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.4.tgz#a4f8437287bf9671b07f483b76e3bb731bc97671" + integrity sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w== + dependencies: + "@babel/types" "^7.6.3" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-call-delegate@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" + integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ== + dependencies: + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/helper-define-map@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz#3dec32c2046f37e09b28c93eb0b103fd2a25d369" + integrity sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.5.5" + lodash "^4.17.13" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-hoist-variables@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" + integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/helper-member-expression-to-functions@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz#1fb5b8ec4453a93c439ee9fe3aeea4a84b76b590" + integrity sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA== + dependencies: + "@babel/types" "^7.5.5" + +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz#f84ff8a09038dcbca1fd4355661a500937165b4a" + integrity sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/template" "^7.4.4" + "@babel/types" "^7.5.5" + lodash "^4.17.13" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" + integrity sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw== + dependencies: + lodash "^4.17.13" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz#f84ce43df031222d2bad068d2626cb5799c34bc2" + integrity sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.5.5" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.5.5" + "@babel/types" "^7.5.5" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" + integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/helper-wrap-function@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" + integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.2.0" + +"@babel/helpers@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.6.2.tgz#681ffe489ea4dcc55f23ce469e58e59c1c045153" + integrity sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA== + dependencies: + "@babel/template" "^7.6.0" + "@babel/traverse" "^7.6.2" + "@babel/types" "^7.6.0" + +"@babel/highlight@^7.0.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" + integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.0.0", "@babel/parser@^7.6.0", "@babel/parser@^7.6.3", "@babel/parser@^7.6.4": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.4.tgz#cb9b36a7482110282d5cb6dd424ec9262b473d81" + integrity sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A== + +"@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" + integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + +"@babel/plugin-proposal-dynamic-import@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz#e532202db4838723691b10a67b8ce509e397c506" + integrity sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.2.0" + +"@babel/plugin-proposal-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" + integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + +"@babel/plugin-proposal-object-rest-spread@7.6.2", "@babel/plugin-proposal-object-rest-spread@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz#8ffccc8f3a6545e9f78988b6bf4fe881b88e8096" + integrity sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" + integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz#05413762894f41bfe42b9a5e80919bd575dcc802" + integrity sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.6.0" + +"@babel/plugin-syntax-async-generators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" + integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-dynamic-import@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" + integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" + integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" + integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" + integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz#89a3848a0166623b5bc481164b5936ab947e887e" + integrity sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" + integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.6.3": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz#6e854e51fbbaa84351b15d4ddafe342f3a5d542a" + integrity sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.13" + +"@babel/plugin-transform-classes@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz#d094299d9bd680a14a2a0edae38305ad60fb4de9" + integrity sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.5.5" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.5.5" + "@babel/helper-split-export-declaration" "^7.4.4" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" + integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz#44bbe08b57f4480094d57d9ffbcd96d309075ba6" + integrity sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-dotall-regex@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.6.2.tgz#44abb948b88f0199a627024e1508acaf8dc9b2f9" + integrity sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.6.0" + +"@babel/plugin-transform-duplicate-keys@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz#c5dbf5106bf84cdf691222c0974c12b1df931853" + integrity sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" + integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-for-of@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" + integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" + integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" + integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-member-expression-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" + integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz#ef00435d46da0a5961aa728a1d2ecff063e4fb91" + integrity sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-commonjs@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz#39dfe957de4420445f1fcf88b68a2e4aa4515486" + integrity sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g== + dependencies: + "@babel/helper-module-transforms" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-systemjs@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz#e75266a13ef94202db2a0620977756f51d52d249" + integrity sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg== + dependencies: + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-umd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" + integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.6.3": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.3.tgz#aaa6e409dd4fb2e50b6e2a91f7e3a3149dbce0cf" + integrity sha512-jTkk7/uE6H2s5w6VlMHeWuH+Pcy2lmdwFoeWCVnvIrDUnB5gQqTVI8WfmEAhF2CDEarGrknZcmSFg1+bkfCoSw== + dependencies: + regexpu-core "^4.6.0" + +"@babel/plugin-transform-new-target@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" + integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz#c70021df834073c65eb613b8679cc4a381d1a9f9" + integrity sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.5.5" + +"@babel/plugin-transform-parameters@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" + integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw== + dependencies: + "@babel/helper-call-delegate" "^7.4.4" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-property-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" + integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-regenerator@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" + integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== + dependencies: + regenerator-transform "^0.14.0" + +"@babel/plugin-transform-reserved-words@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" + integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-shorthand-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" + integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz#fc77cf798b24b10c46e1b51b1b88c2bf661bb8dd" + integrity sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" + integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" + integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" + integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-unicode-regex@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz#b692aad888a7e8d8b1b214be6b9dc03d5031f698" + integrity sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.6.0" + +"@babel/preset-env@7.6.3": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.6.3.tgz#9e1bf05a2e2d687036d24c40e4639dc46cef2271" + integrity sha512-CWQkn7EVnwzlOdR5NOm2+pfgSNEZmvGjOhlCHBDq0J8/EStr+G+FvPEiz9B56dR6MoiUFjXhfE4hjLoAKKJtIQ== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-dynamic-import" "^7.5.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.6.2" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.6.2" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-dynamic-import" "^7.2.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.5.0" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.6.3" + "@babel/plugin-transform-classes" "^7.5.5" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.6.0" + "@babel/plugin-transform-dotall-regex" "^7.6.2" + "@babel/plugin-transform-duplicate-keys" "^7.5.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.4.4" + "@babel/plugin-transform-function-name" "^7.4.4" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-member-expression-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.5.0" + "@babel/plugin-transform-modules-commonjs" "^7.6.0" + "@babel/plugin-transform-modules-systemjs" "^7.5.0" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.6.3" + "@babel/plugin-transform-new-target" "^7.4.4" + "@babel/plugin-transform-object-super" "^7.5.5" + "@babel/plugin-transform-parameters" "^7.4.4" + "@babel/plugin-transform-property-literals" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.4.5" + "@babel/plugin-transform-reserved-words" "^7.2.0" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.6.2" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.4.4" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.6.2" + "@babel/types" "^7.6.3" + browserslist "^4.6.0" + core-js-compat "^3.1.1" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.5.0" + +"@babel/runtime-corejs2@^7.2.0": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.6.3.tgz#de3f446b3fb688b98cbd220474d1a7cad909bcb8" + integrity sha512-nuA2o+rgX2+PrNTZ063ehncVcg7sn+tU71BB81SaWRVUbGwCOlb0+yQA1e0QqmzOfRSYOxfvf8cosYqFbJEiwQ== + dependencies: + core-js "^2.6.5" + regenerator-runtime "^0.13.2" + +"@babel/template@^7.1.0", "@babel/template@^7.4.4", "@babel/template@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6" + integrity sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.6.0" + "@babel/types" "^7.6.0" + +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5", "@babel/traverse@^7.6.2", "@babel/traverse@^7.6.3": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.3.tgz#66d7dba146b086703c0fb10dd588b7364cec47f9" + integrity sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.6.3" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/parser" "^7.6.3" + "@babel/types" "^7.6.3" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5", "@babel/types@^7.6.0", "@babel/types@^7.6.3": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.3.tgz#3f07d96f854f98e2fbd45c64b0cb942d11e8ba09" + integrity sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@nodelib/fs.scandir@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" + integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== + dependencies: + "@nodelib/fs.stat" "2.0.3" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" + integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" + integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + dependencies: + "@nodelib/fs.scandir" "2.1.3" + fastq "^1.6.0" + +"@samverschueren/stream-to-observable@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" + integrity sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg== + dependencies: + any-observable "^0.3.0" + +"@sinonjs/commons@^1", "@sinonjs/commons@^1.3.0", "@sinonjs/commons@^1.4.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.6.0.tgz#ec7670432ae9c8eb710400d112c201a362d83393" + integrity sha512-w4/WHG7C4WWFyE5geCieFJF6MZkbW4VAriol5KlmQXpAQdxvV0p26sqNZOW6Qyw6Y0l9K4g+cHvvczR2sEEpqg== + dependencies: + type-detect "4.0.8" + +"@sinonjs/formatio@^3.2.1": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.2.2.tgz#771c60dfa75ea7f2d68e3b94c7e888a78781372c" + integrity sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ== + dependencies: + "@sinonjs/commons" "^1" + "@sinonjs/samsam" "^3.1.0" + +"@sinonjs/samsam@^3.1.0", "@sinonjs/samsam@^3.3.3": + version "3.3.3" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.3.tgz#46682efd9967b259b81136b9f120fd54585feb4a" + integrity sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ== + dependencies: + "@sinonjs/commons" "^1.3.0" + array-from "^2.1.1" + lodash "^4.17.15" + +"@sinonjs/text-encoding@^0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" + integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== + +"@types/events@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== + +"@types/glob@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" + +"@types/lodash@4.14.144": + version "4.14.144" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.144.tgz#12e57fc99064bce45e5ab3c8bc4783feb75eab8e" + integrity sha512-ogI4g9W5qIQQUhXAclq6zhqgqNUr7UlFaqDHbch7WLSLeeM/7d3CRaw7GLajxvyFvhJqw4Rpcz5bhoaYtIx6Tg== + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/mkdirp@0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" + integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg== + dependencies: + "@types/node" "*" + +"@types/node@*": + version "12.12.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.3.tgz#ebfe83507ac506bc3486314a8aa395be66af8d23" + integrity sha512-opgSsy+cEF9N8MgaVPnWVtdJ3o4mV2aMHvDq7thkQUFt0EuOHJon4rQpJfhjmNHB+ikl0Cd6WhWIErOyQ+f7tw== + +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + +"@types/pg-types@*": + version "1.11.4" + resolved "https://registry.yarnpkg.com/@types/pg-types/-/pg-types-1.11.4.tgz#8d7c59fb509ce3dca3f8bae589252051c639a9a8" + integrity sha512-WdIiQmE347LGc1Vq3Ki8sk3iyCuLgnccqVzgxek6gEHp2H0p3MQ3jniIHt+bRODXKju4kNQ+mp53lmP5+/9moQ== + dependencies: + moment ">=2.14.0" + +"@types/pg@^7.4.0": + version "7.11.2" + resolved "https://registry.yarnpkg.com/@types/pg/-/pg-7.11.2.tgz#199dec09426c9359574dedede37313805ba3fca2" + integrity sha512-4+rj7fnidA77jFURNanuPPc1HrQv+RkhI6s+K18G9zOKbOUUpChA/rbNMqFukNuZ89LoIt/I9dAlxf329TjCNw== + dependencies: + "@types/node" "*" + "@types/pg-types" "*" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +acorn-jsx@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" + integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== + +acorn@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" + integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== + +aggregate-error@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" + integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv@^6.10.0, ajv@^6.10.2: + version "6.10.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" + integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-colors@3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" + integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== + +ansi-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-escapes@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.2.1.tgz#4dccdb846c3eee10f6d64dea66273eab90c37228" + integrity sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q== + dependencies: + type-fest "^0.5.2" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +any-observable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" + integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-from@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" + integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= + +array-includes@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" + integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +babel-eslint@10.0.3: + version "10.0.3" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.3.tgz#81a2c669be0f205e19462fed2482d33e4687a88a" + integrity sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + +babel-plugin-dynamic-import-node@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" + integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== + dependencies: + object.assign "^4.1.0" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserslist@^4.6.0, browserslist@^4.7.2: + version "4.7.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.2.tgz#1bb984531a476b5d389cedecb195b2cd69fb1348" + integrity sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw== + dependencies: + caniuse-lite "^1.0.30001004" + electron-to-chromium "^1.3.295" + node-releases "^1.1.38" + +buffer-writer@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04" + integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw== + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + 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" + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-lite@^1.0.30001004: + version "1.0.30001006" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001006.tgz#5b6e8288792cfa275f007b2819a00ccad7112655" + integrity sha512-MXnUVX27aGs/QINz+QG1sWSLDr3P1A3Hq5EUWoIt0T7K24DuvMxZEnh3Y5aHlJW6Bz2aApJdSewdYLd8zQnUuw== + +chai-as-promised@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" + integrity sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA== + dependencies: + check-error "^1.0.2" + +chai@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" + integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + pathval "^1.1.0" + type-detect "^4.0.5" + +chalk@^1.0.0, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= + +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chownr@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" + integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^2.0.0, cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-truncate@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" + integrity sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ= + dependencies: + slice-ansi "0.0.4" + string-width "^1.0.1" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +commander@^2.20.0, commander@^2.8.1: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +config@>=1.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/config/-/config-3.2.4.tgz#e60a908582991e800852f9cb60fcf424f3274a6c" + integrity sha512-H1XIGfnU1EAkfjSLn9ZvYDRx9lOezDViuzLDgiJ/lMeqjYe3q6iQfpcLt2NInckJgpAeekbNhQkmnnbdEDs9rw== + dependencies: + json5 "^1.0.1" + +confusing-browser-globals@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz#72bc13b483c0276801681871d4898516f8f54fdd" + integrity sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw== + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + +convert-source-map@^1.1.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== + dependencies: + safe-buffer "~5.1.1" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js-compat@^3.1.1: + version "3.3.6" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.3.6.tgz#70c30dbeb582626efe9ecd6f49daa9ff4aeb136c" + integrity sha512-YnwZG/+0/f7Pf6Lr3jxtVAFjtGBW9lsLYcqrxhYJai1GfvrP8DEyEpnNzj/FRQfIkOOfk1j5tTBvPBLWVVJm4A== + dependencies: + browserslist "^4.7.2" + semver "^6.3.0" + +core-js@^2.6.5: + version "2.6.10" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.10.tgz#8a5b8391f8cc7013da703411ce5b585706300d7f" + integrity sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA== + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +cross-env@6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-6.0.3.tgz#4256b71e49b3a40637a0ce70768a6ef5c72ae941" + integrity sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag== + dependencies: + cross-spawn "^7.0.0" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" + integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +date-fns@^1.27.2: + version "1.30.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" + integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== + +debug@3.2.6, debug@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decamelize@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-3.2.0.tgz#84b8e8f4f8c579f938e35e2cc7024907e0090851" + integrity sha512-4TgkVUsmmu7oCSyGBm5FvfMoACuoh9EOidm7V5/J2X2djAwwt57qb3F2KMP2ITqODTCSwb+YRV+0Zqrv18k/hw== + dependencies: + xregexp "^4.2.4" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== + dependencies: + type-detect "^4.0.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7" + integrity sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA== + dependencies: + globby "^10.0.1" + graceful-fs "^4.2.2" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.1" + p-map "^3.0.0" + rimraf "^3.0.0" + slash "^3.0.0" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +diff@3.5.0, diff@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dotenv@>=1.0.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" + integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== + +electron-to-chromium@^1.3.295: + version "1.3.298" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.298.tgz#6f2b09c9b4ffca6a6745d80272dad987bcf5689c" + integrity sha512-IcgwlR5x4qtsVr1X+GDnbDEp0bAAqRA9EHP+bvIn3g5KF59Eiqjm59p27tg8b4YmgmpjfKWgec3trDRTWiVJgg== + +elegant-spinner@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" + integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.12.0, es-abstract@^1.5.1, es-abstract@^1.7.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.0.tgz#d3a26dc9c3283ac9750dca569586e976d9dcc06d" + integrity sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg== + dependencies: + es-to-primitive "^1.2.0" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.0" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-inspect "^1.6.0" + object-keys "^1.1.1" + string.prototype.trimleft "^2.1.0" + string.prototype.trimright "^2.1.0" + +es-to-primitive@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +eslint-config-airbnb-base@14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.0.0.tgz#8a7bcb9643d13c55df4dd7444f138bf4efa61e17" + integrity sha512-2IDHobw97upExLmsebhtfoD3NAKhV4H0CJWP3Uprd/uk+cHuWYOczPVxQ8PxLFUAw7o3Th1RAU8u1DoUpr+cMA== + dependencies: + confusing-browser-globals "^1.0.7" + object.assign "^4.1.0" + object.entries "^1.1.0" + +eslint-config-prettier@6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.5.0.tgz#aaf9a495e2a816865e541bfdbb73a65cc162b3eb" + integrity sha512-cjXp8SbO9VFGW/Z7mbTydqS9to8Z58E5aYhj3e1+Hx7lS9s6gL5ILKNpCqZAFOVYRcSkWPFYljHrEh8QFEK5EQ== + dependencies: + get-stdin "^6.0.0" + +eslint-import-resolver-node@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" + integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== + dependencies: + debug "^2.6.9" + resolve "^1.5.0" + +eslint-module-utils@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz#7b4675875bf96b0dbf1b21977456e5bb1f5e018c" + integrity sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw== + dependencies: + debug "^2.6.8" + pkg-dir "^2.0.0" + +eslint-plugin-import@2.18.2: + version "2.18.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz#02f1180b90b077b33d447a17a2326ceb400aceb6" + integrity sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ== + dependencies: + array-includes "^3.0.3" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.2" + eslint-module-utils "^2.4.0" + has "^1.0.3" + minimatch "^3.0.4" + object.values "^1.1.0" + read-pkg-up "^2.0.0" + resolve "^1.11.0" + +eslint-plugin-prettier@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.1.tgz#507b8562410d02a03f0ddc949c616f877852f2ba" + integrity sha512-A+TZuHZ0KU0cnn56/9mfR7/KjUJ9QNVXUhwvRFSR7PGPe0zQR6PTkmyqg1AtUUEOzTqeRsUwyKFh0oVZKVCrtA== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-security@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-security/-/eslint-plugin-security-1.4.0.tgz#d4f314484a80b1b613b8c8886e84f52efe1526c2" + integrity sha512-xlS7P2PLMXeqfhyf3NpqbvbnW04kN8M9NtmhpR3XGyOvt/vNKS7XPXT5EDbwKW9vCjWH4PpfQvgD/+JgN0VJKA== + dependencies: + safe-regex "^1.1.0" + +eslint-scope@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" + integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + +eslint@6.6.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.6.0.tgz#4a01a2fb48d32aacef5530ee9c5a78f11a8afd04" + integrity sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.0.0" + eslint-utils "^1.4.3" + eslint-visitor-keys "^1.1.0" + espree "^6.1.2" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^11.7.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^7.0.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.14" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" + integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== + dependencies: + acorn "^7.1.0" + acorn-jsx "^5.1.0" + eslint-visitor-keys "^1.1.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-2.1.0.tgz#e5d3ecd837d2a60ec50f3da78fd39767747bbe99" + integrity sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^3.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + 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.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-glob@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.1.0.tgz#77375a7e3e6f6fc9b18f061cddd28b8d1eec75ae" + integrity sha512-TrUz3THiq2Vy3bjfQUB2wNyPdGBeGmdjbzzBLhfHN4YFurYptCKwGq/TfiRavbGywFRzY6U2CdmQ1zmsY5yYaw== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastq@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.6.0.tgz#4ec8a38f4ac25f21492673adb7eae9cfef47d1c2" + integrity sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA== + dependencies: + reusify "^1.0.0" + +figures@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +figures@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" + integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + +fill-keys@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fill-keys/-/fill-keys-1.0.2.tgz#9a8fa36f4e8ad634e3bf6b4f3c8882551452eb20" + integrity sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA= + dependencies: + is-object "~1.0.1" + merge-descriptors "~1.0.0" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@3.0.0, find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flat@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" + integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== + dependencies: + is-buffer "~2.0.3" + +flatted@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" + integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fs-minipass@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + +fs-readdir-recursive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.9" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" + integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== + dependencies: + nan "^2.12.1" + node-pre-gyp "^0.12.0" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.1.tgz#6f7764f88ea11e0b514bd9bd860a132259992ca4" + integrity sha512-09/VS4iek66Dh2bctjRkowueRJbY1JDGR1L/zRxO1Qk8Uxs6PnqaNSqalpizPT+CDjre3hnEsuzvhgomz9qYrA== + +get-stdin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" + integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== + +get-stdin@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-7.0.0.tgz#8d5de98f15171a125c5e516643c7a6d0ea8a96f6" + integrity sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ== + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" + integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.0.0, glob-parent@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + dependencies: + is-glob "^4.0.1" + +glob@7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.1.3: + version "7.1.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.5.tgz#6714c69bee20f3c3e64c4dd905553e532b40cdc0" + integrity sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0, globals@^11.7.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globby@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.1.tgz#4782c34cb75dd683351335c5829cc3420e606b22" + integrity sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A== + dependencies: + "@types/glob" "^7.1.1" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.0.3" + glob "^7.1.3" + ignore "^5.1.1" + merge2 "^1.2.3" + slash "^3.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.2.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.1, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hosted-git-info@^2.1.4: + version "2.8.5" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" + integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== + +husky@3.0.9: + version "3.0.9" + resolved "https://registry.yarnpkg.com/husky/-/husky-3.0.9.tgz#a2c3e9829bfd6b4957509a9500d2eef5dbfc8044" + integrity sha512-Yolhupm7le2/MqC1VYLk/cNmYxsSsqKkTyBhzQHhPK1jFnC89mmmNVuGtLNabjDI6Aj8UNIr0KpRNuBkiC4+sg== + dependencies: + chalk "^2.4.2" + ci-info "^2.0.0" + cosmiconfig "^5.2.1" + execa "^1.0.0" + get-stdin "^7.0.0" + opencollective-postinstall "^2.0.2" + pkg-dir "^4.2.0" + please-upgrade-node "^3.2.0" + read-pkg "^5.2.0" + run-node "^1.0.0" + slash "^3.0.0" + +iconv-lite@^0.4.24, iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore-walk@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" + integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== + dependencies: + minimatch "^3.0.4" + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.1: + version "5.1.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" + integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118" + integrity sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +inquirer@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.0.tgz#9e2b032dde77da1db5db804758b8fea3a970519a" + integrity sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.2" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^4.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-buffer@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" + integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== + +is-callable@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-object@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" + integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= + +is-observable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" + integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== + dependencies: + symbol-observable "^1.1.0" + +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-inside@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" + integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== + +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= + dependencies: + has "^1.0.1" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + dependencies: + has-symbols "^1.0.0" + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +js-levenshtein@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@3.13.1, js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" + integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== + dependencies: + minimist "^1.2.0" + +just-extend@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc" + integrity sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw== + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +lint-staged@9.4.2: + version "9.4.2" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-9.4.2.tgz#14cb577a9512f520691f8b5aefce6a8f7ead6c04" + integrity sha512-OFyGokJSWTn2M6vngnlLXjaHhi8n83VIZZ5/1Z26SULRUWgR3ITWpAEQC9Pnm3MC/EpCxlwts/mQWDHNji2+zA== + dependencies: + chalk "^2.4.2" + commander "^2.20.0" + cosmiconfig "^5.2.1" + debug "^4.1.1" + dedent "^0.7.0" + del "^5.0.0" + execa "^2.0.3" + listr "^0.14.3" + log-symbols "^3.0.0" + micromatch "^4.0.2" + normalize-path "^3.0.0" + please-upgrade-node "^3.1.1" + string-argv "^0.3.0" + stringify-object "^3.3.0" + +listr-silent-renderer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" + integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4= + +listr-update-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" + integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA== + dependencies: + chalk "^1.1.3" + cli-truncate "^0.2.1" + elegant-spinner "^1.0.1" + figures "^1.7.0" + indent-string "^3.0.0" + log-symbols "^1.0.2" + log-update "^2.3.0" + strip-ansi "^3.0.1" + +listr-verbose-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db" + integrity sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw== + dependencies: + chalk "^2.4.1" + cli-cursor "^2.1.0" + date-fns "^1.27.2" + figures "^2.0.0" + +listr@^0.14.3: + version "0.14.3" + resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" + integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA== + dependencies: + "@samverschueren/stream-to-observable" "^0.3.0" + is-observable "^1.1.0" + is-promise "^2.1.0" + is-stream "^1.1.0" + listr-silent-renderer "^1.1.1" + listr-update-renderer "^0.5.0" + listr-verbose-renderer "^0.5.0" + p-map "^2.0.0" + rxjs "^6.3.3" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@~4.17.0: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +log-symbols@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + +log-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + integrity sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg= + dependencies: + chalk "^1.0.0" + +log-symbols@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" + integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== + dependencies: + chalk "^2.4.2" + +log-update@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" + integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= + dependencies: + ansi-escapes "^3.0.0" + cli-cursor "^2.0.0" + wrap-ansi "^3.0.1" + +lolex@^4.1.0, lolex@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-4.2.0.tgz#ddbd7f6213ca1ea5826901ab1222b65d714b3cd7" + integrity sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg== + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +merge-descriptors@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.2.3, merge2@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" + integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + 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.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +mocha@6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.2.tgz#5d8987e28940caf8957a7d7664b910dc5b2fea20" + integrity sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A== + dependencies: + ansi-colors "3.2.3" + browser-stdout "1.3.1" + debug "3.2.6" + diff "3.5.0" + escape-string-regexp "1.0.5" + find-up "3.0.0" + glob "7.1.3" + growl "1.10.5" + he "1.2.0" + js-yaml "3.13.1" + log-symbols "2.2.0" + minimatch "3.0.4" + mkdirp "0.5.1" + ms "2.1.1" + node-environment-flags "1.0.5" + object.assign "4.1.0" + strip-json-comments "2.0.1" + supports-color "6.0.0" + which "1.3.1" + wide-align "1.1.3" + yargs "13.3.0" + yargs-parser "13.1.1" + yargs-unparser "1.6.0" + +module-not-found-error@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/module-not-found-error/-/module-not-found-error-1.0.1.tgz#cf8b4ff4f29640674d6cdd02b0e3bc523c2bbdc0" + integrity sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA= + +moment@>=2.14.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" + integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nan@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + 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-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +needle@^2.2.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" + integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +nise@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/nise/-/nise-1.5.2.tgz#b6d29af10e48b321b307e10e065199338eeb2652" + integrity sha512-/6RhOUlicRCbE9s+94qCUsyE+pKlVJ5AhIv+jEE7ESKwnbXqulKZ1FYU+XAtHHWE9TinYvAxDUJAb912PwPoWA== + dependencies: + "@sinonjs/formatio" "^3.2.1" + "@sinonjs/text-encoding" "^0.7.1" + just-extend "^4.0.2" + lolex "^4.1.0" + path-to-regexp "^1.7.0" + +node-environment-flags@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.5.tgz#fa930275f5bf5dae188d6192b24b4c8bbac3d76a" + integrity sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ== + dependencies: + object.getownpropertydescriptors "^2.0.3" + semver "^5.7.0" + +node-pre-gyp@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" + integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +node-releases@^1.1.38: + version "1.1.39" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.39.tgz#c1011f30343aff5b633153b10ff691d278d08e8d" + integrity sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA== + dependencies: + semver "^6.3.0" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-bundled@^1.0.1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== + +npm-packlist@^1.1.6: + version "1.4.6" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.6.tgz#53ba3ed11f8523079f1457376dd379ee4ea42ff4" + integrity sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npm-run-path@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-3.1.0.tgz#7f91be317f6a466efed3c9f2980ad8a4ee8b0fa5" + integrity sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg== + dependencies: + path-key "^3.0.0" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" + integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@4.1.0, object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.entries@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519" + integrity sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.12.0" + function-bind "^1.1.1" + has "^1.0.3" + +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" + integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.12.0" + function-bind "^1.1.1" + has "^1.0.3" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +onetime@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + dependencies: + mimic-fn "^2.1.0" + +opencollective-postinstall@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz#5657f1bede69b6e33a45939b061eb53d3c6c3a89" + integrity sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw== + +optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +output-file-sync@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-2.0.1.tgz#f53118282f5f553c2799541792b723a4c71430c0" + integrity sha512-mDho4qm7WgIXIGf4eYU1RHN2UU5tPfVYVSRwDJw0uTmj35DQUt/eNp19N7v6T3SrR0ESTEf2up2CGO73qI35zQ== + dependencies: + graceful-fs "^4.1.11" + is-plain-obj "^1.1.0" + mkdirp "^0.5.1" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-finally@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" + integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" + integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +packet-reader@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-1.0.0.tgz#9238e5480dedabacfe1fe3f2771063f164157d74" + integrity sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" + integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + lines-and-columns "^1.1.6" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.0.tgz#99a10d870a803bdd5ee6f0470e58dfcd2f9a54d3" + integrity sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg== + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-to-regexp@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" + integrity sha1-Wf3g9DW62suhA6hOnTvGTpa5k30= + dependencies: + isarray "0.0.1" + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pathval@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" + integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= + +pg-connection-string@0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-0.1.3.tgz#da1847b20940e42ee1492beaf65d49d91b245df7" + integrity sha1-2hhHsglA5C7hSSvq9l1J2RskXfc= + +pg-int8@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" + integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== + +pg-pool@^2.0.4: + version "2.0.7" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-2.0.7.tgz#f14ecab83507941062c313df23f6adcd9fd0ce54" + integrity sha512-UiJyO5B9zZpu32GSlP0tXy8J2NsJ9EFGFfz5v6PSbdz/1hBLX1rNiiy5+mAm5iJJYwfCv4A0EBcQLGWwjbpzZw== + +pg-types@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" + integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== + dependencies: + pg-int8 "1.0.1" + postgres-array "~2.0.0" + postgres-bytea "~1.0.0" + postgres-date "~1.0.4" + postgres-interval "^1.1.0" + +pg@7.12.1: + version "7.12.1" + resolved "https://registry.yarnpkg.com/pg/-/pg-7.12.1.tgz#880636d46d2efbe0968e64e9fe0eeece8ef72a7e" + integrity sha512-l1UuyfEvoswYfcUe6k+JaxiN+5vkOgYcVSbSuw3FvdLqDbaoa2RJo1zfJKfPsSYPFVERd4GHvX3s2PjG1asSDA== + dependencies: + buffer-writer "2.0.0" + packet-reader "1.0.0" + pg-connection-string "0.1.3" + pg-pool "^2.0.4" + pg-types "^2.1.0" + pgpass "1.x" + semver "4.3.2" + +pgpass@1.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.2.tgz#2a7bb41b6065b67907e91da1b07c1847c877b306" + integrity sha1-Knu0G2BltnkH6R2hsHwYR8h3swY= + dependencies: + split "^1.0.0" + +picomatch@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.1.0.tgz#0fd042f568d08b1ad9ff2d3ec0f0bfb3cb80e177" + integrity sha512-uhnEDzAbrcJ8R3g2fANnSuXZMBtkpSjxTTgn2LeSiQlfmq72enQJWdQllXW24MBLYnA1SBD2vfvx2o0Zw3Ielw== + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +please-upgrade-node@^3.1.1, please-upgrade-node@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" + integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== + dependencies: + semver-compare "^1.0.0" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postgres-array@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" + integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== + +postgres-bytea@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" + integrity sha1-AntTPAqokOJtFy1Hz5zOzFIazTU= + +postgres-date@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.4.tgz#1c2728d62ef1bff49abdd35c1f86d4bdf118a728" + integrity sha512-bESRvKVuTrjoBluEcpv2346+6kgB7UlnqWZsnbnCccTNq/pqfj1j6oBaN5+b/NrDXepYUT/HKadqv3iS9lJuVA== + +postgres-interval@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" + integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== + dependencies: + xtend "^4.0.0" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@1.18.2: + version "1.18.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" + integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== + +private@^0.1.6: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +proxyquire@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/proxyquire/-/proxyquire-2.1.3.tgz#2049a7eefa10a9a953346a18e54aab2b4268df39" + integrity sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg== + dependencies: + fill-keys "^1.0.2" + module-not-found-error "^1.0.1" + resolve "^1.11.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +readable-stream@^2.0.2, readable-stream@^2.0.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +regenerate-unicode-properties@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" + integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + +regenerator-runtime@^0.13.2: + version "0.13.3" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" + integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== + +regenerator-transform@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb" + integrity sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ== + dependencies: + private "^0.1.6" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +regexpu-core@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" + integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.1.0" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.1.0" + +regjsgen@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" + integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== + +regjsparser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" + integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@^1.10.0, resolve@^1.11.0, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.3.2, resolve@^1.5.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" + integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== + dependencies: + path-parse "^1.0.6" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +reusify@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rimraf@^2.6.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b" + integrity sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg== + dependencies: + glob "^7.1.3" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + dependencies: + is-promise "^2.1.0" + +run-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e" + integrity sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A== + +run-parallel@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" + integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + +rxjs@^6.3.3, rxjs@^6.4.0: + version "6.5.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" + integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== + dependencies: + tslib "^1.9.0" + +safe-buffer@^5.1.2: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= + +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.7.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7" + integrity sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c= + +semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +sinon-chai@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-3.3.0.tgz#8084ff99451064910fbe2c2cb8ab540c00b740ea" + integrity sha512-r2JhDY7gbbmh5z3Q62pNbrjxZdOAjpsqW/8yxAZRSqLZqowmfGZPGUZPFf3UX36NLis0cv8VEM5IJh9HgkSOAA== + +sinon@7.5.0: + version "7.5.0" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.5.0.tgz#e9488ea466070ea908fd44a3d6478fd4923c67ec" + integrity sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q== + dependencies: + "@sinonjs/commons" "^1.4.0" + "@sinonjs/formatio" "^3.2.1" + "@sinonjs/samsam" "^3.3.3" + diff "^3.5.0" + lolex "^4.2.0" + nise "^1.5.2" + supports-color "^5.5.0" + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +split@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" + integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== + dependencies: + through "2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +string-argv@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.1.0.tgz#ba846d1daa97c3c596155308063e075ed1c99aff" + integrity sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^5.2.0" + +string.prototype.trimleft@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634" + integrity sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string.prototype.trimright@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58" + integrity sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@2.0.1, strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +strip-json-comments@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" + integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + +supports-color@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" + integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== + dependencies: + has-flag "^3.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +symbol-observable@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== + +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +tar@^4: + version "4.4.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" + integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.8.6" + minizlib "^1.2.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.3" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +through@2, through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +tslib@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" + integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +typescript@3.6.4: + version "3.6.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.4.tgz#b18752bb3792bc1a0281335f7f6ebf1bbfc5b91d" + integrity sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg== + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" + integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" + integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +v8-compile-cache@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" + integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@1.3.1, which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.1.tgz#f1cf94d07a8e571b6ff006aeb91d0300c47ef0a4" + integrity sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w== + dependencies: + isexe "^2.0.0" + +wide-align@1.1.3, wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + +wrap-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" + integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo= + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + +xregexp@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.2.4.tgz#02a4aea056d65a42632c02f0233eab8e4d7e57ed" + integrity sha512-sO0bYdYeJAJBcJA8g7MJJX7UrOZIfJPd8U2SC7B2Dd/J24U0aQNoGp33shCaBSWeb0rD5rh6VBUIXOkGal1TZA== + dependencies: + "@babel/runtime-corejs2" "^7.2.0" + +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yallist@^3.0.0, yallist@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yargs-parser@13.1.1, yargs-parser@^13.1.1: + version "13.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.0.tgz#cdd7a97490ec836195f59f3f4dbe5ea9e8f75f08" + integrity sha512-xLTUnCMc4JhxrPEPUYD5IBR1mWCK/aT6+RJ/K29JY2y1vD+FhtgKK0AXRWvI262q3QSffAQuTouFIKUuHX89wQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-unparser@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" + integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== + dependencies: + flat "^4.1.0" + lodash "^4.17.15" + yargs "^13.3.0" + +yargs@13.3.0, yargs@^13.3.0: + version "13.3.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" + integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.1" + +yargs@~14.2.0: + version "14.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.0.tgz#f116a9242c4ed8668790b40759b4906c276e76c3" + integrity sha512-/is78VKbKs70bVZH7w4YaZea6xcJWOAwkhbR0CFuZBmYtfTYF0xjGJF43AYd8g2Uii1yJwmS5GR2vBmrc32sbg== + dependencies: + cliui "^5.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^15.0.0" From b3b3ccbdeaa7a66f8aeb17c0f95007b80d091101 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Sat, 2 Nov 2019 13:59:45 +0100 Subject: [PATCH 34/57] Revoke push of yarn.lock --- yarn.lock | 4529 ----------------------------------------------------- 1 file changed, 4529 deletions(-) delete mode 100644 yarn.lock diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 18bff212..00000000 --- a/yarn.lock +++ /dev/null @@ -1,4529 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/cli@7.6.4": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.6.4.tgz#9b35a4e15fa7d8f487418aaa8229c8b0bc815f20" - integrity sha512-tqrDyvPryBM6xjIyKKUwr3s8CzmmYidwgdswd7Uc/Cv0ogZcuS1TYQTLx/eWKP3UbJ6JxZAiYlBZabXm/rtRsQ== - dependencies: - commander "^2.8.1" - convert-source-map "^1.1.0" - fs-readdir-recursive "^1.1.0" - glob "^7.0.0" - lodash "^4.17.13" - mkdirp "^0.5.1" - output-file-sync "^2.0.0" - slash "^2.0.0" - source-map "^0.5.0" - optionalDependencies: - chokidar "^2.1.8" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" - integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== - dependencies: - "@babel/highlight" "^7.0.0" - -"@babel/core@7.6.4": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.6.4.tgz#6ebd9fe00925f6c3e177bb726a188b5f578088ff" - integrity sha512-Rm0HGw101GY8FTzpWSyRbki/jzq+/PkNQJ+nSulrdY6gFGOsNseCqD6KHRYe2E+EdzuBdr2pxCp6s4Uk6eJ+XQ== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.6.4" - "@babel/helpers" "^7.6.2" - "@babel/parser" "^7.6.4" - "@babel/template" "^7.6.0" - "@babel/traverse" "^7.6.3" - "@babel/types" "^7.6.3" - convert-source-map "^1.1.0" - debug "^4.1.0" - json5 "^2.1.0" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/generator@^7.6.3", "@babel/generator@^7.6.4": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.4.tgz#a4f8437287bf9671b07f483b76e3bb731bc97671" - integrity sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w== - dependencies: - "@babel/types" "^7.6.3" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - -"@babel/helper-annotate-as-pure@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" - integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" - integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-call-delegate@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" - integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ== - dependencies: - "@babel/helper-hoist-variables" "^7.4.4" - "@babel/traverse" "^7.4.4" - "@babel/types" "^7.4.4" - -"@babel/helper-define-map@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz#3dec32c2046f37e09b28c93eb0b103fd2a25d369" - integrity sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg== - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/types" "^7.5.5" - lodash "^4.17.13" - -"@babel/helper-explode-assignable-expression@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" - integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== - dependencies: - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-function-name@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" - integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== - dependencies: - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-get-function-arity@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" - integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-hoist-variables@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" - integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w== - dependencies: - "@babel/types" "^7.4.4" - -"@babel/helper-member-expression-to-functions@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz#1fb5b8ec4453a93c439ee9fe3aeea4a84b76b590" - integrity sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA== - dependencies: - "@babel/types" "^7.5.5" - -"@babel/helper-module-imports@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" - integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz#f84ff8a09038dcbca1fd4355661a500937165b4a" - integrity sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/template" "^7.4.4" - "@babel/types" "^7.5.5" - lodash "^4.17.13" - -"@babel/helper-optimise-call-expression@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" - integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-plugin-utils@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" - integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== - -"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" - integrity sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw== - dependencies: - lodash "^4.17.13" - -"@babel/helper-remap-async-to-generator@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" - integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-wrap-function" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-replace-supers@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz#f84ce43df031222d2bad068d2626cb5799c34bc2" - integrity sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.5.5" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/traverse" "^7.5.5" - "@babel/types" "^7.5.5" - -"@babel/helper-simple-access@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" - integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== - dependencies: - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-split-export-declaration@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" - integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== - dependencies: - "@babel/types" "^7.4.4" - -"@babel/helper-wrap-function@^7.1.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" - integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.2.0" - -"@babel/helpers@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.6.2.tgz#681ffe489ea4dcc55f23ce469e58e59c1c045153" - integrity sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA== - dependencies: - "@babel/template" "^7.6.0" - "@babel/traverse" "^7.6.2" - "@babel/types" "^7.6.0" - -"@babel/highlight@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" - integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== - dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.0.0", "@babel/parser@^7.6.0", "@babel/parser@^7.6.3", "@babel/parser@^7.6.4": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.4.tgz#cb9b36a7482110282d5cb6dd424ec9262b473d81" - integrity sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A== - -"@babel/plugin-proposal-async-generator-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" - integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" - "@babel/plugin-syntax-async-generators" "^7.2.0" - -"@babel/plugin-proposal-dynamic-import@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz#e532202db4838723691b10a67b8ce509e397c506" - integrity sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-dynamic-import" "^7.2.0" - -"@babel/plugin-proposal-json-strings@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" - integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-json-strings" "^7.2.0" - -"@babel/plugin-proposal-object-rest-spread@7.6.2", "@babel/plugin-proposal-object-rest-spread@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz#8ffccc8f3a6545e9f78988b6bf4fe881b88e8096" - integrity sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - -"@babel/plugin-proposal-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" - integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" - -"@babel/plugin-proposal-unicode-property-regex@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz#05413762894f41bfe42b9a5e80919bd575dcc802" - integrity sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.6.0" - -"@babel/plugin-syntax-async-generators@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" - integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-dynamic-import@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" - integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-json-strings@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" - integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-object-rest-spread@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" - integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" - integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-arrow-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" - integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-async-to-generator@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz#89a3848a0166623b5bc481164b5936ab947e887e" - integrity sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" - -"@babel/plugin-transform-block-scoped-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" - integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-block-scoping@^7.6.3": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz#6e854e51fbbaa84351b15d4ddafe342f3a5d542a" - integrity sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - lodash "^4.17.13" - -"@babel/plugin-transform-classes@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz#d094299d9bd680a14a2a0edae38305ad60fb4de9" - integrity sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-define-map" "^7.5.5" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.5.5" - "@babel/helper-split-export-declaration" "^7.4.4" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" - integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-destructuring@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz#44bbe08b57f4480094d57d9ffbcd96d309075ba6" - integrity sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-dotall-regex@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.6.2.tgz#44abb948b88f0199a627024e1508acaf8dc9b2f9" - integrity sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.6.0" - -"@babel/plugin-transform-duplicate-keys@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz#c5dbf5106bf84cdf691222c0974c12b1df931853" - integrity sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-exponentiation-operator@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" - integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-for-of@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" - integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-function-name@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" - integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA== - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" - integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-member-expression-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" - integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-modules-amd@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz#ef00435d46da0a5961aa728a1d2ecff063e4fb91" - integrity sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg== - dependencies: - "@babel/helper-module-transforms" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - babel-plugin-dynamic-import-node "^2.3.0" - -"@babel/plugin-transform-modules-commonjs@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz#39dfe957de4420445f1fcf88b68a2e4aa4515486" - integrity sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g== - dependencies: - "@babel/helper-module-transforms" "^7.4.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - babel-plugin-dynamic-import-node "^2.3.0" - -"@babel/plugin-transform-modules-systemjs@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz#e75266a13ef94202db2a0620977756f51d52d249" - integrity sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg== - dependencies: - "@babel/helper-hoist-variables" "^7.4.4" - "@babel/helper-plugin-utils" "^7.0.0" - babel-plugin-dynamic-import-node "^2.3.0" - -"@babel/plugin-transform-modules-umd@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" - integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== - dependencies: - "@babel/helper-module-transforms" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.6.3": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.3.tgz#aaa6e409dd4fb2e50b6e2a91f7e3a3149dbce0cf" - integrity sha512-jTkk7/uE6H2s5w6VlMHeWuH+Pcy2lmdwFoeWCVnvIrDUnB5gQqTVI8WfmEAhF2CDEarGrknZcmSFg1+bkfCoSw== - dependencies: - regexpu-core "^4.6.0" - -"@babel/plugin-transform-new-target@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" - integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-object-super@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz#c70021df834073c65eb613b8679cc4a381d1a9f9" - integrity sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.5.5" - -"@babel/plugin-transform-parameters@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" - integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw== - dependencies: - "@babel/helper-call-delegate" "^7.4.4" - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-property-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" - integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-regenerator@^7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" - integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== - dependencies: - regenerator-transform "^0.14.0" - -"@babel/plugin-transform-reserved-words@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" - integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-shorthand-properties@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" - integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-spread@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz#fc77cf798b24b10c46e1b51b1b88c2bf661bb8dd" - integrity sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-sticky-regex@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" - integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - -"@babel/plugin-transform-template-literals@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" - integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-typeof-symbol@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" - integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-unicode-regex@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz#b692aad888a7e8d8b1b214be6b9dc03d5031f698" - integrity sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.6.0" - -"@babel/preset-env@7.6.3": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.6.3.tgz#9e1bf05a2e2d687036d24c40e4639dc46cef2271" - integrity sha512-CWQkn7EVnwzlOdR5NOm2+pfgSNEZmvGjOhlCHBDq0J8/EStr+G+FvPEiz9B56dR6MoiUFjXhfE4hjLoAKKJtIQ== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-async-generator-functions" "^7.2.0" - "@babel/plugin-proposal-dynamic-import" "^7.5.0" - "@babel/plugin-proposal-json-strings" "^7.2.0" - "@babel/plugin-proposal-object-rest-spread" "^7.6.2" - "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.6.2" - "@babel/plugin-syntax-async-generators" "^7.2.0" - "@babel/plugin-syntax-dynamic-import" "^7.2.0" - "@babel/plugin-syntax-json-strings" "^7.2.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" - "@babel/plugin-transform-arrow-functions" "^7.2.0" - "@babel/plugin-transform-async-to-generator" "^7.5.0" - "@babel/plugin-transform-block-scoped-functions" "^7.2.0" - "@babel/plugin-transform-block-scoping" "^7.6.3" - "@babel/plugin-transform-classes" "^7.5.5" - "@babel/plugin-transform-computed-properties" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.6.0" - "@babel/plugin-transform-dotall-regex" "^7.6.2" - "@babel/plugin-transform-duplicate-keys" "^7.5.0" - "@babel/plugin-transform-exponentiation-operator" "^7.2.0" - "@babel/plugin-transform-for-of" "^7.4.4" - "@babel/plugin-transform-function-name" "^7.4.4" - "@babel/plugin-transform-literals" "^7.2.0" - "@babel/plugin-transform-member-expression-literals" "^7.2.0" - "@babel/plugin-transform-modules-amd" "^7.5.0" - "@babel/plugin-transform-modules-commonjs" "^7.6.0" - "@babel/plugin-transform-modules-systemjs" "^7.5.0" - "@babel/plugin-transform-modules-umd" "^7.2.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.6.3" - "@babel/plugin-transform-new-target" "^7.4.4" - "@babel/plugin-transform-object-super" "^7.5.5" - "@babel/plugin-transform-parameters" "^7.4.4" - "@babel/plugin-transform-property-literals" "^7.2.0" - "@babel/plugin-transform-regenerator" "^7.4.5" - "@babel/plugin-transform-reserved-words" "^7.2.0" - "@babel/plugin-transform-shorthand-properties" "^7.2.0" - "@babel/plugin-transform-spread" "^7.6.2" - "@babel/plugin-transform-sticky-regex" "^7.2.0" - "@babel/plugin-transform-template-literals" "^7.4.4" - "@babel/plugin-transform-typeof-symbol" "^7.2.0" - "@babel/plugin-transform-unicode-regex" "^7.6.2" - "@babel/types" "^7.6.3" - browserslist "^4.6.0" - core-js-compat "^3.1.1" - invariant "^2.2.2" - js-levenshtein "^1.1.3" - semver "^5.5.0" - -"@babel/runtime-corejs2@^7.2.0": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.6.3.tgz#de3f446b3fb688b98cbd220474d1a7cad909bcb8" - integrity sha512-nuA2o+rgX2+PrNTZ063ehncVcg7sn+tU71BB81SaWRVUbGwCOlb0+yQA1e0QqmzOfRSYOxfvf8cosYqFbJEiwQ== - dependencies: - core-js "^2.6.5" - regenerator-runtime "^0.13.2" - -"@babel/template@^7.1.0", "@babel/template@^7.4.4", "@babel/template@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6" - integrity sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.6.0" - "@babel/types" "^7.6.0" - -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5", "@babel/traverse@^7.6.2", "@babel/traverse@^7.6.3": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.3.tgz#66d7dba146b086703c0fb10dd588b7364cec47f9" - integrity sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.6.3" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.6.3" - "@babel/types" "^7.6.3" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - -"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5", "@babel/types@^7.6.0", "@babel/types@^7.6.3": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.3.tgz#3f07d96f854f98e2fbd45c64b0cb942d11e8ba09" - integrity sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA== - dependencies: - esutils "^2.0.2" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@nodelib/fs.scandir@2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" - integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== - dependencies: - "@nodelib/fs.stat" "2.0.3" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" - integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" - integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== - dependencies: - "@nodelib/fs.scandir" "2.1.3" - fastq "^1.6.0" - -"@samverschueren/stream-to-observable@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" - integrity sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg== - dependencies: - any-observable "^0.3.0" - -"@sinonjs/commons@^1", "@sinonjs/commons@^1.3.0", "@sinonjs/commons@^1.4.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.6.0.tgz#ec7670432ae9c8eb710400d112c201a362d83393" - integrity sha512-w4/WHG7C4WWFyE5geCieFJF6MZkbW4VAriol5KlmQXpAQdxvV0p26sqNZOW6Qyw6Y0l9K4g+cHvvczR2sEEpqg== - dependencies: - type-detect "4.0.8" - -"@sinonjs/formatio@^3.2.1": - version "3.2.2" - resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.2.2.tgz#771c60dfa75ea7f2d68e3b94c7e888a78781372c" - integrity sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ== - dependencies: - "@sinonjs/commons" "^1" - "@sinonjs/samsam" "^3.1.0" - -"@sinonjs/samsam@^3.1.0", "@sinonjs/samsam@^3.3.3": - version "3.3.3" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.3.tgz#46682efd9967b259b81136b9f120fd54585feb4a" - integrity sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ== - dependencies: - "@sinonjs/commons" "^1.3.0" - array-from "^2.1.1" - lodash "^4.17.15" - -"@sinonjs/text-encoding@^0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" - integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== - -"@types/events@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" - integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== - -"@types/glob@^7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" - integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== - dependencies: - "@types/events" "*" - "@types/minimatch" "*" - "@types/node" "*" - -"@types/lodash@4.14.144": - version "4.14.144" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.144.tgz#12e57fc99064bce45e5ab3c8bc4783feb75eab8e" - integrity sha512-ogI4g9W5qIQQUhXAclq6zhqgqNUr7UlFaqDHbch7WLSLeeM/7d3CRaw7GLajxvyFvhJqw4Rpcz5bhoaYtIx6Tg== - -"@types/minimatch@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== - -"@types/mkdirp@0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" - integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg== - dependencies: - "@types/node" "*" - -"@types/node@*": - version "12.12.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.3.tgz#ebfe83507ac506bc3486314a8aa395be66af8d23" - integrity sha512-opgSsy+cEF9N8MgaVPnWVtdJ3o4mV2aMHvDq7thkQUFt0EuOHJon4rQpJfhjmNHB+ikl0Cd6WhWIErOyQ+f7tw== - -"@types/normalize-package-data@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" - integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== - -"@types/pg-types@*": - version "1.11.4" - resolved "https://registry.yarnpkg.com/@types/pg-types/-/pg-types-1.11.4.tgz#8d7c59fb509ce3dca3f8bae589252051c639a9a8" - integrity sha512-WdIiQmE347LGc1Vq3Ki8sk3iyCuLgnccqVzgxek6gEHp2H0p3MQ3jniIHt+bRODXKju4kNQ+mp53lmP5+/9moQ== - dependencies: - moment ">=2.14.0" - -"@types/pg@^7.4.0": - version "7.11.2" - resolved "https://registry.yarnpkg.com/@types/pg/-/pg-7.11.2.tgz#199dec09426c9359574dedede37313805ba3fca2" - integrity sha512-4+rj7fnidA77jFURNanuPPc1HrQv+RkhI6s+K18G9zOKbOUUpChA/rbNMqFukNuZ89LoIt/I9dAlxf329TjCNw== - dependencies: - "@types/node" "*" - "@types/pg-types" "*" - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -acorn-jsx@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" - integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== - -acorn@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" - integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== - -aggregate-error@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" - integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv@^6.10.0, ajv@^6.10.2: - version "6.10.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" - integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-colors@3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" - integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== - -ansi-escapes@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - -ansi-escapes@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.2.1.tgz#4dccdb846c3eee10f6d64dea66273eab90c37228" - integrity sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q== - dependencies: - type-fest "^0.5.2" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -any-observable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" - integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-from@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" - integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= - -array-includes@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" - integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0= - dependencies: - define-properties "^1.1.2" - es-abstract "^1.7.0" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - -async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== - -atob@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -babel-eslint@10.0.3: - version "10.0.3" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.3.tgz#81a2c669be0f205e19462fed2482d33e4687a88a" - integrity sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.0.0" - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" - eslint-visitor-keys "^1.0.0" - resolve "^1.12.0" - -babel-plugin-dynamic-import-node@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" - integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== - dependencies: - object.assign "^4.1.0" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -browserslist@^4.6.0, browserslist@^4.7.2: - version "4.7.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.2.tgz#1bb984531a476b5d389cedecb195b2cd69fb1348" - integrity sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw== - dependencies: - caniuse-lite "^1.0.30001004" - electron-to-chromium "^1.3.295" - node-releases "^1.1.38" - -buffer-writer@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04" - integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw== - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - 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" - -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= - dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -caniuse-lite@^1.0.30001004: - version "1.0.30001006" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001006.tgz#5b6e8288792cfa275f007b2819a00ccad7112655" - integrity sha512-MXnUVX27aGs/QINz+QG1sWSLDr3P1A3Hq5EUWoIt0T7K24DuvMxZEnh3Y5aHlJW6Bz2aApJdSewdYLd8zQnUuw== - -chai-as-promised@7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" - integrity sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA== - dependencies: - check-error "^1.0.2" - -chai@4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" - integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^3.0.1" - get-func-name "^2.0.0" - pathval "^1.1.0" - type-detect "^4.0.5" - -chalk@^1.0.0, chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= - -chokidar@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" - integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" - -chownr@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" - integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-cursor@^2.0.0, cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= - dependencies: - restore-cursor "^2.0.0" - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-truncate@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" - integrity sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ= - dependencies: - slice-ansi "0.0.4" - string-width "^1.0.1" - -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -commander@^2.20.0, commander@^2.8.1: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -config@>=1.0.0: - version "3.2.4" - resolved "https://registry.yarnpkg.com/config/-/config-3.2.4.tgz#e60a908582991e800852f9cb60fcf424f3274a6c" - integrity sha512-H1XIGfnU1EAkfjSLn9ZvYDRx9lOezDViuzLDgiJ/lMeqjYe3q6iQfpcLt2NInckJgpAeekbNhQkmnnbdEDs9rw== - dependencies: - json5 "^1.0.1" - -confusing-browser-globals@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz#72bc13b483c0276801681871d4898516f8f54fdd" - integrity sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw== - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= - -convert-source-map@^1.1.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" - integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== - dependencies: - safe-buffer "~5.1.1" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -core-js-compat@^3.1.1: - version "3.3.6" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.3.6.tgz#70c30dbeb582626efe9ecd6f49daa9ff4aeb136c" - integrity sha512-YnwZG/+0/f7Pf6Lr3jxtVAFjtGBW9lsLYcqrxhYJai1GfvrP8DEyEpnNzj/FRQfIkOOfk1j5tTBvPBLWVVJm4A== - dependencies: - browserslist "^4.7.2" - semver "^6.3.0" - -core-js@^2.6.5: - version "2.6.10" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.10.tgz#8a5b8391f8cc7013da703411ce5b585706300d7f" - integrity sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA== - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -cosmiconfig@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" - -cross-env@6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-6.0.3.tgz#4256b71e49b3a40637a0ce70768a6ef5c72ae941" - integrity sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag== - dependencies: - cross-spawn "^7.0.0" - -cross-spawn@^6.0.0, cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" - integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -date-fns@^1.27.2: - version "1.30.1" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" - integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== - -debug@3.2.6, debug@^3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decamelize@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-3.2.0.tgz#84b8e8f4f8c579f938e35e2cc7024907e0090851" - integrity sha512-4TgkVUsmmu7oCSyGBm5FvfMoACuoh9EOidm7V5/J2X2djAwwt57qb3F2KMP2ITqODTCSwb+YRV+0Zqrv18k/hw== - dependencies: - xregexp "^4.2.4" - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= - -deep-eql@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== - dependencies: - type-detect "^4.0.0" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= - -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -del@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7" - integrity sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA== - dependencies: - globby "^10.0.1" - graceful-fs "^4.2.2" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.1" - p-map "^3.0.0" - rimraf "^3.0.0" - slash "^3.0.0" - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - -diff@3.5.0, diff@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dotenv@>=1.0.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" - integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== - -electron-to-chromium@^1.3.295: - version "1.3.298" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.298.tgz#6f2b09c9b4ffca6a6745d80272dad987bcf5689c" - integrity sha512-IcgwlR5x4qtsVr1X+GDnbDEp0bAAqRA9EHP+bvIn3g5KF59Eiqjm59p27tg8b4YmgmpjfKWgec3trDRTWiVJgg== - -elegant-spinner@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" - integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -error-ex@^1.2.0, error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.12.0, es-abstract@^1.5.1, es-abstract@^1.7.0: - version "1.16.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.0.tgz#d3a26dc9c3283ac9750dca569586e976d9dcc06d" - integrity sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg== - dependencies: - es-to-primitive "^1.2.0" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.0" - is-callable "^1.1.4" - is-regex "^1.0.4" - object-inspect "^1.6.0" - object-keys "^1.1.1" - string.prototype.trimleft "^2.1.0" - string.prototype.trimright "^2.1.0" - -es-to-primitive@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" - integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -eslint-config-airbnb-base@14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.0.0.tgz#8a7bcb9643d13c55df4dd7444f138bf4efa61e17" - integrity sha512-2IDHobw97upExLmsebhtfoD3NAKhV4H0CJWP3Uprd/uk+cHuWYOczPVxQ8PxLFUAw7o3Th1RAU8u1DoUpr+cMA== - dependencies: - confusing-browser-globals "^1.0.7" - object.assign "^4.1.0" - object.entries "^1.1.0" - -eslint-config-prettier@6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.5.0.tgz#aaf9a495e2a816865e541bfdbb73a65cc162b3eb" - integrity sha512-cjXp8SbO9VFGW/Z7mbTydqS9to8Z58E5aYhj3e1+Hx7lS9s6gL5ILKNpCqZAFOVYRcSkWPFYljHrEh8QFEK5EQ== - dependencies: - get-stdin "^6.0.0" - -eslint-import-resolver-node@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" - integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== - dependencies: - debug "^2.6.9" - resolve "^1.5.0" - -eslint-module-utils@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz#7b4675875bf96b0dbf1b21977456e5bb1f5e018c" - integrity sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw== - dependencies: - debug "^2.6.8" - pkg-dir "^2.0.0" - -eslint-plugin-import@2.18.2: - version "2.18.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz#02f1180b90b077b33d447a17a2326ceb400aceb6" - integrity sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ== - dependencies: - array-includes "^3.0.3" - contains-path "^0.1.0" - debug "^2.6.9" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.2" - eslint-module-utils "^2.4.0" - has "^1.0.3" - minimatch "^3.0.4" - object.values "^1.1.0" - read-pkg-up "^2.0.0" - resolve "^1.11.0" - -eslint-plugin-prettier@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.1.tgz#507b8562410d02a03f0ddc949c616f877852f2ba" - integrity sha512-A+TZuHZ0KU0cnn56/9mfR7/KjUJ9QNVXUhwvRFSR7PGPe0zQR6PTkmyqg1AtUUEOzTqeRsUwyKFh0oVZKVCrtA== - dependencies: - prettier-linter-helpers "^1.0.0" - -eslint-plugin-security@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-security/-/eslint-plugin-security-1.4.0.tgz#d4f314484a80b1b613b8c8886e84f52efe1526c2" - integrity sha512-xlS7P2PLMXeqfhyf3NpqbvbnW04kN8M9NtmhpR3XGyOvt/vNKS7XPXT5EDbwKW9vCjWH4PpfQvgD/+JgN0VJKA== - dependencies: - safe-regex "^1.1.0" - -eslint-scope@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" - integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-utils@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" - integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== - -eslint@6.6.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.6.0.tgz#4a01a2fb48d32aacef5530ee9c5a78f11a8afd04" - integrity sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.10.0" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^1.4.3" - eslint-visitor-keys "^1.1.0" - espree "^6.1.2" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^11.7.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^7.0.0" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.14" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^6.1.2" - strip-ansi "^5.2.0" - strip-json-comments "^3.0.1" - table "^5.2.3" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -espree@^6.1.2: - version "6.1.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" - integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== - dependencies: - acorn "^7.1.0" - acorn-jsx "^5.1.0" - eslint-visitor-keys "^1.1.0" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" - integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== - dependencies: - estraverse "^4.0.0" - -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== - dependencies: - estraverse "^4.1.0" - -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-2.1.0.tgz#e5d3ecd837d2a60ec50f3da78fd39767747bbe99" - integrity sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^3.0.0" - onetime "^5.1.0" - p-finally "^2.0.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - 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.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= - -fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - -fast-glob@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.1.0.tgz#77375a7e3e6f6fc9b18f061cddd28b8d1eec75ae" - integrity sha512-TrUz3THiq2Vy3bjfQUB2wNyPdGBeGmdjbzzBLhfHN4YFurYptCKwGq/TfiRavbGywFRzY6U2CdmQ1zmsY5yYaw== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.0" - merge2 "^1.3.0" - micromatch "^4.0.2" - -fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= - -fast-levenshtein@~2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -fastq@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.6.0.tgz#4ec8a38f4ac25f21492673adb7eae9cfef47d1c2" - integrity sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA== - dependencies: - reusify "^1.0.0" - -figures@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" - integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= - dependencies: - escape-string-regexp "^1.0.5" - object-assign "^4.1.0" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - dependencies: - escape-string-regexp "^1.0.5" - -figures@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" - integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== - dependencies: - flat-cache "^2.0.1" - -fill-keys@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/fill-keys/-/fill-keys-1.0.2.tgz#9a8fa36f4e8ad634e3bf6b4f3c8882551452eb20" - integrity sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA= - dependencies: - is-object "~1.0.1" - merge-descriptors "~1.0.0" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@3.0.0, find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^2.0.0, find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== - dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - -flat@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" - integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== - dependencies: - is-buffer "~2.0.3" - -flatted@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" - integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -fs-minipass@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - -fs-readdir-recursive@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" - integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@^1.2.7: - version "1.2.9" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" - integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== - dependencies: - nan "^2.12.1" - node-pre-gyp "^0.12.0" - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= - -get-own-enumerable-property-symbols@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.1.tgz#6f7764f88ea11e0b514bd9bd860a132259992ca4" - integrity sha512-09/VS4iek66Dh2bctjRkowueRJbY1JDGR1L/zRxO1Qk8Uxs6PnqaNSqalpizPT+CDjre3hnEsuzvhgomz9qYrA== - -get-stdin@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" - integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== - -get-stdin@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-7.0.0.tgz#8d5de98f15171a125c5e516643c7a6d0ea8a96f6" - integrity sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ== - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" - integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== - dependencies: - pump "^3.0.0" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-parent@^5.0.0, glob-parent@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" - integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== - dependencies: - is-glob "^4.0.1" - -glob@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.0.0, glob@^7.1.3: - version "7.1.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.5.tgz#6714c69bee20f3c3e64c4dd905553e532b40cdc0" - integrity sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0, globals@^11.7.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globby@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.1.tgz#4782c34cb75dd683351335c5829cc3420e606b22" - integrity sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A== - dependencies: - "@types/glob" "^7.1.1" - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.0.3" - glob "^7.1.3" - ignore "^5.1.1" - merge2 "^1.2.3" - slash "^3.0.0" - -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.2.2: - version "4.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== - -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" - integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.1, has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -he@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -hosted-git-info@^2.1.4: - version "2.8.5" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" - integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== - -husky@3.0.9: - version "3.0.9" - resolved "https://registry.yarnpkg.com/husky/-/husky-3.0.9.tgz#a2c3e9829bfd6b4957509a9500d2eef5dbfc8044" - integrity sha512-Yolhupm7le2/MqC1VYLk/cNmYxsSsqKkTyBhzQHhPK1jFnC89mmmNVuGtLNabjDI6Aj8UNIr0KpRNuBkiC4+sg== - dependencies: - chalk "^2.4.2" - ci-info "^2.0.0" - cosmiconfig "^5.2.1" - execa "^1.0.0" - get-stdin "^7.0.0" - opencollective-postinstall "^2.0.2" - pkg-dir "^4.2.0" - please-upgrade-node "^3.2.0" - read-pkg "^5.2.0" - run-node "^1.0.0" - slash "^3.0.0" - -iconv-lite@^0.4.24, iconv-lite@^0.4.4: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== - dependencies: - minimatch "^3.0.4" - -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.1.1: - version "5.1.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" - integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== - -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - -import-fresh@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118" - integrity sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -indent-string@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" - integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== - -inquirer@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.0.tgz#9e2b032dde77da1db5db804758b8fea3a970519a" - integrity sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ== - dependencies: - ansi-escapes "^4.2.1" - chalk "^2.4.2" - cli-cursor "^3.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.15" - mute-stream "0.0.8" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^4.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - -invariant@^2.2.2: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - dependencies: - binary-extensions "^1.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-buffer@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" - integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== - -is-callable@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" - integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0, is-glob@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= - -is-object@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" - integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= - -is-observable@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" - integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== - dependencies: - symbol-observable "^1.1.0" - -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-inside@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" - integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== - -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= - -is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= - dependencies: - has "^1.0.1" - -is-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" - integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" - integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== - -is-symbol@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" - integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== - dependencies: - has-symbols "^1.0.0" - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -js-levenshtein@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" - integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@3.13.1, js-yaml@^3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -json5@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" - integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== - dependencies: - minimist "^1.2.0" - -just-extend@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc" - integrity sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw== - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== - -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lines-and-columns@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" - integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= - -lint-staged@9.4.2: - version "9.4.2" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-9.4.2.tgz#14cb577a9512f520691f8b5aefce6a8f7ead6c04" - integrity sha512-OFyGokJSWTn2M6vngnlLXjaHhi8n83VIZZ5/1Z26SULRUWgR3ITWpAEQC9Pnm3MC/EpCxlwts/mQWDHNji2+zA== - dependencies: - chalk "^2.4.2" - commander "^2.20.0" - cosmiconfig "^5.2.1" - debug "^4.1.1" - dedent "^0.7.0" - del "^5.0.0" - execa "^2.0.3" - listr "^0.14.3" - log-symbols "^3.0.0" - micromatch "^4.0.2" - normalize-path "^3.0.0" - please-upgrade-node "^3.1.1" - string-argv "^0.3.0" - stringify-object "^3.3.0" - -listr-silent-renderer@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" - integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4= - -listr-update-renderer@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" - integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA== - dependencies: - chalk "^1.1.3" - cli-truncate "^0.2.1" - elegant-spinner "^1.0.1" - figures "^1.7.0" - indent-string "^3.0.0" - log-symbols "^1.0.2" - log-update "^2.3.0" - strip-ansi "^3.0.1" - -listr-verbose-renderer@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db" - integrity sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw== - dependencies: - chalk "^2.4.1" - cli-cursor "^2.1.0" - date-fns "^1.27.2" - figures "^2.0.0" - -listr@^0.14.3: - version "0.14.3" - resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" - integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA== - dependencies: - "@samverschueren/stream-to-observable" "^0.3.0" - is-observable "^1.1.0" - is-promise "^2.1.0" - is-stream "^1.1.0" - listr-silent-renderer "^1.1.1" - listr-update-renderer "^0.5.0" - listr-verbose-renderer "^0.5.0" - p-map "^2.0.0" - rxjs "^6.3.3" - -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@~4.17.0: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== - -log-symbols@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== - dependencies: - chalk "^2.0.1" - -log-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" - integrity sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg= - dependencies: - chalk "^1.0.0" - -log-symbols@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" - integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== - dependencies: - chalk "^2.4.2" - -log-update@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" - integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= - dependencies: - ansi-escapes "^3.0.0" - cli-cursor "^2.0.0" - wrap-ansi "^3.0.1" - -lolex@^4.1.0, lolex@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-4.2.0.tgz#ddbd7f6213ca1ea5826901ab1222b65d714b3cd7" - integrity sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg== - -loose-envify@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -merge-descriptors@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.2.3, merge2@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" - integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== - -micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - 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.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -micromatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== - dependencies: - braces "^3.0.1" - picomatch "^2.0.5" - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimatch@3.0.4, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - -minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= - -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - dependencies: - minimist "0.0.8" - -mocha@6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.2.tgz#5d8987e28940caf8957a7d7664b910dc5b2fea20" - integrity sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A== - dependencies: - ansi-colors "3.2.3" - browser-stdout "1.3.1" - debug "3.2.6" - diff "3.5.0" - escape-string-regexp "1.0.5" - find-up "3.0.0" - glob "7.1.3" - growl "1.10.5" - he "1.2.0" - js-yaml "3.13.1" - log-symbols "2.2.0" - minimatch "3.0.4" - mkdirp "0.5.1" - ms "2.1.1" - node-environment-flags "1.0.5" - object.assign "4.1.0" - strip-json-comments "2.0.1" - supports-color "6.0.0" - which "1.3.1" - wide-align "1.1.3" - yargs "13.3.0" - yargs-parser "13.1.1" - yargs-unparser "1.6.0" - -module-not-found-error@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/module-not-found-error/-/module-not-found-error-1.0.1.tgz#cf8b4ff4f29640674d6cdd02b0e3bc523c2bbdc0" - integrity sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA= - -moment@>=2.14.0: - version "2.24.0" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" - integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -ms@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -nan@^2.12.1: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - 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-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - -needle@^2.2.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" - integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -nise@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/nise/-/nise-1.5.2.tgz#b6d29af10e48b321b307e10e065199338eeb2652" - integrity sha512-/6RhOUlicRCbE9s+94qCUsyE+pKlVJ5AhIv+jEE7ESKwnbXqulKZ1FYU+XAtHHWE9TinYvAxDUJAb912PwPoWA== - dependencies: - "@sinonjs/formatio" "^3.2.1" - "@sinonjs/text-encoding" "^0.7.1" - just-extend "^4.0.2" - lolex "^4.1.0" - path-to-regexp "^1.7.0" - -node-environment-flags@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.5.tgz#fa930275f5bf5dae188d6192b24b4c8bbac3d76a" - integrity sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ== - dependencies: - object.getownpropertydescriptors "^2.0.3" - semver "^5.7.0" - -node-pre-gyp@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" - integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - -node-releases@^1.1.38: - version "1.1.39" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.39.tgz#c1011f30343aff5b633153b10ff691d278d08e8d" - integrity sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA== - dependencies: - semver "^6.3.0" - -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= - dependencies: - abbrev "1" - osenv "^0.1.4" - -normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-bundled@^1.0.1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" - integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== - -npm-packlist@^1.1.6: - version "1.4.6" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.6.tgz#53ba3ed11f8523079f1457376dd379ee4ea42ff4" - integrity sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - -npm-run-path@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-3.1.0.tgz#7f91be317f6a466efed3c9f2980ad8a4ee8b0fa5" - integrity sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg== - dependencies: - path-key "^3.0.0" - -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" - integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== - -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.assign@4.1.0, object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.entries@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519" - integrity sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.12.0" - function-bind "^1.1.1" - has "^1.0.3" - -object.getownpropertydescriptors@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" - integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= - dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -object.values@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" - integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.12.0" - function-bind "^1.1.1" - has "^1.0.3" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= - dependencies: - mimic-fn "^1.0.0" - -onetime@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" - integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== - dependencies: - mimic-fn "^2.1.0" - -opencollective-postinstall@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz#5657f1bede69b6e33a45939b061eb53d3c6c3a89" - integrity sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw== - -optionator@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.4" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - wordwrap "~1.0.0" - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -output-file-sync@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-2.0.1.tgz#f53118282f5f553c2799541792b723a4c71430c0" - integrity sha512-mDho4qm7WgIXIGf4eYU1RHN2UU5tPfVYVSRwDJw0uTmj35DQUt/eNp19N7v6T3SrR0ESTEf2up2CGO73qI35zQ== - dependencies: - graceful-fs "^4.1.11" - is-plain-obj "^1.1.0" - mkdirp "^0.5.1" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-finally@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" - integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" - integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== - dependencies: - p-try "^2.0.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-map@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== - -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== - dependencies: - aggregate-error "^3.0.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -packet-reader@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-1.0.0.tgz#9238e5480dedabacfe1fe3f2771063f164157d74" - integrity sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-json@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" - integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - lines-and-columns "^1.1.6" - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.0.tgz#99a10d870a803bdd5ee6f0470e58dfcd2f9a54d3" - integrity sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg== - -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== - -path-to-regexp@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" - integrity sha1-Wf3g9DW62suhA6hOnTvGTpa5k30= - dependencies: - isarray "0.0.1" - -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= - dependencies: - pify "^2.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pathval@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" - integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= - -pg-connection-string@0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-0.1.3.tgz#da1847b20940e42ee1492beaf65d49d91b245df7" - integrity sha1-2hhHsglA5C7hSSvq9l1J2RskXfc= - -pg-int8@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" - integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== - -pg-pool@^2.0.4: - version "2.0.7" - resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-2.0.7.tgz#f14ecab83507941062c313df23f6adcd9fd0ce54" - integrity sha512-UiJyO5B9zZpu32GSlP0tXy8J2NsJ9EFGFfz5v6PSbdz/1hBLX1rNiiy5+mAm5iJJYwfCv4A0EBcQLGWwjbpzZw== - -pg-types@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" - integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== - dependencies: - pg-int8 "1.0.1" - postgres-array "~2.0.0" - postgres-bytea "~1.0.0" - postgres-date "~1.0.4" - postgres-interval "^1.1.0" - -pg@7.12.1: - version "7.12.1" - resolved "https://registry.yarnpkg.com/pg/-/pg-7.12.1.tgz#880636d46d2efbe0968e64e9fe0eeece8ef72a7e" - integrity sha512-l1UuyfEvoswYfcUe6k+JaxiN+5vkOgYcVSbSuw3FvdLqDbaoa2RJo1zfJKfPsSYPFVERd4GHvX3s2PjG1asSDA== - dependencies: - buffer-writer "2.0.0" - packet-reader "1.0.0" - pg-connection-string "0.1.3" - pg-pool "^2.0.4" - pg-types "^2.1.0" - pgpass "1.x" - semver "4.3.2" - -pgpass@1.x: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.2.tgz#2a7bb41b6065b67907e91da1b07c1847c877b306" - integrity sha1-Knu0G2BltnkH6R2hsHwYR8h3swY= - dependencies: - split "^1.0.0" - -picomatch@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.1.0.tgz#0fd042f568d08b1ad9ff2d3ec0f0bfb3cb80e177" - integrity sha512-uhnEDzAbrcJ8R3g2fANnSuXZMBtkpSjxTTgn2LeSiQlfmq72enQJWdQllXW24MBLYnA1SBD2vfvx2o0Zw3Ielw== - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= - dependencies: - find-up "^2.1.0" - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -please-upgrade-node@^3.1.1, please-upgrade-node@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" - integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== - dependencies: - semver-compare "^1.0.0" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -postgres-array@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" - integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== - -postgres-bytea@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" - integrity sha1-AntTPAqokOJtFy1Hz5zOzFIazTU= - -postgres-date@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.4.tgz#1c2728d62ef1bff49abdd35c1f86d4bdf118a728" - integrity sha512-bESRvKVuTrjoBluEcpv2346+6kgB7UlnqWZsnbnCccTNq/pqfj1j6oBaN5+b/NrDXepYUT/HKadqv3iS9lJuVA== - -postgres-interval@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" - integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== - dependencies: - xtend "^4.0.0" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - -prettier@1.18.2: - version "1.18.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" - integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== - -private@^0.1.6: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -proxyquire@2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/proxyquire/-/proxyquire-2.1.3.tgz#2049a7eefa10a9a953346a18e54aab2b4268df39" - integrity sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg== - dependencies: - fill-keys "^1.0.2" - module-not-found-error "^1.0.1" - resolve "^1.11.1" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -readable-stream@^2.0.2, readable-stream@^2.0.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - -regenerate-unicode-properties@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" - integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== - dependencies: - regenerate "^1.4.0" - -regenerate@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== - -regenerator-runtime@^0.13.2: - version "0.13.3" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" - integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== - -regenerator-transform@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb" - integrity sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ== - dependencies: - private "^0.1.6" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - -regexpu-core@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" - integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg== - dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^8.1.0" - regjsgen "^0.5.0" - regjsparser "^0.6.0" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.1.0" - -regjsgen@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" - integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== - -regjsparser@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" - integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== - dependencies: - jsesc "~0.5.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@^1.10.0, resolve@^1.11.0, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.3.2, resolve@^1.5.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" - integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== - dependencies: - path-parse "^1.0.6" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -reusify@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - -rimraf@^2.6.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -rimraf@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b" - integrity sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg== - dependencies: - glob "^7.1.3" - -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= - dependencies: - is-promise "^2.1.0" - -run-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e" - integrity sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A== - -run-parallel@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" - integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== - -rxjs@^6.3.3, rxjs@^6.4.0: - version "6.5.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" - integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== - dependencies: - tslib "^1.9.0" - -safe-buffer@^5.1.2: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -semver-compare@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" - integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= - -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.7.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7" - integrity sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c= - -semver@^6.1.2, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -set-blocking@^2.0.0, set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= - -sinon-chai@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-3.3.0.tgz#8084ff99451064910fbe2c2cb8ab540c00b740ea" - integrity sha512-r2JhDY7gbbmh5z3Q62pNbrjxZdOAjpsqW/8yxAZRSqLZqowmfGZPGUZPFf3UX36NLis0cv8VEM5IJh9HgkSOAA== - -sinon@7.5.0: - version "7.5.0" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.5.0.tgz#e9488ea466070ea908fd44a3d6478fd4923c67ec" - integrity sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q== - dependencies: - "@sinonjs/commons" "^1.4.0" - "@sinonjs/formatio" "^3.2.1" - "@sinonjs/samsam" "^3.3.3" - diff "^3.5.0" - lolex "^4.2.0" - nise "^1.5.2" - supports-color "^5.5.0" - -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slice-ansi@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" - integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= - -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== - dependencies: - atob "^2.1.1" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= - -source-map@^0.5.0, source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== - -spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -split@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" - integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== - dependencies: - through "2" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -string-argv@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" - integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2", string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string-width@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.1.0.tgz#ba846d1daa97c3c596155308063e075ed1c99aff" - integrity sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^5.2.0" - -string.prototype.trimleft@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634" - integrity sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw== - dependencies: - define-properties "^1.1.3" - function-bind "^1.1.1" - -string.prototype.trimright@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58" - integrity sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg== - dependencies: - define-properties "^1.1.3" - function-bind "^1.1.1" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -stringify-object@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" - integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== - dependencies: - get-own-enumerable-property-symbols "^3.0.0" - is-obj "^1.0.1" - is-regexp "^1.0.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@2.0.1, strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -strip-json-comments@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" - integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== - -supports-color@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" - integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== - dependencies: - has-flag "^3.0.0" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - -supports-color@^5.3.0, supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -symbol-observable@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" - integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== - -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== - dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" - -tar@^4: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - -through@2, through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -tslib@^1.9.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" - integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - -type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" - integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -typescript@3.6.4: - version "3.6.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.4.tgz#b18752bb3792bc1a0281335f7f6ebf1bbfc5b91d" - integrity sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg== - -unicode-canonical-property-names-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" - integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== - -unicode-match-property-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" - integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== - dependencies: - unicode-canonical-property-names-ecmascript "^1.0.4" - unicode-property-aliases-ecmascript "^1.0.4" - -unicode-match-property-value-ecmascript@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" - integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== - -unicode-property-aliases-ecmascript@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" - integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -upath@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== - -uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -v8-compile-cache@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" - integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@1.3.1, which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.1.tgz#f1cf94d07a8e571b6ff006aeb91d0300c47ef0a4" - integrity sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w== - dependencies: - isexe "^2.0.0" - -wide-align@1.1.3, wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - -wrap-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" - integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo= - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - -xregexp@^4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.2.4.tgz#02a4aea056d65a42632c02f0233eab8e4d7e57ed" - integrity sha512-sO0bYdYeJAJBcJA8g7MJJX7UrOZIfJPd8U2SC7B2Dd/J24U0aQNoGp33shCaBSWeb0rD5rh6VBUIXOkGal1TZA== - dependencies: - "@babel/runtime-corejs2" "^7.2.0" - -xtend@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== - -yallist@^3.0.0, yallist@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yargs-parser@13.1.1, yargs-parser@^13.1.1: - version "13.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" - integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^15.0.0: - version "15.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.0.tgz#cdd7a97490ec836195f59f3f4dbe5ea9e8f75f08" - integrity sha512-xLTUnCMc4JhxrPEPUYD5IBR1mWCK/aT6+RJ/K29JY2y1vD+FhtgKK0AXRWvI262q3QSffAQuTouFIKUuHX89wQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-unparser@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" - integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== - dependencies: - flat "^4.1.0" - lodash "^4.17.15" - yargs "^13.3.0" - -yargs@13.3.0, yargs@^13.3.0: - version "13.3.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" - integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.1" - -yargs@~14.2.0: - version "14.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.0.tgz#f116a9242c4ed8668790b40759b4906c276e76c3" - integrity sha512-/is78VKbKs70bVZH7w4YaZea6xcJWOAwkhbR0CFuZBmYtfTYF0xjGJF43AYd8g2Uii1yJwmS5GR2vBmrc32sbg== - dependencies: - cliui "^5.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^15.0.0" From b999edfab906abea564084b1b8034cecc1393e18 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Sat, 2 Nov 2019 15:12:16 +0100 Subject: [PATCH 35/57] Define function argument parameters --- src/migration-builder.ts | 6 +-- src/operations/domains.ts | 18 ++++--- src/operations/extensions.ts | 11 ++++- src/operations/functions.ts | 29 ++++++----- src/operations/indexes.ts | 27 ++++++++--- src/operations/operators.ts | 61 ++++++++++++++---------- src/operations/other.ts | 4 +- src/operations/policies.ts | 34 ++++++++++--- src/operations/roles.ts | 14 +++--- src/operations/schemas.ts | 21 ++++++-- src/operations/sequences.ts | 20 +++++--- src/operations/tables.ts | 74 +++++++++++++++++++++-------- src/operations/triggers.ts | 34 +++++++++---- src/operations/types.ts | 54 ++++++++++++++++----- src/operations/views.ts | 23 ++++++--- src/operations/viewsMaterialized.ts | 34 +++++++++---- src/utils.ts | 2 +- 17 files changed, 327 insertions(+), 139 deletions(-) diff --git a/src/migration-builder.ts b/src/migration-builder.ts index 7db4c72c..9be21835 100644 --- a/src/migration-builder.ts +++ b/src/migration-builder.ts @@ -332,7 +332,7 @@ export default class MigrationBuilder { operatorClassName: Name, type: Type, indexMethod: Name, - operatorList: OperatorListDefinition, + operatorList: OperatorListDefinition[], options: CreateOperatorClassOptions ) => void; public readonly dropOperatorClass: ( @@ -362,12 +362,12 @@ export default class MigrationBuilder { public readonly addToOperatorFamily: ( operatorFamilyName: Name, indexMethod: Name, - operatorList: OperatorListDefinition + operatorList: OperatorListDefinition[] ) => void; public readonly removeFromOperatorFamily: ( operatorFamilyName: Name, indexMethod: Name, - operatorList: OperatorListDefinition + operatorList: OperatorListDefinition[] ) => void; public readonly createPolicy: ( diff --git a/src/operations/domains.ts b/src/operations/domains.ts index 2ddcdb31..ea66841b 100644 --- a/src/operations/domains.ts +++ b/src/operations/domains.ts @@ -1,4 +1,4 @@ -import { Value } from '../definitions'; +import { DropOptions, Name, Type, Value } from '../definitions'; import { MigrationOptions } from '../migration-builder'; import { applyType, escapeValue } from '../utils'; @@ -22,7 +22,7 @@ export interface DomainOptionsAlterEn { export type DomainOptionsAlter = DomainOptionsAlterEn & DomainOptions; export function dropDomain(mOptions: MigrationOptions) { - const _drop = (domainName, { ifExists, cascade } = {}) => { + const _drop = (domainName: Name, { ifExists, cascade }: DropOptions = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; const domainNameStr = mOptions.literal(domainName); @@ -32,7 +32,11 @@ export function dropDomain(mOptions: MigrationOptions) { } export function createDomain(mOptions: MigrationOptions) { - const _create = (domainName, type, options = {}) => { + const _create = ( + domainName: Name, + type: Type, + options: DomainOptionsCreate = {} + ) => { const { default: defaultValue, collation, @@ -69,13 +73,13 @@ export function createDomain(mOptions: MigrationOptions) { return `CREATE DOMAIN ${domainNameStr} AS ${typeStr}${constraintsStr};`; }; - _create.reverse = (domainName, type, options) => + _create.reverse = (domainName: Name, type: Type, options: DropOptions) => dropDomain(mOptions)(domainName, options); return _create; } export function alterDomain(mOptions: MigrationOptions) { - const _alter = (domainName, options) => { + const _alter = (domainName: Name, options: DomainOptionsAlter) => { const { default: defaultValue, notNull, @@ -112,12 +116,12 @@ export function alterDomain(mOptions: MigrationOptions) { } export function renameDomain(mOptions: MigrationOptions) { - const _rename = (domainName, newDomainName) => { + const _rename = (domainName: Name, newDomainName: Name) => { const domainNameStr = mOptions.literal(domainName); const newDomainNameStr = mOptions.literal(newDomainName); return `ALTER DOMAIN ${domainNameStr} RENAME TO ${newDomainNameStr};`; }; - _rename.reverse = (domainName, newDomainName) => + _rename.reverse = (domainName: Name, newDomainName: Name) => _rename(newDomainName, domainName); return _rename; } diff --git a/src/operations/extensions.ts b/src/operations/extensions.ts index 38c4a37d..7846d3f1 100644 --- a/src/operations/extensions.ts +++ b/src/operations/extensions.ts @@ -1,4 +1,5 @@ import _ from 'lodash'; +import { DropOptions, LiteralUnion } from '../definitions'; import { MigrationOptions } from '../migration-builder'; export type Extension = @@ -54,7 +55,10 @@ export interface CreateExtensionOptions { } export function dropExtension(mOptions: MigrationOptions) { - const _drop = (extensions, { ifExists, cascade } = {}) => { + const _drop = ( + extensions: LiteralUnion | Array>, + { ifExists, cascade }: DropOptions = {} + ) => { if (!_.isArray(extensions)) extensions = [extensions]; // eslint-disable-line no-param-reassign const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; @@ -67,7 +71,10 @@ export function dropExtension(mOptions: MigrationOptions) { } export function createExtension(mOptions: MigrationOptions) { - const _create = (extensions, { ifNotExists, schema } = {}) => { + const _create = ( + extensions: LiteralUnion | Array>, + { ifNotExists, schema }: CreateExtensionOptions = {} + ) => { if (!_.isArray(extensions)) extensions = [extensions]; // eslint-disable-line no-param-reassign const ifNotExistsStr = ifNotExists ? ' IF NOT EXISTS' : ''; const schemaStr = schema ? ` SCHEMA ${mOptions.literal(schema)}` : ''; diff --git a/src/operations/functions.ts b/src/operations/functions.ts index c3794afe..1d44fc1a 100644 --- a/src/operations/functions.ts +++ b/src/operations/functions.ts @@ -1,4 +1,4 @@ -import { Value } from '../definitions'; +import { DropOptions, Name, Value } from '../definitions'; import { MigrationOptions } from '../migration-builder'; import { escapeValue, formatParams } from '../utils'; @@ -23,9 +23,9 @@ export interface FunctionOptions { export function dropFunction(mOptions: MigrationOptions) { const _drop = ( - functionName, - functionParams = [], - { ifExists, cascade } = {} + functionName: Name, + functionParams: FunctionParam[] = [], + { ifExists, cascade }: DropOptions = {} ) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; @@ -38,10 +38,10 @@ export function dropFunction(mOptions: MigrationOptions) { export function createFunction(mOptions: MigrationOptions) { const _create = ( - functionName, - functionParams = [], - functionOptions = {}, - definition + functionName: Name, + functionParams: FunctionParam[] = [], + functionOptions: FunctionOptions = {}, + definition: Value ) => { const { replace, @@ -87,13 +87,20 @@ export function createFunction(mOptions: MigrationOptions) { } export function renameFunction(mOptions: MigrationOptions) { - const _rename = (oldFunctionName, functionParams = [], newFunctionName) => { + const _rename = ( + oldFunctionName: Name, + functionParams: FunctionParam[] = [], + newFunctionName: Name + ) => { const paramsStr = formatParams(functionParams, mOptions); const oldFunctionNameStr = mOptions.literal(oldFunctionName); const newFunctionNameStr = mOptions.literal(newFunctionName); return `ALTER FUNCTION ${oldFunctionNameStr}${paramsStr} RENAME TO ${newFunctionNameStr};`; }; - _rename.reverse = (oldFunctionName, functionParams, newFunctionName) => - _rename(newFunctionName, functionParams, oldFunctionName); + _rename.reverse = ( + oldFunctionName: Name, + functionParams: FunctionParam[], + newFunctionName: Name + ) => _rename(newFunctionName, functionParams, oldFunctionName); return _rename; } diff --git a/src/operations/indexes.ts b/src/operations/indexes.ts index 638aedd5..3c1dfe36 100644 --- a/src/operations/indexes.ts +++ b/src/operations/indexes.ts @@ -1,5 +1,5 @@ import _ from 'lodash'; -import { DropOptions } from '../definitions'; +import { DropOptions, Name } from '../definitions'; import { MigrationOptions } from '../migration-builder'; export interface CreateIndexOptions { @@ -18,7 +18,11 @@ export interface DropIndexOptionsEn { export type DropIndexOptions = DropIndexOptionsEn & DropOptions; -function generateIndexName(table, columns, options) { +function generateIndexName( + table: Name, + columns: string | string[], + options: CreateIndexOptions | DropIndexOptions +) { if (options.name) { return typeof table === 'object' ? { schema: table.schema, name: options.name } @@ -34,7 +38,7 @@ function generateIndexName(table, columns, options) { : `${table}_${cols}${uniq}_index`; } -function generateColumnString(column, literal) { +function generateColumnString(column: string, literal: (v: Name) => string) { const openingBracketPos = column.indexOf('('); const closingBracketPos = column.indexOf(')'); const isFunction = @@ -44,14 +48,21 @@ function generateColumnString(column, literal) { : literal(column); // single column } -function generateColumnsString(columns, literal) { +function generateColumnsString( + columns: string | string[], + literal: (v: Name) => string +) { return _.isArray(columns) ? columns.map(column => generateColumnString(column, literal)).join(', ') : generateColumnString(columns, literal); } export function dropIndex(mOptions: MigrationOptions) { - const _drop = (tableName, columns, options = {}) => { + const _drop = ( + tableName: Name, + columns: string | string[], + options: DropIndexOptions = {} + ) => { const { concurrently, ifExists, cascade } = options; const concurrentlyStr = concurrently ? ' CONCURRENTLY' : ''; const ifExistsStr = ifExists ? ' IF EXISTS' : ''; @@ -65,7 +76,11 @@ export function dropIndex(mOptions: MigrationOptions) { } export function createIndex(mOptions: MigrationOptions) { - const _create = (tableName, columns, options = {}) => { + const _create = ( + tableName: Name, + columns: string | string[], + options: CreateIndexOptions = {} + ) => { /* columns - the column, columns, or expression to create the index on diff --git a/src/operations/operators.ts b/src/operations/operators.ts index 7191e6ad..0c2ca1b3 100644 --- a/src/operations/operators.ts +++ b/src/operations/operators.ts @@ -1,4 +1,4 @@ -import { Name } from '../definitions'; +import { Name, DropOptions, Type } from '../definitions'; import { MigrationOptions } from '../migration-builder'; import { applyType, formatParams } from '../utils'; import { FunctionParam } from './functions'; @@ -35,7 +35,7 @@ export interface OperatorListDefinition { } export function dropOperator(mOptions: MigrationOptions) { - const _drop = (operatorName, options: DropOperatorOptions = {}) => { + const _drop = (operatorName: Name, options: DropOperatorOptions = {}) => { const { ifExists, cascade, left, right } = options; const operatorNameStr = mOptions.schemalize(operatorName); @@ -51,7 +51,7 @@ export function dropOperator(mOptions: MigrationOptions) { } export function createOperator(mOptions: MigrationOptions) { - const _create = (operatorName, options: CreateOperatorOptions = {}) => { + const _create = (operatorName: Name, options: CreateOperatorOptions = {}) => { const { procedure, left, @@ -99,9 +99,9 @@ export function createOperator(mOptions: MigrationOptions) { export function dropOperatorFamily(mOptions: MigrationOptions) { const _drop = ( - operatorFamilyName, + operatorFamilyName: Name, indexMethod, - { ifExists, cascade } = {} + { ifExists, cascade }: DropOptions = {} ) => { const operatorFamilyNameStr = mOptions.literal(operatorFamilyName); const ifExistsStr = ifExists ? ' IF EXISTS' : ''; @@ -112,7 +112,7 @@ export function dropOperatorFamily(mOptions: MigrationOptions) { } export function createOperatorFamily(mOptions: MigrationOptions) { - const _create = (operatorFamilyName, indexMethod) => { + const _create = (operatorFamilyName: Name, indexMethod) => { const operatorFamilyNameStr = mOptions.literal(operatorFamilyName); return `CREATE OPERATOR FAMILY ${operatorFamilyNameStr} USING ${indexMethod};`; }; @@ -125,7 +125,7 @@ const operatorMap = (mOptions: MigrationOptions) => ({ number, name, params = [] -}) => { +}: OperatorListDefinition) => { const nameStr = mOptions.literal(name); if (String(type).toLowerCase() === 'function') { if (params.length > 2) { @@ -148,7 +148,11 @@ const changeOperatorFamily = ( op, reverse?: (mOptions: MigrationOptions) => any ) => (mOptions: MigrationOptions) => { - const method = (operatorFamilyName, indexMethod, operatorList) => { + const method = ( + operatorFamilyName: Name, + indexMethod, + operatorList: OperatorListDefinition[] + ) => { const operatorFamilyNameStr = mOptions.literal(operatorFamilyName); const operatorListStr = operatorList .map(operatorMap(mOptions)) @@ -171,9 +175,9 @@ export const addToOperatorFamily = changeOperatorFamily( export function renameOperatorFamily(mOptions: MigrationOptions) { const _rename = ( - oldOperatorFamilyName, + oldOperatorFamilyName: Name, indexMethod, - newOperatorFamilyName + newOperatorFamilyName: Name ) => { const oldOperatorFamilyNameStr = mOptions.literal(oldOperatorFamilyName); const newOperatorFamilyNameStr = mOptions.literal(newOperatorFamilyName); @@ -181,18 +185,18 @@ export function renameOperatorFamily(mOptions: MigrationOptions) { return `ALTER OPERATOR FAMILY ${oldOperatorFamilyNameStr} USING ${indexMethod} RENAME TO ${newOperatorFamilyNameStr};`; }; _rename.reverse = ( - oldOperatorFamilyName, + oldOperatorFamilyName: Name, indexMethod, - newOperatorFamilyName + newOperatorFamilyName: Name ) => _rename(newOperatorFamilyName, indexMethod, oldOperatorFamilyName); return _rename; } export function dropOperatorClass(mOptions: MigrationOptions) { const _drop = ( - operatorClassName, + operatorClassName: Name, indexMethod, - { ifExists, cascade } = {} + { ifExists, cascade }: DropOptions = {} ) => { const operatorClassNameStr = mOptions.literal(operatorClassName); const ifExistsStr = ifExists ? ' IF EXISTS' : ''; @@ -205,11 +209,11 @@ export function dropOperatorClass(mOptions: MigrationOptions) { export function createOperatorClass(mOptions: MigrationOptions) { const _create = ( - operatorClassName, - type, + operatorClassName: Name, + type: Type, indexMethod, - operatorList, - options + operatorList: OperatorListDefinition[], + options: CreateOperatorClassOptions ) => { const { default: isDefault, family } = options; const operatorClassNameStr = mOptions.literal(operatorClassName); @@ -225,23 +229,30 @@ export function createOperatorClass(mOptions: MigrationOptions) { ${operatorListStr};`; }; _create.reverse = ( - operatorClassName, - type, + operatorClassName: Name, + type: Type, indexMethod, - operatorList, - options + operatorList: OperatorListDefinition[], + options: DropOptions ) => dropOperatorClass(mOptions)(operatorClassName, indexMethod, options); return _create; } export function renameOperatorClass(mOptions: MigrationOptions) { - const _rename = (oldOperatorClassName, indexMethod, newOperatorClassName) => { + const _rename = ( + oldOperatorClassName: Name, + indexMethod, + newOperatorClassName: Name + ) => { const oldOperatorClassNameStr = mOptions.literal(oldOperatorClassName); const newOperatorClassNameStr = mOptions.literal(newOperatorClassName); return `ALTER OPERATOR CLASS ${oldOperatorClassNameStr} USING ${indexMethod} RENAME TO ${newOperatorClassNameStr};`; }; - _rename.reverse = (oldOperatorClassName, indexMethod, newOperatorClassName) => - _rename(newOperatorClassName, indexMethod, oldOperatorClassName); + _rename.reverse = ( + oldOperatorClassName: Name, + indexMethod, + newOperatorClassName: Name + ) => _rename(newOperatorClassName, indexMethod, oldOperatorClassName); return _rename; } diff --git a/src/operations/other.ts b/src/operations/other.ts index f8faf694..0776f2f2 100644 --- a/src/operations/other.ts +++ b/src/operations/other.ts @@ -3,9 +3,9 @@ import { createTransformer } from '../utils'; export function sql(mOptions: MigrationOptions) { const t = createTransformer(mOptions.literal); - return (...args) => { + return (sql: string, args?: object) => { // applies some very basic templating using the utils.p - let s: string = t(...args); + let s: string = t(sql, args); // add trailing ; if not present if (s.lastIndexOf(';') !== s.length - 1) { s += ';'; diff --git a/src/operations/policies.ts b/src/operations/policies.ts index 3bf74c7d..fa8770d6 100644 --- a/src/operations/policies.ts +++ b/src/operations/policies.ts @@ -1,3 +1,4 @@ +import { IfExistsOption, Name } from '../definitions'; import { MigrationOptions } from '../migration-builder'; export interface PolicyOptions { @@ -28,7 +29,11 @@ const makeClauses = ({ role, using, check }) => { }; export function dropPolicy(mOptions: MigrationOptions) { - const _drop = (tableName, policyName, { ifExists } = {}) => { + const _drop = ( + tableName: Name, + policyName: string, + { ifExists }: IfExistsOption = {} + ) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const policyNameStr = mOptions.literal(policyName); const tableNameStr = mOptions.literal(tableName); @@ -38,8 +43,12 @@ export function dropPolicy(mOptions: MigrationOptions) { } export function createPolicy(mOptions: MigrationOptions) { - const _create = (tableName, policyName, options = {}) => { - const createOptions = { + const _create = ( + tableName: Name, + policyName: string, + options: CreatePolicyOptions = {} + ) => { + const createOptions: CreatePolicyOptions = { ...options, role: options.role || 'PUBLIC' }; @@ -57,7 +66,11 @@ export function createPolicy(mOptions: MigrationOptions) { } export function alterPolicy(mOptions: MigrationOptions) { - const _alter = (tableName, policyName, options = {}) => { + const _alter = ( + tableName: Name, + policyName: string, + options: PolicyOptions = {} + ) => { const clausesStr = makeClauses(options).join(' '); const policyNameStr = mOptions.literal(policyName); const tableNameStr = mOptions.literal(tableName); @@ -67,13 +80,20 @@ export function alterPolicy(mOptions: MigrationOptions) { } export function renamePolicy(mOptions: MigrationOptions) { - const _rename = (tableName, policyName, newPolicyName) => { + const _rename = ( + tableName: Name, + policyName: string, + newPolicyName: Name + ) => { const policyNameStr = mOptions.literal(policyName); const newPolicyNameStr = mOptions.literal(newPolicyName); const tableNameStr = mOptions.literal(tableName); return `ALTER POLICY ${policyNameStr} ON ${tableNameStr} RENAME TO ${newPolicyNameStr};`; }; - _rename.reverse = (tableName, policyName, newPolicyName) => - _rename(tableName, newPolicyName, policyName); + _rename.reverse = ( + tableName: Name, + policyName: string, + newPolicyName: Name + ) => _rename(tableName, newPolicyName, policyName); return _rename; } diff --git a/src/operations/roles.ts b/src/operations/roles.ts index 4a461727..d1da5dcb 100644 --- a/src/operations/roles.ts +++ b/src/operations/roles.ts @@ -1,5 +1,5 @@ import { isArray } from 'lodash'; -import { Value } from '../definitions'; +import { IfExistsOption, Name, Value } from '../definitions'; import { MigrationOptions } from '../migration-builder'; import { escapeValue } from '../utils'; @@ -20,7 +20,7 @@ export interface RoleOptions { admin?: string | string[]; } -const formatRoleOptions = (roleOptions = {}) => { +const formatRoleOptions = (roleOptions: RoleOptions = {}) => { const options = []; if (roleOptions.superuser !== undefined) { options.push(roleOptions.superuser ? 'SUPERUSER' : 'NOSUPERUSER'); @@ -80,7 +80,7 @@ const formatRoleOptions = (roleOptions = {}) => { }; export function dropRole(mOptions: MigrationOptions) { - const _drop = (roleName, { ifExists } = {}) => { + const _drop = (roleName: Name, { ifExists }: IfExistsOption = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const roleNameStr = mOptions.literal(roleName); return `DROP ROLE${ifExistsStr} ${roleNameStr};`; @@ -89,7 +89,7 @@ export function dropRole(mOptions: MigrationOptions) { } export function createRole(mOptions: MigrationOptions) { - const _create = (roleName, roleOptions = {}) => { + const _create = (roleName: Name, roleOptions: RoleOptions = {}) => { const options = formatRoleOptions({ ...roleOptions, superuser: roleOptions.superuser || false, @@ -107,7 +107,7 @@ export function createRole(mOptions: MigrationOptions) { } export function alterRole(mOptions: MigrationOptions) { - const _alter = (roleName, roleOptions = {}) => { + const _alter = (roleName: Name, roleOptions: RoleOptions = {}) => { const options = formatRoleOptions(roleOptions); return options ? `ALTER ROLE ${mOptions.literal(roleName)} WITH ${options};` @@ -117,12 +117,12 @@ export function alterRole(mOptions: MigrationOptions) { } export function renameRole(mOptions: MigrationOptions) { - const _rename = (oldRoleName, newRoleName) => { + const _rename = (oldRoleName: Name, newRoleName: Name) => { const oldRoleNameStr = mOptions.literal(oldRoleName); const newRoleNameStr = mOptions.literal(newRoleName); return `ALTER ROLE ${oldRoleNameStr} RENAME TO ${newRoleNameStr};`; }; - _rename.reverse = (oldRoleName, newRoleName) => + _rename.reverse = (oldRoleName: Name, newRoleName: Name) => _rename(newRoleName, oldRoleName); return _rename; } diff --git a/src/operations/schemas.ts b/src/operations/schemas.ts index 7cf1c072..8b7c5696 100644 --- a/src/operations/schemas.ts +++ b/src/operations/schemas.ts @@ -1,7 +1,11 @@ +import { DropOptions, Name } from '../definitions'; import { MigrationOptions } from '../migration-builder'; export function dropSchema(mOptions: MigrationOptions) { - const _drop = (schemaName, { ifExists, cascade } = {}) => { + const _drop = ( + schemaName: string, + { ifExists, cascade }: DropOptions = {} + ) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; const schemaNameStr = mOptions.literal(schemaName); @@ -11,7 +15,16 @@ export function dropSchema(mOptions: MigrationOptions) { } export function createSchema(mOptions: MigrationOptions) { - const _create = (schemaName, { ifNotExists, authorization } = {}) => { + const _create = ( + schemaName: string, + { + ifNotExists, + authorization + }: { + ifNotExists?: boolean; + authorization?: string; + } = {} + ) => { const ifNotExistsStr = ifNotExists ? ' IF NOT EXISTS' : ''; const schemaNameStr = mOptions.literal(schemaName); const authorizationStr = authorization @@ -24,12 +37,12 @@ export function createSchema(mOptions: MigrationOptions) { } export function renameSchema(mOptions: MigrationOptions) { - const _rename = (schemaName, newSchemaName) => { + const _rename = (schemaName: Name, newSchemaName: Name) => { const schemaNameStr = mOptions.literal(schemaName); const newSchemaNameStr = mOptions.literal(newSchemaName); return `ALTER SCHEMA ${schemaNameStr} RENAME TO ${newSchemaNameStr};`; }; - _rename.reverse = (schemaName, newSchemaName) => + _rename.reverse = (schemaName: Name, newSchemaName: Name) => _rename(newSchemaName, schemaName); return _rename; } diff --git a/src/operations/sequences.ts b/src/operations/sequences.ts index 58c6128a..f9d40f1c 100644 --- a/src/operations/sequences.ts +++ b/src/operations/sequences.ts @@ -1,4 +1,4 @@ -import { Type } from '../definitions'; +import { ColumnDefinitions, DropOptions, Name, Type } from '../definitions'; import { MigrationOptions } from '../migration-builder'; import { applyType } from '../utils'; @@ -26,7 +26,10 @@ export type SequenceOptionsCreate = SequenceOptionsCreateEn & SequenceOptions; export type SequenceOptionsAlter = SequenceOptionsAlterEn & SequenceOptions; -export const parseSequenceOptions = (typeShorthands, options) => { +export const parseSequenceOptions = ( + typeShorthands: ColumnDefinitions, + options +) => { const { type, increment, @@ -74,7 +77,10 @@ export const parseSequenceOptions = (typeShorthands, options) => { }; export function dropSequence(mOptions: MigrationOptions) { - const _drop = (sequenceName, { ifExists, cascade } = {}) => { + const _drop = ( + sequenceName: Name, + { ifExists, cascade }: DropOptions = {} + ) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; const sequenceNameStr = mOptions.literal(sequenceName); @@ -84,7 +90,7 @@ export function dropSequence(mOptions: MigrationOptions) { } export function createSequence(mOptions: MigrationOptions) { - const _create = (sequenceName, options = {}) => { + const _create = (sequenceName: Name, options: SequenceOptionsCreate = {}) => { const { temporary, ifNotExists } = options; const temporaryStr = temporary ? ' TEMPORARY' : ''; const ifNotExistsStr = ifNotExists ? ' IF NOT EXISTS' : ''; @@ -101,7 +107,7 @@ export function createSequence(mOptions: MigrationOptions) { } export function alterSequence(mOptions: MigrationOptions) { - return (sequenceName, options) => { + return (sequenceName: Name, options: SequenceOptionsAlter) => { const { restart } = options; const clauses = parseSequenceOptions(mOptions.typeShorthands, options); if (restart) { @@ -117,12 +123,12 @@ export function alterSequence(mOptions: MigrationOptions) { } export function renameSequence(mOptions: MigrationOptions) { - const _rename = (sequenceName, newSequenceName) => { + const _rename = (sequenceName: Name, newSequenceName: Name) => { const sequenceNameStr = mOptions.literal(sequenceName); const newSequenceNameStr = mOptions.literal(newSequenceName); return `ALTER SEQUENCE ${sequenceNameStr} RENAME TO ${newSequenceNameStr};`; }; - _rename.reverse = (sequenceName, newSequenceName) => + _rename.reverse = (sequenceName: Name, newSequenceName: Name) => _rename(newSequenceName, sequenceName); return _rename; } diff --git a/src/operations/tables.ts b/src/operations/tables.ts index fe20c4db..5dd0e51d 100644 --- a/src/operations/tables.ts +++ b/src/operations/tables.ts @@ -1,5 +1,13 @@ import _ from 'lodash'; -import { LikeOptions, Name, ReferencesOptions, Value } from '../definitions'; +import { + AddOptions, + ColumnDefinitions, + DropOptions, + LikeOptions, + Name, + ReferencesOptions, + Value +} from '../definitions'; import { MigrationOptions } from '../migration-builder'; import { applyType, @@ -8,7 +16,7 @@ import { escapeValue, formatLines } from '../utils'; -import { parseSequenceOptions } from './sequences'; +import { parseSequenceOptions, SequenceOptions } from './sequences'; export interface ForeignKeyOptions extends ReferencesOptions { columns: Name | Name[]; @@ -293,7 +301,7 @@ const parseLike = (like, literal) => { // TABLE export function dropTable(mOptions: MigrationOptions) { - const _drop = (tableName, { ifExists, cascade } = {}) => { + const _drop = (tableName: Name, { ifExists, cascade }: DropOptions = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; const tableNameStr = mOptions.literal(tableName); @@ -303,7 +311,11 @@ export function dropTable(mOptions: MigrationOptions) { } export function createTable(mOptions: MigrationOptions) { - const _create = (tableName, columns, options = {}) => { + const _create = ( + tableName: Name, + columns: ColumnDefinitions, + options: TableOptions = {} + ) => { const { temporary, ifNotExists, @@ -365,7 +377,7 @@ ${formatLines(tableDefinition)} } export function alterTable(mOptions: MigrationOptions) { - const _alter = (tableName, options) => { + const _alter = (tableName: Name, options: AlterTableOptions) => { const alterDefinition = []; if (options.levelSecurity) { alterDefinition.push(`${options.levelSecurity} ROW LEVEL SECURITY`); @@ -392,7 +404,11 @@ export interface AlterColumnOptions { } export function dropColumns(mOptions: MigrationOptions) { - const _drop = (tableName, columns, { ifExists, cascade } = {}) => { + const _drop = ( + tableName: Name, + columns: string | string[] | ColumnDefinitions, + { ifExists, cascade }: DropOptions = {} + ) => { if (typeof columns === 'string') { columns = [columns]; // eslint-disable-line no-param-reassign } else if (!_.isArray(columns) && typeof columns === 'object') { @@ -410,7 +426,11 @@ ${columnsStr};`; } export function addColumns(mOptions: MigrationOptions) { - const _add = (tableName, columns, { ifNotExists } = {}) => { + const _add = ( + tableName: Name, + columns: ColumnDefinitions, + { ifNotExists }: AddOptions = {} + ) => { const { columns: columnLines, comments: columnComments = [] @@ -430,7 +450,7 @@ export function addColumns(mOptions: MigrationOptions) { } export function alterColumn(mOptions: MigrationOptions) { - return (tableName, columnName, options) => { + return (tableName: Name, columnName: string, options: AlterColumnOptions) => { const { default: defaultValue, type, @@ -441,7 +461,7 @@ export function alterColumn(mOptions: MigrationOptions) { comment: columnComment, generated } = options; - const actions = []; + const actions: string[] = []; if (defaultValue === null) { actions.push('DROP DEFAULT'); } else if (defaultValue !== undefined) { @@ -474,7 +494,7 @@ export function alterColumn(mOptions: MigrationOptions) { } } - const queries = []; + const queries: string[] = []; if (actions.length > 0) { const columnsStr = formatLines( actions, @@ -498,41 +518,53 @@ export function alterColumn(mOptions: MigrationOptions) { } export function renameTable(mOptions: MigrationOptions) { - const _rename = (tableName, newName) => { + const _rename = (tableName: Name, newName: Name) => { const tableNameStr = mOptions.literal(tableName); const newNameStr = mOptions.literal(newName); return `ALTER TABLE ${tableNameStr} RENAME TO ${newNameStr};`; }; - _rename.reverse = (tableName, newName) => _rename(newName, tableName); + _rename.reverse = (tableName: Name, newName: Name) => + _rename(newName, tableName); return _rename; } export function renameColumn(mOptions: MigrationOptions) { - const _rename = (tableName, columnName, newName) => { + const _rename = (tableName: Name, columnName: string, newName: string) => { const tableNameStr = mOptions.literal(tableName); const columnNameStr = mOptions.literal(columnName); const newNameStr = mOptions.literal(newName); return `ALTER TABLE ${tableNameStr} RENAME ${columnNameStr} TO ${newNameStr};`; }; - _rename.reverse = (tableName, columnName, newName) => + _rename.reverse = (tableName: Name, columnName: string, newName: string) => _rename(tableName, newName, columnName); return _rename; } export function renameConstraint(mOptions: MigrationOptions) { - const _rename = (tableName, constraintName, newName) => { + const _rename = ( + tableName: Name, + constraintName: string, + newName: string + ) => { const tableNameStr = mOptions.literal(tableName); const constraintNameStr = mOptions.literal(constraintName); const newNameStr = mOptions.literal(newName); return `ALTER TABLE ${tableNameStr} RENAME CONSTRAINT ${constraintNameStr} TO ${newNameStr};`; }; - _rename.reverse = (tableName, constraintName, newName) => - _rename(tableName, newName, constraintName); + _rename.reverse = ( + tableName: Name, + constraintName: string, + newName: string + ) => _rename(tableName, newName, constraintName); return _rename; } export function dropConstraint(mOptions: MigrationOptions) { - const _drop = (tableName, constraintName, { ifExists, cascade } = {}) => { + const _drop = ( + tableName: Name, + constraintName: string, + { ifExists, cascade }: DropOptions = {} + ) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; const tableNameStr = mOptions.literal(tableName); @@ -542,7 +574,11 @@ export function dropConstraint(mOptions: MigrationOptions) { return _drop; } export function addConstraint(mOptions: MigrationOptions) { - const _add = (tableName, constraintName, expression) => { + const _add = ( + tableName: Name, + constraintName: string | null, + expression: string | ConstraintOptions + ) => { const { constraints, comments } = typeof expression === 'string' ? { diff --git a/src/operations/triggers.ts b/src/operations/triggers.ts index 3b1e0256..acc83aaa 100644 --- a/src/operations/triggers.ts +++ b/src/operations/triggers.ts @@ -1,5 +1,5 @@ import { isArray } from 'lodash'; -import { Name, Value } from '../definitions'; +import { DropOptions, Name, Value } from '../definitions'; import { MigrationOptions } from '../migration-builder'; import { escapeValue } from '../utils'; import { createFunction, dropFunction } from './functions'; @@ -17,7 +17,11 @@ export interface TriggerOptions { } export function dropTrigger(mOptions: MigrationOptions) { - const _drop = (tableName, triggerName, { ifExists, cascade } = {}) => { + const _drop = ( + tableName: Name, + triggerName: Name, + { ifExists, cascade }: DropOptions = {} + ) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; const triggerNameStr = mOptions.literal(triggerName); @@ -28,7 +32,12 @@ export function dropTrigger(mOptions: MigrationOptions) { } export function createTrigger(mOptions: MigrationOptions) { - const _create = (tableName, triggerName, triggerOptions = {}, definition) => { + const _create = ( + tableName: Name, + triggerName: Name, + triggerOptions = {}, + definition?: Value + ) => { const { constraint, condition, @@ -92,10 +101,10 @@ export function createTrigger(mOptions: MigrationOptions) { }; _create.reverse = ( - tableName, - triggerName, + tableName: Name, + triggerName: Name, triggerOptions = {}, - definition + definition?: Value ) => { const triggerSQL = dropTrigger(mOptions)( tableName, @@ -116,13 +125,20 @@ export function createTrigger(mOptions: MigrationOptions) { } export function renameTrigger(mOptions: MigrationOptions) { - const _rename = (tableName, oldTriggerName, newTriggerName) => { + const _rename = ( + tableName: Name, + oldTriggerName: Name, + newTriggerName: Name + ) => { const oldTriggerNameStr = mOptions.literal(oldTriggerName); const tableNameStr = mOptions.literal(tableName); const newTriggerNameStr = mOptions.literal(newTriggerName); return `ALTER TRIGGER ${oldTriggerNameStr} ON ${tableNameStr} RENAME TO ${newTriggerNameStr};`; }; - _rename.reverse = (tableName, oldTriggerName, newTriggerName) => - _rename(tableName, newTriggerName, oldTriggerName); + _rename.reverse = ( + tableName: Name, + oldTriggerName: Name, + newTriggerName: Name + ) => _rename(tableName, newTriggerName, oldTriggerName); return _rename; } diff --git a/src/operations/types.ts b/src/operations/types.ts index 36ff2682..662809e7 100644 --- a/src/operations/types.ts +++ b/src/operations/types.ts @@ -1,9 +1,10 @@ import _ from 'lodash'; +import { DropOptions, IfExistsOption, Name, Type, Value } from '../definitions'; import { MigrationOptions } from '../migration-builder'; import { applyType, escapeValue } from '../utils'; export function dropType(mOptions: MigrationOptions) { - const _drop = (typeName, { ifExists, cascade } = {}) => { + const _drop = (typeName: Name, { ifExists, cascade }: DropOptions = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; const typeNameStr = mOptions.literal(typeName); @@ -13,7 +14,10 @@ export function dropType(mOptions: MigrationOptions) { } export function createType(mOptions: MigrationOptions) { - const _create = (typeName, options) => { + const _create = ( + typeName: Name, + options: Value[] | { [name: string]: Type } + ) => { if (_.isArray(options)) { const optionsStr = options.map(escapeValue).join(', '); const typeNameStr = mOptions.literal(typeName); @@ -30,7 +34,11 @@ export function createType(mOptions: MigrationOptions) { } export function dropTypeAttribute(mOptions: MigrationOptions) { - const _drop = (typeName, attributeName, { ifExists } = {}) => { + const _drop = ( + typeName: Name, + attributeName: string, + { ifExists }: IfExistsOption = {} + ) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const typeNameStr = mOptions.literal(typeName); const attributeNameStr = mOptions.literal(attributeName); @@ -40,7 +48,11 @@ export function dropTypeAttribute(mOptions: MigrationOptions) { } export function addTypeAttribute(mOptions: MigrationOptions) { - const _alterAttributeAdd = (typeName, attributeName, attributeType) => { + const _alterAttributeAdd = ( + typeName: Name, + attributeName: string, + attributeType: Type + ) => { const typeStr = applyType(attributeType, mOptions.typeShorthands).type; const typeNameStr = mOptions.literal(typeName); const attributeNameStr = mOptions.literal(attributeName); @@ -52,7 +64,7 @@ export function addTypeAttribute(mOptions: MigrationOptions) { } export function setTypeAttribute(mOptions: MigrationOptions) { - return (typeName, attributeName, attributeType) => { + return (typeName: Name, attributeName: string, attributeType: Type) => { const typeStr = applyType(attributeType, mOptions.typeShorthands).type; const typeNameStr = mOptions.literal(typeName); const attributeNameStr = mOptions.literal(attributeName); @@ -62,7 +74,15 @@ export function setTypeAttribute(mOptions: MigrationOptions) { } export function addTypeValue(mOptions: MigrationOptions) { - const _add = (typeName, value, options = {}) => { + const _add = ( + typeName: Name, + value: Value, + options: { + ifNotExists?: boolean; + before?: string; + after?: string; + } = {} + ) => { const { ifNotExists, before, after } = options; if (before && after) { @@ -80,35 +100,43 @@ export function addTypeValue(mOptions: MigrationOptions) { } export function renameType(mOptions: MigrationOptions) { - const _rename = (typeName, newTypeName) => { + const _rename = (typeName: Name, newTypeName: Name) => { const typeNameStr = mOptions.literal(typeName); const newTypeNameStr = mOptions.literal(newTypeName); return `ALTER TYPE ${typeNameStr} RENAME TO ${newTypeNameStr};`; }; - _rename.reverse = (typeName, newTypeName) => _rename(newTypeName, typeName); + _rename.reverse = (typeName: Name, newTypeName: Name) => + _rename(newTypeName, typeName); return _rename; } export function renameTypeAttribute(mOptions: MigrationOptions) { - const _rename = (typeName, attributeName, newAttributeName) => { + const _rename = ( + typeName: Name, + attributeName: string, + newAttributeName: string + ) => { const typeNameStr = mOptions.literal(typeName); const attributeNameStr = mOptions.literal(attributeName); const newAttributeNameStr = mOptions.literal(newAttributeName); return `ALTER TYPE ${typeNameStr} RENAME ATTRIBUTE ${attributeNameStr} TO ${newAttributeNameStr};`; }; - _rename.reverse = (typeName, attributeName, newAttributeName) => - _rename(typeName, newAttributeName, attributeName); + _rename.reverse = ( + typeName: Name, + attributeName: string, + newAttributeName: string + ) => _rename(typeName, newAttributeName, attributeName); return _rename; } export function renameTypeValue(mOptions: MigrationOptions) { - const _rename = (typeName, value, newValue) => { + const _rename = (typeName: Name, value: string, newValue: string) => { const valueStr = escapeValue(value); const newValueStr = escapeValue(newValue); const typeNameStr = mOptions.literal(typeName); return `ALTER TYPE ${typeNameStr} RENAME VALUE ${valueStr} TO ${newValueStr};`; }; - _rename.reverse = (typeName, value, newValue) => + _rename.reverse = (typeName: Name, value: string, newValue: string) => _rename(typeName, newValue, value); return _rename; } diff --git a/src/operations/views.ts b/src/operations/views.ts index 6d0c8765..4236eaf6 100644 --- a/src/operations/views.ts +++ b/src/operations/views.ts @@ -1,4 +1,4 @@ -import { Value } from '../definitions'; +import { DropOptions, Name, Value } from '../definitions'; import { MigrationOptions } from '../migration-builder'; import { escapeValue } from '../utils'; @@ -19,7 +19,7 @@ export interface AlterViewColumnOptions { } export function dropView(mOptions: MigrationOptions) { - const _drop = (viewName, { ifExists, cascade } = {}) => { + const _drop = (viewName: Name, { ifExists, cascade }: DropOptions = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; const viewNameStr = mOptions.literal(viewName); @@ -29,7 +29,11 @@ export function dropView(mOptions: MigrationOptions) { } export function createView(mOptions: MigrationOptions) { - const _create = (viewName, options, definition) => { + const _create = ( + viewName: Name, + options: CreateViewOptions, + definition: string + ) => { const { temporary, replace, @@ -55,7 +59,7 @@ export function createView(mOptions: MigrationOptions) { } export function alterView(mOptions: MigrationOptions) { - const _alter = (viewName, options) => { + const _alter = (viewName: Name, options: AlterViewOptions) => { const { checkOption } = options; const clauses = []; if (checkOption !== undefined) { @@ -73,7 +77,11 @@ export function alterView(mOptions: MigrationOptions) { } export function alterViewColumn(mOptions: MigrationOptions) { - const _alter = (viewName, columnName, options) => { + const _alter = ( + viewName: Name, + columnName: Name, + options: AlterViewColumnOptions + ) => { const { default: defaultValue } = options; const actions = []; if (defaultValue === null) { @@ -94,11 +102,12 @@ export function alterViewColumn(mOptions: MigrationOptions) { } export function renameView(mOptions: MigrationOptions) { - const _rename = (viewName, newViewName) => { + const _rename = (viewName: Name, newViewName: Name) => { const viewNameStr = mOptions.literal(viewName); const newViewNameStr = mOptions.literal(newViewName); return `ALTER VIEW ${viewNameStr} RENAME TO ${newViewNameStr};`; }; - _rename.reverse = (viewName, newViewName) => _rename(newViewName, viewName); + _rename.reverse = (viewName: Name, newViewName: Name) => + _rename(newViewName, viewName); return _rename; } diff --git a/src/operations/viewsMaterialized.ts b/src/operations/viewsMaterialized.ts index 89b3e9b3..9fa430ea 100644 --- a/src/operations/viewsMaterialized.ts +++ b/src/operations/viewsMaterialized.ts @@ -1,3 +1,4 @@ +import { DropOptions, Name } from '../definitions'; import { MigrationOptions } from '../migration-builder'; import { formatLines } from '../utils'; @@ -29,7 +30,7 @@ const storageParameterStr = storageParameters => key => { }; export function dropMaterializedView(mOptions: MigrationOptions) { - const _drop = (viewName, { ifExists, cascade } = {}) => { + const _drop = (viewName: Name, { ifExists, cascade }: DropOptions = {}) => { const ifExistsStr = ifExists ? ' IF EXISTS' : ''; const cascadeStr = cascade ? ' CASCADE' : ''; const viewNameStr = mOptions.literal(viewName); @@ -39,7 +40,11 @@ export function dropMaterializedView(mOptions: MigrationOptions) { } export function createMaterializedView(mOptions: MigrationOptions) { - const _create = (viewName, options, definition) => { + const _create = ( + viewName: Name, + options: CreateMaterializedViewOptions, + definition: string + ) => { const { ifNotExists, columns = [], @@ -69,7 +74,7 @@ export function createMaterializedView(mOptions: MigrationOptions) { } export function alterMaterializedView(mOptions: MigrationOptions) { - const _alter = (viewName, options) => { + const _alter = (viewName: Name, options: AlterMaterializedViewOptions) => { const { cluster, extension, storageParameters = {} } = options; const clauses = []; if (cluster !== undefined) { @@ -103,29 +108,40 @@ export function alterMaterializedView(mOptions: MigrationOptions) { } export function renameMaterializedView(mOptions: MigrationOptions) { - const _rename = (viewName, newViewName) => { + const _rename = (viewName: Name, newViewName: Name) => { const viewNameStr = mOptions.literal(viewName); const newViewNameStr = mOptions.literal(newViewName); return `ALTER MATERIALIZED VIEW ${viewNameStr} RENAME TO ${newViewNameStr};`; }; - _rename.reverse = (viewName, newViewName) => _rename(newViewName, viewName); + _rename.reverse = (viewName: Name, newViewName: Name) => + _rename(newViewName, viewName); return _rename; } export function renameMaterializedViewColumn(mOptions: MigrationOptions) { - const _rename = (viewName, columnName, newColumnName) => { + const _rename = ( + viewName: Name, + columnName: string, + newColumnName: string + ) => { const viewNameStr = mOptions.literal(viewName); const columnNameStr = mOptions.literal(columnName); const newColumnNameStr = mOptions.literal(newColumnName); return `ALTER MATERIALIZED VIEW ${viewNameStr} RENAME COLUMN ${columnNameStr} TO ${newColumnNameStr};`; }; - _rename.reverse = (viewName, columnName, newColumnName) => - _rename(viewName, newColumnName, columnName); + _rename.reverse = ( + viewName: Name, + columnName: string, + newColumnName: string + ) => _rename(viewName, newColumnName, columnName); return _rename; } export function refreshMaterializedView(mOptions: MigrationOptions) { - const _refresh = (viewName, { concurrently, data } = {}) => { + const _refresh = ( + viewName: Name, + { concurrently, data }: RefreshMaterializedViewOptions = {} + ) => { const concurrentlyStr = concurrently ? ' CONCURRENTLY' : ''; const dataStr = dataClause(data); const viewNameStr = mOptions.literal(viewName); diff --git a/src/utils.ts b/src/utils.ts index 1450e1d2..6a8f669b 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -42,7 +42,7 @@ export const createSchemalize = ( export const createTransformer = (literal: (v: Name) => string) => ( s: string, - d + d?: object ) => Object.keys(d || {}).reduce( (str: string, p) => str.replace(new RegExp(`{${p}}`, 'g'), literal(d[p])), // eslint-disable-line security/detect-non-literal-regexp From 07273cefe703be98ababe0c676b52fd49692e48b Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Sat, 2 Nov 2019 16:45:40 +0100 Subject: [PATCH 36/57] Improve type definitions --- src/operations/sequences.ts | 4 ++-- src/utils.ts | 38 ++++++++++++++++++++++++------------- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/operations/sequences.ts b/src/operations/sequences.ts index f9d40f1c..6aa101aa 100644 --- a/src/operations/sequences.ts +++ b/src/operations/sequences.ts @@ -28,7 +28,7 @@ export type SequenceOptionsAlter = SequenceOptionsAlterEn & SequenceOptions; export const parseSequenceOptions = ( typeShorthands: ColumnDefinitions, - options + options: SequenceOptions ) => { const { type, @@ -40,7 +40,7 @@ export const parseSequenceOptions = ( cycle, owner } = options; - const clauses = []; + const clauses: string[] = []; if (type) { clauses.push(`AS ${applyType(type, typeShorthands).type}`); } diff --git a/src/utils.ts b/src/utils.ts index 6a8f669b..1bd0f423 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,5 +1,7 @@ import decamelize from 'decamelize'; import { ColumnDefinitions, Name, Type, Value } from './definitions'; +import { MigrationOptions } from './migration-builder'; +import { FunctionParamType } from './operations/functions'; import { RunnerOption } from './runner'; // This is used to create unescaped strings @@ -57,7 +59,7 @@ export const escapeValue = (val: Value): string | number => { return val.toString(); } if (typeof val === 'string') { - let dollars; + let dollars: string; let index = 0; do { index += 1; @@ -113,13 +115,13 @@ export const applyTypeAdapters = (type: string): string => export const applyType = ( type: Type, extendingTypeShorthands: ColumnDefinitions = {} -) => { +): FunctionParamType => { const typeShorthands: ColumnDefinitions = { ...defaultTypeShorthands, ...extendingTypeShorthands }; const options = typeof type === 'string' ? { type } : type; - let ext = null; + let ext: { type?: string } | null = null; const types: string[] = [options.type]; while (typeShorthands[types[types.length - 1]]) { if (ext) { @@ -144,12 +146,16 @@ export const applyType = ( }; }; -const formatParam = mOptions => param => { - const { mode, name, type, default: defaultValue } = applyType( - param, - mOptions.typeShorthands - ); - const options = []; +const formatParam = (mOptions: MigrationOptions) => ( + param: FunctionParamType +) => { + const { + mode, + name, + type, + default: defaultValue + }: FunctionParamType = applyType(param, mOptions.typeShorthands); + const options: string[] = []; if (mode) { options.push(mode); } @@ -165,15 +171,21 @@ const formatParam = mOptions => param => { return options.join(' '); }; -export const formatParams = (params = [], mOptions) => - `(${params.map(formatParam(mOptions)).join(', ')})`; +export const formatParams = ( + params: FunctionParamType[] = [], + mOptions: MigrationOptions +) => `(${params.map(formatParam(mOptions)).join(', ')})`; -export const comment = (object, name, text) => { +export const comment = (object: string, name: string, text?: string) => { const cmt = escapeValue(text || null); return `COMMENT ON ${object} ${name} IS ${cmt};`; }; -export const formatLines = (lines, replace = ' ', separator = ',') => +export const formatLines = ( + lines: string[], + replace: string = ' ', + separator: string = ',' +) => lines .map(line => line.replace(/(?:\r\n|\r|\n)+/g, ' ')) .join(`${separator}\n`) From 55777897ab2805224ddb9739b6afcac16e514fec Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Sat, 2 Nov 2019 17:21:55 +0100 Subject: [PATCH 37/57] Remove string from ColumnDefinitions --- src/definitions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/definitions.ts b/src/definitions.ts index d1768a48..56296b83 100644 --- a/src/definitions.ts +++ b/src/definitions.ts @@ -106,7 +106,7 @@ export interface ColumnDefinition extends ReferencesOptions { } export interface ColumnDefinitions { - [name: string]: ColumnDefinition | string; + [name: string]: ColumnDefinition; } export type Like = From 588b4dc71bf27da55e50307a3edd18c322cc24e6 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Sat, 2 Nov 2019 17:22:10 +0100 Subject: [PATCH 38/57] Improve type definitions --- src/operations/policies.ts | 8 +- src/operations/tables.ts | 168 ++++++++++++++++++++----------------- src/utils.ts | 14 +++- 3 files changed, 106 insertions(+), 84 deletions(-) diff --git a/src/operations/policies.ts b/src/operations/policies.ts index fa8770d6..92643a0c 100644 --- a/src/operations/policies.ts +++ b/src/operations/policies.ts @@ -13,9 +13,9 @@ export interface CreatePolicyOptionsEn { export type CreatePolicyOptions = CreatePolicyOptionsEn & PolicyOptions; -const makeClauses = ({ role, using, check }) => { +const makeClauses = ({ role, using, check }: PolicyOptions) => { const roles = (Array.isArray(role) ? role : [role]).join(', '); - const clauses = []; + const clauses: string[] = []; if (roles) { clauses.push(`TO ${roles}`); } @@ -83,7 +83,7 @@ export function renamePolicy(mOptions: MigrationOptions) { const _rename = ( tableName: Name, policyName: string, - newPolicyName: Name + newPolicyName: string ) => { const policyNameStr = mOptions.literal(policyName); const newPolicyNameStr = mOptions.literal(newPolicyName); @@ -93,7 +93,7 @@ export function renamePolicy(mOptions: MigrationOptions) { _rename.reverse = ( tableName: Name, policyName: string, - newPolicyName: Name + newPolicyName: string ) => _rename(tableName, newPolicyName, policyName); return _rename; } diff --git a/src/operations/tables.ts b/src/operations/tables.ts index 5dd0e51d..e52ee73a 100644 --- a/src/operations/tables.ts +++ b/src/operations/tables.ts @@ -1,6 +1,7 @@ import _ from 'lodash'; import { AddOptions, + ColumnDefinition, ColumnDefinitions, DropOptions, LikeOptions, @@ -70,14 +71,24 @@ const parseReferences = (options, literal) => { const parseDeferrable = options => `DEFERRABLE INITIALLY ${options.deferred ? 'DEFERRED' : 'IMMEDIATE'}`; -const parseColumns = (tableName, columns, mOptions: MigrationOptions) => { +const parseColumns = ( + tableName: Name, + columns: ColumnDefinitions, + mOptions: MigrationOptions +): { + columns: string[]; + constraints: { primaryKey?: string[] }; + comments: string[]; +} => { const extendingTypeShorthands = mOptions.typeShorthands; let columnsWithOptions = _.mapValues(columns, column => applyType(column, extendingTypeShorthands) ); const primaryColumns = _.chain(columnsWithOptions) - .map((options, columnName) => (options.primaryKey ? columnName : null)) + .map((options: ColumnDefinition, columnName) => + options.primaryKey ? columnName : null + ) .filter() .value(); const multiplePrimaryColumns = primaryColumns.length > 1; @@ -89,9 +100,9 @@ const parseColumns = (tableName, columns, mOptions: MigrationOptions) => { })); } - const comments = _.chain(columnsWithOptions) + const comments: string[] = _.chain(columnsWithOptions) .map( - (options, columnName) => + (options: ColumnDefinition, columnName) => typeof options.comment !== 'undefined' && comment( 'COLUMN', @@ -103,83 +114,88 @@ const parseColumns = (tableName, columns, mOptions: MigrationOptions) => { .value(); return { - columns: _.map(columnsWithOptions, (options, columnName) => { - const { - type, - collation, - default: defaultValue, - unique, - primaryKey, - notNull, - check, - references, - referencesConstraintName, - referencesConstraintComment, - deferrable, - generated - } = options; - const constraints = []; - if (collation) { - constraints.push(`COLLATE ${collation}`); - } - if (defaultValue !== undefined) { - constraints.push(`DEFAULT ${escapeValue(defaultValue)}`); - } - if (unique) { - constraints.push('UNIQUE'); - } - if (primaryKey) { - constraints.push('PRIMARY KEY'); - } - if (notNull) { - constraints.push('NOT NULL'); - } - if (check) { - constraints.push(`CHECK (${check})`); - } - if (references) { - const name = - referencesConstraintName || - (referencesConstraintComment ? `${tableName}_fk_${columnName}` : ''); - const constraintName = name - ? `CONSTRAINT ${mOptions.literal(name)} ` - : ''; - constraints.push( - `${constraintName}${parseReferences(options, mOptions.literal)}` - ); - if (referencesConstraintComment) { - comments.push( - comment( - `CONSTRAINT ${mOptions.literal(name)} ON`, - mOptions.literal(tableName), - referencesConstraintComment - ) + columns: _.map( + columnsWithOptions, + (options: ColumnDefinition, columnName) => { + const { + type, + collation, + default: defaultValue, + unique, + primaryKey, + notNull, + check, + references, + referencesConstraintName, + referencesConstraintComment, + deferrable, + generated + }: ColumnDefinition = options; + const constraints: string[] = []; + if (collation) { + constraints.push(`COLLATE ${collation}`); + } + if (defaultValue !== undefined) { + constraints.push(`DEFAULT ${escapeValue(defaultValue)}`); + } + if (unique) { + constraints.push('UNIQUE'); + } + if (primaryKey) { + constraints.push('PRIMARY KEY'); + } + if (notNull) { + constraints.push('NOT NULL'); + } + if (check) { + constraints.push(`CHECK (${check})`); + } + if (references) { + const name = + referencesConstraintName || + (referencesConstraintComment + ? `${tableName}_fk_${columnName}` + : ''); + const constraintName = name + ? `CONSTRAINT ${mOptions.literal(name)} ` + : ''; + constraints.push( + `${constraintName}${parseReferences(options, mOptions.literal)}` + ); + if (referencesConstraintComment) { + comments.push( + comment( + `CONSTRAINT ${mOptions.literal(name)} ON`, + mOptions.literal(tableName), + referencesConstraintComment + ) + ); + } + } + if (deferrable) { + constraints.push(parseDeferrable(options)); + } + if (generated) { + const sequenceOptions = parseSequenceOptions( + extendingTypeShorthands, + generated + ).join(' '); + constraints.push( + `GENERATED ${generated.precedence} AS IDENTITY${ + sequenceOptions ? ` (${sequenceOptions})` : '' + }` ); } - } - if (deferrable) { - constraints.push(parseDeferrable(options)); - } - if (generated) { - const sequenceOptions = parseSequenceOptions( - extendingTypeShorthands, - generated - ).join(' '); - constraints.push( - `GENERATED ${generated.precedence} AS IDENTITY${ - sequenceOptions ? ` (${sequenceOptions})` : '' - }` - ); - } - const constraintsStr = constraints.length - ? ` ${constraints.join(' ')}` - : ''; + const constraintsStr = constraints.length + ? ` ${constraints.join(' ')}` + : ''; - const sType = typeof type === 'object' ? mOptions.literal(type) : type; + const sType = typeof type === 'object' ? mOptions.literal(type) : type; - return `${mOptions.literal(columnName)} ${sType}${constraintsStr}`; - }), + return `${mOptions.literal(columnName)} ${sType}${constraintsStr}`; + } + ), constraints: multiplePrimaryColumns ? { primaryKey: primaryColumns } : {}, comments }; diff --git a/src/utils.ts b/src/utils.ts index 1bd0f423..699905da 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,7 +1,13 @@ import decamelize from 'decamelize'; -import { ColumnDefinitions, Name, Type, Value } from './definitions'; +import { + ColumnDefinition, + ColumnDefinitions, + Name, + Type, + Value +} from './definitions'; import { MigrationOptions } from './migration-builder'; -import { FunctionParamType } from './operations/functions'; +import { FunctionParam, FunctionParamType } from './operations/functions'; import { RunnerOption } from './runner'; // This is used to create unescaped strings @@ -115,7 +121,7 @@ export const applyTypeAdapters = (type: string): string => export const applyType = ( type: Type, extendingTypeShorthands: ColumnDefinitions = {} -): FunctionParamType => { +): ColumnDefinition & FunctionParamType => { const typeShorthands: ColumnDefinitions = { ...defaultTypeShorthands, ...extendingTypeShorthands @@ -172,7 +178,7 @@ const formatParam = (mOptions: MigrationOptions) => ( }; export const formatParams = ( - params: FunctionParamType[] = [], + params: FunctionParam[] = [], mOptions: MigrationOptions ) => `(${params.map(formatParam(mOptions)).join(', ')})`; From b19761f45230166bd1bf0c986102c6e198a77363 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Sat, 2 Nov 2019 17:23:09 +0100 Subject: [PATCH 39/57] Ignore lib folder --- .eslintignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.eslintignore b/.eslintignore index fb5ad414..c083809b 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,4 +2,5 @@ lib/migration-template.js lib/migration-template.ts node_modules dist +lib src From e5bc24ce467eb036abfe91bda2811b2eadbe64b6 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Sat, 2 Nov 2019 17:33:15 +0100 Subject: [PATCH 40/57] TriggerOptions extends FunctionOptions --- src/operations/triggers.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/operations/triggers.ts b/src/operations/triggers.ts index acc83aaa..a68820b3 100644 --- a/src/operations/triggers.ts +++ b/src/operations/triggers.ts @@ -2,9 +2,9 @@ import { isArray } from 'lodash'; import { DropOptions, Name, Value } from '../definitions'; import { MigrationOptions } from '../migration-builder'; import { escapeValue } from '../utils'; -import { createFunction, dropFunction } from './functions'; +import { createFunction, dropFunction, FunctionOptions } from './functions'; -export interface TriggerOptions { +export interface TriggerOptions extends FunctionOptions { when?: 'BEFORE' | 'AFTER' | 'INSTEAD OF'; operation: string | string[]; constraint?: boolean; @@ -35,7 +35,7 @@ export function createTrigger(mOptions: MigrationOptions) { const _create = ( tableName: Name, triggerName: Name, - triggerOptions = {}, + triggerOptions: TriggerOptions = {}, definition?: Value ) => { const { @@ -45,7 +45,7 @@ export function createTrigger(mOptions: MigrationOptions) { deferrable, deferred, functionArgs = [] - } = triggerOptions; + }: TriggerOptions = triggerOptions; let { when, level = 'STATEMENT', function: functionName } = triggerOptions; const operations = isArray(operation) ? operation.join(' OR ') : operation; if (constraint) { @@ -103,7 +103,7 @@ export function createTrigger(mOptions: MigrationOptions) { _create.reverse = ( tableName: Name, triggerName: Name, - triggerOptions = {}, + triggerOptions: Partial & DropOptions = {}, definition?: Value ) => { const triggerSQL = dropTrigger(mOptions)( From 1f71ff385ebd93f71463a0011729ab2ff1f94f7b Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Sat, 2 Nov 2019 17:43:31 +0100 Subject: [PATCH 41/57] Use module.exports.loadMigrationFiles --- src/migration.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/migration.ts b/src/migration.ts index 5b4af40e..f01712d6 100644 --- a/src/migration.ts +++ b/src/migration.ts @@ -199,3 +199,4 @@ export class Migration implements RunMigration { export default Migration; module.exports = Migration; +module.exports.loadMigrationFiles = loadMigrationFiles; From 38bb98ddea0ac7e40bd119960021f47acc3f8aaf Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Sat, 2 Nov 2019 21:59:16 +0100 Subject: [PATCH 42/57] Set noImplicitAny --- tsconfig.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 0ca39d98..455e7dc0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,7 +9,8 @@ "declaration": true, "sourceMap": false, "removeComments": true, - "strict": false + "strict": false, + "noImplicitAny": true }, "include": ["src/**/*"], "exclude": ["src/migration-template.*", "node_modules", "lib", "dist", "bin"] From 106f92199188c93c3399fa799ec77f0626a26ae4 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Sat, 2 Nov 2019 21:59:35 +0100 Subject: [PATCH 43/57] Add type definitions --- src/db.ts | 35 ++++++++++++++++++++++----------- src/migration-builder.ts | 11 +++++++++-- src/migration.ts | 42 ++++++++++++++++++++++++++-------------- src/runner.ts | 14 +++++++++++--- src/utils.ts | 8 +++++--- 5 files changed, 76 insertions(+), 34 deletions(-) diff --git a/src/db.ts b/src/db.ts index 86b9b3cd..c392373c 100644 --- a/src/db.ts +++ b/src/db.ts @@ -2,7 +2,13 @@ This file just manages the database connection and provides a query method */ -import { Client, QueryConfig, QueryResult } from 'pg'; +import { + Client, + ClientConfig, + QueryArrayResult, + QueryConfig, + QueryResult +} from 'pg'; // or native libpq bindings // const pg = require('pg/native'); @@ -24,13 +30,18 @@ export interface DB { close(): Promise; } -const db = (connection, log = console.error): DB => { +const db = ( + connection: Client | string | ClientConfig, + log = console.error +): DB => { const isExternalClient = connection instanceof Client; let clientActive = false; - const client = isExternalClient ? connection : new Client(connection); + const client: Client = isExternalClient + ? (connection as Client) + : new Client(connection as string | ClientConfig); - const beforeCloseListeners = []; + const beforeCloseListeners: any[] = []; const createConnection: () => Promise = () => new Promise((resolve, reject) => @@ -46,13 +57,15 @@ const db = (connection, log = console.error): DB => { }) ); - const query = async (...args) => { + const query = async ( + ...args: any[] + ): Promise> => { await createConnection(); try { return await client.query(...args); } catch (err) { - const { message, position } = err; - const string = args[0].text || args[0]; + const { message, position }: { message: string; position: number } = err; + const string: string = args[0].text || args[0]; if (message && position >= 1) { const endLineWrapIndexOf = string.indexOf('\n', position); const endLineWrapPos = @@ -77,12 +90,12 @@ ${err} } }; - const select = async (...args) => { + const select = async (...args: T[]) => { const { rows } = await query(...args); return rows; }; - const column = async (columnName, ...args) => - (await select(...args)).map(r => r[columnName]); + const column = async (columnName: string, ...args: string[]) => + (await select(...args)).map((r: { [key: string]: any }) => r[columnName]); return { createConnection, @@ -95,7 +108,7 @@ ${err} close: async () => { await beforeCloseListeners.reduce( (promise, listener) => - promise.then(listener).catch(err => log(err.stack || err)), + promise.then(listener).catch((err: any) => log(err.stack || err)), Promise.resolve() ); if (!isExternalClient) { diff --git a/src/migration-builder.ts b/src/migration-builder.ts index 9be21835..803cd81b 100644 --- a/src/migration-builder.ts +++ b/src/migration-builder.ts @@ -452,10 +452,17 @@ export default class MigrationBuilder { // by default, all migrations are wrapped in a transaction this._use_transaction = true; + type WrapOperation = { + (...args: any[]): R; + reverse?: (...args: any[]) => R; + }; + // this function wraps each operation within a function that either // calls the operation or its reverse, and appends the result (array of sql statements) // to the steps array - const wrap = operation => (...args) => { + const wrap = (operation: WrapOperation) => ( + ...args: any[] + ) => { if (this._REVERSE_MODE && typeof operation.reverse !== 'function') { const name = `pgm.${operation.name}()`; throw new Error( @@ -581,7 +588,7 @@ export default class MigrationBuilder { this.func = PgLiteral.create; // expose DB so we can access database within transaction - const wrapDB = operation => (...args) => { + const wrapDB = (operation: (...args: T[]) => R) => (...args: T[]) => { if (this._REVERSE_MODE) { throw new Error('Impossible to automatically infer down migration'); } diff --git a/src/migration.ts b/src/migration.ts index f01712d6..560dea71 100644 --- a/src/migration.ts +++ b/src/migration.ts @@ -9,19 +9,21 @@ import fs from 'fs'; import mkdirp from 'mkdirp'; import path from 'path'; - -import MigrationBuilder, { MigrationBuilderActions } from './migration-builder'; -import { getMigrationTableSchema, promisify } from './utils'; import { DB } from './db'; import { ColumnDefinitions } from './definitions'; -import { MigrationDirection } from './runner'; +import MigrationBuilder, { MigrationBuilderActions } from './migration-builder'; +import { MigrationDirection, RunnerOption } from './runner'; +import { getMigrationTableSchema, promisify } from './utils'; const readdir = promisify(fs.readdir); // eslint-disable-line security/detect-non-literal-fs-filename const lstat = promisify(fs.lstat); // eslint-disable-line security/detect-non-literal-fs-filename const SEPARATOR = '_'; -export const loadMigrationFiles = async (dir: string, ignorePattern) => { +export const loadMigrationFiles = async ( + dir: string, + ignorePattern: string +) => { const dirContent = await readdir(`${dir}/`); const files = await Promise.all( dirContent.map(async file => { @@ -33,7 +35,7 @@ export const loadMigrationFiles = async (dir: string, ignorePattern) => { return files.filter(i => i && !filter.test(i)).sort(); }; -const getLastSuffix = async (dir, ignorePattern) => { +const getLastSuffix = async (dir: string, ignorePattern: string) => { try { const files = await loadMigrationFiles(dir, ignorePattern); return files.length > 0 @@ -52,7 +54,12 @@ export interface RunMigration { export class Migration implements RunMigration { // class method that creates a new migration file by cloning the migration template - static async create(name, directory, language, ignorePattern) { + static async create( + name: string, + directory: string, + language: 'js' | 'ts' | 'sql', + ignorePattern: string + ) { // ensure the migrations directory exists mkdirp.sync(directory); @@ -80,17 +87,17 @@ export class Migration implements RunMigration { public readonly path: string; public readonly name: string; public readonly timestamp: number; - public readonly up: any; - public down: any; - public readonly options: any; + public readonly up: (pgm: MigrationBuilder) => Promise; + public down?: ((pgm: MigrationBuilder) => Promise) | false; + public readonly options: RunnerOption; public readonly typeShorthands: ColumnDefinitions; - public readonly log: (message?: any, ...optionalParams: any[]) => void; + public readonly log: typeof console.log; constructor( db: DB | null, migrationPath: string, { up, down }: MigrationBuilderActions = {}, - options = {}, + options: RunnerOption = {}, typeShorthands?: ColumnDefinitions, log = console.log ) { @@ -105,7 +112,7 @@ export class Migration implements RunMigration { this.log = log; } - _getMarkAsRun(action) { + _getMarkAsRun(action: (pgm: MigrationBuilder) => Promise) { const schema = getMigrationTableSchema(this.options); const { migrationsTable } = this.options; const { name } = this; @@ -121,7 +128,10 @@ export class Migration implements RunMigration { } } - async _apply(action, pgm: MigrationBuilder) { + async _apply( + action: (pgm: MigrationBuilder, value?: unknown) => Promise, + pgm: MigrationBuilder + ) { if (action.length === 2) { await new Promise(resolve => action(pgm, resolve)); } else { @@ -167,7 +177,9 @@ export class Migration implements RunMigration { } } - const action = this[direction]; + const action: ((pgm: MigrationBuilder) => Promise) | false = this[ + direction + ]; if (typeof action !== 'function') { throw new Error(`Unknown value for direction: ${direction}`); diff --git a/src/runner.ts b/src/runner.ts index 0ae4a2d6..90cd44f0 100644 --- a/src/runner.ts +++ b/src/runner.ts @@ -23,7 +23,11 @@ const idColumn = 'id'; const nameColumn = 'name'; const runOnColumn = 'run_on'; -const loadMigrations = async (db: DB, options, log) => { +const loadMigrations = async ( + db: DB, + options: RunnerOption, + log: typeof console.log +) => { try { let shorthands: ColumnDefinitions = {}; const files = await loadMigrationFiles(options.dir, options.ignorePattern); @@ -152,7 +156,7 @@ const getMigrationsToRun = ( ); }; -const checkOrder = (runNames, migrations) => { +const checkOrder = (runNames: string[], migrations: Migration[]) => { const len = Math.min(runNames.length, migrations.length); for (let i = 0; i < len; i += 1) { const runName = runNames[i]; @@ -167,7 +171,11 @@ const checkOrder = (runNames, migrations) => { export type MigrationDirection = 'up' | 'down'; -const runMigrations = (toRun, method, direction: MigrationDirection) => +const runMigrations = ( + toRun: Migration[], + method: 'markAsRun' | 'apply', + direction: MigrationDirection +) => toRun.reduce( (promise, migration) => promise.then(() => migration[method](direction)), Promise.resolve() diff --git a/src/utils.ts b/src/utils.ts index 699905da..1b100941 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -108,7 +108,7 @@ const typeAdapters = { double: 'double precision', datetime: 'timestamp', bool: 'boolean' -}; +} as const; const defaultTypeShorthands: ColumnDefinitions = { id: { type: 'serial', primaryKey: true } // convenience type for serial primary keys @@ -197,10 +197,12 @@ export const formatLines = ( .join(`${separator}\n`) .replace(/^/gm, replace); -export function promisify(fn: (...args) => any): (...args) => Promise { +export function promisify( + fn: (...args: any[]) => any +): (...args: any[]) => Promise { return (...args) => new Promise((resolve, reject) => - fn.call(this, ...args, (err, ...result) => + fn.call(this, ...args, (err: any, ...result: any[]) => err ? reject(err) : resolve(...result) ) ); From 58d882d798b54983cd0bb0629a0ef2206c11bd70 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Sat, 2 Nov 2019 22:08:41 +0100 Subject: [PATCH 44/57] Set indexMethod to string --- src/migration-builder.ts | 14 +++++++------- src/operations/operators.ts | 22 +++++++++++----------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/migration-builder.ts b/src/migration-builder.ts index 803cd81b..96f174b8 100644 --- a/src/migration-builder.ts +++ b/src/migration-builder.ts @@ -331,23 +331,23 @@ export default class MigrationBuilder { public readonly createOperatorClass: ( operatorClassName: Name, type: Type, - indexMethod: Name, + indexMethod: string, operatorList: OperatorListDefinition[], options: CreateOperatorClassOptions ) => void; public readonly dropOperatorClass: ( operatorClassName: Name, - indexMethod: Name, + indexMethod: string, dropOptions?: DropOptions ) => void; public readonly renameOperatorClass: ( oldOperatorClassName: Name, - indexMethod: Name, + indexMethod: string, newOperatorClassName: Name ) => void; public readonly createOperatorFamily: ( operatorFamilyName: Name, - indexMethod: Name + indexMethod: string ) => void; public readonly dropOperatorFamily: ( operatorFamilyName: Name, @@ -356,17 +356,17 @@ export default class MigrationBuilder { ) => void; public readonly renameOperatorFamily: ( oldOperatorFamilyName: Name, - indexMethod: Name, + indexMethod: string, newOperatorFamilyName: Name ) => void; public readonly addToOperatorFamily: ( operatorFamilyName: Name, - indexMethod: Name, + indexMethod: string, operatorList: OperatorListDefinition[] ) => void; public readonly removeFromOperatorFamily: ( operatorFamilyName: Name, - indexMethod: Name, + indexMethod: string, operatorList: OperatorListDefinition[] ) => void; diff --git a/src/operations/operators.ts b/src/operations/operators.ts index 0c2ca1b3..c70d3045 100644 --- a/src/operations/operators.ts +++ b/src/operations/operators.ts @@ -100,7 +100,7 @@ export function createOperator(mOptions: MigrationOptions) { export function dropOperatorFamily(mOptions: MigrationOptions) { const _drop = ( operatorFamilyName: Name, - indexMethod, + indexMethod: string, { ifExists, cascade }: DropOptions = {} ) => { const operatorFamilyNameStr = mOptions.literal(operatorFamilyName); @@ -112,7 +112,7 @@ export function dropOperatorFamily(mOptions: MigrationOptions) { } export function createOperatorFamily(mOptions: MigrationOptions) { - const _create = (operatorFamilyName: Name, indexMethod) => { + const _create = (operatorFamilyName: Name, indexMethod: string) => { const operatorFamilyNameStr = mOptions.literal(operatorFamilyName); return `CREATE OPERATOR FAMILY ${operatorFamilyNameStr} USING ${indexMethod};`; }; @@ -145,12 +145,12 @@ const operatorMap = (mOptions: MigrationOptions) => ({ }; const changeOperatorFamily = ( - op, + op: 'ADD' | 'DROP', reverse?: (mOptions: MigrationOptions) => any ) => (mOptions: MigrationOptions) => { const method = ( operatorFamilyName: Name, - indexMethod, + indexMethod: string, operatorList: OperatorListDefinition[] ) => { const operatorFamilyNameStr = mOptions.literal(operatorFamilyName); @@ -176,7 +176,7 @@ export const addToOperatorFamily = changeOperatorFamily( export function renameOperatorFamily(mOptions: MigrationOptions) { const _rename = ( oldOperatorFamilyName: Name, - indexMethod, + indexMethod: string, newOperatorFamilyName: Name ) => { const oldOperatorFamilyNameStr = mOptions.literal(oldOperatorFamilyName); @@ -186,7 +186,7 @@ export function renameOperatorFamily(mOptions: MigrationOptions) { }; _rename.reverse = ( oldOperatorFamilyName: Name, - indexMethod, + indexMethod: string, newOperatorFamilyName: Name ) => _rename(newOperatorFamilyName, indexMethod, oldOperatorFamilyName); return _rename; @@ -195,7 +195,7 @@ export function renameOperatorFamily(mOptions: MigrationOptions) { export function dropOperatorClass(mOptions: MigrationOptions) { const _drop = ( operatorClassName: Name, - indexMethod, + indexMethod: string, { ifExists, cascade }: DropOptions = {} ) => { const operatorClassNameStr = mOptions.literal(operatorClassName); @@ -211,7 +211,7 @@ export function createOperatorClass(mOptions: MigrationOptions) { const _create = ( operatorClassName: Name, type: Type, - indexMethod, + indexMethod: string, operatorList: OperatorListDefinition[], options: CreateOperatorClassOptions ) => { @@ -231,7 +231,7 @@ export function createOperatorClass(mOptions: MigrationOptions) { _create.reverse = ( operatorClassName: Name, type: Type, - indexMethod, + indexMethod: string, operatorList: OperatorListDefinition[], options: DropOptions ) => dropOperatorClass(mOptions)(operatorClassName, indexMethod, options); @@ -241,7 +241,7 @@ export function createOperatorClass(mOptions: MigrationOptions) { export function renameOperatorClass(mOptions: MigrationOptions) { const _rename = ( oldOperatorClassName: Name, - indexMethod, + indexMethod: string, newOperatorClassName: Name ) => { const oldOperatorClassNameStr = mOptions.literal(oldOperatorClassName); @@ -251,7 +251,7 @@ export function renameOperatorClass(mOptions: MigrationOptions) { }; _rename.reverse = ( oldOperatorClassName: Name, - indexMethod, + indexMethod: string, newOperatorClassName: Name ) => _rename(newOperatorClassName, indexMethod, oldOperatorClassName); return _rename; From f292bd454d66fce7bbf4aa81d5328ac395cfb0cb Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Sat, 2 Nov 2019 22:13:53 +0100 Subject: [PATCH 45/57] Define CreateSchemaOptions --- src/migration-builder.ts | 6 ++---- src/operations/schemas.ts | 14 ++++++-------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/migration-builder.ts b/src/migration-builder.ts index 96f174b8..31fbbd20 100644 --- a/src/migration-builder.ts +++ b/src/migration-builder.ts @@ -32,6 +32,7 @@ import { } from './operations/operators'; import { CreatePolicyOptions, PolicyOptions } from './operations/policies'; import { RoleOptions } from './operations/roles'; +import { CreateSchemaOptions } from './operations/schemas'; import { SequenceOptionsAlter, SequenceOptionsCreate @@ -271,10 +272,7 @@ export default class MigrationBuilder { public readonly createSchema: ( schemaName: string, - schemaOptions?: { - ifNotExists?: boolean; - authorization?: string; - } + schemaOptions?: CreateSchemaOptions ) => void; public readonly dropSchema: ( schemaName: string, diff --git a/src/operations/schemas.ts b/src/operations/schemas.ts index 8b7c5696..bf487f64 100644 --- a/src/operations/schemas.ts +++ b/src/operations/schemas.ts @@ -1,6 +1,10 @@ -import { DropOptions, Name } from '../definitions'; +import { DropOptions, IfNotExistsOption, Name } from '../definitions'; import { MigrationOptions } from '../migration-builder'; +export interface CreateSchemaOptions extends IfNotExistsOption { + authorization?: string; +} + export function dropSchema(mOptions: MigrationOptions) { const _drop = ( schemaName: string, @@ -17,13 +21,7 @@ export function dropSchema(mOptions: MigrationOptions) { export function createSchema(mOptions: MigrationOptions) { const _create = ( schemaName: string, - { - ifNotExists, - authorization - }: { - ifNotExists?: boolean; - authorization?: string; - } = {} + { ifNotExists, authorization }: CreateSchemaOptions = {} ) => { const ifNotExistsStr = ifNotExists ? ' IF NOT EXISTS' : ''; const schemaNameStr = mOptions.literal(schemaName); From 3cd79252927f1439e411aaafe948b643a673de11 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Sat, 2 Nov 2019 22:29:56 +0100 Subject: [PATCH 46/57] Add parameter type definitions --- src/operations/tables.ts | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/src/operations/tables.ts b/src/operations/tables.ts index e52ee73a..818f9629 100644 --- a/src/operations/tables.ts +++ b/src/operations/tables.ts @@ -4,6 +4,7 @@ import { ColumnDefinition, ColumnDefinitions, DropOptions, + Like, LikeOptions, Name, ReferencesOptions, @@ -47,9 +48,12 @@ export interface AlterTableOptions { levelSecurity: 'DISABLE' | 'ENABLE' | 'FORCE' | 'NO FORCE'; } -const parseReferences = (options, literal) => { +const parseReferences = ( + options: ReferencesOptions, + literal: (v: Name) => string +) => { const { references, match, onDelete, onUpdate } = options; - const clauses = []; + const clauses: string[] = []; clauses.push( typeof references === 'string' && (references.startsWith('"') || references.endsWith(')')) @@ -68,7 +72,7 @@ const parseReferences = (options, literal) => { return clauses.join(' '); }; -const parseDeferrable = options => +const parseDeferrable = (options: { deferred?: boolean }) => `DEFERRABLE INITIALLY ${options.deferred ? 'DEFERRED' : 'IMMEDIATE'}`; const parseColumns = ( @@ -201,7 +205,12 @@ const parseColumns = ( }; }; -const parseConstraints = (table, options, optionName, literal) => { +const parseConstraints = ( + table: Name, + options: ConstraintOptions, + optionName: string, + literal: (v: Name) => string +) => { const { check, unique, @@ -210,7 +219,7 @@ const parseConstraints = (table, options, optionName, literal) => { exclude, deferrable, comment: optionComment - } = options; + }: ConstraintOptions = options; const tableName = typeof table === 'object' ? table.name : table; let constraints = []; const comments = []; @@ -299,8 +308,14 @@ const parseConstraints = (table, options, optionName, literal) => { }; }; -const parseLike = (like, literal) => { - const formatOptions = (name, options) => +const parseLike = ( + like: Name | { table: Name; options?: LikeOptions }, + literal: (v: Name) => string +) => { + const formatOptions = ( + name: 'INCLUDING' | 'EXCLUDING', + options: Like | Like[] + ) => (_.isArray(options) ? options : [options]) .map(option => ` ${name} ${option}`) .join(''); @@ -339,7 +354,7 @@ export function createTable(mOptions: MigrationOptions) { like, constraints: optionsConstraints = {}, comment: tableComment - } = options; + }: TableOptions = options; const { columns: columnLines, constraints: crossColumnConstraints, @@ -356,7 +371,7 @@ export function createTable(mOptions: MigrationOptions) { ); } - const constraints = { + const constraints: ConstraintOptions = { ...optionsConstraints, ...crossColumnConstraints }; From f7d5dd93f36e381e83c2f1c415a79526f3d2ddc5 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Sat, 2 Nov 2019 22:42:39 +0100 Subject: [PATCH 47/57] Improve type definitions --- src/operations/viewsMaterialized.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/operations/viewsMaterialized.ts b/src/operations/viewsMaterialized.ts index 9fa430ea..39548cb3 100644 --- a/src/operations/viewsMaterialized.ts +++ b/src/operations/viewsMaterialized.ts @@ -21,9 +21,9 @@ export interface RefreshMaterializedViewOptions { data?: boolean; } -const dataClause = data => +const dataClause = (data?: boolean) => data !== undefined ? ` WITH${data ? '' : ' NO'} DATA` : ''; -const storageParameterStr = storageParameters => key => { +const storageParameterStr = (storageParameters: T) => (key: keyof T) => { const value = storageParameters[key] === true ? '' : ` = ${storageParameters[key]}`; return `${key}${value}`; @@ -75,7 +75,11 @@ export function createMaterializedView(mOptions: MigrationOptions) { export function alterMaterializedView(mOptions: MigrationOptions) { const _alter = (viewName: Name, options: AlterMaterializedViewOptions) => { - const { cluster, extension, storageParameters = {} } = options; + const { + cluster, + extension, + storageParameters = {} + }: AlterMaterializedViewOptions = options; const clauses = []; if (cluster !== undefined) { if (cluster) { From 76e545b4d1727f11f830ba9be623a2a8a95867d8 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Sat, 2 Nov 2019 22:47:17 +0100 Subject: [PATCH 48/57] Improve type definitions --- src/utils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils.ts b/src/utils.ts index 1b100941..0f602e60 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -28,8 +28,8 @@ export class PgLiteral { } } -const identity = v => v; -const quote = str => `"${str}"`; +const identity = (v: T) => v; +const quote = (str: string) => `"${str}"`; export const createSchemalize = ( shouldDecamelize: boolean, From 5e239b64809374e451a1a6906ffcff85847322e5 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Wed, 6 Nov 2019 08:45:34 +0100 Subject: [PATCH 49/57] Remove options from lock --- src/runner.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runner.ts b/src/runner.ts index 90cd44f0..d3655fa8 100644 --- a/src/runner.ts +++ b/src/runner.ts @@ -257,7 +257,7 @@ const runner = async (options: RunnerOption): Promise => { await ensureMigrationsTable(db, options); if (!options.noLock) { - await lock(db, options); + await lock(db); } const [migrations, runNames] = await Promise.all([ From 08ff07f421cf7aa4198f65bbdb32bd7fd8f8da4e Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Wed, 6 Nov 2019 08:54:40 +0100 Subject: [PATCH 50/57] Improve query with string type --- src/db.ts | 11 ++++++----- src/runner.ts | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/db.ts b/src/db.ts index c392373c..e878407a 100644 --- a/src/db.ts +++ b/src/db.ts @@ -7,7 +7,8 @@ import { ClientConfig, QueryArrayResult, QueryConfig, - QueryResult + QueryResult, + QueryResultRow } from 'pg'; // or native libpq bindings // const pg = require('pg/native'); @@ -16,10 +17,10 @@ import { export interface DB { createConnection(): Promise; query(queryConfig: QueryConfig): Promise; - query( - queryTextOrConfig: string | QueryConfig, - values?: any[] - ): Promise; + query( + queryTextOrConfig: string | QueryConfig, + values?: I[] + ): Promise>; select(queryConfig: QueryConfig): Promise; select( queryTextOrConfig: string | QueryConfig, diff --git a/src/runner.ts b/src/runner.ts index d3655fa8..f58b87a8 100644 --- a/src/runner.ts +++ b/src/runner.ts @@ -59,7 +59,7 @@ const loadMigrations = async ( const lock = async (db: DB): Promise => { const { rows: [lockObtained] - } = await db.query( + } = await db.query<{ lockObtained: boolean }>( `select pg_try_advisory_lock(${PG_MIGRATE_LOCK_ID}) as "lockObtained"` ); if (!lockObtained) { From 8b40202bde5e7229e1429cd6ace9722b8240ec6f Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Thu, 7 Nov 2019 21:25:44 +0100 Subject: [PATCH 51/57] Key of ColumnDefinitions can be a string --- src/definitions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/definitions.ts b/src/definitions.ts index 56296b83..d1768a48 100644 --- a/src/definitions.ts +++ b/src/definitions.ts @@ -106,7 +106,7 @@ export interface ColumnDefinition extends ReferencesOptions { } export interface ColumnDefinitions { - [name: string]: ColumnDefinition; + [name: string]: ColumnDefinition | string; } export type Like = From a425600b38c587fa22c35a9ae772685f98ecf033 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Thu, 7 Nov 2019 21:38:04 +0100 Subject: [PATCH 52/57] Improve types of storage parameter --- src/operations/viewsMaterialized.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/operations/viewsMaterialized.ts b/src/operations/viewsMaterialized.ts index 39548cb3..b26bbfce 100644 --- a/src/operations/viewsMaterialized.ts +++ b/src/operations/viewsMaterialized.ts @@ -6,14 +6,14 @@ export interface CreateMaterializedViewOptions { ifNotExists?: boolean; columns?: string | string[]; tablespace?: string; - storageParameters?: object; + storageParameters?: { [key: string]: any }; data?: boolean; } export interface AlterMaterializedViewOptions { cluster?: null | false | string; extension?: string; - storageParameters?: object; + storageParameters?: { [key: string]: any }; } export interface RefreshMaterializedViewOptions { @@ -23,7 +23,12 @@ export interface RefreshMaterializedViewOptions { const dataClause = (data?: boolean) => data !== undefined ? ` WITH${data ? '' : ' NO'} DATA` : ''; -const storageParameterStr = (storageParameters: T) => (key: keyof T) => { +const storageParameterStr = < + T extends { [key: string]: any }, + K extends keyof T +>( + storageParameters: T +) => (key: K) => { const value = storageParameters[key] === true ? '' : ` = ${storageParameters[key]}`; return `${key}${value}`; From 9d4655cf5cc9fc952478f05a19c3e482af07ccd5 Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Thu, 7 Nov 2019 21:55:26 +0100 Subject: [PATCH 53/57] Move templates --- .eslintignore | 3 +-- .prettierignore | 2 +- package.json | 4 ++-- src/migration.ts | 2 +- {src => templates}/migration-template.js | 0 {src => templates}/migration-template.sql | 0 {src => templates}/migration-template.ts | 0 tsconfig.json | 2 +- 8 files changed, 6 insertions(+), 7 deletions(-) rename {src => templates}/migration-template.js (100%) rename {src => templates}/migration-template.sql (100%) rename {src => templates}/migration-template.ts (100%) diff --git a/.eslintignore b/.eslintignore index c083809b..5b1583d3 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,6 +1,5 @@ -lib/migration-template.js -lib/migration-template.ts node_modules dist lib +templates src diff --git a/.prettierignore b/.prettierignore index 63d3fde8..f8a26871 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1 +1 @@ -lib/migration-template.js \ No newline at end of file +templates diff --git a/package.json b/package.json index 0243a5f1..a741d3dc 100644 --- a/package.json +++ b/package.json @@ -88,8 +88,8 @@ "dotenv": ">=1.0.0" }, "scripts": { - "build": "(tsc || true) && cp src/migration-template.* lib/", - "compile": "babel lib/ -d dist/ && cp lib/migration-template.* dist/", + "build": "tsc", + "compile": "babel lib/ -d dist/", "test": "cross-env NODE_ENV=test mocha --opts ./mocha.opts test", "migrate": "node bin/node-pg-migrate", "lint": "eslint . bin/*", diff --git a/src/migration.ts b/src/migration.ts index 560dea71..5baf17d0 100644 --- a/src/migration.ts +++ b/src/migration.ts @@ -73,7 +73,7 @@ export class Migration implements RunMigration { await new Promise(resolve => { // eslint-disable-next-line security/detect-non-literal-fs-filename fs.createReadStream( - path.resolve(__dirname, `./migration-template.${suffix}`) + path.resolve(__dirname, `../templates/migration-template.${suffix}`) ) // eslint-disable-next-line security/detect-non-literal-fs-filename .pipe(fs.createWriteStream(newFile)) diff --git a/src/migration-template.js b/templates/migration-template.js similarity index 100% rename from src/migration-template.js rename to templates/migration-template.js diff --git a/src/migration-template.sql b/templates/migration-template.sql similarity index 100% rename from src/migration-template.sql rename to templates/migration-template.sql diff --git a/src/migration-template.ts b/templates/migration-template.ts similarity index 100% rename from src/migration-template.ts rename to templates/migration-template.ts diff --git a/tsconfig.json b/tsconfig.json index 455e7dc0..b6017b4b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,5 +13,5 @@ "noImplicitAny": true }, "include": ["src/**/*"], - "exclude": ["src/migration-template.*", "node_modules", "lib", "dist", "bin"] + "exclude": ["node_modules", "templates", "lib", "dist", "bin"] } From 527876a01682c6d3e6be4478f1fb5628ef8759bc Mon Sep 17 00:00:00 2001 From: Christopher Quadflieg Date: Thu, 7 Nov 2019 21:57:16 +0100 Subject: [PATCH 54/57] Ignore tsc exit code --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a741d3dc..657de264 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "dotenv": ">=1.0.0" }, "scripts": { - "build": "tsc", + "build": "(tsc || true)", "compile": "babel lib/ -d dist/", "test": "cross-env NODE_ENV=test mocha --opts ./mocha.opts test", "migrate": "node bin/node-pg-migrate", From 86b5fa42f513decc5d27ec22f87b4c2e8a26d5ae Mon Sep 17 00:00:00 2001 From: Jan Dolezel Date: Fri, 8 Nov 2019 09:40:33 +0100 Subject: [PATCH 55/57] Remove generated files --- .gitignore | 3 +- .npmignore | 1 + lib/db.js | 89 ----- lib/migration-builder.js | 202 ----------- lib/migration-template.js | 11 - lib/migration-template.sql | 1 - lib/migration-template.ts | 10 - lib/migration.js | 181 ---------- lib/operations/domains.js | 109 ------ lib/operations/extensions.js | 33 -- lib/operations/functions.js | 84 ----- lib/operations/indexes.js | 87 ----- lib/operations/operators.js | 218 ----------- lib/operations/other.js | 18 - lib/operations/policies.js | 72 ---- lib/operations/roles.js | 116 ------ lib/operations/schemas.js | 39 -- lib/operations/sequences.js | 110 ------ lib/operations/tables.js | 539 ---------------------------- lib/operations/triggers.js | 120 ------- lib/operations/types.js | 125 ------- lib/operations/views.js | 94 ----- lib/operations/viewsMaterialized.js | 125 ------- lib/runner.js | 248 ------------- lib/utils.js | 189 ---------- 25 files changed, 3 insertions(+), 2821 deletions(-) delete mode 100644 lib/db.js delete mode 100644 lib/migration-builder.js delete mode 100644 lib/migration-template.js delete mode 100644 lib/migration-template.sql delete mode 100644 lib/migration-template.ts delete mode 100644 lib/migration.js delete mode 100644 lib/operations/domains.js delete mode 100644 lib/operations/extensions.js delete mode 100644 lib/operations/functions.js delete mode 100644 lib/operations/indexes.js delete mode 100644 lib/operations/operators.js delete mode 100644 lib/operations/other.js delete mode 100644 lib/operations/policies.js delete mode 100644 lib/operations/roles.js delete mode 100644 lib/operations/schemas.js delete mode 100644 lib/operations/sequences.js delete mode 100644 lib/operations/tables.js delete mode 100644 lib/operations/triggers.js delete mode 100644 lib/operations/types.js delete mode 100644 lib/operations/views.js delete mode 100644 lib/operations/viewsMaterialized.js delete mode 100644 lib/runner.js delete mode 100644 lib/utils.js diff --git a/.gitignore b/.gitignore index 8a9d4927..af55a89f 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ *.log /migrations /node_modules -/dist*/** \ No newline at end of file +/dist +/lib diff --git a/.npmignore b/.npmignore index e524ecfa..e64a4f40 100644 --- a/.npmignore +++ b/.npmignore @@ -2,5 +2,6 @@ *.log migrations/ test/ +src/ mocha* renovate.json diff --git a/lib/db.js b/lib/db.js deleted file mode 100644 index 794ab81b..00000000 --- a/lib/db.js +++ /dev/null @@ -1,89 +0,0 @@ -/* - This file just manages the database connection and provides a query method - */ - -const pg = require('pg'); -// or native libpq bindings -// const pg = require('pg/native'); - -module.exports = (connection, log = console.error) => { - const isExternalClient = connection instanceof pg.Client; - let clientActive = false; - - const client = isExternalClient ? connection : new pg.Client(connection); - - const beforeCloseListeners = []; - - const createConnection = () => - new Promise((resolve, reject) => - clientActive || isExternalClient - ? resolve() - : client.connect(err => { - if (err) { - log('could not connect to postgres', err); - return reject(err); - } - clientActive = true; - return resolve(); - }) - ); - - const query = async (...args) => { - await createConnection(); - try { - return await 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 stringStart = string.substring(0, endLineWrapPos); - const stringEnd = string.substr(endLineWrapPos); - const startLineWrapPos = stringStart.lastIndexOf('\n') + 1; - const padding = ' '.repeat(position - startLineWrapPos - 1); - log(`Error executing: -${stringStart} -${padding}^^^^${stringEnd} - -${message} -`); - } else { - log(`Error executing: -${string} -${err} -`); - } - throw err; - } - }; - - const select = async (...args) => { - const { rows } = await query(...args); - return rows; - }; - const column = async (columnName, ...args) => - (await select(...args)).map(r => r[columnName]); - - return { - createConnection, - query, - select, - column, - - addBeforeCloseListener: listener => beforeCloseListeners.push(listener), - - close: async () => { - await beforeCloseListeners.reduce( - (promise, listener) => - promise.then(listener).catch(err => log(err.stack || err)), - Promise.resolve() - ); - if (!isExternalClient) { - clientActive = false; - client.end(); - } - } - }; -}; diff --git a/lib/migration-builder.js b/lib/migration-builder.js deleted file mode 100644 index b6f1d063..00000000 --- a/lib/migration-builder.js +++ /dev/null @@ -1,202 +0,0 @@ -/* - The migration builder is used to actually create a migration from instructions - - A new instance of MigrationBuilder is instantiated and passed to the up or down block - of each migration when it is being run. - - It makes the methods available via the pgm variable and stores up the sql commands. - This is what makes it possible to do this without making everything async - and it makes inference of down migrations possible. - */ - -const { PgLiteral, createSchemalize } = require('./utils'); - -const extensions = require('./operations/extensions'); -const indexes = require('./operations/indexes'); -const tables = require('./operations/tables'); -const types = require('./operations/types'); -const roles = require('./operations/roles'); -const functions = require('./operations/functions'); -const triggers = require('./operations/triggers'); -const schemas = require('./operations/schemas'); -const domains = require('./operations/domains'); -const sequences = require('./operations/sequences'); -const operators = require('./operations/operators'); -const policies = require('./operations/policies'); -const views = require('./operations/views'); -const mViews = require('./operations/viewsMaterialized'); -const other = require('./operations/other'); - -/* eslint-disable security/detect-non-literal-fs-filename */ -module.exports = class MigrationBuilder { - constructor(db, typeShorthands, shouldDecamelize) { - this._steps = []; - this._REVERSE_MODE = false; - // by default, all migrations are wrapped in a transaction - this._use_transaction = true; - - // this function wraps each operation within a function that either - // 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') { - const name = `pgm.${operation.name}()`; - throw new Error( - `Impossible to automatically infer down migration for "${name}"` - ); - } - this._steps = this._steps.concat( - this._REVERSE_MODE ? operation.reverse(...args) : operation(...args) - ); - }; - - const options = { - typeShorthands, - schemalize: createSchemalize(shouldDecamelize, false), - literal: createSchemalize(shouldDecamelize, true) - }; - - // defines the methods that are accessible via pgm in each migrations - // there are some convenience aliases to make usage easier - this.createExtension = wrap(extensions.createExtension(options)); - this.dropExtension = wrap(extensions.dropExtension(options)); - this.addExtension = this.createExtension; - - this.createTable = wrap(tables.createTable(options)); - this.dropTable = wrap(tables.dropTable(options)); - this.renameTable = wrap(tables.renameTable(options)); - this.alterTable = wrap(tables.alterTable(options)); - - this.addColumns = wrap(tables.addColumns(options)); - this.dropColumns = wrap(tables.dropColumns(options)); - this.renameColumn = wrap(tables.renameColumn(options)); - this.alterColumn = wrap(tables.alterColumn(options)); - this.addColumn = this.addColumns; - this.dropColumn = this.dropColumns; - - this.addConstraint = wrap(tables.addConstraint(options)); - this.dropConstraint = wrap(tables.dropConstraint(options)); - this.renameConstraint = wrap(tables.renameConstraint(options)); - this.createConstraint = this.addConstraint; - - this.createType = wrap(types.createType(options)); - this.dropType = wrap(types.dropType(options)); - this.addType = this.createType; - this.renameType = wrap(types.renameType(options)); - this.renameTypeAttribute = wrap(types.renameTypeAttribute(options)); - this.renameTypeValue = wrap(types.renameTypeValue(options)); - this.addTypeAttribute = wrap(types.addTypeAttribute(options)); - this.dropTypeAttribute = wrap(types.dropTypeAttribute(options)); - this.setTypeAttribute = wrap(types.setTypeAttribute(options)); - this.addTypeValue = wrap(types.addTypeValue(options)); - - this.createIndex = wrap(indexes.createIndex(options)); - this.dropIndex = wrap(indexes.dropIndex(options)); - this.addIndex = this.createIndex; - - this.createRole = wrap(roles.createRole(options)); - this.dropRole = wrap(roles.dropRole(options)); - this.alterRole = wrap(roles.alterRole(options)); - this.renameRole = wrap(roles.renameRole(options)); - - this.createFunction = wrap(functions.createFunction(options)); - this.dropFunction = wrap(functions.dropFunction(options)); - this.renameFunction = wrap(functions.renameFunction(options)); - - this.createTrigger = wrap(triggers.createTrigger(options)); - this.dropTrigger = wrap(triggers.dropTrigger(options)); - this.renameTrigger = wrap(triggers.renameTrigger(options)); - - this.createSchema = wrap(schemas.createSchema(options)); - this.dropSchema = wrap(schemas.dropSchema(options)); - this.renameSchema = wrap(schemas.renameSchema(options)); - - this.createDomain = wrap(domains.createDomain(options)); - this.dropDomain = wrap(domains.dropDomain(options)); - this.alterDomain = wrap(domains.alterDomain(options)); - this.renameDomain = wrap(domains.renameDomain(options)); - - this.createSequence = wrap(sequences.createSequence(options)); - this.dropSequence = wrap(sequences.dropSequence(options)); - this.alterSequence = wrap(sequences.alterSequence(options)); - this.renameSequence = wrap(sequences.renameSequence(options)); - - this.createOperator = wrap(operators.createOperator(options)); - this.dropOperator = wrap(operators.dropOperator(options)); - this.createOperatorClass = wrap(operators.createOperatorClass(options)); - this.dropOperatorClass = wrap(operators.dropOperatorClass(options)); - this.renameOperatorClass = wrap(operators.renameOperatorClass(options)); - this.createOperatorFamily = wrap(operators.createOperatorFamily(options)); - this.dropOperatorFamily = wrap(operators.dropOperatorFamily(options)); - this.renameOperatorFamily = wrap(operators.renameOperatorFamily(options)); - this.addToOperatorFamily = wrap(operators.addToOperatorFamily(options)); - this.removeFromOperatorFamily = wrap( - operators.removeFromOperatorFamily(options) - ); - - this.createPolicy = wrap(policies.createPolicy(options)); - this.dropPolicy = wrap(policies.dropPolicy(options)); - this.alterPolicy = wrap(policies.alterPolicy(options)); - this.renamePolicy = wrap(policies.renamePolicy(options)); - - this.createView = wrap(views.createView(options)); - this.dropView = wrap(views.dropView(options)); - this.alterView = wrap(views.alterView(options)); - this.alterViewColumn = wrap(views.alterViewColumn(options)); - this.renameView = wrap(views.renameView(options)); - - this.createMaterializedView = wrap(mViews.createMaterializedView(options)); - this.dropMaterializedView = wrap(mViews.dropMaterializedView(options)); - this.alterMaterializedView = wrap(mViews.alterMaterializedView(options)); - this.renameMaterializedView = wrap(mViews.renameMaterializedView(options)); - this.renameMaterializedViewColumn = wrap( - mViews.renameMaterializedViewColumn(options) - ); - this.refreshMaterializedView = wrap( - mViews.refreshMaterializedView(options) - ); - - this.sql = wrap(other.sql(options)); - - // Other utilities which may be useful - // .func creates a string which will not be escaped - // common uses are for PG functions, ex: { ... default: pgm.func('NOW()') } - this.func = PgLiteral.create; - - // 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'); - } - return operation(...args); - }; - this.db = { - query: wrapDB(db.query), - select: wrapDB(db.select) - }; - } - - enableReverseMode() { - this._REVERSE_MODE = true; - return this; - } - - noTransaction() { - this._use_transaction = false; - return this; - } - - isUsingTransaction() { - return this._use_transaction; - } - - getSql() { - return `${this.getSqlSteps().join('\n')}\n`; - } - - getSqlSteps() { - // in reverse mode, we flip the order of the statements - return this._REVERSE_MODE ? this._steps.slice().reverse() : this._steps; - } -}; -/* eslint-enable security/detect-non-literal-fs-filename */ diff --git a/lib/migration-template.js b/lib/migration-template.js deleted file mode 100644 index 5dffd627..00000000 --- a/lib/migration-template.js +++ /dev/null @@ -1,11 +0,0 @@ -/* eslint-disable camelcase */ - -exports.shorthands = undefined; - -exports.up = (pgm) => { - -}; - -exports.down = (pgm) => { - -}; diff --git a/lib/migration-template.sql b/lib/migration-template.sql deleted file mode 100644 index aed00f2e..00000000 --- a/lib/migration-template.sql +++ /dev/null @@ -1 +0,0 @@ --- up migration \ No newline at end of file diff --git a/lib/migration-template.ts b/lib/migration-template.ts deleted file mode 100644 index 9d2731e4..00000000 --- a/lib/migration-template.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* eslint-disable @typescript-eslint/camelcase */ -import { MigrationBuilder } from 'node-pg-migrate'; - -export const shorthands = undefined; - -export async function up(pgm: MigrationBuilder): Promise { -} - -export async function down(pgm: MigrationBuilder): Promise { -} diff --git a/lib/migration.js b/lib/migration.js deleted file mode 100644 index 9d2ae0b5..00000000 --- a/lib/migration.js +++ /dev/null @@ -1,181 +0,0 @@ -/* - A new Migration is instantiated for each migration file. - - It is responsible for storing the name of the file and knowing how to execute - the up and down migrations defined in the file. - - */ - -const fs = require('fs'); -const mkdirp = require('mkdirp'); -const path = require('path'); - -const MigrationBuilder = require('./migration-builder'); -const { getMigrationTableSchema, promisify } = require('./utils'); - -const readdir = promisify(fs.readdir); // eslint-disable-line security/detect-non-literal-fs-filename -const lstat = promisify(fs.lstat); // eslint-disable-line security/detect-non-literal-fs-filename - -const SEPARATOR = '_'; - -const loadMigrationFiles = async (dir, ignorePattern) => { - const dirContent = await readdir(`${dir}/`); - const files = await Promise.all( - dirContent.map(async file => { - const stats = await lstat(`${dir}/${file}`); - return stats.isFile() ? file : null; - }) - ); - const filter = new RegExp(`^(${ignorePattern})$`); // eslint-disable-line security/detect-non-literal-regexp - return files.filter(i => i && !filter.test(i)).sort(); -}; - -const getLastSuffix = async (dir, ignorePattern) => { - try { - const files = await loadMigrationFiles(dir, ignorePattern); - return files.length > 0 - ? path.extname(files[files.length - 1]).substr(1) - : undefined; - } catch (err) { - return undefined; - } -}; - -module.exports = class Migration { - // class method that creates a new migration file by cloning the migration template - static async create(name, directory, language, ignorePattern) { - // ensure the migrations directory exists - mkdirp.sync(directory); - - const suffix = - language || (await getLastSuffix(directory, ignorePattern)) || 'js'; - - // file name looks like migrations/1391877300255_migration-title.js - const newFile = `${directory}/${Date.now()}${SEPARATOR}${name}.${suffix}`; - - // copy the default migration template to the new file location - await new Promise(resolve => { - // eslint-disable-next-line security/detect-non-literal-fs-filename - fs.createReadStream( - path.resolve(__dirname, `./migration-template.${suffix}`) - ) - // eslint-disable-next-line security/detect-non-literal-fs-filename - .pipe(fs.createWriteStream(newFile)) - .on('end', resolve); - }); - - return new Migration(null, newFile); - } - - constructor( - db, - migrationPath, - { up, down } = {}, - options = {}, - typeShorthands, - log = console.log - ) { - this.db = db; - this.path = migrationPath; - this.name = path.basename(migrationPath, path.extname(migrationPath)); - this.timestamp = Number(this.name.split(SEPARATOR)[0]) || 0; - this.up = up; - this.down = down; - this.options = options; - this.typeShorthands = typeShorthands; - this.log = log; - } - - _getMarkAsRun(action) { - const schema = getMigrationTableSchema(this.options); - const { migrationsTable } = this.options; - const { name } = this; - switch (action) { - case this.down: - this.log(`### MIGRATION ${this.name} (DOWN) ###`); - return `DELETE FROM "${schema}"."${migrationsTable}" WHERE name='${name}';`; - case this.up: - this.log(`### MIGRATION ${this.name} (UP) ###`); - return `INSERT INTO "${schema}"."${migrationsTable}" (name, run_on) VALUES ('${name}', NOW());`; - default: - throw new Error('Unknown direction'); - } - } - - async _apply(action, pgm) { - if (action.length === 2) { - await new Promise(resolve => action(pgm, resolve)); - } else { - await action(pgm); - } - - const sqlSteps = pgm.getSqlSteps(); - - sqlSteps.push(this._getMarkAsRun(action)); - - if (!this.options.singleTransaction && pgm.isUsingTransaction()) { - // if not in singleTransaction mode we need to create our own transaction - 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;'); - } else if (!this.options.singleTransaction || !pgm.isUsingTransaction()) { - this.log('#> WARNING: This migration is not wrapped in a transaction! <'); - } - - this.log(`${sqlSteps.join('\n')}\n\n`); - - return sqlSteps.reduce( - (promise, sql) => - promise.then(() => this.options.dryRun || this.db.query(sql)), - Promise.resolve() - ); - } - - _getAction(direction) { - if (direction === 'down') { - if (this.down === false) { - throw new Error( - `User has disabled down migration on file: ${this.name}` - ); - } - - if (this.down === undefined) { - this.down = this.up; - } - } - - const action = this[direction]; - - if (typeof action !== 'function') { - throw new Error(`Unknown value for direction: ${direction}`); - } - - return action; - } - - apply(direction) { - const pgm = new MigrationBuilder( - this.db, - this.typeShorthands, - this.options.decamelize - ); - const action = this._getAction(direction); - - if (this.down === this.up) { - // automatically infer the down migration by running the up migration in reverse mode... - pgm.enableReverseMode(); - } - - return this._apply(action, pgm); - } - - markAsRun(direction) { - return this.db.query(this._getMarkAsRun(this._getAction(direction))); - } -}; - -module.exports.loadMigrationFiles = loadMigrationFiles; diff --git a/lib/operations/domains.js b/lib/operations/domains.js deleted file mode 100644 index 77c7d2a6..00000000 --- a/lib/operations/domains.js +++ /dev/null @@ -1,109 +0,0 @@ -const { applyType, escapeValue } = require('../utils'); - -function dropDomain(mOptions) { - const _drop = (domainName, { ifExists, cascade } = {}) => { - const ifExistsStr = ifExists ? ' IF EXISTS' : ''; - const cascadeStr = cascade ? ' CASCADE' : ''; - const domainNameStr = mOptions.literal(domainName); - return `DROP DOMAIN${ifExistsStr} ${domainNameStr}${cascadeStr};`; - }; - return _drop; -} - -function createDomain(mOptions) { - const _create = (domainName, type, options = {}) => { - const { - default: defaultValue, - collation, - notNull, - check, - constraintName - } = options; - const constraints = []; - if (collation) { - constraints.push(`COLLATE ${collation}`); - } - if (defaultValue !== undefined) { - constraints.push(`DEFAULT ${escapeValue(defaultValue)}`); - } - if (notNull && check) { - throw new Error('"notNull" and "check" can\'t be specified together'); - } else if (notNull || check) { - if (constraintName) { - constraints.push(`CONSTRAINT ${mOptions.literal(constraintName)}`); - } - if (notNull) { - constraints.push('NOT NULL'); - } else if (check) { - constraints.push(`CHECK (${check})`); - } - } - - const constraintsStr = constraints.length - ? ` ${constraints.join(' ')}` - : ''; - - const typeStr = applyType(type, mOptions.typeShorthands).type; - const domainNameStr = mOptions.literal(domainName); - - return `CREATE DOMAIN ${domainNameStr} AS ${typeStr}${constraintsStr};`; - }; - _create.reverse = (domainName, type, options) => - dropDomain(mOptions)(domainName, options); - return _create; -} - -function alterDomain(mOptions) { - const _alter = (domainName, options) => { - const { - default: defaultValue, - notNull, - allowNull, - check, - constraintName - } = options; - const actions = []; - if (defaultValue === null) { - actions.push('DROP DEFAULT'); - } else if (defaultValue !== undefined) { - actions.push(`SET DEFAULT ${escapeValue(defaultValue)}`); - } - if (notNull) { - actions.push('SET NOT NULL'); - } else if (notNull === false || allowNull) { - actions.push('DROP NOT NULL'); - } - if (check) { - actions.push( - `${ - constraintName - ? `CONSTRAINT ${mOptions.literal(constraintName)} ` - : '' - }CHECK (${check})` - ); - } - - return `${actions - .map(action => `ALTER DOMAIN ${mOptions.literal(domainName)} ${action}`) - .join(';\n')};`; - }; - return _alter; -} - -function renameDomain(mOptions) { - const _rename = (domainName, newDomainName) => { - const domainNameStr = mOptions.literal(domainName); - const newDomainNameStr = mOptions.literal(newDomainName); - return `ALTER DOMAIN ${domainNameStr} RENAME TO ${newDomainNameStr};`; - }; - _rename.reverse = (domainName, newDomainName) => - _rename(newDomainName, domainName); - return _rename; -} - -module.exports = { - dropDomain, - createDomain, - alterDomain, - renameDomain -}; diff --git a/lib/operations/extensions.js b/lib/operations/extensions.js deleted file mode 100644 index 4fda4723..00000000 --- a/lib/operations/extensions.js +++ /dev/null @@ -1,33 +0,0 @@ -const _ = require('lodash'); - -function dropExtension(mOptions) { - const _drop = (extensions, { ifExists, cascade } = {}) => { - if (!_.isArray(extensions)) extensions = [extensions]; // eslint-disable-line no-param-reassign - const ifExistsStr = ifExists ? ' IF EXISTS' : ''; - const cascadeStr = cascade ? ' CASCADE' : ''; - return _.map(extensions, extension => { - const extensionStr = mOptions.literal(extension); - return `DROP EXTENSION${ifExistsStr} ${extensionStr}${cascadeStr};`; - }); - }; - return _drop; -} - -function createExtension(mOptions) { - const _create = (extensions, { ifNotExists, schema } = {}) => { - if (!_.isArray(extensions)) extensions = [extensions]; // eslint-disable-line no-param-reassign - const ifNotExistsStr = ifNotExists ? ' IF NOT EXISTS' : ''; - const schemaStr = schema ? ` SCHEMA ${mOptions.literal(schema)}` : ''; - return _.map(extensions, extension => { - const extensionStr = mOptions.literal(extension); - return `CREATE EXTENSION${ifNotExistsStr} ${extensionStr}${schemaStr};`; - }); - }; - _create.reverse = dropExtension(mOptions); - return _create; -} - -module.exports = { - createExtension, - dropExtension -}; diff --git a/lib/operations/functions.js b/lib/operations/functions.js deleted file mode 100644 index 33783d83..00000000 --- a/lib/operations/functions.js +++ /dev/null @@ -1,84 +0,0 @@ -const { escapeValue, formatParams } = require('../utils'); - -function dropFunction(mOptions) { - const _drop = ( - functionName, - functionParams = [], - { ifExists, cascade } = {} - ) => { - const ifExistsStr = ifExists ? ' IF EXISTS' : ''; - const cascadeStr = cascade ? ' CASCADE' : ''; - const paramsStr = formatParams(functionParams, mOptions); - const functionNameStr = mOptions.literal(functionName); - return `DROP FUNCTION${ifExistsStr} ${functionNameStr}${paramsStr}${cascadeStr};`; - }; - return _drop; -} - -function createFunction(mOptions) { - const _create = ( - functionName, - functionParams = [], - functionOptions = {}, - definition - ) => { - const { - replace, - returns = 'void', - language, - window, - behavior = 'VOLATILE', - onNull, - parallel - } = functionOptions; - const options = []; - if (behavior) { - options.push(behavior); - } - if (language) { - options.push(`LANGUAGE ${language}`); - } else { - throw new Error( - `Language for function ${functionName} have to be specified` - ); - } - if (window) { - options.push('WINDOW'); - } - if (onNull) { - options.push('RETURNS NULL ON NULL INPUT'); - } - if (parallel) { - options.push(`PARALLEL ${parallel}`); - } - - const replaceStr = replace ? ' OR REPLACE' : ''; - const paramsStr = formatParams(functionParams, mOptions); - const functionNameStr = mOptions.literal(functionName); - - return `CREATE${replaceStr} FUNCTION ${functionNameStr}${paramsStr} - RETURNS ${returns} - AS ${escapeValue(definition)} - ${options.join('\n ')};`; - }; - _create.reverse = dropFunction(mOptions); - return _create; -} - -function renameFunction(mOptions) { - const _rename = (oldFunctionName, functionParams = [], newFunctionName) => { - const paramsStr = formatParams(functionParams, mOptions); - const oldFunctionNameStr = mOptions.literal(oldFunctionName); - const newFunctionNameStr = mOptions.literal(newFunctionName); - return `ALTER FUNCTION ${oldFunctionNameStr}${paramsStr} RENAME TO ${newFunctionNameStr};`; - }; - _rename.reverse = (oldFunctionName, functionParams, newFunctionName) => - _rename(newFunctionName, functionParams, oldFunctionName); - return _rename; -} - -module.exports = { - createFunction, - dropFunction, - renameFunction -}; diff --git a/lib/operations/indexes.js b/lib/operations/indexes.js deleted file mode 100644 index b33fce47..00000000 --- a/lib/operations/indexes.js +++ /dev/null @@ -1,87 +0,0 @@ -const _ = require('lodash'); - -function generateIndexName(table, columns, options) { - if (options.name) { - return typeof table === 'object' - ? { schema: table.schema, name: options.name } - : options.name; - } - const cols = _.isArray(columns) ? columns.join('_') : columns; - const uniq = options.unique ? '_unique' : ''; - return typeof table === 'object' - ? { - schema: table.schema, - name: `${table.name}_${cols}${uniq}_index` - } - : `${table}_${cols}${uniq}_index`; -} - -function generateColumnString(column, literal) { - const openingBracketPos = column.indexOf('('); - const closingBracketPos = column.indexOf(')'); - const isFunction = - openingBracketPos >= 0 && closingBracketPos > openingBracketPos; - return isFunction - ? column // expression - : literal(column); // single column -} - -function generateColumnsString(columns, literal) { - return _.isArray(columns) - ? columns.map(column => generateColumnString(column, literal)).join(', ') - : generateColumnString(columns, literal); -} - -function dropIndex(mOptions) { - const _drop = (tableName, columns, options = {}) => { - const { concurrently, ifExists, cascade } = options; - const concurrentlyStr = concurrently ? ' CONCURRENTLY' : ''; - const ifExistsStr = ifExists ? ' IF EXISTS' : ''; - const indexName = generateIndexName(tableName, columns, options); - const cascadeStr = cascade ? ' CASCADE' : ''; - const indexNameStr = mOptions.literal(indexName); - - return `DROP INDEX${concurrentlyStr}${ifExistsStr} ${indexNameStr}${cascadeStr};`; - }; - return _drop; -} - -function createIndex(mOptions) { - const _create = (tableName, columns, options = {}) => { - /* - columns - the column, columns, or expression to create the index on - - Options - name - explicitly specify the name for the index - unique - is this a unique index - where - where clause - concurrently - - opclass - name of an operator class - options.method - [ btree | hash | gist | spgist | gin ] - */ - const indexName = generateIndexName( - typeof tableName === 'object' ? tableName.name : tableName, - columns, - options - ); - const columnsString = generateColumnsString(columns, mOptions.literal); - 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 opclass = options.opclass - ? ` ${mOptions.schemalize(options.opclass)}` - : ''; - const indexNameStr = mOptions.literal(indexName); - const tableNameStr = mOptions.literal(tableName); - - return `CREATE ${unique} INDEX ${concurrently} ${indexNameStr} ON ${tableNameStr}${method} (${columnsString}${opclass})${where};`; - }; - _create.reverse = dropIndex(mOptions); - return _create; -} - -module.exports = { - createIndex, - dropIndex -}; diff --git a/lib/operations/operators.js b/lib/operations/operators.js deleted file mode 100644 index a985de84..00000000 --- a/lib/operations/operators.js +++ /dev/null @@ -1,218 +0,0 @@ -const { formatParams, applyType } = require('../utils'); - -function dropOperator(mOptions) { - const _drop = (operatorName, options = {}) => { - const { ifExists, cascade, left, right } = options; - - const operatorNameStr = mOptions.schemalize(operatorName); - const leftStr = mOptions.literal(left || 'none'); - const rightStr = mOptions.literal(right || 'none'); - - const ifExistsStr = ifExists ? ' IF EXISTS' : ''; - const cascadeStr = cascade ? ' CASCADE' : ''; - - return `DROP OPERATOR${ifExistsStr} ${operatorNameStr}(${leftStr}, ${rightStr})${cascadeStr};`; - }; - return _drop; -} - -function createOperator(mOptions) { - const _create = (operatorName, options = {}) => { - const { - procedure, - left, - right, - commutator, - negator, - restrict, - join, - hashes, - merges - } = options; - - const defs = []; - defs.push(`PROCEDURE = ${mOptions.literal(procedure)}`); - if (left) { - defs.push(`LEFTARG = ${mOptions.literal(left)}`); - } - if (right) { - defs.push(`RIGHTARG = ${mOptions.literal(right)}`); - } - if (commutator) { - defs.push(`COMMUTATOR = ${mOptions.schemalize(commutator)}`); - } - if (negator) { - defs.push(`NEGATOR = ${mOptions.schemalize(negator)}`); - } - if (restrict) { - defs.push(`RESTRICT = ${mOptions.literal(restrict)}`); - } - if (join) { - defs.push(`JOIN = ${mOptions.literal(join)}`); - } - if (hashes) { - defs.push('HASHES'); - } - if (merges) { - defs.push('MERGES'); - } - const operatorNameStr = mOptions.schemalize(operatorName); - return `CREATE OPERATOR ${operatorNameStr} (${defs.join(', ')});`; - }; - _create.reverse = dropOperator(mOptions); - return _create; -} - -function dropOperatorFamily(mOptions) { - const _drop = ( - operatorFamilyName, - indexMethod, - { ifExists, cascade } = {} - ) => { - const operatorFamilyNameStr = mOptions.literal(operatorFamilyName); - const ifExistsStr = ifExists ? ' IF EXISTS' : ''; - const cascadeStr = cascade ? ' CASCADE' : ''; - return `DROP OPERATOR FAMILY ${ifExistsStr} ${operatorFamilyNameStr} USING ${indexMethod}${cascadeStr};`; - }; - return _drop; -} - -function createOperatorFamily(mOptions) { - const _create = (operatorFamilyName, indexMethod) => { - const operatorFamilyNameStr = mOptions.literal(operatorFamilyName); - return `CREATE OPERATOR FAMILY ${operatorFamilyNameStr} USING ${indexMethod};`; - }; - _create.reverse = dropOperatorFamily(mOptions); - return _create; -} - -const operatorMap = mOptions => ({ type = '', number, name, params = [] }) => { - const nameStr = mOptions.literal(name); - if (String(type).toLowerCase() === 'function') { - if (params.length > 2) { - throw new Error("Operator can't have more than 2 parameters"); - } - const paramsStr = params.length > 0 ? formatParams(params, mOptions) : ''; - - return `OPERATOR ${number} ${nameStr}${paramsStr}`; - } - - if (String(type).toLowerCase() === 'operator') { - const paramsStr = formatParams(params, mOptions); - return `FUNCTION ${number} ${nameStr}${paramsStr}`; - } - - throw new Error('Operator "type" must be either "function" or "operator"'); -}; - -const changeOperatorFamily = (op, reverse) => mOptions => { - const method = (operatorFamilyName, indexMethod, operatorList) => { - const operatorFamilyNameStr = mOptions.literal(operatorFamilyName); - const operatorListStr = operatorList - .map(operatorMap(mOptions)) - .join(',\n '); - - return `ALTER OPERATOR FAMILY ${operatorFamilyNameStr} USING ${indexMethod} ${op} - ${operatorListStr};`; - }; - if (reverse) { - method.reverse = reverse(mOptions); - } - return method; -}; - -const removeFromOperatorFamily = changeOperatorFamily('DROP'); -const addToOperatorFamily = changeOperatorFamily( - 'ADD', - removeFromOperatorFamily -); - -function renameOperatorFamily(mOptions) { - const _rename = ( - oldOperatorFamilyName, - indexMethod, - newOperatorFamilyName - ) => { - const oldOperatorFamilyNameStr = mOptions.literal(oldOperatorFamilyName); - const newOperatorFamilyNameStr = mOptions.literal(newOperatorFamilyName); - - return `ALTER OPERATOR FAMILY ${oldOperatorFamilyNameStr} USING ${indexMethod} RENAME TO ${newOperatorFamilyNameStr};`; - }; - _rename.reverse = ( - oldOperatorFamilyName, - indexMethod, - newOperatorFamilyName - ) => _rename(newOperatorFamilyName, indexMethod, oldOperatorFamilyName); - return _rename; -} - -function dropOperatorClass(mOptions) { - const _drop = ( - operatorClassName, - indexMethod, - { ifExists, cascade } = {} - ) => { - const operatorClassNameStr = mOptions.literal(operatorClassName); - const ifExistsStr = ifExists ? ' IF EXISTS' : ''; - const cascadeStr = cascade ? ' CASCADE' : ''; - - return `DROP OPERATOR CLASS ${ifExistsStr} ${operatorClassNameStr} USING ${indexMethod}${cascadeStr};`; - }; - return _drop; -} - -function createOperatorClass(mOptions) { - const _create = ( - operatorClassName, - type, - indexMethod, - operatorList, - options - ) => { - const { default: isDefault, family } = options; - const operatorClassNameStr = mOptions.literal(operatorClassName); - const defaultStr = isDefault ? ' DEFAULT' : ''; - const typeStr = mOptions.literal(applyType(type).type); - const indexMethodStr = mOptions.literal(indexMethod); - const familyStr = family ? ` FAMILY ${family}` : ''; - const operatorListStr = operatorList - .map(operatorMap(mOptions)) - .join(',\n '); - - return `CREATE OPERATOR CLASS ${operatorClassNameStr}${defaultStr} FOR TYPE ${typeStr} USING ${indexMethodStr} ${familyStr} AS - ${operatorListStr};`; - }; - _create.reverse = ( - operatorClassName, - type, - indexMethod, - operatorList, - options - ) => dropOperatorClass(mOptions)(operatorClassName, indexMethod, options); - return _create; -} - -function renameOperatorClass(mOptions) { - const _rename = (oldOperatorClassName, indexMethod, newOperatorClassName) => { - const oldOperatorClassNameStr = mOptions.literal(oldOperatorClassName); - const newOperatorClassNameStr = mOptions.literal(newOperatorClassName); - - return `ALTER OPERATOR CLASS ${oldOperatorClassNameStr} USING ${indexMethod} RENAME TO ${newOperatorClassNameStr};`; - }; - _rename.reverse = (oldOperatorClassName, indexMethod, newOperatorClassName) => - _rename(newOperatorClassName, indexMethod, oldOperatorClassName); - return _rename; -} - -module.exports = { - createOperator, - dropOperator, - createOperatorFamily, - dropOperatorFamily, - removeFromOperatorFamily, - addToOperatorFamily, - renameOperatorFamily, - dropOperatorClass, - createOperatorClass, - renameOperatorClass -}; diff --git a/lib/operations/other.js b/lib/operations/other.js deleted file mode 100644 index 0181acb9..00000000 --- a/lib/operations/other.js +++ /dev/null @@ -1,18 +0,0 @@ -const { createTransformer } = require('../utils'); - -function sql(mOptions) { - const t = createTransformer(mOptions.literal); - return (...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 += ';'; - } - return s; - }; -} - -module.exports = { - sql -}; diff --git a/lib/operations/policies.js b/lib/operations/policies.js deleted file mode 100644 index f268a801..00000000 --- a/lib/operations/policies.js +++ /dev/null @@ -1,72 +0,0 @@ -const makeClauses = ({ role, using, check }) => { - const roles = (Array.isArray(role) ? role : [role]).join(', '); - const clauses = []; - if (roles) { - clauses.push(`TO ${roles}`); - } - if (using) { - clauses.push(`USING (${using})`); - } - if (check) { - clauses.push(`WITH CHECK (${check})`); - } - return clauses; -}; - -function dropPolicy(mOptions) { - const _drop = (tableName, policyName, { ifExists } = {}) => { - const ifExistsStr = ifExists ? ' IF EXISTS' : ''; - const policyNameStr = mOptions.literal(policyName); - const tableNameStr = mOptions.literal(tableName); - return `DROP POLICY${ifExistsStr} ${policyNameStr} ON ${tableNameStr};`; - }; - return _drop; -} - -function createPolicy(mOptions) { - const _create = (tableName, policyName, options = {}) => { - const createOptions = { - ...options, - role: options.role || 'PUBLIC' - }; - const clauses = [ - `FOR ${options.command || 'ALL'}`, - ...makeClauses(createOptions) - ]; - const clausesStr = clauses.join(' '); - const policyNameStr = mOptions.literal(policyName); - const tableNameStr = mOptions.literal(tableName); - return `CREATE POLICY ${policyNameStr} ON ${tableNameStr} ${clausesStr};`; - }; - _create.reverse = dropPolicy(mOptions); - return _create; -} - -function alterPolicy(mOptions) { - const _alter = (tableName, policyName, options = {}) => { - const clausesStr = makeClauses(options).join(' '); - const policyNameStr = mOptions.literal(policyName); - const tableNameStr = mOptions.literal(tableName); - return `ALTER POLICY ${policyNameStr} ON ${tableNameStr} ${clausesStr};`; - }; - return _alter; -} - -function renamePolicy(mOptions) { - const _rename = (tableName, policyName, newPolicyName) => { - const policyNameStr = mOptions.literal(policyName); - const newPolicyNameStr = mOptions.literal(newPolicyName); - const tableNameStr = mOptions.literal(tableName); - return `ALTER POLICY ${policyNameStr} ON ${tableNameStr} RENAME TO ${newPolicyNameStr};`; - }; - _rename.reverse = (tableName, policyName, newPolicyName) => - _rename(tableName, newPolicyName, policyName); - return _rename; -} - -module.exports = { - createPolicy, - dropPolicy, - alterPolicy, - renamePolicy -}; diff --git a/lib/operations/roles.js b/lib/operations/roles.js deleted file mode 100644 index 37ad5c57..00000000 --- a/lib/operations/roles.js +++ /dev/null @@ -1,116 +0,0 @@ -const { isArray } = require('lodash'); -const { escapeValue } = require('../utils'); - -const formatRoleOptions = (roleOptions = {}) => { - const options = []; - if (roleOptions.superuser !== undefined) { - options.push(roleOptions.superuser ? 'SUPERUSER' : 'NOSUPERUSER'); - } - if (roleOptions.createdb !== undefined) { - options.push(roleOptions.createdb ? 'CREATEDB' : 'NOCREATEDB'); - } - if (roleOptions.createrole !== undefined) { - options.push(roleOptions.createrole ? 'CREATEROLE' : 'NOCREATEROLE'); - } - if (roleOptions.inherit !== undefined) { - options.push(roleOptions.inherit ? 'INHERIT' : 'NOINHERIT'); - } - if (roleOptions.login !== undefined) { - options.push(roleOptions.login ? 'LOGIN' : 'NOLOGIN'); - } - if (roleOptions.replication !== undefined) { - options.push(roleOptions.replication ? 'REPLICATION' : 'NOREPLICATION'); - } - if (roleOptions.bypassrls !== undefined) { - options.push(roleOptions.bypassrls ? 'BYPASSRLS' : 'NOBYPASSRLS'); - } - if (roleOptions.limit) { - options.push(`CONNECTION LIMIT ${Number(roleOptions.limit)}`); - } - if (roleOptions.password !== undefined) { - const encrypted = - roleOptions.encrypted === false ? 'UNENCRYPTED' : 'ENCRYPTED'; - options.push(`${encrypted} PASSWORD ${escapeValue(roleOptions.password)}`); - } - if (roleOptions.valid !== undefined) { - const valid = roleOptions.valid - ? escapeValue(roleOptions.valid) - : "'infinity'"; - options.push(`VALID UNTIL ${valid}`); - } - if (roleOptions.inRole) { - const inRole = isArray(roleOptions.inRole) - ? roleOptions.inRole.join(',') - : roleOptions.inRole; - options.push(`IN ROLE ${inRole}`); - } - if (roleOptions.role) { - const role = isArray(roleOptions.role) - ? roleOptions.role.join(',') - : roleOptions.role; - options.push(`ROLE ${role}`); - } - if (roleOptions.admin) { - const admin = isArray(roleOptions.admin) - ? roleOptions.admin.join(',') - : roleOptions.admin; - options.push(`ADMIN ${admin}`); - } - - return options.join(' '); -}; - -function dropRole(mOptions) { - const _drop = (roleName, { ifExists } = {}) => { - const ifExistsStr = ifExists ? ' IF EXISTS' : ''; - const roleNameStr = mOptions.literal(roleName); - return `DROP ROLE${ifExistsStr} ${roleNameStr};`; - }; - return _drop; -} - -function createRole(mOptions) { - const _create = (roleName, roleOptions = {}) => { - const options = formatRoleOptions({ - ...roleOptions, - superuser: roleOptions.superuser || false, - createdb: roleOptions.createdb || false, - createrole: roleOptions.createrole || false, - inherit: roleOptions.inherit !== false, - login: roleOptions.login || false, - replication: roleOptions.replication || false - }); - const optionsStr = options ? ` WITH ${options}` : ''; - return `CREATE ROLE ${mOptions.literal(roleName)}${optionsStr};`; - }; - _create.reverse = dropRole(mOptions); - return _create; -} - -function alterRole(mOptions) { - const _alter = (roleName, roleOptions = {}) => { - const options = formatRoleOptions(roleOptions); - return options - ? `ALTER ROLE ${mOptions.literal(roleName)} WITH ${options};` - : ''; - }; - return _alter; -} - -function renameRole(mOptions) { - const _rename = (oldRoleName, newRoleName) => { - const oldRoleNameStr = mOptions.literal(oldRoleName); - const newRoleNameStr = mOptions.literal(newRoleName); - return `ALTER ROLE ${oldRoleNameStr} RENAME TO ${newRoleNameStr};`; - }; - _rename.reverse = (oldRoleName, newRoleName) => - _rename(newRoleName, oldRoleName); - return _rename; -} - -module.exports = { - createRole, - dropRole, - alterRole, - renameRole -}; diff --git a/lib/operations/schemas.js b/lib/operations/schemas.js deleted file mode 100644 index f632daab..00000000 --- a/lib/operations/schemas.js +++ /dev/null @@ -1,39 +0,0 @@ -function dropSchema(mOptions) { - const _drop = (schemaName, { ifExists, cascade } = {}) => { - const ifExistsStr = ifExists ? ' IF EXISTS' : ''; - const cascadeStr = cascade ? ' CASCADE' : ''; - const schemaNameStr = mOptions.literal(schemaName); - return `DROP SCHEMA${ifExistsStr} ${schemaNameStr}${cascadeStr};`; - }; - return _drop; -} - -function createSchema(mOptions) { - const _create = (schemaName, { ifNotExists, authorization } = {}) => { - const ifNotExistsStr = ifNotExists ? ' IF NOT EXISTS' : ''; - const schemaNameStr = mOptions.literal(schemaName); - const authorizationStr = authorization - ? ` AUTHORIZATION ${authorization}` - : ''; - return `CREATE SCHEMA${ifNotExistsStr} ${schemaNameStr}${authorizationStr};`; - }; - _create.reverse = dropSchema(mOptions); - return _create; -} - -function renameSchema(mOptions) { - const _rename = (schemaName, newSchemaName) => { - const schemaNameStr = mOptions.literal(schemaName); - const newSchemaNameStr = mOptions.literal(newSchemaName); - return `ALTER SCHEMA ${schemaNameStr} RENAME TO ${newSchemaNameStr};`; - }; - _rename.reverse = (schemaName, newSchemaName) => - _rename(newSchemaName, schemaName); - return _rename; -} - -module.exports = { - createSchema, - dropSchema, - renameSchema -}; diff --git a/lib/operations/sequences.js b/lib/operations/sequences.js deleted file mode 100644 index 106b4c1b..00000000 --- a/lib/operations/sequences.js +++ /dev/null @@ -1,110 +0,0 @@ -const { applyType } = require('../utils'); - -const parseSequenceOptions = (typeShorthands, options) => { - const { - type, - increment, - minvalue, - maxvalue, - start, - cache, - cycle, - owner - } = options; - const clauses = []; - if (type) { - clauses.push(`AS ${applyType(type, typeShorthands).type}`); - } - if (increment) { - clauses.push(`INCREMENT BY ${increment}`); - } - if (minvalue) { - clauses.push(`MINVALUE ${minvalue}`); - } else if (minvalue === null || minvalue === false) { - clauses.push('NO MINVALUE'); - } - if (maxvalue) { - clauses.push(`MAXVALUE ${maxvalue}`); - } else if (maxvalue === null || maxvalue === false) { - clauses.push('NO MAXVALUE'); - } - if (start) { - clauses.push(`START WITH ${start}`); - } - if (cache) { - clauses.push(`CACHE ${cache}`); - } - if (cycle) { - clauses.push('CYCLE'); - } else if (cycle === false) { - clauses.push('NO CYCLE'); - } - if (owner) { - clauses.push(`OWNED BY ${owner}`); - } else if (owner === null || owner === false) { - clauses.push('OWNED BY NONE'); - } - return clauses; -}; - -function dropSequence(mOptions) { - const _drop = (sequenceName, { ifExists, cascade } = {}) => { - const ifExistsStr = ifExists ? ' IF EXISTS' : ''; - const cascadeStr = cascade ? ' CASCADE' : ''; - const sequenceNameStr = mOptions.literal(sequenceName); - return `DROP SEQUENCE${ifExistsStr} ${sequenceNameStr}${cascadeStr};`; - }; - return _drop; -} - -function createSequence(mOptions) { - const _create = (sequenceName, options = {}) => { - const { temporary, ifNotExists } = options; - const temporaryStr = temporary ? ' TEMPORARY' : ''; - const ifNotExistsStr = ifNotExists ? ' IF NOT EXISTS' : ''; - const sequenceNameStr = mOptions.literal(sequenceName); - const clausesStr = parseSequenceOptions( - mOptions.typeShorthands, - options - ).join('\n '); - return `CREATE${temporaryStr} SEQUENCE${ifNotExistsStr} ${sequenceNameStr} - ${clausesStr};`; - }; - _create.reverse = dropSequence(mOptions); - return _create; -} - -function alterSequence(mOptions) { - return (sequenceName, options) => { - const { restart } = options; - const clauses = parseSequenceOptions(mOptions.typeShorthands, options); - if (restart) { - if (restart === true) { - clauses.push('RESTART'); - } else { - clauses.push(`RESTART WITH ${restart}`); - } - } - return `ALTER SEQUENCE ${mOptions.literal(sequenceName)} - ${clauses.join('\n ')};`; - }; -} - -function renameSequence(mOptions) { - const _rename = (sequenceName, newSequenceName) => { - const sequenceNameStr = mOptions.literal(sequenceName); - const newSequenceNameStr = mOptions.literal(newSequenceName); - return `ALTER SEQUENCE ${sequenceNameStr} RENAME TO ${newSequenceNameStr};`; - }; - _rename.reverse = (sequenceName, newSequenceName) => - _rename(newSequenceName, sequenceName); - return _rename; -} - -module.exports = { - createSequence, - dropSequence, - alterSequence, - renameSequence, - parseSequenceOptions -}; diff --git a/lib/operations/tables.js b/lib/operations/tables.js deleted file mode 100644 index bf56a700..00000000 --- a/lib/operations/tables.js +++ /dev/null @@ -1,539 +0,0 @@ -const _ = require('lodash'); -const { - escapeValue, - applyType, - applyTypeAdapters, - comment, - formatLines -} = require('../utils'); -const { parseSequenceOptions } = require('./sequences'); - -const parseReferences = (options, literal) => { - const { references, match, onDelete, onUpdate } = options; - const clauses = []; - clauses.push( - typeof references === 'string' && - (references.startsWith('"') || references.endsWith(')')) - ? `REFERENCES ${references}` - : `REFERENCES ${literal(references)}` - ); - if (match) { - clauses.push(`MATCH ${match}`); - } - if (onDelete) { - clauses.push(`ON DELETE ${onDelete}`); - } - if (onUpdate) { - clauses.push(`ON UPDATE ${onUpdate}`); - } - return clauses.join(' '); -}; - -const parseDeferrable = options => - `DEFERRABLE INITIALLY ${options.deferred ? 'DEFERRED' : 'IMMEDIATE'}`; - -const parseColumns = (tableName, columns, mOptions) => { - const extendingTypeShorthands = mOptions.typeShorthands; - let columnsWithOptions = _.mapValues(columns, column => - applyType(column, extendingTypeShorthands) - ); - - const primaryColumns = _.chain(columnsWithOptions) - .map((options, columnName) => (options.primaryKey ? columnName : null)) - .filter() - .value(); - const multiplePrimaryColumns = primaryColumns.length > 1; - - if (multiplePrimaryColumns) { - columnsWithOptions = _.mapValues(columnsWithOptions, options => ({ - ...options, - primaryKey: false - })); - } - - const comments = _.chain(columnsWithOptions) - .map( - (options, columnName) => - typeof options.comment !== 'undefined' && - comment( - 'COLUMN', - `${mOptions.literal(tableName)}.${mOptions.literal(columnName)}`, - options.comment - ) - ) - .filter() - .value(); - - return { - columns: _.map(columnsWithOptions, (options, columnName) => { - const { - type, - collation, - default: defaultValue, - unique, - primaryKey, - notNull, - check, - references, - referencesConstraintName, - referencesConstraintComment, - deferrable, - generated - } = options; - const constraints = []; - if (collation) { - constraints.push(`COLLATE ${collation}`); - } - if (defaultValue !== undefined) { - constraints.push(`DEFAULT ${escapeValue(defaultValue)}`); - } - if (unique) { - constraints.push('UNIQUE'); - } - if (primaryKey) { - constraints.push('PRIMARY KEY'); - } - if (notNull) { - constraints.push('NOT NULL'); - } - if (check) { - constraints.push(`CHECK (${check})`); - } - if (references) { - const name = - referencesConstraintName || - (referencesConstraintComment ? `${tableName}_fk_${columnName}` : ''); - const constraintName = name - ? `CONSTRAINT ${mOptions.literal(name)} ` - : ''; - constraints.push( - `${constraintName}${parseReferences(options, mOptions.literal)}` - ); - if (referencesConstraintComment) { - comments.push( - comment( - `CONSTRAINT ${mOptions.literal(name)} ON`, - mOptions.literal(tableName), - referencesConstraintComment - ) - ); - } - } - if (deferrable) { - constraints.push(parseDeferrable(options)); - } - if (generated) { - const sequenceOptions = parseSequenceOptions( - extendingTypeShorthands, - generated - ).join(' '); - constraints.push( - `GENERATED ${generated.precedence} AS IDENTITY${ - sequenceOptions ? ` (${sequenceOptions})` : '' - }` - ); - } - - const constraintsStr = constraints.length - ? ` ${constraints.join(' ')}` - : ''; - - const sType = typeof type === 'object' ? mOptions.literal(type) : type; - - return `${mOptions.literal(columnName)} ${sType}${constraintsStr}`; - }), - constraints: multiplePrimaryColumns ? { primaryKey: primaryColumns } : {}, - comments - }; -}; - -const parseConstraints = (table, options, optionName, literal) => { - const { - check, - unique, - primaryKey, - foreignKeys, - exclude, - deferrable, - comment: optionComment - } = options; - const tableName = typeof table === 'object' ? table.name : table; - let constraints = []; - const comments = []; - if (check) { - if (_.isArray(check)) { - check.forEach((ch, i) => { - const name = literal(optionName || `${tableName}_chck_${i + 1}`); - constraints.push(`CONSTRAINT ${name} CHECK (${ch})`); - }); - } else { - const name = literal(optionName || `${tableName}_chck`); - constraints.push(`CONSTRAINT ${name} 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]; - const name = literal(optionName || `${tableName}_uniq_${cols.join('_')}`); - constraints.push( - `CONSTRAINT ${name} UNIQUE (${cols.map(literal).join(', ')})` - ); - }); - } - if (primaryKey) { - const name = literal(optionName || `${tableName}_pkey`); - const key = (_.isArray(primaryKey) ? primaryKey : [primaryKey]) - .map(literal) - .join(', '); - constraints.push(`CONSTRAINT ${name} PRIMARY KEY (${key})`); - } - if (foreignKeys) { - (_.isArray(foreignKeys) ? foreignKeys : [foreignKeys]).forEach(fk => { - const { - columns, - referencesConstraintName, - referencesConstraintComment - } = fk; - const cols = _.isArray(columns) ? columns : [columns]; - const name = literal( - referencesConstraintName || - optionName || - `${tableName}_fk_${cols.join('_')}` - ); - const key = cols.map(literal).join(', '); - const referencesStr = parseReferences(fk, literal); - constraints.push( - `CONSTRAINT ${name} FOREIGN KEY (${key}) ${referencesStr}` - ); - if (referencesConstraintComment) { - comments.push( - comment( - `CONSTRAINT ${name} ON`, - literal(tableName), - referencesConstraintComment - ) - ); - } - }); - } - if (exclude) { - const name = literal(optionName || `${tableName}_excl`); - constraints.push(`CONSTRAINT ${name} EXCLUDE ${exclude}`); - } - - if (deferrable) { - constraints = constraints.map( - constraint => `${constraint} ${parseDeferrable(options)}` - ); - } - if (optionComment) { - if (!optionName) - throw new Error('cannot comment on unspecified constraints'); - comments.push( - comment( - `CONSTRAINT ${literal(optionName)} ON`, - literal(tableName), - optionComment - ) - ); - } - return { - constraints, - comments - }; -}; - -const parseLike = (like, literal) => { - const formatOptions = (name, options) => - (_.isArray(options) ? options : [options]) - .map(option => ` ${name} ${option}`) - .join(''); - - const table = typeof like === 'string' || !like.table ? like : like.table; - const options = like.options - ? [ - formatOptions('INCLUDING', like.options.including), - formatOptions('EXCLUDING', like.options.excluding) - ].join('') - : ''; - return `LIKE ${literal(table)}${options}`; -}; - -// TABLE -function dropTable(mOptions) { - const _drop = (tableName, { ifExists, cascade } = {}) => { - const ifExistsStr = ifExists ? ' IF EXISTS' : ''; - const cascadeStr = cascade ? ' CASCADE' : ''; - const tableNameStr = mOptions.literal(tableName); - return `DROP TABLE${ifExistsStr} ${tableNameStr}${cascadeStr};`; - }; - return _drop; -} - -function createTable(mOptions) { - const _create = (tableName, columns, options = {}) => { - const { - temporary, - ifNotExists, - inherits, - like, - constraints: optionsConstraints = {}, - comment: tableComment - } = options; - const { - columns: columnLines, - constraints: crossColumnConstraints, - comments: columnComments = [] - } = parseColumns(tableName, columns, mOptions); - const dupes = _.intersection( - Object.keys(optionsConstraints), - Object.keys(crossColumnConstraints) - ); - if (dupes.length > 0) { - const dupesStr = dupes.join(', '); - throw new Error( - `There is duplicate constraint definition in table and columns options: ${dupesStr}` - ); - } - - const constraints = { ...optionsConstraints, ...crossColumnConstraints }; - const { - constraints: constraintLines, - comments: constraintComments - } = parseConstraints(tableName, constraints, '', mOptions.literal); - const tableDefinition = [...columnLines, ...constraintLines].concat( - like ? [parseLike(like, mOptions.literal)] : [] - ); - - const temporaryStr = temporary ? ' TEMPORARY' : ''; - const ifNotExistsStr = ifNotExists ? ' IF NOT EXISTS' : ''; - const inheritsStr = inherits - ? ` INHERITS (${mOptions.literal(inherits)})` - : ''; - const tableNameStr = mOptions.literal(tableName); - - const createTableQuery = `CREATE TABLE${temporaryStr}${ifNotExistsStr} ${tableNameStr} ( -${formatLines(tableDefinition)} -)${inheritsStr};`; - const comments = [...columnComments, ...constraintComments]; - if (typeof tableComment !== 'undefined') { - comments.push( - comment('TABLE', mOptions.literal(tableName), tableComment) - ); - } - return `${createTableQuery}${ - comments.length > 0 ? `\n${comments.join('\n')}` : '' - }`; - }; - _create.reverse = dropTable(mOptions); - return _create; -} - -function alterTable(mOptions) { - const _alter = (tableName, options) => { - const alterDefinition = []; - if (options.levelSecurity) { - alterDefinition.push(`${options.levelSecurity} ROW LEVEL SECURITY`); - } - return `ALTER TABLE ${mOptions.literal(tableName)} - ${formatLines(alterDefinition)};`; - }; - return _alter; -} - -// COLUMNS -function dropColumns(mOptions) { - const _drop = (tableName, columns, { ifExists, cascade } = {}) => { - if (typeof columns === 'string') { - columns = [columns]; // eslint-disable-line no-param-reassign - } else if (!_.isArray(columns) && typeof columns === 'object') { - columns = _.keys(columns); // eslint-disable-line no-param-reassign - } - const columnsStr = formatLines( - columns.map(mOptions.literal), - ` DROP ${ifExists ? ' IF EXISTS' : ''}`, - `${cascade ? ' CASCADE' : ''},` - ); - return `ALTER TABLE ${mOptions.literal(tableName)} -${columnsStr};`; - }; - return _drop; -} - -function addColumns(mOptions) { - const _add = (tableName, columns, { ifNotExists } = {}) => { - const { - columns: columnLines, - comments: columnComments = [] - } = parseColumns(tableName, columns, mOptions); - const columnsStr = formatLines( - columnLines, - ` ADD ${ifNotExists ? 'IF NOT EXISTS ' : ''}` - ); - const tableNameStr = mOptions.literal(tableName); - const alterTableQuery = `ALTER TABLE ${tableNameStr}\n${columnsStr};`; - const columnCommentsStr = - columnComments.length > 0 ? `\n${columnComments.join('\n')}` : ''; - return `${alterTableQuery}${columnCommentsStr}`; - }; - _add.reverse = dropColumns(mOptions); - return _add; -} - -function alterColumn(mOptions) { - return (tableName, columnName, options) => { - const { - default: defaultValue, - type, - collation, - using, - notNull, - allowNull, - comment: columnComment, - generated - } = options; - const actions = []; - if (defaultValue === null) { - actions.push('DROP DEFAULT'); - } else if (defaultValue !== undefined) { - actions.push(`SET DEFAULT ${escapeValue(defaultValue)}`); - } - if (type) { - const typeStr = applyTypeAdapters(type); - const collationStr = collation ? `COLLATE ${collation}` : ''; - const usingStr = using ? ` USING ${using}` : ''; - actions.push(`SET DATA TYPE ${typeStr}${collationStr}${usingStr}`); - } - if (notNull) { - actions.push('SET NOT NULL'); - } else if (notNull === false || allowNull) { - actions.push('DROP NOT NULL'); - } - if (generated !== undefined) { - if (!generated) { - actions.push('DROP IDENTITY'); - } else { - const sequenceOptions = parseSequenceOptions( - mOptions.typeShorthands, - generated - ).join(' '); - actions.push( - `SET GENERATED ${generated.precedence} AS IDENTITY${ - sequenceOptions ? ` (${sequenceOptions})` : '' - }` - ); - } - } - - const queries = []; - if (actions.length > 0) { - const columnsStr = formatLines( - actions, - ` ALTER ${mOptions.literal(columnName)} ` - ); - queries.push( - `ALTER TABLE ${mOptions.literal(tableName)}\n${columnsStr};` - ); - } - if (typeof columnComment !== 'undefined') { - queries.push( - comment( - 'COLUMN', - `${mOptions.literal(tableName)}.${mOptions.literal(columnName)}`, - columnComment - ) - ); - } - return queries.join('\n'); - }; -} - -function renameTable(mOptions) { - const _rename = (tableName, newName) => { - const tableNameStr = mOptions.literal(tableName); - const newNameStr = mOptions.literal(newName); - return `ALTER TABLE ${tableNameStr} RENAME TO ${newNameStr};`; - }; - _rename.reverse = (tableName, newName) => _rename(newName, tableName); - return _rename; -} - -function renameColumn(mOptions) { - const _rename = (tableName, columnName, newName) => { - const tableNameStr = mOptions.literal(tableName); - const columnNameStr = mOptions.literal(columnName); - const newNameStr = mOptions.literal(newName); - return `ALTER TABLE ${tableNameStr} RENAME ${columnNameStr} TO ${newNameStr};`; - }; - _rename.reverse = (tableName, columnName, newName) => - _rename(tableName, newName, columnName); - return _rename; -} - -function renameConstraint(mOptions) { - const _rename = (tableName, constraintName, newName) => { - const tableNameStr = mOptions.literal(tableName); - const constraintNameStr = mOptions.literal(constraintName); - const newNameStr = mOptions.literal(newName); - return `ALTER TABLE ${tableNameStr} RENAME CONSTRAINT ${constraintNameStr} TO ${newNameStr};`; - }; - _rename.reverse = (tableName, constraintName, newName) => - _rename(tableName, newName, constraintName); - return _rename; -} - -function dropConstraint(mOptions) { - const _drop = (tableName, constraintName, { ifExists, cascade } = {}) => { - const ifExistsStr = ifExists ? ' IF EXISTS' : ''; - const cascadeStr = cascade ? ' CASCADE' : ''; - const tableNameStr = mOptions.literal(tableName); - const constraintNameStr = mOptions.literal(constraintName); - return `ALTER TABLE ${tableNameStr} DROP CONSTRAINT${ifExistsStr} ${constraintNameStr}${cascadeStr};`; - }; - return _drop; -} -function addConstraint(mOptions) { - const _add = (tableName, constraintName, expression) => { - const { constraints, comments } = - typeof expression === 'string' - ? { - constraints: [ - `${ - constraintName - ? `CONSTRAINT ${mOptions.literal(constraintName)} ` - : '' - }${expression}` - ], - comments: [] - } - : parseConstraints( - tableName, - expression, - constraintName, - mOptions.literal - ); - const constraintStr = formatLines(constraints, ' ADD '); - return [ - `ALTER TABLE ${mOptions.literal(tableName)}\n${constraintStr};`, - ...comments - ].join('\n'); - }; - _add.reverse = dropConstraint(mOptions); - return _add; -} - -module.exports = { - createTable, - dropTable, - alterTable, - renameTable, - addColumns, - dropColumns, - alterColumn, - renameColumn, - addConstraint, - dropConstraint, - renameConstraint -}; diff --git a/lib/operations/triggers.js b/lib/operations/triggers.js deleted file mode 100644 index a6bdef58..00000000 --- a/lib/operations/triggers.js +++ /dev/null @@ -1,120 +0,0 @@ -const { isArray } = require('lodash'); -const { escapeValue } = require('../utils'); -const { createFunction, dropFunction } = require('./functions'); - -function dropTrigger(mOptions) { - const _drop = (tableName, triggerName, { ifExists, cascade } = {}) => { - const ifExistsStr = ifExists ? ' IF EXISTS' : ''; - const cascadeStr = cascade ? ' CASCADE' : ''; - const triggerNameStr = mOptions.literal(triggerName); - const tableNameStr = mOptions.literal(tableName); - return `DROP TRIGGER${ifExistsStr} ${triggerNameStr} ON ${tableNameStr}${cascadeStr};`; - }; - return _drop; -} - -function createTrigger(mOptions) { - const _create = (tableName, triggerName, triggerOptions = {}, definition) => { - const { - constraint, - condition, - operation, - deferrable, - deferred, - functionArgs = [] - } = triggerOptions; - let { when, level = 'STATEMENT', function: functionName } = triggerOptions; - const operations = isArray(operation) ? operation.join(' OR ') : operation; - if (constraint) { - when = 'AFTER'; - } - const isInsteadOf = /instead\s+of/i.test(when); - if (isInsteadOf) { - level = 'ROW'; - } - if (definition) { - functionName = functionName || triggerName; - } - - 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"); - } - if (!operations) { - throw new Error( - '"operation" (INSERT/UPDATE[ OF ...]/DELETE/TRUNCATE) have to be specified' - ); - } - - const defferStr = constraint - ? `${ - deferrable - ? `DEFERRABLE INITIALLY ${deferred ? 'DEFERRED' : 'IMMEDIATE'}` - : 'NOT DEFERRABLE' - }\n ` - : ''; - const conditionClause = condition ? `WHEN (${condition})\n ` : ''; - const constraintStr = constraint ? ' CONSTRAINT' : ''; - const paramsStr = functionArgs.map(escapeValue).join(', '); - const triggerNameStr = mOptions.literal(triggerName); - const tableNameStr = mOptions.literal(tableName); - const functionNameStr = mOptions.literal(functionName); - - const triggerSQL = `CREATE${constraintStr} TRIGGER ${triggerNameStr} - ${when} ${operations} ON ${tableNameStr} - ${defferStr}FOR EACH ${level} - ${conditionClause}EXECUTE PROCEDURE ${functionNameStr}(${paramsStr});`; - - const fnSQL = definition - ? `${createFunction(mOptions)( - functionName, - [], - { ...triggerOptions, returns: 'trigger' }, - definition - )}\n` - : ''; - return `${fnSQL}${triggerSQL}`; - }; - - _create.reverse = ( - tableName, - triggerName, - triggerOptions = {}, - definition - ) => { - const triggerSQL = dropTrigger(mOptions)( - tableName, - triggerName, - triggerOptions - ); - const fnSQL = definition - ? `\n${dropFunction(mOptions)( - triggerOptions.function || triggerName, - [], - triggerOptions - )}` - : ''; - return `${triggerSQL}${fnSQL}`; - }; - - return _create; -} - -function renameTrigger(mOptions) { - const _rename = (tableName, oldTriggerName, newTriggerName) => { - const oldTriggerNameStr = mOptions.literal(oldTriggerName); - const tableNameStr = mOptions.literal(tableName); - const newTriggerNameStr = mOptions.literal(newTriggerName); - return `ALTER TRIGGER ${oldTriggerNameStr} ON ${tableNameStr} RENAME TO ${newTriggerNameStr};`; - }; - _rename.reverse = (tableName, oldTriggerName, newTriggerName) => - _rename(tableName, newTriggerName, oldTriggerName); - return _rename; -} - -module.exports = { - createTrigger, - dropTrigger, - renameTrigger -}; diff --git a/lib/operations/types.js b/lib/operations/types.js deleted file mode 100644 index 7f2748d2..00000000 --- a/lib/operations/types.js +++ /dev/null @@ -1,125 +0,0 @@ -const _ = require('lodash'); -const { applyType, escapeValue } = require('../utils'); - -function dropType(mOptions) { - const _drop = (typeName, { ifExists, cascade } = {}) => { - const ifExistsStr = ifExists ? ' IF EXISTS' : ''; - const cascadeStr = cascade ? ' CASCADE' : ''; - const typeNameStr = mOptions.literal(typeName); - return `DROP TYPE${ifExistsStr} ${typeNameStr}${cascadeStr};`; - }; - return _drop; -} - -function createType(mOptions) { - const _create = (typeName, options) => { - if (_.isArray(options)) { - const optionsStr = options.map(escapeValue).join(', '); - const typeNameStr = mOptions.literal(typeName); - return `CREATE TYPE ${typeNameStr} AS ENUM (${optionsStr});`; - } - const attributes = _.map(options, (attribute, attributeName) => { - const typeStr = applyType(attribute, mOptions.typeShorthands).type; - return `${mOptions.literal(attributeName)} ${typeStr}`; - }).join(',\n'); - return `CREATE TYPE ${mOptions.literal(typeName)} AS (\n${attributes}\n);`; - }; - _create.reverse = dropType(mOptions); - return _create; -} - -function dropTypeAttribute(mOptions) { - const _drop = (typeName, attributeName, { ifExists } = {}) => { - const ifExistsStr = ifExists ? ' IF EXISTS' : ''; - const typeNameStr = mOptions.literal(typeName); - const attributeNameStr = mOptions.literal(attributeName); - return `ALTER TYPE ${typeNameStr} DROP ATTRIBUTE ${attributeNameStr}${ifExistsStr};`; - }; - return _drop; -} - -function addTypeAttribute(mOptions) { - const _alterAttributeAdd = (typeName, attributeName, attributeType) => { - const typeStr = applyType(attributeType, mOptions.typeShorthands).type; - const typeNameStr = mOptions.literal(typeName); - const attributeNameStr = mOptions.literal(attributeName); - - return `ALTER TYPE ${typeNameStr} ADD ATTRIBUTE ${attributeNameStr} ${typeStr};`; - }; - _alterAttributeAdd.reverse = dropTypeAttribute(mOptions); - return _alterAttributeAdd; -} - -function setTypeAttribute(mOptions) { - return (typeName, attributeName, attributeType) => { - const typeStr = applyType(attributeType, mOptions.typeShorthands).type; - const typeNameStr = mOptions.literal(typeName); - const attributeNameStr = mOptions.literal(attributeName); - - return `ALTER TYPE ${typeNameStr} ALTER ATTRIBUTE ${attributeNameStr} SET DATA TYPE ${typeStr};`; - }; -} - -function addTypeValue(mOptions) { - const _add = (typeName, value, options = {}) => { - const { ifNotExists, before, after } = options; - - if (before && after) { - throw new Error('"before" and "after" can\'t be specified together'); - } - const beforeStr = before ? ` BEFORE ${mOptions.literal(before)}` : ''; - const afterStr = after ? ` AFTER ${mOptions.literal(after)}` : ''; - const ifNotExistsStr = ifNotExists ? ' IF NOT EXISTS' : ''; - const valueStr = escapeValue(value); - const typeNameStr = mOptions.literal(typeName); - - return `ALTER TYPE ${typeNameStr} ADD VALUE${ifNotExistsStr} ${valueStr}${beforeStr}${afterStr};`; - }; - return _add; -} - -function renameType(mOptions) { - const _rename = (typeName, newTypeName) => { - const typeNameStr = mOptions.literal(typeName); - const newTypeNameStr = mOptions.literal(newTypeName); - return `ALTER TYPE ${typeNameStr} RENAME TO ${newTypeNameStr};`; - }; - _rename.reverse = (typeName, newTypeName) => _rename(newTypeName, typeName); - return _rename; -} - -function renameTypeAttribute(mOptions) { - const _rename = (typeName, attributeName, newAttributeName) => { - const typeNameStr = mOptions.literal(typeName); - const attributeNameStr = mOptions.literal(attributeName); - const newAttributeNameStr = mOptions.literal(newAttributeName); - return `ALTER TYPE ${typeNameStr} RENAME ATTRIBUTE ${attributeNameStr} TO ${newAttributeNameStr};`; - }; - _rename.reverse = (typeName, attributeName, newAttributeName) => - _rename(typeName, newAttributeName, attributeName); - return _rename; -} - -function renameTypeValue(mOptions) { - const _rename = (typeName, value, newValue) => { - const valueStr = escapeValue(value); - const newValueStr = escapeValue(newValue); - const typeNameStr = mOptions.literal(typeName); - return `ALTER TYPE ${typeNameStr} RENAME VALUE ${valueStr} TO ${newValueStr};`; - }; - _rename.reverse = (typeName, value, newValue) => - _rename(typeName, newValue, value); - return _rename; -} - -module.exports = { - createType, - dropType, - renameType, - addTypeAttribute, - dropTypeAttribute, - setTypeAttribute, - renameTypeAttribute, - renameTypeValue, - addTypeValue -}; diff --git a/lib/operations/views.js b/lib/operations/views.js deleted file mode 100644 index d0b6233c..00000000 --- a/lib/operations/views.js +++ /dev/null @@ -1,94 +0,0 @@ -const { escapeValue } = require('../utils'); - -function dropView(mOptions) { - const _drop = (viewName, { ifExists, cascade } = {}) => { - const ifExistsStr = ifExists ? ' IF EXISTS' : ''; - const cascadeStr = cascade ? ' CASCADE' : ''; - const viewNameStr = mOptions.literal(viewName); - return `DROP VIEW${ifExistsStr} ${viewNameStr}${cascadeStr};`; - }; - return _drop; -} - -function createView(mOptions) { - const _create = (viewName, options, definition) => { - const { - temporary, - replace, - recursive, - columns = [], - checkOption - } = options; - // prettier-ignore - const columnNames = (Array.isArray(columns) ? columns : [columns]).map(mOptions.literal).join(", "); - const replaceStr = replace ? ' OR REPLACE' : ''; - const temporaryStr = temporary ? ' TEMPORARY' : ''; - const recursiveStr = recursive ? ' RECURSIVE' : ''; - const columnStr = columnNames ? `(${columnNames})` : ''; - const checkOptionStr = checkOption - ? ` WITH ${checkOption} CHECK OPTION` - : ''; - const viewNameStr = mOptions.literal(viewName); - - return `CREATE${replaceStr}${temporaryStr}${recursiveStr} VIEW ${viewNameStr}${columnStr} AS ${definition}${checkOptionStr};`; - }; - _create.reverse = dropView(mOptions); - return _create; -} - -function alterView(mOptions) { - const _alter = (viewName, options) => { - const { checkOption } = options; - const clauses = []; - if (checkOption !== undefined) { - if (checkOption) { - clauses.push(`SET check_option = ${checkOption}`); - } else { - clauses.push(`RESET check_option`); - } - } - return clauses - .map(clause => `ALTER VIEW ${mOptions.literal(viewName)} ${clause};`) - .join('\n'); - }; - return _alter; -} - -function alterViewColumn(mOptions) { - const _alter = (viewName, columnName, options) => { - const { default: defaultValue } = options; - const actions = []; - if (defaultValue === null) { - actions.push('DROP DEFAULT'); - } else if (defaultValue !== undefined) { - actions.push(`SET DEFAULT ${escapeValue(defaultValue)}`); - } - const viewNameStr = mOptions.literal(viewName); - const columnNameStr = mOptions.literal(columnName); - return actions - .map( - action => - `ALTER VIEW ${viewNameStr} ALTER COLUMN ${columnNameStr} ${action};` - ) - .join('\n'); - }; - return _alter; -} - -function renameView(mOptions) { - const _rename = (viewName, newViewName) => { - const viewNameStr = mOptions.literal(viewName); - const newViewNameStr = mOptions.literal(newViewName); - return `ALTER VIEW ${viewNameStr} RENAME TO ${newViewNameStr};`; - }; - _rename.reverse = (viewName, newViewName) => _rename(newViewName, viewName); - return _rename; -} - -module.exports = { - createView, - dropView, - alterView, - alterViewColumn, - renameView -}; diff --git a/lib/operations/viewsMaterialized.js b/lib/operations/viewsMaterialized.js deleted file mode 100644 index 2d0ee044..00000000 --- a/lib/operations/viewsMaterialized.js +++ /dev/null @@ -1,125 +0,0 @@ -const { formatLines } = require('../utils'); - -const dataClause = data => - data !== undefined ? ` WITH${data ? '' : ' NO'} DATA` : ''; -const storageParameterStr = storageParameters => key => { - const value = - storageParameters[key] === true ? '' : ` = ${storageParameters[key]}`; - return `${key}${value}`; -}; - -function dropMaterializedView(mOptions) { - const _drop = (viewName, { ifExists, cascade } = {}) => { - const ifExistsStr = ifExists ? ' IF EXISTS' : ''; - const cascadeStr = cascade ? ' CASCADE' : ''; - const viewNameStr = mOptions.literal(viewName); - return `DROP MATERIALIZED VIEW${ifExistsStr} ${viewNameStr}${cascadeStr};`; - }; - return _drop; -} - -function createMaterializedView(mOptions) { - const _create = (viewName, options, definition) => { - const { - ifNotExists, - columns = [], - tablespace, - storageParameters = {}, - data - } = options; - // prettier-ignore - const columnNames = (Array.isArray(columns) ? columns : [columns]).map(mOptions.literal).join(", "); - const withOptions = Object.keys(storageParameters) - .map(storageParameterStr(storageParameters)) - .join(', '); - - const ifNotExistsStr = ifNotExists ? ' IF NOT EXISTS' : ''; - const columnsStr = columnNames ? `(${columnNames})` : ''; - const withOptionsStr = withOptions ? ` WITH (${withOptions})` : ''; - const tablespaceStr = tablespace - ? `TABLESPACE ${mOptions.literal(tablespace)}` - : ''; - const dataStr = dataClause(data); - const viewNameStr = mOptions.literal(viewName); - - return `CREATE MATERIALIZED VIEW${ifNotExistsStr} ${viewNameStr}${columnsStr}${withOptionsStr}${tablespaceStr} AS ${definition}${dataStr};`; - }; - _create.reverse = dropMaterializedView(mOptions); - return _create; -} - -function alterMaterializedView(mOptions) { - const _alter = (viewName, options) => { - const { cluster, extension, storageParameters = {} } = options; - const clauses = []; - if (cluster !== undefined) { - if (cluster) { - clauses.push(`CLUSTER ON ${mOptions.literal(cluster)}`); - } else { - clauses.push(`SET WITHOUT CLUSTER`); - } - } - if (extension) { - clauses.push(`DEPENDS ON EXTENSION ${mOptions.literal(extension)}`); - } - const withOptions = Object.keys(storageParameters) - .filter(key => storageParameters[key]) - .map(storageParameterStr(storageParameters)) - .join(', '); - if (withOptions) { - clauses.push(`SET (${withOptions})`); - } - const resetOptions = Object.keys(storageParameters) - .filter(key => !storageParameters[key]) - .join(', '); - if (resetOptions) { - clauses.push(`RESET (${resetOptions})`); - } - const clausesStr = formatLines(clauses); - const viewNameStr = mOptions.literal(viewName); - return `ALTER MATERIALIZED VIEW ${viewNameStr}\n${clausesStr};`; - }; - return _alter; -} - -function renameMaterializedView(mOptions) { - const _rename = (viewName, newViewName) => { - const viewNameStr = mOptions.literal(viewName); - const newViewNameStr = mOptions.literal(newViewName); - return `ALTER MATERIALIZED VIEW ${viewNameStr} RENAME TO ${newViewNameStr};`; - }; - _rename.reverse = (viewName, newViewName) => _rename(newViewName, viewName); - return _rename; -} - -function renameMaterializedViewColumn(mOptions) { - const _rename = (viewName, columnName, newColumnName) => { - const viewNameStr = mOptions.literal(viewName); - const columnNameStr = mOptions.literal(columnName); - const newColumnNameStr = mOptions.literal(newColumnName); - return `ALTER MATERIALIZED VIEW ${viewNameStr} RENAME COLUMN ${columnNameStr} TO ${newColumnNameStr};`; - }; - _rename.reverse = (viewName, columnName, newColumnName) => - _rename(viewName, newColumnName, columnName); - return _rename; -} - -function refreshMaterializedView(mOptions) { - const _refresh = (viewName, { concurrently, data } = {}) => { - const concurrentlyStr = concurrently ? ' CONCURRENTLY' : ''; - const dataStr = dataClause(data); - const viewNameStr = mOptions.literal(viewName); - return `REFRESH MATERIALIZED VIEW${concurrentlyStr} ${viewNameStr}${dataStr};`; - }; - _refresh.reverse = _refresh; - return _refresh; -} - -module.exports = { - createMaterializedView, - dropMaterializedView, - alterMaterializedView, - renameMaterializedView, - renameMaterializedViewColumn, - refreshMaterializedView -}; diff --git a/lib/runner.js b/lib/runner.js deleted file mode 100644 index b84277b5..00000000 --- a/lib/runner.js +++ /dev/null @@ -1,248 +0,0 @@ -const path = require('path'); -const fs = require('fs'); -const Db = require('./db'); -const Migration = require('./migration'); -const { - getSchemas, - getMigrationTableSchema, - promisify, - PgLiteral, - createSchemalize -} = require('./utils'); - -// Random but well-known identifier shared by all instances of node-pg-migrate -const PG_MIGRATE_LOCK_ID = 7241865325823964; - -const readFile = promisify(fs.readFile); // eslint-disable-line security/detect-non-literal-fs-filename - -const idColumn = 'id'; -const nameColumn = 'name'; -const runOnColumn = 'run_on'; - -const loadMigrations = async (db, options, log) => { - try { - let shorthands = {}; - const files = await Migration.loadMigrationFiles( - options.dir, - options.ignorePattern - ); - return files.map(file => { - const filePath = `${options.dir}/${file}`; - const actions = - path.extname(filePath) === '.sql' - ? // eslint-disable-next-line security/detect-non-literal-fs-filename - { up: async pgm => pgm.sql(await readFile(filePath, 'utf8')) } - : // eslint-disable-next-line global-require,import/no-dynamic-require,security/detect-non-literal-require - require(path.relative(__dirname, filePath)); - shorthands = { ...shorthands, ...actions.shorthands }; - return new Migration( - db, - filePath, - actions, - options, - { - ...shorthands - }, - log - ); - }); - } catch (err) { - throw new Error(`Can't get migration files: ${err.stack}`); - } -}; - -const lock = async db => { - const { - rows: [lockObtained] - } = await db.query( - `select pg_try_advisory_lock(${PG_MIGRATE_LOCK_ID}) as "lockObtained"` - ); - if (!lockObtained) { - throw new Error('Another migration is already running'); - } -}; - -const ensureMigrationsTable = async (db, options) => { - try { - const schema = getMigrationTableSchema(options); - const { migrationsTable } = options; - const fullTableName = createSchemalize(options.decamelize, true)({ - schema, - name: migrationsTable - }); - - const migrationTables = await db.select( - `SELECT table_name FROM information_schema.tables WHERE table_schema = '${schema}' AND table_name = '${migrationsTable}'` - ); - - if (migrationTables && migrationTables.length === 1) { - const primaryKeyConstraints = await db.select( - `SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = '${schema}' AND table_name = '${migrationsTable}' AND constraint_type = 'PRIMARY KEY'` - ); - if (!primaryKeyConstraints || primaryKeyConstraints.length !== 1) { - await db.query( - `ALTER TABLE ${fullTableName} ADD PRIMARY KEY (${idColumn})` - ); - } - } else { - await db.query( - `CREATE TABLE ${fullTableName} ( ${idColumn} SERIAL PRIMARY KEY, ${nameColumn} varchar(255) NOT NULL, ${runOnColumn} timestamp NOT NULL)` - ); - } - } catch (err) { - throw new Error(`Unable to ensure migrations table: ${err.stack}`); - } -}; - -const getRunMigrations = async (db, options) => { - const schema = getMigrationTableSchema(options); - const { migrationsTable } = options; - const fullTableName = createSchemalize(options.decamelize, true)({ - schema, - name: migrationsTable - }); - return db.column( - nameColumn, - `SELECT ${nameColumn} FROM ${fullTableName} ORDER BY ${runOnColumn}, ${idColumn}` - ); -}; - -const getMigrationsToRun = (options, runNames, migrations) => { - if (options.direction === 'down') { - const downMigrations = runNames - .filter(migrationName => !options.file || options.file === 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) - ) - ).reverse(); - const deletedMigrations = toRun.filter( - migration => typeof migration === 'string' - ); - if (deletedMigrations.length) { - const deletedMigrationsStr = deletedMigrations.join(', '); - throw new Error( - `Definitions of migrations ${deletedMigrationsStr} have been deleted.` - ); - } - return toRun; - } - 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) - ); -}; - -const checkOrder = (runNames, migrations) => { - const len = Math.min(runNames.length, migrations.length); - for (let i = 0; i < len; i += 1) { - const runName = runNames[i]; - const migrationName = migrations[i].name; - if (runName !== migrationName) { - throw new Error( - `Not run migration ${migrationName} is preceding already run migration ${runName}` - ); - } - } -}; - -const runMigrations = (toRun, method, direction) => - toRun.reduce( - (promise, migration) => promise.then(() => migration[method](direction)), - Promise.resolve() - ); - -const runner = async options => { - const log = options.log || console.log; - const db = Db(options.dbClient || options.databaseUrl, log); - try { - await db.createConnection(); - if (options.schema) { - const schemas = getSchemas(options.schema); - if (options.createSchema) { - await Promise.all( - schemas.map(schema => - db.query(`CREATE SCHEMA IF NOT EXISTS "${schema}"`) - ) - ); - } - await db.query( - `SET search_path TO ${schemas.map(s => `"${s}"`).join(', ')}` - ); - } - if (options.migrationsSchema && options.createMigrationsSchema) { - await db.query( - `CREATE SCHEMA IF NOT EXISTS "${options.migrationsSchema}"` - ); - } - - await ensureMigrationsTable(db, options); - - if (!options.noLock) { - await lock(db, options); - } - - const [migrations, runNames] = await Promise.all([ - loadMigrations(db, options, log), - getRunMigrations(db, options) - ]); - - if (options.checkOrder) { - checkOrder(runNames, migrations); - } - - const toRun = getMigrationsToRun(options, runNames, migrations); - - if (!toRun.length) { - log('No migrations to run!'); - return []; - } - - // TODO: add some fancy colors to logging - log('> Migrating files:'); - toRun.forEach(m => { - log(`> - ${m.name}`); - }); - - if (options.fake) { - await runMigrations(toRun, 'markAsRun', options.direction); - } else if (options.singleTransaction) { - await db.query('BEGIN'); - try { - await runMigrations(toRun, 'apply', options.direction); - await db.query('COMMIT'); - } catch (err) { - log('> Rolling back attempted migration ...'); - await db.query('ROLLBACK'); - throw err; - } - } else { - await runMigrations(toRun, 'apply', options.direction); - } - - return toRun.map(m => ({ - path: m.path, - name: m.name, - timestamp: m.timestamp - })); - } finally { - db.close(); - } -}; - -runner.default = runner; // workaround for transpilers -runner.PgLiteral = PgLiteral; -runner.Migration = Migration; - -module.exports = runner; diff --git a/lib/utils.js b/lib/utils.js deleted file mode 100644 index 684f539b..00000000 --- a/lib/utils.js +++ /dev/null @@ -1,189 +0,0 @@ -const decamelize = require('decamelize'); - -// This is used to create unescaped strings -// exposed in the migrations via pgm.func -class PgLiteral { - static create(str) { - return new PgLiteral(str); - } - - constructor(str) { - this._str = str; - } - - toString() { - return this._str; - } -} - -const identity = v => v; -const quote = str => `"${str}"`; - -const createSchemalize = (shouldDecamelize, shouldQuote) => { - const transform = [ - shouldDecamelize ? decamelize : identity, - shouldQuote ? quote : identity - ].reduce((acc, fn) => (fn === identity ? acc : x => acc(fn(x)))); - return v => { - if (typeof v === 'object') { - const { schema, name } = v; - return (schema ? `${transform(schema)}.` : '') + transform(name); - } - return transform(v); - }; -}; - -const createTransformer = literal => (s, d) => - Object.keys(d || {}).reduce( - (str, p) => str.replace(new RegExp(`{${p}}`, 'g'), literal(d[p])), // eslint-disable-line security/detect-non-literal-regexp - s - ); - -const escapeValue = val => { - if (val === null) { - return 'NULL'; - } - if (typeof val === 'boolean') { - return val.toString(); - } - if (typeof val === 'string') { - let dollars; - let index = 0; - do { - index += 1; - dollars = `$pg${index}$`; - } while (val.indexOf(dollars) >= 0); - return `${dollars}${val}${dollars}`; - } - if (typeof val === 'number') { - return val; - } - if (Array.isArray(val)) { - const arrayStr = val - .map(escapeValue) - .join(',') - .replace(/ARRAY/g, ''); - return `ARRAY[${arrayStr}]`; - } - if (val instanceof PgLiteral) { - return val.toString(); - } - return ''; -}; - -const getSchemas = schema => { - const schemas = (Array.isArray(schema) ? schema : [schema]).filter( - s => typeof s === 'string' && s.length > 0 - ); - return schemas.length > 0 ? schemas : ['public']; -}; - -const getMigrationTableSchema = options => - options.migrationsSchema !== undefined - ? options.migrationsSchema - : getSchemas(options.schema)[0]; - -const typeAdapters = { - 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 -}; - -// some convenience adapters -- see above -const applyTypeAdapters = type => - typeAdapters[type] ? typeAdapters[type] : type; - -const applyType = (type, extendingTypeShorthands = {}) => { - const typeShorthands = { - ...defaultTypeShorthands, - ...extendingTypeShorthands - }; - const options = typeof type === 'string' ? { type } : type; - let ext = null; - const types = [options.type]; - while (typeShorthands[types[types.length - 1]]) { - if (ext) { - delete ext.type; - } - ext = { ...typeShorthands[types[types.length - 1]], ...ext }; - if (types.includes(ext.type)) { - throw new Error( - `Shorthands contain cyclic dependency: ${types.join(', ')}, ${ext.type}` - ); - } else { - types.push(ext.type); - } - } - if (!ext) { - ext = { type: options.type }; - } - return { - ...ext, - ...options, - type: applyTypeAdapters(ext.type) - }; -}; - -const formatParam = mOptions => param => { - const { mode, name, type, default: defaultValue } = applyType( - param, - mOptions.typeShorthands - ); - const options = []; - if (mode) { - options.push(mode); - } - if (name) { - options.push(mOptions.literal(name)); - } - if (type) { - options.push(type); - } - if (defaultValue) { - options.push(`DEFAULT ${escapeValue(defaultValue)}`); - } - return options.join(' '); -}; - -const formatParams = (params = [], mOptions) => - `(${params.map(formatParam(mOptions)).join(', ')})`; - -const comment = (object, name, text) => { - const cmt = escapeValue(text || null); - return `COMMENT ON ${object} ${name} IS ${cmt};`; -}; - -const formatLines = (lines, replace = ' ', separator = ',') => - lines - .map(line => line.replace(/(?:\r\n|\r|\n)+/g, ' ')) - .join(`${separator}\n`) - .replace(/^/gm, replace); - -const promisify = fn => (...args) => - new Promise((resolve, reject) => - fn.call(this, ...args, (err, ...result) => - err ? reject(err) : resolve(...result) - ) - ); - -module.exports = { - PgLiteral, - createSchemalize, - createTransformer, - escapeValue, - getSchemas, - getMigrationTableSchema, - applyTypeAdapters, - applyType, - formatParams, - comment, - formatLines, - promisify -}; From 154757ef042bcc2c397e4d7315cbe456e2c5ac03 Mon Sep 17 00:00:00 2001 From: Jan Dolezel Date: Fri, 8 Nov 2019 11:12:49 +0100 Subject: [PATCH 56/57] Fixing ts errors --- bin/node-pg-migrate | 4 +-- docs/triggers.md | 2 +- index.d.ts | 2 +- package.json | 2 +- src/db.ts | 54 ++++++++++++++++++++++--------------- src/definitions.ts | 4 +++ src/migration-builder.ts | 7 ++--- src/migration.ts | 12 ++++----- src/operations/functions.ts | 2 +- src/operations/indexes.ts | 2 +- src/operations/operators.ts | 4 +-- src/operations/other.ts | 3 ++- src/operations/policies.ts | 8 +++--- src/operations/sequences.ts | 4 +-- src/operations/tables.ts | 16 +++++------ src/operations/triggers.ts | 8 +++--- src/runner.ts | 16 +++++------ src/utils.ts | 12 ++++----- test/tables-test.js | 27 +++++++++++++++++++ 19 files changed, 116 insertions(+), 73 deletions(-) diff --git a/bin/node-pg-migrate b/bin/node-pg-migrate index 31b89483..4d831acf 100755 --- a/bin/node-pg-migrate +++ b/bin/node-pg-migrate @@ -277,8 +277,8 @@ if (action === 'create') { MIGRATIONS_FILE_LANGUAGE, IGNORE_PATTERN ) - .then(migration => { - console.log(util.format('Created migration -- %s', migration.path)); + .then(migrationPath => { + console.log(util.format('Created migration -- %s', migrationPath)); process.exit(0); }) .catch(err => { diff --git a/docs/triggers.md b/docs/triggers.md index b80b4713..1e3bcc2e 100644 --- a/docs/triggers.md +++ b/docs/triggers.md @@ -13,7 +13,7 @@ - `operation` _[string or array of strings]_ - `INSERT`, `UPDATE[ OF ...]`, `DELETE` or `TRUNCATE` - `constraint` _[boolean]_ - creates constraint trigger - `function` _[[Name](migrations.md#type)]_ - the name of procedure to execute - - `functionArgs` _[array]_ - parameters of the procedure + - `functionParams` _[array]_ - parameters of the procedure - `level` _[string]_ - `STATEMENT`, or `ROW` - `condition` _[string]_ - condition to met to execute trigger - `deferrable` _[boolean]_ - flag for deferrable constraint trigger diff --git a/index.d.ts b/index.d.ts index 70455548..d1d0c1cc 100644 --- a/index.d.ts +++ b/index.d.ts @@ -32,7 +32,7 @@ export interface ForeignKeyOptions extends ReferencesOptions { export interface ConstraintOptions { check?: string | string[] - unique?: Name[] | Name[][] + unique?: Name | Name[] | Name[][] primaryKey?: Name | Name[] foreignKeys?: ForeignKeyOptions | ForeignKeyOptions[] exclude?: string diff --git a/package.json b/package.json index 657de264..a741d3dc 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "dotenv": ">=1.0.0" }, "scripts": { - "build": "(tsc || true)", + "build": "tsc", "compile": "babel lib/ -d dist/", "test": "cross-env NODE_ENV=test mocha --opts ./mocha.opts test", "migrate": "node bin/node-pg-migrate", diff --git a/src/db.ts b/src/db.ts index e878407a..e91657f8 100644 --- a/src/db.ts +++ b/src/db.ts @@ -6,9 +6,9 @@ import { Client, ClientConfig, QueryArrayResult, - QueryConfig, QueryResult, - QueryResultRow + QueryArrayConfig, + QueryConfig, } from 'pg'; // or native libpq bindings // const pg = require('pg/native'); @@ -16,17 +16,19 @@ import { // see ClientBase in @types/pg export interface DB { createConnection(): Promise; + + query(queryConfig: QueryArrayConfig, values?: any[]): Promise; query(queryConfig: QueryConfig): Promise; - query( - queryTextOrConfig: string | QueryConfig, - values?: I[] - ): Promise>; - select(queryConfig: QueryConfig): Promise; - select( - queryTextOrConfig: string | QueryConfig, - values?: any[] - ): Promise; - column(columnName: 'name', ...args: string[]): Promise; + query(queryTextOrConfig: string | QueryConfig, values?: any[]): Promise; + + select(queryConfig: QueryArrayConfig, values?: any[]): Promise; + select(queryConfig: QueryConfig): Promise; + select(queryTextOrConfig: string | QueryConfig, values?: any[]): Promise; + + column(columnName: 'name',queryConfig: QueryArrayConfig, values?: any[]): Promise; + column(columnName: 'name',queryConfig: QueryConfig): Promise; + column(columnName: 'name',queryTextOrConfig: string | QueryConfig, values?: any[]): Promise; + addBeforeCloseListener: (listener: any) => number; close(): Promise; } @@ -58,15 +60,16 @@ const db = ( }) ); - const query = async ( - ...args: any[] - ): Promise> => { + const query: DB['query'] = async ( + queryTextOrConfig: string | QueryConfig | QueryArrayConfig, + values?: any[], + ): Promise => { await createConnection(); try { - return await client.query(...args); + return await client.query(queryTextOrConfig, values); } catch (err) { const { message, position }: { message: string; position: number } = err; - const string: string = args[0].text || args[0]; + const string: string = typeof queryTextOrConfig === 'string' ? queryTextOrConfig : queryTextOrConfig.text; if (message && position >= 1) { const endLineWrapIndexOf = string.indexOf('\n', position); const endLineWrapPos = @@ -91,12 +94,21 @@ ${err} } }; - const select = async (...args: T[]) => { - const { rows } = await query(...args); + const select: DB['select'] = async ( + queryTextOrConfig: string | QueryConfig | QueryArrayConfig, + values?: any[], + ) => { + const { rows } = await query(queryTextOrConfig, values); return rows; }; - const column = async (columnName: string, ...args: string[]) => - (await select(...args)).map((r: { [key: string]: any }) => r[columnName]); + const column: DB['column'] = async ( + columnName: string, + queryTextOrConfig: string | QueryConfig | QueryArrayConfig, + values?: any[], + ) => { + const rows = await select(queryTextOrConfig, values) + return rows.map((r: { [key: string]: any }) => r[columnName]); + } return { createConnection, diff --git a/src/definitions.ts b/src/definitions.ts index d1768a48..5a4d1f05 100644 --- a/src/definitions.ts +++ b/src/definitions.ts @@ -109,6 +109,10 @@ export interface ColumnDefinitions { [name: string]: ColumnDefinition | string; } +export interface ShorthandDefinitions { + [name: string]: ColumnDefinition +} + export type Like = | 'COMMENTS' | 'CONSTRAINTS' diff --git a/src/migration-builder.ts b/src/migration-builder.ts index 31fbbd20..430ac71f 100644 --- a/src/migration-builder.ts +++ b/src/migration-builder.ts @@ -13,6 +13,7 @@ import { DB } from './db'; import { AddOptions, ColumnDefinitions, + ShorthandDefinitions, DropOptions, IfExistsOption, LiteralUnion, @@ -70,11 +71,11 @@ import * as mViews from './operations/viewsMaterialized'; export interface MigrationBuilderActions { up?: (pgm: MigrationBuilder) => Promise; down?: (pgm: MigrationBuilder) => Promise; - shorthands?: ColumnDefinitions; + shorthands?: ShorthandDefinitions; } export interface MigrationOptions { - typeShorthands: ColumnDefinitions; + typeShorthands: ShorthandDefinitions; schemalize: (v: Name) => string; literal: (v: Name) => string; } @@ -442,7 +443,7 @@ export default class MigrationBuilder { constructor( db: DB, - typeShorthands: ColumnDefinitions, + typeShorthands: ShorthandDefinitions, shouldDecamelize: boolean ) { this._steps = []; diff --git a/src/migration.ts b/src/migration.ts index 5baf17d0..ee0c7d62 100644 --- a/src/migration.ts +++ b/src/migration.ts @@ -10,7 +10,7 @@ import fs from 'fs'; import mkdirp from 'mkdirp'; import path from 'path'; import { DB } from './db'; -import { ColumnDefinitions } from './definitions'; +import { ShorthandDefinitions } from './definitions'; import MigrationBuilder, { MigrationBuilderActions } from './migration-builder'; import { MigrationDirection, RunnerOption } from './runner'; import { getMigrationTableSchema, promisify } from './utils'; @@ -80,7 +80,7 @@ export class Migration implements RunMigration { .on('end', resolve); }); - return new Migration(null, newFile); + return newFile; } public readonly db: DB; @@ -90,15 +90,15 @@ export class Migration implements RunMigration { public readonly up: (pgm: MigrationBuilder) => Promise; public down?: ((pgm: MigrationBuilder) => Promise) | false; public readonly options: RunnerOption; - public readonly typeShorthands: ColumnDefinitions; + public readonly typeShorthands: ShorthandDefinitions; public readonly log: typeof console.log; constructor( db: DB | null, migrationPath: string, { up, down }: MigrationBuilderActions = {}, - options: RunnerOption = {}, - typeShorthands?: ColumnDefinitions, + options: RunnerOption, + typeShorthands?: ShorthandDefinitions, log = console.log ) { this.db = db; @@ -159,7 +159,7 @@ export class Migration implements RunMigration { return sqlSteps.reduce( (promise, sql) => - promise.then(() => this.options.dryRun || this.db.query(sql)), + promise.then((): unknown => this.options.dryRun || this.db.query(sql)), Promise.resolve() ); } diff --git a/src/operations/functions.ts b/src/operations/functions.ts index 1d44fc1a..967b82f9 100644 --- a/src/operations/functions.ts +++ b/src/operations/functions.ts @@ -40,7 +40,7 @@ export function createFunction(mOptions: MigrationOptions) { const _create = ( functionName: Name, functionParams: FunctionParam[] = [], - functionOptions: FunctionOptions = {}, + functionOptions: Partial = {}, definition: Value ) => { const { diff --git a/src/operations/indexes.ts b/src/operations/indexes.ts index 3c1dfe36..87995a17 100644 --- a/src/operations/indexes.ts +++ b/src/operations/indexes.ts @@ -29,7 +29,7 @@ function generateIndexName( : options.name; } const cols = _.isArray(columns) ? columns.join('_') : columns; - const uniq = options.unique ? '_unique' : ''; + const uniq = 'unique' in options && options.unique ? '_unique' : ''; return typeof table === 'object' ? { schema: table.schema, diff --git a/src/operations/operators.ts b/src/operations/operators.ts index c70d3045..97eabc14 100644 --- a/src/operations/operators.ts +++ b/src/operations/operators.ts @@ -51,7 +51,7 @@ export function dropOperator(mOptions: MigrationOptions) { } export function createOperator(mOptions: MigrationOptions) { - const _create = (operatorName: Name, options: CreateOperatorOptions = {}) => { + const _create = (operatorName: Name, options: Partial = {}) => { const { procedure, left, @@ -121,7 +121,7 @@ export function createOperatorFamily(mOptions: MigrationOptions) { } const operatorMap = (mOptions: MigrationOptions) => ({ - type = '', + type, number, name, params = [] diff --git a/src/operations/other.ts b/src/operations/other.ts index 0776f2f2..d91825e6 100644 --- a/src/operations/other.ts +++ b/src/operations/other.ts @@ -1,9 +1,10 @@ import { MigrationOptions } from '../migration-builder'; import { createTransformer } from '../utils'; +import { Name } from '../definitions'; export function sql(mOptions: MigrationOptions) { const t = createTransformer(mOptions.literal); - return (sql: string, args?: object) => { + return (sql: string, args?: { [key: string]: Name }) => { // applies some very basic templating using the utils.p let s: string = t(sql, args); // add trailing ; if not present diff --git a/src/operations/policies.ts b/src/operations/policies.ts index 92643a0c..b2f962fa 100644 --- a/src/operations/policies.ts +++ b/src/operations/policies.ts @@ -13,7 +13,7 @@ export interface CreatePolicyOptionsEn { export type CreatePolicyOptions = CreatePolicyOptionsEn & PolicyOptions; -const makeClauses = ({ role, using, check }: PolicyOptions) => { +const makeClauses = ({ role, using, check }: Partial) => { const roles = (Array.isArray(role) ? role : [role]).join(', '); const clauses: string[] = []; if (roles) { @@ -46,9 +46,9 @@ export function createPolicy(mOptions: MigrationOptions) { const _create = ( tableName: Name, policyName: string, - options: CreatePolicyOptions = {} + options: Partial = {} ) => { - const createOptions: CreatePolicyOptions = { + const createOptions: Partial = { ...options, role: options.role || 'PUBLIC' }; @@ -69,7 +69,7 @@ export function alterPolicy(mOptions: MigrationOptions) { const _alter = ( tableName: Name, policyName: string, - options: PolicyOptions = {} + options: Partial = {} ) => { const clausesStr = makeClauses(options).join(' '); const policyNameStr = mOptions.literal(policyName); diff --git a/src/operations/sequences.ts b/src/operations/sequences.ts index 6aa101aa..cb8b4f3c 100644 --- a/src/operations/sequences.ts +++ b/src/operations/sequences.ts @@ -1,4 +1,4 @@ -import { ColumnDefinitions, DropOptions, Name, Type } from '../definitions'; +import { ShorthandDefinitions, DropOptions, Name, Type } from '../definitions'; import { MigrationOptions } from '../migration-builder'; import { applyType } from '../utils'; @@ -27,7 +27,7 @@ export type SequenceOptionsCreate = SequenceOptionsCreateEn & SequenceOptions; export type SequenceOptionsAlter = SequenceOptionsAlterEn & SequenceOptions; export const parseSequenceOptions = ( - typeShorthands: ColumnDefinitions, + typeShorthands: ShorthandDefinitions, options: SequenceOptions ) => { const { diff --git a/src/operations/tables.ts b/src/operations/tables.ts index 818f9629..824fdef6 100644 --- a/src/operations/tables.ts +++ b/src/operations/tables.ts @@ -26,7 +26,7 @@ export interface ForeignKeyOptions extends ReferencesOptions { export interface ConstraintOptions { check?: string | string[]; - unique?: Name[] | Name[][]; + unique?: Name | Name[] | Name[][]; primaryKey?: Name | Name[]; foreignKeys?: ForeignKeyOptions | ForeignKeyOptions[]; exclude?: string; @@ -235,9 +235,9 @@ const parseConstraints = ( } } if (unique) { - const uniqueArray = _.isArray(unique) ? unique : [unique]; + const uniqueArray: Array = _.isArray(unique) ? unique : [unique]; const isArrayOfArrays = uniqueArray.some(uniqueSet => _.isArray(uniqueSet)); - (isArrayOfArrays ? uniqueArray : [uniqueArray]).forEach(uniqueSet => { + ((isArrayOfArrays ? uniqueArray : [uniqueArray]) as Array).forEach(uniqueSet => { const cols = _.isArray(uniqueSet) ? uniqueSet : [uniqueSet]; const name = literal(optionName || `${tableName}_uniq_${cols.join('_')}`); constraints.push( @@ -320,13 +320,13 @@ const parseLike = ( .map(option => ` ${name} ${option}`) .join(''); - const table = typeof like === 'string' || !like.table ? like : like.table; - const options = like.options - ? [ + const table = typeof like === 'string' || !('table' in like) ? like : like.table; + const options = typeof like === 'string' || !('options' in like) + ? '' + : [ formatOptions('INCLUDING', like.options.including), formatOptions('EXCLUDING', like.options.excluding) - ].join('') - : ''; + ].join(''); return `LIKE ${literal(table)}${options}`; }; diff --git a/src/operations/triggers.ts b/src/operations/triggers.ts index a68820b3..fe5a5088 100644 --- a/src/operations/triggers.ts +++ b/src/operations/triggers.ts @@ -35,7 +35,7 @@ export function createTrigger(mOptions: MigrationOptions) { const _create = ( tableName: Name, triggerName: Name, - triggerOptions: TriggerOptions = {}, + triggerOptions: Partial = {}, definition?: Value ) => { const { @@ -44,8 +44,8 @@ export function createTrigger(mOptions: MigrationOptions) { operation, deferrable, deferred, - functionArgs = [] - }: TriggerOptions = triggerOptions; + functionParams = [] + } = triggerOptions; let { when, level = 'STATEMENT', function: functionName } = triggerOptions; const operations = isArray(operation) ? operation.join(' OR ') : operation; if (constraint) { @@ -79,7 +79,7 @@ export function createTrigger(mOptions: MigrationOptions) { : ''; const conditionClause = condition ? `WHEN (${condition})\n ` : ''; const constraintStr = constraint ? ' CONSTRAINT' : ''; - const paramsStr = functionArgs.map(escapeValue).join(', '); + const paramsStr = functionParams.map(escapeValue).join(', '); const triggerNameStr = mOptions.literal(triggerName); const tableNameStr = mOptions.literal(tableName); const functionNameStr = mOptions.literal(functionName); diff --git a/src/runner.ts b/src/runner.ts index f58b87a8..68e3c854 100644 --- a/src/runner.ts +++ b/src/runner.ts @@ -3,7 +3,7 @@ import path from 'path'; import { Client } from 'pg'; import { TlsOptions } from 'tls'; import Db, { DB } from './db'; -import { ColumnDefinitions } from './definitions'; +import { ShorthandDefinitions } from './definitions'; import Migration, { loadMigrationFiles, RunMigration } from './migration'; import { MigrationBuilderActions } from './migration-builder'; import { @@ -29,7 +29,7 @@ const loadMigrations = async ( log: typeof console.log ) => { try { - let shorthands: ColumnDefinitions = {}; + let shorthands: ShorthandDefinitions = {}; const files = await loadMigrationFiles(options.dir, options.ignorePattern); return files.map(file => { const filePath = `${options.dir}/${file}`; @@ -57,9 +57,7 @@ const loadMigrations = async ( }; const lock = async (db: DB): Promise => { - const { - rows: [lockObtained] - } = await db.query<{ lockObtained: boolean }>( + const [lockObtained] = await db.select( `select pg_try_advisory_lock(${PG_MIGRATE_LOCK_ID}) as "lockObtained"` ); if (!lockObtained) { @@ -121,20 +119,20 @@ const getMigrationsToRun = ( migrations: Migration[] ): Migration[] => { if (options.direction === 'down') { - const downMigrations: Migration[] = runNames + const downMigrations: Array = runNames .filter(migrationName => !options.file || options.file === migrationName) .map( migrationName => migrations.find(({ name }) => name === migrationName) || migrationName ); const toRun = (options.timestamp - ? downMigrations.filter(({ timestamp }) => timestamp >= options.count) + ? downMigrations.filter((migration) => typeof migration === 'object' && migration.timestamp >= options.count) : downMigrations.slice( -Math.abs(options.count === undefined ? 1 : options.count) ) ).reverse(); const deletedMigrations = toRun.filter( - migration => typeof migration === 'string' + (migration): migration is string => typeof migration === 'string' ); if (deletedMigrations.length) { const deletedMigrationsStr = deletedMigrations.join(', '); @@ -142,7 +140,7 @@ const getMigrationsToRun = ( `Definitions of migrations ${deletedMigrationsStr} have been deleted.` ); } - return toRun; + return toRun as Migration[]; } const upMigrations = migrations.filter( ({ name }) => diff --git a/src/utils.ts b/src/utils.ts index 0f602e60..3436daab 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,7 +1,7 @@ import decamelize from 'decamelize'; import { ColumnDefinition, - ColumnDefinitions, + ShorthandDefinitions, Name, Type, Value @@ -50,7 +50,7 @@ export const createSchemalize = ( export const createTransformer = (literal: (v: Name) => string) => ( s: string, - d?: object + d?: { [key: string]: Name } ) => Object.keys(d || {}).reduce( (str: string, p) => str.replace(new RegExp(`{${p}}`, 'g'), literal(d[p])), // eslint-disable-line security/detect-non-literal-regexp @@ -110,19 +110,19 @@ const typeAdapters = { bool: 'boolean' } as const; -const defaultTypeShorthands: ColumnDefinitions = { +const defaultTypeShorthands: ShorthandDefinitions = { id: { type: 'serial', primaryKey: true } // convenience type for serial primary keys }; // some convenience adapters -- see above export const applyTypeAdapters = (type: string): string => - typeAdapters[type] ? typeAdapters[type] : type; + type in typeAdapters ? typeAdapters[type as keyof typeof typeAdapters] : type; export const applyType = ( type: Type, - extendingTypeShorthands: ColumnDefinitions = {} + extendingTypeShorthands: ShorthandDefinitions = {} ): ColumnDefinition & FunctionParamType => { - const typeShorthands: ColumnDefinitions = { + const typeShorthands: ShorthandDefinitions = { ...defaultTypeShorthands, ...extendingTypeShorthands }; diff --git a/test/tables-test.js b/test/tables-test.js index 63c945b6..1899f003 100644 --- a/test/tables-test.js +++ b/test/tables-test.js @@ -194,6 +194,33 @@ describe('lib/operations/tables', () => { );`); }); + it('check table unique constraint work correctly for string', () => { + const args = [ + 'myTableName', + { + colA: { type: 'integer' }, + colB: { type: 'varchar' } + }, + { + constraints: { + unique: 'colA' + } + } + ]; + const sql1 = Tables.createTable(options1)(...args); + const sql2 = Tables.createTable(options2)(...args); + expect(sql1).to.equal(`CREATE TABLE "myTableName" ( + "colA" integer, + "colB" varchar, + CONSTRAINT "myTableName_uniq_colA" UNIQUE ("colA") +);`); + expect(sql2).to.equal(`CREATE TABLE "my_table_name" ( + "col_a" integer, + "col_b" varchar, + CONSTRAINT "my_table_name_uniq_col_a" UNIQUE ("col_a") +);`); + }); + it('check table unique constraint work correctly for array of arrays', () => { const args = [ 'myTableName', From 7223717e29fe748bcda92b24d7314a3d7ad821c2 Mon Sep 17 00:00:00 2001 From: Jan Dolezel Date: Fri, 8 Nov 2019 13:51:35 +0100 Subject: [PATCH 57/57] Few type fixes --- index.d.ts | 2 +- src/migration-builder.ts | 19 +++++++++++-------- src/migration.ts | 21 ++++++++------------- src/operations/triggers.ts | 4 ++-- 4 files changed, 22 insertions(+), 24 deletions(-) diff --git a/index.d.ts b/index.d.ts index d1d0c1cc..0170dc7b 100644 --- a/index.d.ts +++ b/index.d.ts @@ -513,7 +513,7 @@ export interface MigrationBuilder { createView(viewName: Name, options: CreateViewOptions, definition: string): void dropView(viewName: Name, options?: DropOptions): void alterView(viewName: Name, options: AlterViewOptions): void - alterViewColumn(viewName: Name, options: AlterViewColumnOptions): void + alterViewColumn(viewName: Name, columnName: string, options: AlterViewColumnOptions): void renameView(viewName: Name, newViewName: Name): void createMaterializedView(viewName: Name, options: CreateMaterializedViewOptions, definition: string): void diff --git a/src/migration-builder.ts b/src/migration-builder.ts index 430ac71f..503cb29b 100644 --- a/src/migration-builder.ts +++ b/src/migration-builder.ts @@ -68,9 +68,11 @@ import * as types from './operations/types'; import * as views from './operations/views'; import * as mViews from './operations/viewsMaterialized'; +export type MigrationAction = (pgm: MigrationBuilder, run?: () => void) => Promise | void + export interface MigrationBuilderActions { - up?: (pgm: MigrationBuilder) => Promise; - down?: (pgm: MigrationBuilder) => Promise; + up?: MigrationAction; + down?: MigrationAction; shorthands?: ShorthandDefinitions; } @@ -402,6 +404,7 @@ export default class MigrationBuilder { ) => void; public readonly alterViewColumn: ( viewName: Name, + columnName: string, options: AlterViewColumnOptions ) => void; public readonly renameView: (viewName: Name, newViewName: Name) => void; @@ -451,16 +454,16 @@ export default class MigrationBuilder { // by default, all migrations are wrapped in a transaction this._use_transaction = true; - type WrapOperation = { - (...args: any[]): R; - reverse?: (...args: any[]) => R; - }; + interface Operation { + (...args: any[]): string | string[] + reverse?: (...args: any[]) => string | string[] + } // this function wraps each operation within a function that either // calls the operation or its reverse, and appends the result (array of sql statements) // to the steps array - const wrap = (operation: WrapOperation) => ( - ...args: any[] + const wrap = (operation: T) => ( + ...args: Parameters ) => { if (this._REVERSE_MODE && typeof operation.reverse !== 'function') { const name = `pgm.${operation.name}()`; diff --git a/src/migration.ts b/src/migration.ts index ee0c7d62..b95b49ca 100644 --- a/src/migration.ts +++ b/src/migration.ts @@ -11,7 +11,7 @@ import mkdirp from 'mkdirp'; import path from 'path'; import { DB } from './db'; import { ShorthandDefinitions } from './definitions'; -import MigrationBuilder, { MigrationBuilderActions } from './migration-builder'; +import MigrationBuilder, { MigrationAction, MigrationBuilderActions } from './migration-builder'; import { MigrationDirection, RunnerOption } from './runner'; import { getMigrationTableSchema, promisify } from './utils'; @@ -87,16 +87,16 @@ export class Migration implements RunMigration { public readonly path: string; public readonly name: string; public readonly timestamp: number; - public readonly up: (pgm: MigrationBuilder) => Promise; - public down?: ((pgm: MigrationBuilder) => Promise) | false; + public readonly up?: MigrationAction; + public down?: false | MigrationAction; public readonly options: RunnerOption; public readonly typeShorthands: ShorthandDefinitions; public readonly log: typeof console.log; constructor( - db: DB | null, + db: DB, migrationPath: string, - { up, down }: MigrationBuilderActions = {}, + { up, down }: MigrationBuilderActions, options: RunnerOption, typeShorthands?: ShorthandDefinitions, log = console.log @@ -112,7 +112,7 @@ export class Migration implements RunMigration { this.log = log; } - _getMarkAsRun(action: (pgm: MigrationBuilder) => Promise) { + _getMarkAsRun(action: MigrationAction) { const schema = getMigrationTableSchema(this.options); const { migrationsTable } = this.options; const { name } = this; @@ -128,10 +128,7 @@ export class Migration implements RunMigration { } } - async _apply( - action: (pgm: MigrationBuilder, value?: unknown) => Promise, - pgm: MigrationBuilder - ) { + async _apply(action: MigrationAction, pgm: MigrationBuilder) { if (action.length === 2) { await new Promise(resolve => action(pgm, resolve)); } else { @@ -177,9 +174,7 @@ export class Migration implements RunMigration { } } - const action: ((pgm: MigrationBuilder) => Promise) | false = this[ - direction - ]; + const action: MigrationAction | false = this[direction]; if (typeof action !== 'function') { throw new Error(`Unknown value for direction: ${direction}`); diff --git a/src/operations/triggers.ts b/src/operations/triggers.ts index fe5a5088..83db7465 100644 --- a/src/operations/triggers.ts +++ b/src/operations/triggers.ts @@ -4,7 +4,7 @@ import { MigrationOptions } from '../migration-builder'; import { escapeValue } from '../utils'; import { createFunction, dropFunction, FunctionOptions } from './functions'; -export interface TriggerOptions extends FunctionOptions { +export interface TriggerOptions { when?: 'BEFORE' | 'AFTER' | 'INSTEAD OF'; operation: string | string[]; constraint?: boolean; @@ -35,7 +35,7 @@ export function createTrigger(mOptions: MigrationOptions) { const _create = ( tableName: Name, triggerName: Name, - triggerOptions: Partial = {}, + triggerOptions: Partial = {}, definition?: Value ) => { const {