From 060e7d06e542a961bc7698038fbd039b4badf806 Mon Sep 17 00:00:00 2001 From: Sven Slootweg Date: Tue, 1 Feb 2022 12:21:41 +0100 Subject: [PATCH] WIP, move from GraphQl to dlayer --- babel.config.json | 6 +- knexfile.js | 2 +- migrations/20160906073423_initial.js | 128 +- migrations/20160907033335_instance-uuid.js | 13 - migrations/20160907034042_disks.js | 14 - notes.txt | 66 + package.json | 12 +- src/api/data-sources/lsblk.js | 5 +- src/api/data-sources/lvm/logical-volumes.js | 27 + src/api/data-sources/lvm/physical-volumes.js | 2 + src/api/data-sources/lvm/volume-groups.js | 27 + src/api/index.js | 179 +- src/api/loaders.js | 1 + src/api/notes.txt | 19 + src/api/test.js | 38 + src/api/types/block-device.js | 119 +- src/api/types/drive.js | 138 +- src/api/types/index.js | 9 + src/api/types/lvm-physical-volume.js | 32 - src/api/types/lvm-volume-group.js | 13 - src/api/types/lvm/physical-volume.js | 23 + src/api/types/lvm/volume-group.js | 48 + src/api/types/mount.js | 96 +- src/app.js | 27 +- src/packages/asyncpipe/index.js | 9 + src/packages/dlayer-source/index.js | 73 + src/packages/dlayer/index.js | 199 ++ src/packages/dlayer/test.js | 48 + src/packages/exec-binary/index.js | 227 +- src/packages/exec-findmnt/index.js | 4 +- .../commands/add-volume-to-volume-group.js | 28 + .../commands/create-physical-volume.js | 25 + .../exec-lvm/commands/create-volume-group.js | 63 + .../commands/destroy-physical-volume.js | 29 + .../exec-lvm/commands/get-logical-volumes.js | 188 ++ .../exec-lvm/commands/get-physical-volumes.js | 45 + .../exec-lvm/commands/get-volume-groups.js | 89 + src/packages/exec-lvm/commands/version.js | 23 + src/packages/exec-lvm/commands/version.pegjs | 24 + src/packages/exec-lvm/errors.js | 2 + src/packages/exec-lvm/index.js | 246 +- src/packages/exec-lvm/map-flag.js | 7 + src/packages/exec-lvm/map-version-title.js | 12 + src/packages/exec-lvm/modifiers/as-json.js | 14 + .../exec-lvm/modifiers/force-flags.js | 8 + .../modifiers/handle-device-in-use.js | 21 + .../modifiers/handle-device-not-found.js | 16 + .../modifiers/handle-incompatible-device.js | 16 + .../modifiers/handle-partition-exists.js | 16 + .../handle-physical-volume-in-use.js | 35 + .../handle-volume-group-not-found.js | 16 + .../exec-lvm/modifiers/unattended-flags.js | 8 + src/packages/exec-lvm/parse-optional-date.js | 9 + .../exec-lvm/parse-optional-string.js | 9 + src/packages/exec-lvm/parse-string-list.js | 9 + src/packages/exec-nvme-cli/index.js | 2 +- src/packages/exec-smartctl/index.js | 2 +- .../parsers/commands/attributes.pegjs | 3 +- .../exec-smartctl/parsers/commands/info.pegjs | 3 +- .../exec-smartctl/parsers/commands/scan.pegjs | 3 +- .../exec-smartctl/parsers/primitives.pegjs | 5 - .../exec-smartctl/parsers/shared.pegjs | 3 +- src/packages/make-units/index.js | 2 + src/packages/map-maybe-array/index.js | 9 + src/packages/parse-int-strict/index.js | 14 + src/packages/parse-mount-options/index.js | 12 + src/packages/peg-rest-of-line/index.pegjs | 6 + src/packages/text-parser-json/index.js | 21 +- src/packages/text-parser-pegjs/index.js | 4 +- src/packages/text-parser-regex/index.js | 27 + src/packages/text-parser/index.js | 21 +- src/packages/treecutter/index.js | 12 + src/routes/resource-pools.js | 13 + src/schemas/main.gql | 40 + src/test-wrapper.js | 33 +- .../disk-images/installation-media/list.jsx | 72 + src/views/disk-images/layout.jsx | 23 + src/views/hardware/layout.jsx | 2 + src/views/hardware/storage-devices/list.jsx | 106 +- src/views/resource-pools/layout.jsx | 23 + src/views/resource-pools/storage/list.jsx | 29 + src/wrappers/smartctl/index.js | 58 - try/api.js | 72 + try/lib.js | 15 + try/source.js | 14 + yarn.lock | 2793 ++++++++--------- 86 files changed, 3595 insertions(+), 2409 deletions(-) delete mode 100644 migrations/20160907033335_instance-uuid.js delete mode 100644 migrations/20160907034042_disks.js create mode 100644 src/api/data-sources/lvm/logical-volumes.js create mode 100644 src/api/data-sources/lvm/volume-groups.js create mode 100644 src/api/notes.txt create mode 100644 src/api/test.js create mode 100644 src/api/types/index.js delete mode 100644 src/api/types/lvm-physical-volume.js delete mode 100644 src/api/types/lvm-volume-group.js create mode 100644 src/api/types/lvm/physical-volume.js create mode 100644 src/api/types/lvm/volume-group.js create mode 100644 src/packages/asyncpipe/index.js create mode 100644 src/packages/dlayer-source/index.js create mode 100644 src/packages/dlayer/index.js create mode 100644 src/packages/dlayer/test.js create mode 100644 src/packages/exec-lvm/commands/add-volume-to-volume-group.js create mode 100644 src/packages/exec-lvm/commands/create-physical-volume.js create mode 100644 src/packages/exec-lvm/commands/create-volume-group.js create mode 100644 src/packages/exec-lvm/commands/destroy-physical-volume.js create mode 100644 src/packages/exec-lvm/commands/get-logical-volumes.js create mode 100644 src/packages/exec-lvm/commands/get-physical-volumes.js create mode 100644 src/packages/exec-lvm/commands/get-volume-groups.js create mode 100644 src/packages/exec-lvm/commands/version.js create mode 100644 src/packages/exec-lvm/commands/version.pegjs create mode 100644 src/packages/exec-lvm/map-flag.js create mode 100644 src/packages/exec-lvm/map-version-title.js create mode 100644 src/packages/exec-lvm/modifiers/as-json.js create mode 100644 src/packages/exec-lvm/modifiers/force-flags.js create mode 100644 src/packages/exec-lvm/modifiers/handle-device-in-use.js create mode 100644 src/packages/exec-lvm/modifiers/handle-device-not-found.js create mode 100644 src/packages/exec-lvm/modifiers/handle-incompatible-device.js create mode 100644 src/packages/exec-lvm/modifiers/handle-partition-exists.js create mode 100644 src/packages/exec-lvm/modifiers/handle-physical-volume-in-use.js create mode 100644 src/packages/exec-lvm/modifiers/handle-volume-group-not-found.js create mode 100644 src/packages/exec-lvm/modifiers/unattended-flags.js create mode 100644 src/packages/exec-lvm/parse-optional-date.js create mode 100644 src/packages/exec-lvm/parse-optional-string.js create mode 100644 src/packages/exec-lvm/parse-string-list.js create mode 100644 src/packages/map-maybe-array/index.js create mode 100644 src/packages/parse-int-strict/index.js create mode 100644 src/packages/peg-rest-of-line/index.pegjs create mode 100644 src/packages/text-parser-regex/index.js create mode 100644 src/routes/resource-pools.js create mode 100644 src/views/disk-images/installation-media/list.jsx create mode 100644 src/views/disk-images/layout.jsx create mode 100644 src/views/resource-pools/layout.jsx create mode 100644 src/views/resource-pools/storage/list.jsx delete mode 100644 src/wrappers/smartctl/index.js create mode 100644 try/api.js create mode 100644 try/lib.js create mode 100644 try/source.js diff --git a/babel.config.json b/babel.config.json index b7191e7..6c07099 100644 --- a/babel.config.json +++ b/babel.config.json @@ -1 +1,5 @@ -{ "presets": ["@babel/preset-env"] } +{ "presets": [ + [ "@babel/preset-env", { + "targets": { "node": "current" } + }] +] } diff --git a/knexfile.js b/knexfile.js index f822fbc..6c9429e 100644 --- a/knexfile.js +++ b/knexfile.js @@ -7,7 +7,7 @@ module.exports = { client: "pg", connection: { connectionString: postgresqlSocketUrl({ - socketPath: "/tmp", + socketPath: "/run/postgresql", database: config.database }) }, diff --git a/migrations/20160906073423_initial.js b/migrations/20160906073423_initial.js index ee6638b..1501595 100644 --- a/migrations/20160906073423_initial.js +++ b/migrations/20160906073423_initial.js @@ -1,51 +1,91 @@ 'use strict'; exports.up = function(knex, Promise) { - return Promise.all([ - knex.schema.createTable("images", (table) => { - table.increments("id"); - table.integer("userId").notNullable(); // user that added it - table.uuid("fileId").notNullable(); - table.text("name"); - table.text("description"); - table.enum("sourceType", ["local", "http", "upload"]).notNullable(); - table.text("source"); // URL, path, etc. - table.enum("imageType", ["disk", "tarball"]).notNullable(); // eg. tarballs for OpenVZ - table.boolean("public").notNullable(); // whether the image should be visible to everybody, or just its owner - table.boolean("isInstallMedium").notNullable(); // whether the image is just for installation (if not, it will be directly clonable) - }), - knex.schema.createTable("instances", (table) => { - table.increments("id"); - table.integer("userId").notNullable(); - table.integer("imageId"); - table.integer("lastInstallationMediaId"); - table.text("comment"); - table.text("customIdentifier"); - table.enum("virtualizationType", ["kvm"]).notNullable(); - table.integer("memory").notNullable(); // in MB - table.integer("swap"); // in MB - table.integer("diskSpace").notNullable(); // in MB - table.integer("traffic"); // in MB - table.boolean("suspended").notNullable(); - table.text("suspensionReason"); - table.boolean("terminated").notNullable(); - table.text("terminationReason"); - table.boolean("running"); - }), - knex.schema.createTable("users", (table) => { - table.increments("id"); - table.text("username").notNullable(); - table.text("hash").notNullable(); - table.text("emailAddress").notNullable(); - table.boolean("active").notNullable(); - }) - ]); + return knex.schema + .createTable("users", (table) => { + table.bigIncrements("id").primary(); + table.text("username").notNullable(); + table.text("hash").notNullable(); + table.text("email_address").notNullable(); + table.boolean("is_active").notNullable(); + table.timestamp("created_at").notNullable().defaultTo(knex.fn.now()); + }) + .createTable("storage_pools", (table) => { + table.bigIncrements("id").primary(); + table.text("type").notNullable(); // lvm, folder + table.text("name"); // for lvm VG name + table.text("path"); // for folder base path + table.boolean("is_local").notNullable(); // to prevent trying to attach a storage volume that lives on the wrong host + table.timestamp("created_at").notNullable().defaultTo(knex.fn.now()); + }) + .createTable("instance_types", (table) => { + table.bigIncrements("id").primary(); + table.text("name").notNullable(); + table.text("internal_comment"); + table.integer("default_memory").notNullable(); // in MB + table.integer("default_disk_space").notNullable(); // in MB + table.integer("default_traffic"); // in MB + table.timestamp("created_at").notNullable().defaultTo(knex.fn.now()); + }) + .createTable("allowed_storage_pools", (table) => { + table.bigInteger("instance_type_id").notNullable().references("instance_types.id"); + table.bigInteger("storage_pool_id").notNullable().references("storage_pools.id"); + table.unique([ "instance_type_id", "storage_pool_id" ]); + }) + .createTable("images", (table) => { + table.bigIncrements("id").primary(); + table.bigInteger("user_id").notNullable().references("users.id"); // user that added it + // table.uuid("file_id").notNullable(); + table.text("name"); + table.text("description"); + table.text("source_type").notNullable(); // local, http, upload + table.text("source"); // URL, path, etc. + table.boolean("is_public").notNullable(); // whether the image should be visible to everybody, or just its owner + table.boolean("is_install_medium").notNullable(); // whether the image is just for installation (if not, it will be directly clonable) + table.timestamp("created_at").notNullable().defaultTo(knex.fn.now()); + }) + .createTable("instances", (table) => { + table.bigIncrements("id").primary(); + table.bigInteger("user_id").notNullable().references("users.id"); + table.bigInteger("mounted_image_id").references("images.id"); + table.bigInteger("last_installation_media_id").references("images.id"); + table.jsonb("boot_order").notNullable(); // array that includes references to storage volumes! + // table.uuid("instance_uuid").notNullable(); + table.text("name"); + table.text("comment"); + table.integer("memory").notNullable(); // in MB + table.integer("disk_space").notNullable(); // in MB + table.integer("traffic"); // in MB + table.boolean("is_suspended").notNullable(); + table.text("suspension_reason"); + table.boolean("is_terminated").notNullable(); + table.text("termination_reason"); + table.boolean("is_running"); + table.timestamp("created_at").notNullable().defaultTo(knex.fn.now()); + }) + .createTable("storage_volumes", (table) => { + table.bigIncrements("id").primary(); + table.bigInteger("user_id").references("users.id"); + table.bigInteger("storage_pool_id").references("storage_pools.id"); + // table.uuid("volume_uuid").notNullable(); + table.text("format").notNullable(); // qcow2 + table.timestamp("created_at").notNullable().defaultTo(knex.fn.now()); + }) + .createTable("storage_attachments", (table) => { + table.bigInteger("storage_volume_id").notNullable().references("storage_volumes.id").unique(); + table.bigInteger("instance_id").notNullable().references("storage_volumes.id"); + table.boolean("is_locked").notNullable(); // whether the user should be prevented from detaching this storage volume + }); }; exports.down = function(knex, Promise) { - return Promise.all([ - knex.schema.dropTable("images"), - knex.schema.dropTable("instances"), - knex.schema.dropTable("users") - ]); + return knex.schema + .dropTable("storage_attachments") + .dropTable("storage_volumes") + .dropTable("instances") + .dropTable("images") + .dropTable("allowed_storage_pools") + .dropTable("instance_types") + .dropTable("storage_pools") + .dropTable("users"); }; diff --git a/migrations/20160907033335_instance-uuid.js b/migrations/20160907033335_instance-uuid.js deleted file mode 100644 index 13e1805..0000000 --- a/migrations/20160907033335_instance-uuid.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict'; - -exports.up = function(knex, Promise) { - return knex.schema.table("instances", (table) => { - table.uuid("instanceUuid").notNullable(); - }); -}; - -exports.down = function(knex, Promise) { - return knex.schema.table("instances", (table) => { - table.dropColumn("instanceUuid"); - }) -}; diff --git a/migrations/20160907034042_disks.js b/migrations/20160907034042_disks.js deleted file mode 100644 index c32c74c..0000000 --- a/migrations/20160907034042_disks.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -exports.up = function(knex, Promise) { - return knex.table("storage_volumes", (table) => { - table.increments("id"); - table.integer("instanceId"); - table.uuid("volumeUuid").notNullable(); - table.enum("format", ["qcow2"]).notNullable(); - }) -}; - -exports.down = function(knex, Promise) { - -}; diff --git a/notes.txt b/notes.txt index bad427e..a24e7a0 100644 --- a/notes.txt +++ b/notes.txt @@ -5,10 +5,29 @@ MARKER: - Switch hashing to argon2id - Switch child_process to execa +Next: +- ISO/image download and storage + - Progress streams + cancellation of operation + - lossy-push-value-stream for progress updates + - Audit logging +- VM creation/initialization + GraphQL API for VM management + IDEAS: - contextual sidebar on add/edit form pages that shows/highlights all the relevant data for deciding what to fill into the form - eg. all storage devices and pools when creating a new volume - or highlighting the currently-editing volume in an edit screen +- Image feeds for disk images / installation media + - Allow arbitrary amount of image feeds to be configured + - Make auto-update optional, and allow a 'whitelist every source host explicitly' setting, for improved supply chain security + - Eventually figure out a sensible signature mechanism for this, that also transitively verifies that the content at the source URLs has not changed + - Make sure to clearly document the security caveats + - The ID of each image from a feed is colon-prefixed with the feed ID, to prevent namespace conflicts + - Eventually allow highly-restricted Markdown for the image descriptions? + +---------------------- + +QEMU setup: +- Ensure to set discard=on for any -blockdev arguments to QEMU - this makes it so that deletes on the guest FS actually free up blocks in the host volume when using a thin pool or sparse file, preventing endless growth of volumes over time. ---------------------- @@ -138,3 +157,50 @@ Utilities fuser Show which processes use the named files, sockets, or filesystems. + + +---------------- + +Disk images + Installation media + Preinstalled images +Host nodes + Hardware + Storage pools + Network pools +VMs + + +SCHEMA +====== + +storage pools +------------- + +id +type: lvm | folder +vg_name? +path? + + +storage volumes +--------------- + +id (name is derived from this) +pool_id + + +instances +--------- + +id (name is derived from this, prefixed with cvm-) +attached_image_id + +storage_attachments +---------------- + +instance_id +volume_id +is_primary + +MARKER: Implement storage pool setup + network pools + VM spawn diff --git a/package.json b/package.json index 33e4a1b..5c05ddc 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "capitalize": "^2.0.0", "chalk": "^4.1.0", "classnames": "^2.2.6", + "concat-arrays": "^2.0.0", "create-event-emitter": "^1.0.0", "dataloader": "^1.4.0", "debounce": "^1.0.0", @@ -59,7 +60,7 @@ "error-chain": "^0.1.2", "escape-string-regexp": "^2.0.0", "eval": "^0.1.4", - "execall": "^1.0.0", + "execall": "^2.0.0", "express": "^4.14.0", "express-promise-router": "^1.1.0", "express-ws": "^3.0.0", @@ -68,19 +69,20 @@ "generate-lookup-table": "^1.0.0", "graphql": "^14.2.1", "is-iterable": "^1.1.1", - "is-plain-obj": "^2.1.0", - "knex": "^0.13.0", - "map-obj": "^3.0.0", + "is-plain-obj": "^3.0.0", + "knex": "^0.21.18", + "map-obj": "^4.2.1", "match-value": "^1.1.0", "memoizee": "^0.4.14", "nanoid": "^2.1.11", "object.fromentries": "^2.0.2", "pegjs": "^0.10.0", - "pg": "^6.1.0", + "pg": "^8.5.1", "postgresql-socket-url": "^1.0.0", "react-dom": "^16.8.6", "snake-case": "^2.1.0", "split": "^1.0.0", + "split-filter-n": "^1.1.2", "sse-channel": "^3.1.1", "syncpipe": "^1.0.0", "through2": "^2.0.1", diff --git a/src/api/data-sources/lsblk.js b/src/api/data-sources/lsblk.js index 0303195..9d75ed1 100644 --- a/src/api/data-sources/lsblk.js +++ b/src/api/data-sources/lsblk.js @@ -39,8 +39,8 @@ module.exports = function () { }).then(({tree, list}) => { return selectors.map((selector) => { if (selector === All) { - // return tree; - return list; + return tree; + // return list; } else { let { path, name } = selector; @@ -54,6 +54,7 @@ module.exports = function () { } }); + // TODO: Shouldn't this pick from the list instead? return findInTree({ tree, predicate }); } }); diff --git a/src/api/data-sources/lvm/logical-volumes.js b/src/api/data-sources/lvm/logical-volumes.js new file mode 100644 index 0000000..795e42f --- /dev/null +++ b/src/api/data-sources/lvm/logical-volumes.js @@ -0,0 +1,27 @@ +"use strict"; + +const Promise = require("bluebird"); +const memoizee = require("memoizee"); + +const lvm = require("../../../packages/exec-lvm"); +const All = require("../../../packages/graphql-interface/symbols/all"); + +module.exports = function () { + let getLogicalVolumesOnce = memoizee(lvm.getLogicalVolumes); + + return function (paths) { + return Promise.try(() => { + return getLogicalVolumesOnce(); + }).then((result) => { + return result.volumes; + }).then((volumes) => { + return paths.map((path) => { + if (path === All) { + return volumes; + } else { + return volumes.find((device) => device.path === path); + } + }); + }); + }; +}; diff --git a/src/api/data-sources/lvm/physical-volumes.js b/src/api/data-sources/lvm/physical-volumes.js index 472a850..cb5c748 100644 --- a/src/api/data-sources/lvm/physical-volumes.js +++ b/src/api/data-sources/lvm/physical-volumes.js @@ -12,6 +12,8 @@ module.exports = function () { return function (paths) { return Promise.try(() => { return getPhysicalVolumesOnce(); + }).then((result) => { + return result.volumes; }).then((volumes) => { return paths.map((path) => { if (path === All) { diff --git a/src/api/data-sources/lvm/volume-groups.js b/src/api/data-sources/lvm/volume-groups.js new file mode 100644 index 0000000..3c6b178 --- /dev/null +++ b/src/api/data-sources/lvm/volume-groups.js @@ -0,0 +1,27 @@ +"use strict"; + +const Promise = require("bluebird"); +const memoizee = require("memoizee"); + +const lvm = require("../../../packages/exec-lvm"); +const All = require("../../../packages/graphql-interface/symbols/all"); + +module.exports = function () { + let getVolumeGroupsOnce = memoizee(lvm.getVolumeGroups); + + return function (names) { + return Promise.try(() => { + return getVolumeGroupsOnce(); + }).then((result) => { + return result.groups; + }).then((groups) => { + return names.map((name) => { + if (name === All) { + return groups; + } else { + return groups.find((group) => group.name === name); + } + }); + }); + }; +}; diff --git a/src/api/index.js b/src/api/index.js index 9839531..0c24fc2 100644 --- a/src/api/index.js +++ b/src/api/index.js @@ -1,101 +1,104 @@ "use strict"; const Promise = require("bluebird"); -const graphql = require("graphql"); -const fs = require("fs"); -const path = require("path"); - -const createGraphQLInterface = require("../packages/graphql-interface/index"); +const dlayer = require("../packages/dlayer"); const All = require("../packages/graphql-interface/symbols/all"); -const loadTypes = require("../packages/graphql-interface/type-loader"); - -const createLoaders = require("./loaders"); - -/* FIXME: This seems to be added into a global registry somehow? How to specify this explicitly on a query without relying on globals? */ -new graphql.GraphQLScalarType({ - name: "ByteSize", - description: "A value that represents a value on a byte scale", - serialize: (value) => { - return JSON.stringify(value); - }, - parseValue: (value) => { - return JSON.parse(value); - }, - parseLiteral: (value) => { - return JSON.parse(value); - }, -}); - -new graphql.GraphQLScalarType({ - name: "TimeSize", - description: "A value that represents a value on a time scale", - serialize: (value) => { - return JSON.stringify(value); - }, - parseValue: (value) => { - return JSON.parse(value); - }, - parseLiteral: (value) => { - return JSON.parse(value); - }, -}); +const loaders = require("./loaders"); +const types = require("./types"); -let schema = graphql.buildSchema(fs.readFileSync(path.resolve(__dirname, "../schemas/main.gql"), "utf8")); - -let types = loadTypes({ - Drive: require("./types/drive"), - BlockDevice: require("./types/block-device"), - Mount: require("./types/mount"), - LVMPhysicalVolume: require("./types/lvm-physical-volume"), - LVMVolumeGroup: require("./types/lvm-volume-group"), -}); +function typeFromSource(source, ids, factoryFunction) { + return Promise.try(() => { + if (ids != null) { + return source.loadMany(ids); + } else { + return source.load(All); // FIXME: Symbol + } + }).then((items) => { + return items.map((item) => factoryFunction(item)); + }); +} module.exports = function () { - return createGraphQLInterface(schema, { loaderFactory: createLoaders }, { - hardware: { - drives: function ({ paths }, { data }) { - return Promise.try(() => { - if (paths != null) { - return data.smartctlScan.loadMany(paths); - } else { - return data.smartctlScan.load(All); - } - }).then((devices) => { - return devices.map((device) => { - return types.Drive({ path: device.path }); - }); - }); - } + return dlayer({ + makeContext: function () { + return { + sources: loaders() + }; }, - resources: { - blockDevices: function ({ names }, { data }) { - return Promise.try(() => { - if (names != null) { - return data.lsblk.loadMany(names); - } else { - return data.lsblk.load(All); - } - }).then((devices) => { - return devices.map((device) => { - return types.BlockDevice({ name: device.name }); - }); - }); + schema: { + hardware: { + drives: ({ paths }, { sources }) => { + return typeFromSource(sources.smartctlScan, paths, (device) => types.Drive({ path: device.path })); + } }, - lvm: { - physicalVolumes: function ({ paths }, { data }) { - return Promise.try(() => { - if (paths != null) { - return data.lvmPhysicalVolumes.loadMany(paths); - } else { - return data.lvmPhysicalVolumes.load(All); - } - }).then((volumes) => { - return volumes.map((volume) => { - return types.LVMPhysicalVolume({ path: volume.path }); - }); - }); + resources: { + blockDevices: ({ names }, { sources }) => { + return typeFromSource(sources.lsblk, names, (device) => types.BlockDevice({ name: device.name })); + }, + lvm: { + physicalVolumes: ({ paths }, { sources }) => { + return typeFromSource(sources.lvmPhysicalVolumes, paths, (volume) => types.LVMPhysicalVolume({ path: volume.path })); + }, + volumeGroups: ({ names }, { sources }) => { + return typeFromSource(sources.lvmVolumeGroups, names, (group) => types.LVMVolumeGroup({ name: group.name })); + } + }, + images: { + installationMedia: [], + vmImages: [] } - } + }, } }); }; + + +// let schemaTodo = { +// system: { +// hardware: { ... }, +// lvm: { +// ... +// } +// }, +// resources: { +// storagePools: { +// name: "...", +// type: "lvm|folder", +// isLocal: true, +// folderPath: "...", +// lvmVolumeGroup: LVMVolumeGroup, +// $$update: { +// $arguments: { +// name: "..." +// } +// }, +// $$delete: {}, +// $collection: { +// $$create: { +// $arguments: { +// name: "poolName", +// volumeGroup: "name", +// // or: +// folderPath: "path" +// } +// // standard fields for a storage pool entry go here, including LVMVolumeGroup resolution! +// } +// }, +// }, +// networkPools: { ... }, +// storageVolumes: { +// id: 0, +// userID: 0, +// pool: StoragePool, +// poolID: 0, // the index/ID within the pool +// size: 0, // bytes-iec +// }, +// instances: { +// id: 0, +// userID: 0, +// state: "running|stopped|creating", +// storageVolumes: StorageVolume, // in boot order + +// } +// } +// }; diff --git a/src/api/loaders.js b/src/api/loaders.js index 0b23354..ed1cca4 100644 --- a/src/api/loaders.js +++ b/src/api/loaders.js @@ -10,6 +10,7 @@ let dataSourceFactories = { smartctlScan: require("./data-sources/smartctl/scan"), smartctlAttributes: require("./data-sources/smartctl/attributes"), lvmPhysicalVolumes: require("./data-sources/lvm/physical-volumes"), + lvmVolumeGroups: require("./data-sources/lvm/volume-groups"), nvmeListNamespaces: require("./data-sources/nvme/list-namespaces"), }; diff --git a/src/api/notes.txt b/src/api/notes.txt new file mode 100644 index 0000000..3d2a0b6 --- /dev/null +++ b/src/api/notes.txt @@ -0,0 +1,19 @@ +General architecture of the internal API +======================================== + +The API implementation consists of a number of different things: +- System interaction libraries, often wrappers around system management programs +- Data sources, a standardized representation of the data exposed by those libraries +- Types, different kinds of 'system objects' (storage drive, block device, LVM volume group, etc.) that can be read from and interacted with +- A root API schema, which represents the 'tree' of available queryable objects + +The full API schema is made up of the root schema + the schemas of each type. Types can reference each other, including recursively, so loops in the schema exist. The API uses dlayer as its querying mechanism. + +A 'data source' is a factory function that produces a data retrieval function. This data retrieval function accepts an array of object IDs (or a special `All` marker), and is expected to produce a respectively-ordered array of results. The data retrieval function is responsible for doing the entire translation from this standardized retrieval API, to whatever API the underlying system interaction library requires. The `dataloader` library is used to wrap this data retrieval function for more efficient operation. + +Each type is defined as an object with a set of keys, whose value is a function that (optionally) accepts an object of named arguments and a context object as its parameters, and which is expected to (asynchronously) return a value for that key. All the previously-defined-and-wrapped data sources are made available under `sources` on the context object. The context object also includes a number of utility functions for evaluating other properties, for edge-cases where the logic of one property is dependent on the value of another. These functions are free to implement whatever logic they require, and in fact this uses the same API as the rest of dlayer - 'types' are not actually special on a dlayer level, they are essentially just lazily-returned schema objects. + +In this project, specifically, most properties *are not* defined manually - instead, `dlayer-source` is used, which provides a bridge between dlayer and the data sources mechanism. Rather than manually calling a source for every property that needs to access it, a `$sources` meta-property is defined that specifies every data sources that's needed for this object, and which properties it can satisfy. The value for those property keys may either be a function (to manually extract data from the data-source-provided value) or a string (to simply copy the key from the data-source-provided value). + +Data source: ID[] -> DataObject[] +Schema: QueryObject -> (data source) -> SchemaObject[]? diff --git a/src/api/test.js b/src/api/test.js new file mode 100644 index 0000000..c0630d4 --- /dev/null +++ b/src/api/test.js @@ -0,0 +1,38 @@ +"use strict"; + +const Promise = require("bluebird"); +const api = require("./"); +const loaders = require("./loaders"); + +return Promise.try(() => { + return api.query({ + hardware: { + drives: { + model: true, + size: true, + interface: true, + smartHealth: true, + blockDevice: { + name: true, + path: true, + type: true, + children: { + name: true, + path: true, + type: true, + mounts: { + mountpoint: true, + filesystem: true, + totalSpace: true + } + } + } + // allBlockDevices + } + } + }); +}).then((result) => { + console.dir(result, { depth: null }); +}).catch((error) => { + console.dir(error, { depth: null }); +}); diff --git a/src/api/types/block-device.js b/src/api/types/block-device.js index 117f0c5..bfb6a5d 100644 --- a/src/api/types/block-device.js +++ b/src/api/types/block-device.js @@ -3,93 +3,62 @@ const Promise = require("bluebird"); const fs = Promise.promisifyAll(require("fs")); const matchValue = require("match-value"); +const asyncpipe = require("../../packages/asyncpipe"); -const { createDataObject, LocalProperties, ID, Dynamic } = require("../../packages/graphql-interface/data-object"); -const All = require("../../packages/graphql-interface/symbols/all"); +const dlayerSource = require("../../packages/dlayer-source"); +const All = require("../../packages/graphql-interface/symbols/all"); // FIXME: Move to dlayer-source? const treecutter = require("../../packages/treecutter"); +const types = require("./"); -module.exports = function (types) { - return function BlockDevice({ name, path, _treecutterDepth, _treecutterSequenceNumber }) { - // if (name != null) { - // path = `/dev/${name}`; - // } else if (path != null) { - // name = deviceNameFromPath(path); - // } +module.exports = function BlockDevice({ name, path }) { + return dlayerSource.withSources({ + // TODO: Eventually make this produce a (filtered) tree instead? + mounts: function ({ type }, { $getProperty, $getPropertyPath, sources }) { + return Promise.try(() => { + return sources.findmnt.load(All); + }).then((mountTree) => { + return asyncpipe(mountTree, [ + (_) => treecutter.flatten(_), + (_) => _.map((mount) => types.Mount({ mountpoint: mount.mountpoint })), + (_) => Promise.filter(_, async (mount) => { + let sourcePath = await $getPropertyPath(mount, "sourceDevice.path"); + let sourceName = await $getPropertyPath(mount, "sourceDevice.name"); - // return Promise.try(() => { - // return fs.realpathAsync(path); - // }).then((realPath) => { - /* FIXME: parent */ - return createDataObject({ - [LocalProperties]: { - _treecutterDepth, - _treecutterSequenceNumber - }, - [Dynamic]: { - mounts: function ({ type }, { resolveProperty, resolvePropertyPath, resolveDataSource }) { - return Promise.try(() => { - return resolveDataSource("findmnt", All); - }).then((allMounts) => { - return treecutter.flatten(allMounts); - }).map((mount) => { - return types.Mount({ mountpoint: mount.mountpoint }); - }).filter((mount) => { - return Promise.try(() => { - return resolvePropertyPath([ "sourceDevice", "path" ], mount); - }).then((sourceDevicePath) => { - // FIXME: Get own path dynamically - return (sourceDevicePath === path); - }); - }).then((mounts) => { - if (type != null) { - return Promise.filter(mounts, (mount) => { - return Promise.try(() => { - return resolveProperty("type", mount); - }).then((mountType) => { - return (mountType === type); - }); - }); - } else { - return mounts; - } + return ( + (sourcePath != null && sourcePath === path) + || (sourceName != null && sourceName === name) + ); + }) + ]); + }).then((relevantMounts) => { + if (type == null) { + return relevantMounts; + } else { + return Promise.filter(relevantMounts, async (mount) => { + return (await $getProperty(mount, "type") === type); }); } - }, - // findmnt: { - // [ID]: All, - // mounts: function (allMounts, { type }, context) { - // let { resolveProperty } = context; - // console.log("CONTEXT", context); - - // // FIXME: Why is this called so often? - - // } - // }, + }); + }, + $sources: { lsblk: { - [ID]: { name, path }, + [dlayerSource.ID]: { name, path }, name: "name", - path: (device) => { - return fs.realpathAsync(device.path); - }, - type: (device) => { - return matchValue(device.type, { - partition: "PARTITION", - disk: "DISK", - loopDevice: "LOOP_DEVICE" - }); - }, + path: (device) => fs.realpathAsync(device.path), + type: (device) => matchValue(device.type, { + partition: "PARTITION", + disk: "DISK", + loopDevice: "LOOP_DEVICE" + }), size: "size", mountpoint: "mountpoint", // FIXME: Isn't this obsoleted by `mounts`? deviceNumber: "deviceNumber", removable: "removable", readOnly: "readOnly", - children: (device) => { - return device.children.map((child) => { - return BlockDevice({ name: child.name }); - }); - } + children: (device) => device.children.map((child) => { + return BlockDevice({ name: child.name }); + }) } - }); - // }); - }; + } + }); }; diff --git a/src/api/types/drive.js b/src/api/types/drive.js index e1202c3..865c51a 100644 --- a/src/api/types/drive.js +++ b/src/api/types/drive.js @@ -1,106 +1,53 @@ "use strict"; const Promise = require("bluebird"); - -const {createDataObject, LocalProperties, ID, Dynamic} = require("../../packages/graphql-interface/data-object"); -const upperSnakeCase = require("../../packages/upper-snake-case"); +const dlayerSource = require("../../packages/dlayer-source"); const treecutter = require("../../packages/treecutter"); -const deviceNameFromPath = require("../../util/device-name-from-path"); +const upperSnakeCase = require("../../packages/upper-snake-case"); -/* TO IMPLEMENT: -- resolveProperty -- resolveProperties -- resolveDataSource -- Dynamic -*/ - -module.exports = function (types) { - return function Drive({ path }) { - return createDataObject({ - [LocalProperties]: { - path: path, - /* FIXME: allBlockDevices, for representing every single block device that's hosted on this physical drive, linearly. Need to figure out how that works with representation of mdraid arrays, LVM volumes, etc. */ - }, - [Dynamic]: { - // FIXME: namespaces - blockDevice: (_, { resolveProperty }) => { - return Promise.try(() => { - return resolveProperty("interface"); - }).then((interface_) => { - if (interface_ === "nvme") { - /* NVMe drives do not have a single block device, they have zero or more namespaces */ - return null; - } else { - return types.BlockDevice({ path: path }); - } - }); - - }, - allBlockDevices: ({ type }, { resolveProperty, resolveDataSource }) => { - // FIXME: Figure out how to semantically represent that data cannot be stored directly onto an NVMe device (only onto a namespace), but *can* be directly stored on a *non-NVMe* device... usually, anyway. +const types = require("./"); +module.exports = function Drive ({ path }) { + return dlayerSource.withSources({ + path: path, + blockDevice: async function(_, { $getProperty }) { + if (await $getProperty(this, "interface") === "nvme") { + return null; + } else { + return types.BlockDevice({ path: path }); + } + }, + allBlockDevices: async function(_, { $getProperty, sources }) { + return Promise.try(async () => { + if (await $getProperty(this, "interface") === "nvme") { return Promise.try(() => { - return resolveProperty("interface"); - }).then((interface_) => { - if (interface_ === "nvme") { - // Dynamic data source lookup: nvme list-ns -> Drive - return Promise.try(() => { - return resolveDataSource("nvmeListNamespaces", path); - }).map((namespaceId) => { - return `${path}n${namespaceId}`; - }); - } else { - return [ path ]; - } - }).map((rootPath) => { - return resolveDataSource("lsblk", { path: rootPath }); - }).then((blockDeviceTrees) => { - let blockDevices = treecutter.flatten(blockDeviceTrees) - .map((device) => types.BlockDevice(device)); - // MARKER: Find a way to reassemble this tree on the client side, for display - // MARKER: Why are most of the mounts (erroneously) empty? - - if (type != null) { - return Promise.filter(blockDevices, (device) => { - return Promise.try(() => { - return resolveProperty("type", device.item); - }).then((deviceType) => { - return (deviceType === type); - }); - }); - } else { - return blockDevices; - } + return sources.nvmeListNamespaces.load(path); + }).map((namespaceID) => { + return `${path}n${namespaceID}`; }); + } else { + return [ path ]; } - }, - lsblk: { - [ID]: { path }, - // TODO: Implement [DependsOn], for cases where a source data mapper depends on data from more than one source, so it can reference properties defined elsewhere? - // FIXME: Figure out a nice way to make a source lookup conditional upon something else (like only do a `lsblk` if not an NVMe drive, and for NVMe drives return a hardcoded thing) - // allBlockDevices: function (rootDevice, { type }, context) { - // let devices = treecutter.flatten([rootDevice]) - // .map((device) => types.BlockDevice({ name: device.name })); - - // if (type != null) { - // return Promise.filter(devices, (device) => { - // return Promise.try(() => { - // return device.type({}, context); - // }).then((deviceType) => { - // return (deviceType === type); - // }); - // }); - // } else { - // return devices; - // } - // } - }, + }).then((rootPaths) => { + let queries = rootPaths.map((path) => ({ path: path })); + return sources.lsblk.loadMany(queries); + }).map((blockDeviceTree) => { + return treecutter.map(blockDeviceTree, (device) => types.BlockDevice(device)); + }).then((resultArray) => { + // Treecutter always returns an array, regardless of whether the input was an array or not, so we need to flatten it since we will only ever have a single root entry per rootPath query here + return resultArray.flat(); + }); + }, + $sources: { + // lsblk: { + // [dlayerSource.ID]: { path }, + // }, smartctlScan: { - [ID]: path, + [dlayerSource.ID]: path, interface: "interface" }, smartctlInfo: { - [ID]: path, + [dlayerSource.ID]: path, model: "model", modelFamily: "modelFamily", smartAvailable: "smartAvailable", @@ -117,13 +64,14 @@ module.exports = function (types) { sataVersion: "sataVersion" }, smartctlAttributes: { - [ID]: path, + [dlayerSource.ID]: path, smartAttributes: (attributes) => { return attributes.map((attribute) => { - return Object.assign({}, attribute, { + return { + ... attribute, type: upperSnakeCase(attribute.type), updatedWhen: upperSnakeCase(attribute.updatedWhen) - }); + }; }); }, smartHealth: (attributes) => { @@ -144,6 +92,6 @@ module.exports = function (types) { } } } - }); - }; + } + }); }; diff --git a/src/api/types/index.js b/src/api/types/index.js new file mode 100644 index 0000000..88259dc --- /dev/null +++ b/src/api/types/index.js @@ -0,0 +1,9 @@ +"use strict"; + +Object.assign(module.exports, { + Drive: require("./drive"), + BlockDevice: require("./block-device"), + Mount: require("./mount"), + LVMPhysicalVolume: require("./lvm/physical-volume"), + LVMVolumeGroup: require("./lvm/volume-group"), +}); diff --git a/src/api/types/lvm-physical-volume.js b/src/api/types/lvm-physical-volume.js deleted file mode 100644 index f5c8b7e..0000000 --- a/src/api/types/lvm-physical-volume.js +++ /dev/null @@ -1,32 +0,0 @@ -"use strict"; - -const {createDataObject, LocalProperties, ID} = require("../../packages/graphql-interface/data-object"); - -module.exports = function (types) { - return function LVMPhysicalVolume({ path }) { - return createDataObject({ - [LocalProperties]: { - path: path, - blockDevice: () => { - return types.BlockDevice({ path: path }); - } - }, - lvmPhysicalVolumes: { - [ID]: path, - volumeGroup: (volume) => { - if (volume.volumeGroup != null) { - return types.LVMVolumeGroup({ name: volume.volumeGroup }); - } - }, - format: "format", - size: "totalSpace", - freeSpace: "freeSpace", - duplicate: "isDuplicate", - allocatable: "isAllocatable", - used: "isUsed", - exported: "isExported", - missing: "isMissing" - } - }); - }; -}; diff --git a/src/api/types/lvm-volume-group.js b/src/api/types/lvm-volume-group.js deleted file mode 100644 index 7fbc954..0000000 --- a/src/api/types/lvm-volume-group.js +++ /dev/null @@ -1,13 +0,0 @@ -"use strict"; - -const {createDataObject, LocalProperties} = require("../../packages/graphql-interface/data-object"); - -module.exports = function (_types) { - return function createVolumeGroup({ name }) { - return createDataObject({ - [LocalProperties]: { - name: name - } - }); - }; -}; diff --git a/src/api/types/lvm/physical-volume.js b/src/api/types/lvm/physical-volume.js new file mode 100644 index 0000000..7dbbc82 --- /dev/null +++ b/src/api/types/lvm/physical-volume.js @@ -0,0 +1,23 @@ +"use strict"; + +const dlayerSource = require("../../../packages/dlayer-source"); + +const types = require("../"); + +module.exports = function LVMPhysicalVolume ({ path }) { + return dlayerSource.withSources({ + $sources: { + lvmPhysicalVolumes: { + [dlayerSource.ID]: path, + path: "path", + format: "format", + totalSpace: "totalSpace", + freeSpace: "freeSpace", + status: "status", + isExported: "isExported", + isMissing: "isMissing", + volumeGroup: (volume) => types.LVMVolumeGroup({ name: volume.volumeGroup }) + } + } + }); +}; diff --git a/src/api/types/lvm/volume-group.js b/src/api/types/lvm/volume-group.js new file mode 100644 index 0000000..cdd5d16 --- /dev/null +++ b/src/api/types/lvm/volume-group.js @@ -0,0 +1,48 @@ +"use strict"; + +const Promise = require("bluebird"); +const dlayerSource = require("../../../packages/dlayer-source"); + +const types = require("../"); +const All = require("../../../packages/graphql-interface/symbols/all"); + +module.exports = function LVMVolumeGroup ({ name }) { + return dlayerSource.withSources({ + physicalVolumes: function (_args, { sources }) { + return Promise.try(() => { + return sources.lvmPhysicalVolumes.load(All); + }).filter((volume) => { + return (volume.volumeGroup === name); + }).map((volume) => { + return types.LVMPhysicalVolume({ path: volume.path }); + }); + }, + logicalVolumes: function (_args, { sources }) { + return Promise.try(() => { + return sources.lvmLogicalVolumes.load(All); + }).filter((volume) => { + return (volume.volumeGroup === name); + }).map((volume) => { + return types.LVMLogicalVolume({ path: volume.path }); + }); + }, + $sources: { + lvmVolumeGroups: { + [dlayerSource.ID]: name, + name: "name", + totalSpace: "totalSpace", + freeSpace: "freeSpace", + physicalVolumeCount: "physicalVolumeCount", + logicalVolumeCount: "logicalVolumeCount", + snapshotCount: "snapshotCount", + isReadOnly: "isReadOnly", + isResizeable: "isResizeable", + isExported: "isExported", + isIncomplete: "isIncomplete", + allocationPolicy: "allocationPolicy", + mode: "mode" + // FIXME: physicalVolumes, logicalVolumes + } + } + }); +}; diff --git a/src/api/types/mount.js b/src/api/types/mount.js index f99a2b2..22a048a 100644 --- a/src/api/types/mount.js +++ b/src/api/types/mount.js @@ -2,66 +2,42 @@ const Promise = require("bluebird"); const fs = Promise.promisifyAll(require("fs")); +const dlayerSource = require("../../packages/dlayer-source"); +const types = require("./"); -const {createDataObject, LocalProperties, ID, Dynamic} = require("../../packages/graphql-interface/data-object"); +module.exports = function Mount({ mountpoint }) { + return dlayerSource.withSources({ + mountpoint: mountpoint, + sourceDevice: async (_, { sources }) => { + let mount = await sources.findmnt.load(mountpoint); -module.exports = function (types) { - return function Mount({ mountpoint }) { - return createDataObject({ - [LocalProperties]: { - mountpoint: mountpoint - }, - [Dynamic]: { - sourceDevice: (_, { resolveDataSource }) => { - // FIXME: This code is rather bulky, maybe there should be a first-class way to express "try to create a data object that may fail" - return Promise.try(() => { - return resolveDataSource("findmnt", mountpoint); - }).then((mount) => { - if (mount.sourceDevice != null) { - return Promise.try(() => { - return fs.realpathAsync(mount.sourceDevice); - }).then((sourcePath) => { - return Promise.try(() => { - return resolveDataSource("lsblk", { path: sourcePath }); - }).then((lsblkResult) => { - if (lsblkResult != null) { - return types.BlockDevice({ path: sourcePath }); - } else { - // This occurs when the `sourceDevice` is a valid device, but it is not a *block* device, eg. like with `/dev/fuse` - return null; - } - }); - }); - } else { - return null; - } - }); + if (mount != null) { + if (mount.sourceDevice != null) { + let sourcePath = await fs.realpathAsync(mount.sourceDevice); + + if (await sources.lsblk.load({ path: sourcePath }) != null) { + return types.BlockDevice({ path: sourcePath }); + } else { + // This occurs when the `sourceDevice` is a valid device, but it is not a *block* device, eg. `/dev/fuse` + return null; + } + } else { + // This occurs when the mount is not backed by a device, eg. an sshfs FUSE mount + return null; } - }, + } else { + // TODO: Can this ever happen for any legitimate reason? + throw new Error(`Mountpoint '${mountpoint}' not found in findmnt output`); + } + }, + $sources: { findmnt: { - [ID]: mountpoint, + [dlayerSource.ID]: mountpoint, id: "id", // FIXME: Aren't we inferring the below somewhere else in the code, using the square brackets? - type: (mount) => { - if (mount.rootPath === "/") { - return "ROOT_MOUNT"; - } else { - return "SUBMOUNT"; - } - }, - // sourceDevice: (mount) => { - // return Promise.try(() => { - // if (mount.sourceDevice != null) { - // return Promise.try(() => { - // return fs.realpathAsync(mount.sourceDevice); - // }).then((sourcePath) => { - // return types.BlockDevice({ path: sourcePath }); - // }); - // } else { - // return null; - // } - // }); - // }, + type: (mount) => (mount.rootPath === "/") + ? "ROOT_MOUNT" + : "SUBMOUNT", filesystem: "filesystem", options: "options", label: "label", @@ -76,12 +52,10 @@ module.exports = function (types) { taskID: "taskID", optionalFields: "optionalFields", propagationFlags: "propagationFlags", - children: (mount) => { - return mount.children.map((child) => { - return Mount({ mountpoint: child.mountpoint }); - }); - } + children: (mount) => mount.children.map((child) => { + return Mount({ mountpoint: child.mountpoint }); + }) } - }); - }; + } + }); }; diff --git a/src/app.js b/src/app.js index 9f45412..fbc9dd1 100644 --- a/src/app.js +++ b/src/app.js @@ -21,7 +21,7 @@ module.exports = function () { let db = knex(require("../knexfile")); let imageStore = require("./util/image-store")(projectPath("./images")); let taskTracker = require("../lib/tasks/tracker")(); - let apiQuery = require("./api")(); + let api = require("./api")(); let state = {db, imageStore, taskTracker}; @@ -36,19 +36,20 @@ module.exports = function () { ? template.queryArguments(locals) : {}; - return apiQuery(template.query, queryArguments); + return api.query(template.query, queryArguments); } }).then((result) => { if (result == null) { return {}; } else { - if (result.errors != null && result.errors.length > 0) { - throw result.errors[0]; - } else { - return { - data: result.data - }; - } + return { data: result }; + // if (result.errors != null && result.errors.length > 0) { + // throw result.errors[0]; + // } else { + // return { + // data: result.data + // }; + // } } }); } @@ -77,6 +78,12 @@ module.exports = function () { app.use("/disk-images", require("./routes/disk-images")(state)); app.use("/instances", require("./routes/instances")(state)); app.use("/hardware/storage-devices", require("./routes/storage-devices")(state)); + app.use("/resource-pools", require("./routes/resource-pools")(state)); + + app.get("/hardware", (req, res) => { + // FIXME: default to /hardware/system-information instead, when that is implemented + res.redirect("/hardware/storage-devices"); + }); app.use((err, req, res, next) => { /* GraphQL will wrap any data-resolving errors in its own error type, and that'll break our `showChain` logic below. Note that some GraphQL errors may not *have* an originalError (eg. schema violations), so we account for that as well. */ @@ -108,7 +115,7 @@ module.exports = function () { error: err }); - debugger; + // debugger; }); return app; diff --git a/src/packages/asyncpipe/index.js b/src/packages/asyncpipe/index.js new file mode 100644 index 0000000..f36411e --- /dev/null +++ b/src/packages/asyncpipe/index.js @@ -0,0 +1,9 @@ +"use strict"; + +const Promise = require("bluebird"); + +module.exports = function asyncpipe(value, pipeline) { + return Promise.reduce(pipeline, (lastValue, func) => { + return func(lastValue); + }, value); +}; diff --git a/src/packages/dlayer-source/index.js b/src/packages/dlayer-source/index.js new file mode 100644 index 0000000..a5dc281 --- /dev/null +++ b/src/packages/dlayer-source/index.js @@ -0,0 +1,73 @@ +"use strict"; + +const Promise = require("bluebird"); +const syncpipe = require("syncpipe"); +const util = require("util"); + +const ID = Symbol("dlayer-source object ID"); + +// TODO: Make more readable + +module.exports = { + withSources: function withSources(schemaObject) { + let { $sources, ... rest } = schemaObject; + + let generatedProperties = syncpipe($sources ?? {}, [ + (_) => Object.entries(_), + (_) => _.flatMap(([ source, properties ]) => { + return Object.entries(properties).map(([ property, selector ]) => { + // This is to support property name shorthand used in place of a selector function + let effectiveSelector = (typeof selector === "string") + ? (result) => { + // FIXME: Consider whether to add this check or not; currently, it would break stuff in CVM + // if (selector in result) { + return result[selector]; + // } else { + // throw new Error(`Result object does not have a '${selector}' property`); + // } + } + : selector; + + let getter = function (_args, context) { + return Promise.try(() => { + if (properties[ID] != null) { + let dataSource = context.sources[source]; + + if (dataSource != null) { + // console.log(`Calling source '${source}' with ID ${util.inspect(properties[ID])}`); + return dataSource.load(properties[ID]); + } else { + throw new Error(`Attempted to read from source '${source}', but no such source is registered`); + } + } else { + // FIXME: Better error message + throw new Error(`Must specify a dlayer-source ID`); + } + }).then((result) => { + // console.log(`Result [${source}|${util.inspect(properties[ID])}] ${util.inspect(result)}`); + // TODO: How to deal with null results? Allow them or not? Make it an option? + if (result != null) { + return effectiveSelector(result); + } else { + throw new Error(`Null-ish result returned for ID '${properties[ID]}' from source '${source}'; this is not allowed, and there is probably a bug in your code. Please file a ticket if you have a good usecase for null-ish results!`); + } + }); + }; + + return [ property, getter ]; + }); + }), + (_) => Object.fromEntries(_) + ]); + + // NOTE: We always specify the generated properties first, so that properties can be overridden by explicit known values to bypass the source lookup, if needed by the implementation + return { + ... generatedProperties, + ... rest + }; + }, + ID: ID +}; + + + diff --git a/src/packages/dlayer/index.js b/src/packages/dlayer/index.js new file mode 100644 index 0000000..36c422b --- /dev/null +++ b/src/packages/dlayer/index.js @@ -0,0 +1,199 @@ +"use strict"; + +const Promise = require("bluebird"); +const mapObject = require("map-obj"); + +// TODO: Bounded/unbounded recursion +// TODO: context +// TODO: $required query predicate +// TODO: Lazy query objects, which get initialized by calling a function that gets the parent object as an argument? This would not be serializable over the network! +// FIXME: $getProperty, $getPropertyPath, maybe $resolveObject/$query? +// FIXME: Allow setting an evaluation depth limit for queries, to limit eg. recursion +// FIXME: recurseDepth, recurseLabel/recurseGoto + +/* Recursion design: +When setting `$recurse: true` on a child property, the parent schema gets duplicated with the child schema merged into it, and the resulting combined schema is used for the recursive fetching. Because the child schema can explicitly set properties to false, this allows for both "fetch in parent but not in recursed children" cases (true in parent, false in child) and "fetch in recursed children but not in parent" cases (unspecified or false in parent, true in child). +The schema merging will eventually become deep-merging, when multi-level recursion is implemented (ie. the possibility to recurse indirectly). +*/ + +const specialKeyRegex = /^\$[^\$]/; + +function stringifyPath(queryPath, schemaPath) { + return queryPath + .map((segment, i) => { + if (segment === schemaPath[i]) { + return segment; + } else { + // This is used for representing aliases, showing the original schema key in brackets + return `${segment} [${schemaPath[i]}]`; + } + }) + .join(" -> "); +} + +function maybeCall(value, args, thisContext) { + return Promise.try(() => { + if (typeof value === "function") { + return value.call(thisContext, ...args); + } else { + return value; + } + }); +} + +function isObject(value) { + // FIXME: Replace this with a more sensible check, like is-plain-object + return (value != null && typeof value === "object" && !Array.isArray(value)); +} + +// TODO: Move to separate package, decide whether to keep the nested array detection or not - that should probably just be part of the handler? +function mapMaybeArray(value, handler) { + // NOTE: This is async! + if (Array.isArray(value)) { + return Promise.map(value, (item) => { + if (Array.isArray(item)) { + throw new Error(`Encountered a nested array, which is not allowed; maybe you forgot to flatten it?`); + } else { + return handler(item); + } + }); + } else { + return handler(value); + } +} + +/* Possible values of a schema property: +true, null, object with only special keys (but not $recurse) -- fetch value and return it as-is +false -- do not fetch value at all +object with $recurse -- recursively fetch, optionally with extra keys to fetch (or ignore) for recursed children only, inheriting the rest of the schema from the parent +object with regular non-special keys -- fetch object and continue fetching into child properties according to the schema + +a "special key" is any key that is prefixed with $ - they are used to provide additional parameters to dlayer, and cannot be used for business logic keys +*/ + +function asyncMapObject(object, handler) { + return Promise.props(mapObject(object, handler)); +} + +function analyzeSubquery(subquery) { + let isRecursive = (subquery?.$recurse === true); + let hasChildKeys = isObject(subquery) && Object.keys(subquery).some((key) => !specialKeyRegex.test(key)); + let isLeaf = (subquery === true || subquery === null || (!hasChildKeys && !isRecursive)); + let args = subquery?.$arguments ?? {}; + + return { isRecursive, hasChildKeys, isLeaf, args }; +} + +function analyzeQueryKey(schemaObject, queryObject, queryKey) { + let subquery = queryObject[queryKey]; + let schemaKey = subquery?.$key ?? queryKey; // $key is for handling aliases + let handler = schemaObject[schemaKey] ?? schemaObject.$anyKey; + + return { + ... analyzeSubquery(subquery), + schemaKey: schemaKey, + handler: handler + }; +} + +function evaluate(schemaObject, queryObject, context, queryPath, schemaPath) { + // map query object -> result object + return asyncMapObject(queryObject, (queryKey, subquery) => { + let shouldFetch = (subquery !== false); + + if (!shouldFetch || specialKeyRegex.test(queryKey)) { + // When constructing the result object, we only care about the 'real' keys, not about special meta-keys like $key; those get processed in the actual resolution logic itself. + return mapObject.mapObjectSkip; + } else { + let { schemaKey, handler, args, isRecursive, isLeaf } = analyzeQueryKey(schemaObject, queryObject, queryKey); + + if (handler != null) { + let promise = Promise.try(() => { + // This calls the data provider in the schema + return maybeCall(handler, [ args, context ], schemaObject); + }).then((result) => { + let nextQueryPath = queryPath.concat([ queryKey ]); + let nextSchemaPath = schemaPath.concat([ schemaKey ]); + + return Promise.try(() => { + if (!isLeaf && result != null) { + let effectiveSubquery = (isRecursive) + ? { ... queryObject, ... subquery } + : subquery; + + return mapMaybeArray(result, (item) => { + return evaluate(item, effectiveSubquery, context, nextQueryPath, nextSchemaPath); + }); + } else { + // null / undefined are returned as-is, so are leaves + return result; + } + }).catch((error) => { + // FIXME: Chain properly + if (error.path == null) { + // Only assign the path if it hasn't already happened at a deeper level; this is a recursive function after all + error.path = nextQueryPath; + error.message = error.message + ` (${stringifyPath(nextQueryPath, nextSchemaPath)})`; + } + throw error; + }); + }); + + return [ queryKey, promise ]; + } else { + throw new Error(`No key '${schemaKey}' exists in the schema`); + } + } + }); +} + +module.exports = function createDLayer(options) { + // options = { schema, makeContext } + + return { + query: function (query, context) { + let generatedContext = (options.makeContext != null) + ? options.makeContext() + : {}; + + function getProperty(object, property, args = {}) { + // FIXME: Validatem + if (object == null) { + throw new Error(`Empty object passed`); + } + + if (property in object) { + return maybeCall(object[property], [ args, combinedContext ], object); + } else { + // FIXME: Better error message with path + throw new Error(`No key '${property}' exists in the schema`); + } + } + + let combinedContext = { + ... generatedContext, + ... context, + // FIXME: Figure out a way to annotate errors here with the path at which they occurred, *and* make clear that it was an internal property lookup + $getProperty: getProperty, + $getPropertyPath: function (object, propertyPath) { + let parsedPath = (typeof propertyPath === "string") + ? propertyPath.split(".") + : propertyPath; + + return Promise.reduce(parsedPath, (currentObject, pathSegment) => { + if (currentObject != null) { + return getProperty(currentObject, pathSegment); + } else { + // Effectively null-coalescing + return null; + } + }, object); + } + }; + + return evaluate(options.schema, query, combinedContext, [], []); + } + }; +}; + + diff --git a/src/packages/dlayer/test.js b/src/packages/dlayer/test.js new file mode 100644 index 0000000..927c255 --- /dev/null +++ b/src/packages/dlayer/test.js @@ -0,0 +1,48 @@ +"use strict"; + +const Promise = require("bluebird"); +const dlayer = require("./"); + +const loaders = require("../../api/loaders"); + +let schema = { + hardware: { + drives: function () { + return [{ + name: "foo", + size: () => "4 GiB" + }, { + name: "bar", + size: () => "2 TiB" + }]; + }, + primaryNetworkInterface: function () { + return { + name: "baz", + dataRate: () => "2.5 gbps" + }; + } + } +}; + +let api = dlayer({ + schema: schema +}); + +return Promise.try(() => { + return api.query({ + hardware: { + drives: { + name: true, + size: true + }, + primaryNetworkInterface: { + name: true + } + } + }); +}).then((result) => { + console.dir(result, {depth: null}); +}).catch((error) => { + console.dir("Unhandled error", error); +}); diff --git a/src/packages/exec-binary/index.js b/src/packages/exec-binary/index.js index 600dfbb..480b747 100644 --- a/src/packages/exec-binary/index.js +++ b/src/packages/exec-binary/index.js @@ -7,13 +7,20 @@ const util = require("util"); const execFileAsync = util.promisify(require("child_process").execFile); const debug = require("debug")("cvm:execBinary"); const asExpression = require("as-expression"); +const splitFilterN = require("split-filter-n"); const { rethrowAs, chain } = require("error-chain"); +const isPlainObj = require("is-plain-obj"); +const concatArrays = require("concat-arrays"); +const unreachable = require("@joepie91/unreachable")("cvm"); // FIXME: Change on publish const textParser = require("../text-parser"); const errors = require("./errors"); +const OutputForbidden = Symbol("OutputForbidden"); + /* FIXME: How to handle partial result parsing when an error is encountered in the parsing adapter? */ /* FIXME: Test that flag-dash prevention in arguments works */ +// FIXME: Explicitly document that text parsers *should* allow for specifying arbitrary postprocessing JS in some way function keyToFlagName(key) { if (key.startsWith("!")) { @@ -54,8 +61,83 @@ function validateArguments(args) { } } +function testExitCode(exitCode, allowedExitCodes) { + if (allowedExitCodes === null) { + // NOTE: The `===` here is intentional; *only* a null is considered to mean "any exit code allowed", so that when an `undefined` gets passed in accidentally, it doesn't silently do the wrong thing. + return true; + } else { + return allowedExitCodes.includes(exitCode); + } +} + +function tryExpectation(expectation, channels) { + let channelName = expectation.channel; + let channel = channels[channelName]; + let channelAsString = channel.toString(); + + if (channel != null) { + if (expectation.adapter === OutputForbidden && channelAsString.length > 0) { + throw new errors.UnexpectedOutput(`Encountered output on '${channelName}', but no output was supposed to be produced there`, { + failedChannel: channelName + }); + } else { + let result = asExpression(() => { + try { + return expectation.adapter.parse(channelAsString); + } catch (error) { + if (error instanceof textParser.ParseError) { + throw error; + } else { + throw chain(error, errors.OutputParsingFailed, `An error occurred while parsing '${channelName}'`, { + failedChannel: expectation.channel + }); + } + } + }); + + if (textParser.isErrorResult(result)) { + result.throw(); + // } else if (result === undefined || isPlainObj(result)) { // NOTE: Currently broken, see https://github.com/sindresorhus/is-plain-obj/issues/11 + } else if (result === undefined || (typeof result === "object" && !Array.isArray(result) )) { + return result; + } else { + throw new Error(`Output adapters may only return a plain object from their parse method (or nothing at all)`); + } + } + } else { + throw unreachable(`Encountered expectation for unexpected channel '${channelName}'`); + } +} + +const NoResult = Symbol("NoResult"); + +function testExpectations(expectations, channels) { + return expectations + .map((expectation) => { + try { + return tryExpectation(expectation, channels); + } catch (error) { + if (error instanceof textParser.ParseError) { + if (expectation.required !== true) { + return NoResult; + } else { + let channelName = expectation.channel; + + throw chain(error, errors.ExpectedOutputMissing, `A required parser failed to parse the output on ${channelName}`, { + failedChannel: channelName + }); + } + } else { + throw error; + } + } + }) + .filter((result) => result !== NoResult); +} + // FIXME: Immutable-builder abstraction // FIXME: validatem +// FIXME: Reconsider the exit code handling; should we always permit stderr parsing even if a non-zero exit code occurs? module.exports = function createBinaryInvocation(command, args = []) { /* FIXME: The below disallows dashes in the args, but not in the command. Is that what we want? */ validateArguments(args); @@ -67,6 +149,7 @@ module.exports = function createBinaryInvocation(command, args = []) { flags: {}, environment: {}, expectedExitCodes: [0], + resultRequired: false, resultMerger: function (results) { return results.reduce((merged, result) => Object.assign(merged, result), {}); } @@ -86,6 +169,12 @@ module.exports = function createBinaryInvocation(command, args = []) { asRoot: function () { return this._withSettings({ asRoot: true }); }, + withAllowedExitCodes: function (allowedExitCodes) { + return this._withSettings({ expectedExitCodes: allowedExitCodes }); + }, + withAnyExitCode: function () { + return this._withSettings({ expectedExitCodes: null }); + }, withFlags: function (flags) { if (flags != null) { return this._withSettings({ @@ -124,10 +213,17 @@ module.exports = function createBinaryInvocation(command, args = []) { required: true }); }, - failOnStdout: function (adapter) { + // failOnStdout: function (adapter) { + // return this._withExpectation({ + // channel: "stdout", + // adapter: adapter, + // disallowed: true + // }); + // }, + failOnAnyStdout: function () { return this._withExpectation({ channel: "stdout", - adapter: adapter, + adapter: OutputForbidden, disallowed: true }); }, @@ -144,20 +240,25 @@ module.exports = function createBinaryInvocation(command, args = []) { required: true }); }, - failOnStderr: function (adapter) { - return this._withExpectation({ - channel: "stderr", - adapter: adapter, - disallowed: true - }); - }, + // failOnStderr: function (adapter) { + // return this._withExpectation({ + // channel: "stderr", + // adapter: adapter, + // disallowed: true + // }); + // }, failOnAnyStderr: function () { return this._withExpectation({ channel: "stderr", - adapter: null, + adapter: OutputForbidden, disallowed: true }); }, + requireResult: function () { + // NOTE: This requires that *any* adapter produces a result, it doesn't matter which one. + // FIXME: Should this be inverted so that "requires result" is the default, and the user can opt out of that? + return this._withSettings({ requireResult: true }); + }, then: function () { throw new Error("Attempted to use a command builder as a Promise; you probably forgot to call .execute"); }, @@ -189,82 +290,52 @@ module.exports = function createBinaryInvocation(command, args = []) { return { stdout, stderr, error, exitCode }; }).then(({stdout, stderr, error, exitCode}) => { - try { - let channels = { stdout, stderr }; + let { expectedExitCodes, expectations, resultMerger, resultRequired } = this._settings; + let expectationsByChannel = splitFilterN(expectations, [ "stdout", "stderr" ], (expectation) => expectation.channel); + let channels = { stdout, stderr }; - if (!this._settings.expectedExitCodes.includes(exitCode)) { + // 1. process stderr expectations + // 2. throw on invalid exit code if there was no stderr match + // 3. only process stdout expectations if exit code was valid *and* there was no throw + + try { + let hasValidExitCode = testExitCode(exitCode, expectedExitCodes); + let stderrResults = testExpectations(expectationsByChannel.stderr, channels); + + // TODO: Add an option to validate the exit code *even* when there's stderr output + if (stderrResults.length === 0 && !hasValidExitCode) { // FIXME: Can we actually pass `error` to be chained onto here, when there's a case where `error` is undefined? Namely, when requiring a non-zero exit code, but the process exits with 0. - throw chain(error, errors.NonZeroExitCode, `Expected exit code to be one of ${JSON.stringify(this._settings.expectedExitCodes)}, but got '${exitCode}'`, { + throw chain(error, errors.NonZeroExitCode, `Expected exit code to be one of ${JSON.stringify(expectedExitCodes)}, but got '${exitCode}'`, { exitCode: exitCode, stdout: stdout, stderr: stderr }); - } else { - let expectationResults = this._settings.expectations - .map((expectation) => { - if (expectation.adapter == null) { - if (channels[expectation.channel] != null) { - if (channels[expectation.channel].length > 0) { - throw new errors.UnexpectedOutput(`Encountered output on '${expectation.channel}', but no output was supposed to be produced there`, { - failedChannel: expectation.channel - }); - } else { - return undefined; - } - } else { - // FIXME: use @joepie91/unreachable - throw new Error(`Encountered expectation for unexpected channel '${expectation.channel}'; this is a bug, please report it`, { - failedChannel: expectation.channel - }); - } - } else { - let result = asExpression(() => { - try { - return expectation.adapter.parse(channels[expectation.channel].toString()); - } catch (error) { - // TODO: What if both `required` *and* `disallowed`? Can that ever occur, conceptually speaking? - if (error instanceof textParser.NoResult) { - // FIXME: Annotate to make error source clearer? - if (expectation.required === true) { - throw error; - } else { - return undefined; - } - } else { - throw chain(error, errors.OutputParsingFailed, `An error occurred while parsing '${expectation.channel}'`, { - failedChannel: expectation.channel - }); - } - } - }); - - if (result !== undefined && (typeof result !== "object" || Array.isArray(result))) { - throw new Error(`Output adapters may only return a plain object from their parse method (or nothing at all)`); - } else if (result !== undefined && expectation.disallowed === true) { - // TODO: How to make this error more informative? - throw new errors.UnexpectedOutput(`Encountered output on '${expectation.channel}' that isn't supposed to be there`, { - failedChannel: expectation.channel - }); - } else { - return result; - } - } - }) - .filter((result) => { - return (result != null); - }); + } - let mergedResults = (expectationResults.length > 0) - ? this._settings.resultMerger(expectationResults) - : expectationResults[0]; + let stdoutResults = testExpectations(expectationsByChannel.stdout, channels); + let allResults = concatArrays(stderrResults, stdoutResults); - return { - exitCode: exitCode, - stdout: stdout, - stderr: stderr, - result: mergedResults - }; - } + let mergedResults = asExpression(() => { + if (allResults.length === 0) { + if (!resultRequired) { + return {}; + } else { + throw new errors.ExpectedOutputMissing(`At least one of the output parsers should have produced a result, but none of them did`); + } + } else if (allResults.length === 1) { + return allResults[0]; + } else { + // FIXME: Make merger explicitly configurable with a dedicated configuration method + return resultMerger(allResults); + } + }); + + return { + exitCode: exitCode, + stdout: stdout, + stderr: stderr, + result: mergedResults + }; } catch (error) { // FIXME: Use getAllContext let message = (error.failedChannel != null) diff --git a/src/packages/exec-findmnt/index.js b/src/packages/exec-findmnt/index.js index 603f051..a3c0181 100644 --- a/src/packages/exec-findmnt/index.js +++ b/src/packages/exec-findmnt/index.js @@ -12,8 +12,8 @@ const createJsonParser = require("../text-parser-json"); function mapMountList(mounts) { return mounts.map((mount) => { // Some poorly-documented pseudo-filesystems were not worth investigating mount options for, yet. For those, we silently ignore missing/unknown entries. - // TODO: FUSE should eventually be removed from this list - let missingOptionsAllowed = ["cgroup", "cgroup2", "bpf", "pstore", "fuse"].includes(mount.fstype); + // TODO: FUSE, UDF should eventually be removed from this list + let missingOptionsAllowed = ["cgroup", "cgroup2", "bpf", "pstore", "fuse", "udf"].includes(mount.fstype); let parsedOptions = parseMountOptions(mount.fstype, mount.options); diff --git a/src/packages/exec-lvm/commands/add-volume-to-volume-group.js b/src/packages/exec-lvm/commands/add-volume-to-volume-group.js new file mode 100644 index 0000000..7c388c2 --- /dev/null +++ b/src/packages/exec-lvm/commands/add-volume-to-volume-group.js @@ -0,0 +1,28 @@ +"use strict"; + +const Promise = require("bluebird"); +const execBinary = require("../../exec-binary"); + +const unattendedFlags = require("../modifiers/unattended-flags"); +const handleDeviceNotFound = require("../modifiers/handle-device-not-found"); +const handleVolumeGroupNotFound = require("../modifiers/handle-volume-group-not-found"); +const handlePhysicalVolumeInUse = require("../modifiers/handle-physical-volume-in-use"); +const handlePartitionExists = require("../modifiers/handle-partition-exists"); +const handleIncompatibleDevice = require("../modifiers/handle-incompatible-device"); + +module.exports = function ({ physicalVolume, volumeGroup }) { + return Promise.try(() => { + return execBinary("vgextend", [volumeGroup, physicalVolume]) + .asRoot() + .requireResult() + .withModifier(unattendedFlags) + .withModifier(handleDeviceNotFound(physicalVolume)) + .withModifier(handleVolumeGroupNotFound(volumeGroup)) + .withModifier(handlePhysicalVolumeInUse(physicalVolume)) + .withModifier(handlePartitionExists(physicalVolume, "add device to Volume Group")) + .withModifier(handleIncompatibleDevice(physicalVolume, "added to the Volume Group")) + .execute(); + }).then((_output) => { + return true; + }); +}; diff --git a/src/packages/exec-lvm/commands/create-physical-volume.js b/src/packages/exec-lvm/commands/create-physical-volume.js new file mode 100644 index 0000000..1aaba48 --- /dev/null +++ b/src/packages/exec-lvm/commands/create-physical-volume.js @@ -0,0 +1,25 @@ +"use strict"; + +const Promise = require("bluebird"); +const execBinary = require("../../exec-binary"); + +const forceFlags = require("../modifiers/force-flags"); +const unattendedFlags = require("../modifiers/unattended-flags"); +const handleDeviceNotFound = require("../modifiers/handle-device-not-found"); +const handlePartitionExists = require("../modifiers/handle-partition-exists"); +const handleDeviceInUse = require("../modifiers/handle-device-in-use"); + +module.exports = function ({ devicePath, force }) { + return Promise.try(() => { + return execBinary("pvcreate", [devicePath]) + .asRoot() + .requireResult() + .withModifier((force === true) ? forceFlags : unattendedFlags) + .withModifier(handleDeviceNotFound(devicePath)) + .withModifier(handleDeviceInUse(devicePath)) + .withModifier(handlePartitionExists(devicePath, "create a Physical Volume")) + .execute(); + }).then((_output) => { + return true; + }); +}; diff --git a/src/packages/exec-lvm/commands/create-volume-group.js b/src/packages/exec-lvm/commands/create-volume-group.js new file mode 100644 index 0000000..fba2b75 --- /dev/null +++ b/src/packages/exec-lvm/commands/create-volume-group.js @@ -0,0 +1,63 @@ +"use strict"; + +const Promise = require("bluebird"); +const execBinary = require("../../exec-binary"); +const { errorResult } = require("../../text-parser"); +const createRegexParser = require("../../text-parser-regex"); + +const unattendedFlags = require("../modifiers/unattended-flags"); +const errors = require("../errors"); + +// TODO: Plural versions of handle modifiers? Or just have them accept an array of inputs? + +module.exports = function ({ name, physicalVolumes }) { + return Promise.try(() => { + // FIXME: Validatem + if (/^[a-zA-Z0-9_][a-zA-Z0-9+_.-]*$/.test(name)) { + return execBinary("vgcreate", [name, ...physicalVolumes]) + .asRoot() + .requireResult() + .withModifier(unattendedFlags) + .expectOnStderr(createRegexParser(/A volume group called ([^"]+) already exists\./, () => { + return errorResult(new errors.VolumeGroupExists(`A volume group with the name '${name}' already exists`, { + volumeGroupName: name + })); + })) + .expectOnStderr(createRegexParser(/WARNING: [a-z]+ signature detected on (.+) at offset/g, (matches) => { + let failedDevices = matches.map((match) => match.subMatches[0]); + let list = failedDevices.join(", "); + + return errorResult(new errors.PartitionExists(`Refused to create a Volume Group, as partitions or partition tables already exist on the following devices: ${list}`, { + paths: failedDevices + })); + })) + .expectOnStderr(createRegexParser(/Device (.+) not found\./g, (matches) => { + let failedDevices = matches.map((match) => match.subMatches[0]); + let list = failedDevices.join(", "); + + return errorResult(new errors.InvalidPath(`The following specified devices do not exist: ${list}`, { + paths: failedDevices + })); + })) + .expectOnStderr(createRegexParser(/Physical volume '([^']+)' is already in volume group '([^']+)'/g, (matches) => { + let failedItems = matches.map((match) => { + let [ device, volumeGroup ] = match.subMatches; + return { device, volumeGroup }; + }); + + let list = failedItems + .map((item) => `${item.device} (${item.volumeGroup})`) + .join(", "); + + return errorResult(new errors.PhysicalVolumeInUse(`The following specified Physical Volumes are already in use in another Volume Group: ${list}`, { + volumes: failedItems + })); + })) + .execute(); + } else { + throw new errors.InvalidName(`The specified Volume Group name '${name}' contains invalid characters`); + } + }).then((_output) => { + return true; + }); +}; diff --git a/src/packages/exec-lvm/commands/destroy-physical-volume.js b/src/packages/exec-lvm/commands/destroy-physical-volume.js new file mode 100644 index 0000000..f8badd7 --- /dev/null +++ b/src/packages/exec-lvm/commands/destroy-physical-volume.js @@ -0,0 +1,29 @@ +"use strict"; + +const Promise = require("bluebird"); +const execBinary = require("../../exec-binary"); +const { errorResult } = require("../../text-parser"); +const createRegexParser = require("../../text-parser-regex"); + +const handleDeviceNotFound = require("../modifiers/handle-device-not-found"); +const handlePhysicalVolumeInUse = require("../modifiers/handle-physical-volume-in-use"); +const errors = require("../errors"); + +module.exports = function ({ devicePath }) { + return Promise.try(() => { + return execBinary("pvremove", [devicePath]) + .asRoot() + .requireResult() + .withModifier(handleDeviceNotFound(devicePath)) + .withModifier(handlePhysicalVolumeInUse(devicePath)) + .expectOnStdout(createRegexParser(/Labels on physical volume "[^"]+" successfully wiped\./, () => undefined)) + .expectOnStderr(createRegexParser(/No PV( label)? found on .+\./, () => { + return errorResult(new errors.InvalidPath(`Specified device '${devicePath}' is not a Physical Volume`, { + path: devicePath + })); + })) + .execute(); + }).then((_output) => { + return true; + }); +}; diff --git a/src/packages/exec-lvm/commands/get-logical-volumes.js b/src/packages/exec-lvm/commands/get-logical-volumes.js new file mode 100644 index 0000000..80837f4 --- /dev/null +++ b/src/packages/exec-lvm/commands/get-logical-volumes.js @@ -0,0 +1,188 @@ +"use strict"; + +const Promise = require("bluebird"); +const execBinary = require("../../exec-binary"); +const parseIECBytes = require("../../parse-bytes-iec"); +const matchValue = require("match-value"); + +const asJson = require("../modifiers/as-json"); +const mapFlag = require("../map-flag"); +const parseStringList = require("../parse-string-list"); +const parseOptionalString = require("../parse-optional-string"); +const parseOptionalDate = require("../parse-optional-date"); +const parseIntStrict = require("../../parse-int-strict"); + +function isUppercase(string) { + return (string === string.toUpperCase()); +} + +module.exports = function () { + return Promise.try(() => { + return execBinary("lvs") + .asRoot() + .withFlags({ + options: "lv_all" + }) + .withModifier(asJson((result) => { + return { + volumes: result.report[0].lv.map((volume) => { + return { + path: volume.lv_path, + name: volume.lv_name, // NOTE: Not unique! + fullName: volume.lv_full_name, + uuid: volume.lv_uuid, + deviceMapperPath: volume.lv_dm_path, + // FIXME: lv_parent -- is this just for thin pools? + // FIXME: lv_active, only known value is 'active' but it's not documented + layoutAttributes: parseStringList(volume.lv_layout), // linear, mirrored, striped // FIXME: check for specific values here? and can there really be multiple? + roles: parseStringList(volume.lv_role), + tags: parseStringList(volume.lv_tags), + configurationProfile: parseOptionalString(volume.lv_profile), + creationTime: parseOptionalDate(volume.lv_time), + creationHost: parseOptionalString(volume.lv_host), + neededKernelModules: parseStringList(volume.lv_modules), + dataVolume: parseOptionalString(volume.data_lv), // For thin and cache pools only + metadataVolume: parseOptionalString(volume.metadata_lv), // For thin and cache pools only + poolVolume: parseOptionalString(volume.pool_lv), // For thin volumes only + persistentMajorNumber: (volume.lv_major !== "-1") ? parseIntStrict(volume.lv_major) : undefined, + persistentMinorNumber: (volume.lv_minor !== "-1") ? parseIntStrict(volume.lv_minor) : undefined, + // Volume type: (C)ache, (m)irrored, (M)irrored without initial sync, (o)rigin, (O)rigin with merging snapshot, (r)aid, (R)aid without initial sync, (s)napshot, merging (S)napshot, (p)vmove, (v)irtual, mirror or raid (i)mage, mirror or raid (I)mage out-of-sync, mirror (l)og device, under (c)onversion, thin (V)olume, (t)hin pool, (T)hin pool data, v(d)o pool, v(D)o pool data, raid or pool m(e)tadata or pool metadata spare. + type: mapFlag(volume.lv_attr, 0, { + C: "CACHE", + m: "MIRRORED", + M: "MIRRORED", + o: "ORIGIN", + O: "ORIGIN", + r: "RAID", + R: "RAID", + s: "SNAPSHOT", + S: "SNAPSHOT", + p: "PVMOVE", + v: "VIRTUAL", + i: "IMAGE", + I: "IMAGE", + l: "LOG_DEVICE", + c: "UNDER_CONVERSION", + V: "THIN_VOLUME", + t: "THIN_POOL", + T: "THIN_POOL_DATA", + d: "VDO_POOL", + D: "VDO_POOL_DATA", + e: "METADATA", + "-": "NORMAL" + }), + // Permissions: (w)riteable, (r)ead-only, (R)ead-only activation of non-read-only volume + isReadOnly: mapFlag(volume.lv_attr, 1, { + w: false, + r: true, + R: false + }), + isCurrentlyReadOnly: mapFlag(volume.lv_attr, 1, { + w: false, + r: true, + R: true + }), + // Allocation policy: (a)nywhere, (c)ontiguous, (i)nherited, c(l)ing, (n)ormal This is capitalised if the volume is currently locked against allocation changes, for example during pvmove(8). + isAllocationLocked: isUppercase(volume.lv_attr[2]), + allocationPolicy: mapFlag(volume.lv_attr, 2, { + a: "ANYWHERE", + A: "ANYWHERE", + c: "CONTIGUOUS", + C: "CONTIGUOUS", + i: "INHERITED", + I: "INHERITED", + l: "CLING", + L: "CLING", + n: "NORMAL", + N: "NORMAL" + }), + // State: (a)ctive, (h)istorical, (s)uspended, (I)nvalid snapshot, invalid (S)uspended snapshot, snapshot (m)erge failed, suspended snapshot (M)erge failed, mapped (d)evice present without tables, mapped device present with (i)nactive table, thin-pool (c)heck needed, suspended thin-pool (C)heck needed, (X) unknown + status: mapFlag(volume.lv_attr, 4, { + a: "ACTIVE", + h: "HISTORICAL", + s: null, + I: "SNAPSHOT_INVALID", + S: "SNAPSHOT_INVALID", + m: "SNAPSHOT_MERGE_FAILED", + M: "SNAPSHOT_MERGE_FAILED", + d: "TABLES_MISSING", + i: "TABLES_INACTIVE", + c: "THIN_POOL_CHECK_NEEDED", + C: "THIN_POOL_CHECK_NEEDED", + X: "UNKNOWN" + }), + // isSuspended: mapFlag(volume.lv_attr, 4, { + // a: false, + // h: false, + // s: true, + // I: false, + // S: true, + // m: false, + // M: true, + // d: false, + // i: false, + // c: false, + // C: true, + // X: false + // }), + // Newly-allocated data blocks are overwritten with blocks of (z)eroes before use. + // isZeroFilled: mapFlag(volume.lv_attr, 7, { + // z: true, + // "-": false + // }), + // Volume Health, where there are currently three groups of attributes identified: + // (p)artial signifies that one or more of the Physical Volumes this Logical Volume uses is missing from the system. (X) unknown signifies the status is unknown. + // (r)efresh signifies that one or more of the Physical Volumes this RAID Logical Volume uses had suffered a write error. The write error could be due to a temporary failure of that Physical Volume or an indication that it is failing. The device should be refreshed or replaced. (m)ismatches signifies that the RAID logical volume has portions of the array that are not coherent. Inconsistencies are detected by initiating a "check" on a RAID logical volume. (The scrubbing operations, "check" and "repair", can be performed on a RAID logical volume via the 'lvchange' command.) (w)ritemostly signifies the devices in a RAID 1 logical volume that have been marked write-mostly. Re(s)haping signifies a RAID Logical Volume is either undergoing a stripe addition/removal, a stripe size or RAID algorithm change. (R)emove after reshape signifies freed striped raid images to be removed. + // (F)ailed is set if thin pool encounters serious failures and hence no further I/O is permitted at all. The out of (D)ata space is set if thin pool has run out of data space. (M)etadata read only signifies that thin pool encounters certain types of failures but it's still possible to do reads at least, but no metadata changes are allowed. + // (F)ailed is set when related thin pool enters Failed state and no further I/O is permitted at all. + // (E)rror is set dm-writecache reports an error. + healthStatus: mapFlag(volume.lv_attr, 8, { + X: "UNKNOWN", + p: "PV_MISSING", + r: "RAID_REPLACE_DEVICE", + m: "RAID_MISMATCH", + w: "RAID_PREFER_WRITE_ONLY", + s: "RAID_RESHAPING", + R: "RAID_REMOVE_UNNECESSARY", + F: "FAILED", + D: "OUT_OF_DATA_SPACE", + M: "METADATA_FAILURE_READ_ONLY", + E: "WRITECACHE_ERROR_REPORTED", + "-": "HEALTHY" + }), + // s(k)ip activation: this volume is flagged to be skipped during activation. + // isActivationSkipped: mapFlag(volume.lv_attr, 9, { + // k: true, + // "-": false + // }), + + isInitiallySynchronized: (volume.lv_initial_image_sync === "initial image sync"), + isCurrentlySynchronized: (volume.lv_image_synced === "image synced"), + isMerging: (volume.lv_merging === "merging"), + isConverting: (volume.lv_converting === "converting"), + isSuspended: (volume.lv_suspended === "suspended"), + isActivationSkipped: (volume.lv_skip_activation === "skip activation"), + isOpened: (volume.lv_device_open === "open"), + isActiveLocally: (volume.lv_active_locally === "active locally"), + isActiveRemotely: (volume.lv_active_remotely === "active remotely"), + isActiveExclusively: (volume.lv_active_exclusively === "active exclusively"), + isMergeFailed: (volume.lv_merge_failed === "merge failed"), + isSnapshotInvalid: (volume.lv_merge_failed === "snapshot invalid"), // Snapshots only + isLiveTablePresent: (volume.lv_live_table === "live table present"), + isInactiveTablePresent: (volume.lv_live_table === "inactive table present"), + isZeroFilled: (volume.zero === "zero"), // Thin pools only + hasFixedMinorNumber: (volume.lv_fixed_minor === "fixed minor"), + outOfSpacePolicy: matchValue(volume.lv_when_full, { + error: "ERROR", + queue: "QUEUE", + "": null + }) + }; + }) + }; + })) + .execute(); + }).then((output) => { + return output.result; + }); +}; diff --git a/src/packages/exec-lvm/commands/get-physical-volumes.js b/src/packages/exec-lvm/commands/get-physical-volumes.js new file mode 100644 index 0000000..3c585a2 --- /dev/null +++ b/src/packages/exec-lvm/commands/get-physical-volumes.js @@ -0,0 +1,45 @@ +"use strict"; + +const Promise = require("bluebird"); +const execBinary = require("../../exec-binary"); +const parseIECBytes = require("../../parse-bytes-iec"); + +const asJson = require("../modifiers/as-json"); +const mapFlag = require("../map-flag"); + +module.exports = function () { + return Promise.try(() => { + return execBinary("pvs") + .asRoot() + .withModifier(asJson((result) => { + return { + volumes: result.report[0].pv.map((volume) => { + return { + path: volume.pv_name, + volumeGroup: (volume.vg_name === "") ? null : volume.vg_name, + format: volume.pv_fmt, + // FIXME: These amounts can contain commas depending on locale (eg. https://serverfault.com/a/648302) + totalSpace: parseIECBytes(volume.pv_size), + freeSpace: parseIECBytes(volume.pv_free), + status: mapFlag(volume.pv_attr, 0, { + d: "DUPLICATE", + a: "ALLOCATABLE", + u: "USED" + }), + isExported: mapFlag(volume.pv_attr, 1, { + x: true, + "-": false + }), + isMissing: mapFlag(volume.pv_attr, 2, { + m: true, + "-": false + }), + }; + }) + }; + })) + .execute(); + }).then((output) => { + return output.result; + }); +}; diff --git a/src/packages/exec-lvm/commands/get-volume-groups.js b/src/packages/exec-lvm/commands/get-volume-groups.js new file mode 100644 index 0000000..ba7c299 --- /dev/null +++ b/src/packages/exec-lvm/commands/get-volume-groups.js @@ -0,0 +1,89 @@ +"use strict"; + +const Promise = require("bluebird"); +const execBinary = require("../../exec-binary"); +const parseIECBytes = require("../../parse-bytes-iec"); +const parseIntStrict = require("../../parse-int-strict"); + +const asJson = require("../modifiers/as-json"); +const mapFlag = require("../map-flag"); +const parseOptionalString = require("../parse-optional-string"); +const parseStringList = require("../parse-string-list"); + +module.exports = function () { + return Promise.try(() => { + return execBinary("vgs") + .asRoot() + .withFlags({ + options: "vg_all" + }) + .withModifier(asJson((result) => { + return { + groups: result.report[0].vg.map((group) => { + return { + name: group.vg_name, + uuid: group.vg_uuid, + systemID: parseOptionalString(group.vg_systemid), + metadataRevision: parseIntStrict(group.vg_seqno), + tags: parseStringList(group.vg_tags), + configurationProfile: parseOptionalString(group.vg_profile), + // FIXME: vg_lock_type, vg_lock_args + // FIXME: These amounts can contain commas depending on locale (eg. https://serverfault.com/a/648302) + totalSpace: parseIECBytes(group.vg_size), + freeSpace: parseIECBytes(group.vg_free), + extentSize: parseIECBytes(group.vg_extent_size), + totalExtents: parseIntStrict(group.vg_extent_count), + freeExtents: parseIntStrict(group.vg_free_count), + freeMetadataSpace: parseIECBytes(group.vg_mda_free), + smallestMetadataSize: parseIECBytes(group.vg_mda_size), + totalMetadataAreas: parseIntStrict(group.vg_mda_count), + usedMetadataAreas: parseIntStrict(group.vg_mda_used_count), + usedMetadataAreasTarget: (group.vg_mda_copies === "unmanaged" ? undefined : parseIntStrict(group.vg_mda_copies)), + physicalVolumeCount: parseIntStrict(group.pv_count), + physicalVolumeLimit: (group.max_pv === "0") ? Infinity : parseIntStrict(group.max_pv), + missingPhysicalVolumes: parseIntStrict(group.vg_missing_pv_count), + logicalVolumeCount: parseIntStrict(group.lv_count), + logicalVolumeLimit: (group.max_lv === "0") ? Infinity : parseIntStrict(group.max_lv), + snapshotCount: parseIntStrict(group.snap_count), + isExtendable: (group.vg_extendable === "extendable"), + isReadOnly: mapFlag(group.vg_attr, 0, { + // Permissions: (w)riteable, (r)ead-only + r: true, + w: false + }), + isResizeable: mapFlag(group.vg_attr, 1, { + // Resi(z)eable + z: true, + "-": false + }), + isExported: mapFlag(group.vg_attr, 2, { + // E(x)ported + x: true, + "-": false + }), + isIncomplete: mapFlag(group.vg_attr, 3, { + // (p)artial: one or more physical volumes belonging to the volume group are missing from the system + p: true, + "-": false + }), + allocationPolicy: mapFlag(group.vg_attr, 4, { + // Allocation policy: (c)ontiguous, c(l)ing, (n)ormal, (a)nywhere + c: "CONTIGUOUS", + l: "CLING", + n: "NORMAL", + a: "ANYWHERE" + }), + mode: mapFlag(group.vg_attr, 5, { + c: "CLUSTERED", + s: "SHARED", + "-": "LOCAL" + }) + }; + }) + }; + })) + .execute(); + }).then((output) => { + return output.result; + }); +}; diff --git a/src/packages/exec-lvm/commands/version.js b/src/packages/exec-lvm/commands/version.js new file mode 100644 index 0000000..25ad11a --- /dev/null +++ b/src/packages/exec-lvm/commands/version.js @@ -0,0 +1,23 @@ +"use strict"; + +const Promise = require("bluebird"); +const path = require("path"); +const execBinary = require("../../exec-binary"); +const createPegParser = require("../../text-parser-pegjs"); + +let versionParser = createPegParser({ + grammarFile: path.join(__dirname, "./version.pegjs") +}); + +module.exports = function () { + return Promise.try(() => { + return versionParser; + }).then((parser) => { + return execBinary("lvm", ["version"]) + .asRoot() + .requireOnStdout(parser) + .execute(); + }).then((output) => { + return output.result; + }); +}; diff --git a/src/packages/exec-lvm/commands/version.pegjs b/src/packages/exec-lvm/commands/version.pegjs new file mode 100644 index 0000000..04d4ee0 --- /dev/null +++ b/src/packages/exec-lvm/commands/version.pegjs @@ -0,0 +1,24 @@ +import { SameLine as _ } from "../../peg-whitespace" +import { RestOfLine } from "../../peg-rest-of-line" + +{ + const syncpipe = require("syncpipe"); + const mapVersionTitle = require("../map-version-title"); +} + +Output + = entries:VersionLine+ { + // FIXME/MARKER: Build a generic abstraction for fromNamedEntries or so + return syncpipe(entries, [ + (_) => _.map(({ key, value }) => [ key, value ]), + (_) => Object.fromEntries(_) + ]); + } + +VersionLine + = _ label:$[A-Za-z ]+ ":" _ version:RestOfLine { + return { + key: mapVersionTitle(label), // FIXME/MARKER: Rename to mapVersionLabel + value: version.trim() + }; + } diff --git a/src/packages/exec-lvm/errors.js b/src/packages/exec-lvm/errors.js index 53a62d2..7c7c2e6 100644 --- a/src/packages/exec-lvm/errors.js +++ b/src/packages/exec-lvm/errors.js @@ -9,4 +9,6 @@ module.exports = { VolumeGroupExists: errorChain.create("VolumeGroupExists"), InvalidVolumeGroup: errorChain.create("InvalidVolumeGroup"), PhysicalVolumeInUse: errorChain.create("PhysicalVolumeInUse"), + DeviceInUse: errorChain.create("PhysicalVolumeInUse"), + IncompatibleDevice: errorChain.create("IncompatibleDevice") }; diff --git a/src/packages/exec-lvm/index.js b/src/packages/exec-lvm/index.js index df73f0d..a7968bf 100644 --- a/src/packages/exec-lvm/index.js +++ b/src/packages/exec-lvm/index.js @@ -1,243 +1,15 @@ "use strict"; -const Promise = require("bluebird"); -const { chain } = require("error-chain"); -const execBinary = require("../exec-binary"); -const parseIECBytes = require("../parse-bytes-iec"); - -const errors = require("./errors"); - -function mapVersionTitle(title) { - if (title === "LVM version") { - return "lvm"; - } else if (title === "Library version") { - return "library"; - } else if (title === "Driver version") { - return "driver"; - } else if (title === "Configuration") { - return "configuration"; - } else { - throw new Error(`Unrecognized version type for LVM: ${title}`); - } -} - -function unattendedFlags(command) { - /* This will answer "no" to any safety prompts, cancelling the operation if safety issues arise. */ - return command.withFlags({ - q: [true, true] - }); -} - -function forceFlags(command) { - /* This will force-bypass safety checks, for when the administrator has indicated that they want to take the risk. */ - return command.withFlags({ - force: true - }); -} - -function asJson(resultMapper) { - return function (command) { - return command - .expectJsonStdout(resultMapper) - .withFlags({ - reportformat: "json" - }); - }; -} - -function hasFlag(flag) { - return function (error) { - if (error.getAllContext != null) { - let context = error.getAllContext(); - - /* The below counts *any* kind of non-null value as having a flag set, to accommodate matchAll scenarios and scenarios where the flag needs to contain further information. */ - return (context.result != null && context.result[flag] != null); - } else { - return false; - } - }; -} - -// FIXME: Convert to new execBinary API module.exports = { - getVersions: function () { - return Promise.try(() => { - return execBinary("lvm", ["version"]) - .asRoot() - .singleResult() - .expectStdout("versions", /^\s*([^:]+):\s*(.+)$/gm, { - required: true, - matchAll: true, - result: ([title, version]) => { - return { - key: mapVersionTitle(title), - value: version - }; - } - }) - .execute(); - }).then(({result}) => { - return result.reduce((object, entry) => { - return Object.assign(object, { - [entry.key]: entry.value - }); - }, {}); - }); - }, - getPhysicalVolumes: function () { - return Promise.try(() => { - return execBinary("pvs") - .asRoot() - .singleResult() - .withModifier(asJson((result) => { - return result.report[0].pv.map((volume) => { - return { - path: volume.pv_name, - volumeGroup: (volume.vg_name === "") ? null : volume.vg_name, - format: volume.pv_fmt, - totalSpace: parseIECBytes(volume.pv_size), - freeSpace: parseIECBytes(volume.pv_free), - isDuplicate: volume.pv_attr.includes("d"), - isAllocatable: volume.pv_attr.includes("a"), - isUsed: volume.pv_attr.includes("u"), - isExported: volume.pv_attr.includes("x"), - isMissing: volume.pv_attr.includes("m"), - }; - }); - })) - .execute(); - }).then((output) => { - return output.result; - }); - }, - createPhysicalVolume: function ({ devicePath, force }) { - return Promise.try(() => { - return execBinary("pvcreate", [devicePath]) - .asRoot() - .withModifier((force === true) ? forceFlags : unattendedFlags) - .expectStderr("deviceNotFound", /Device .+ not found\./, { result: () => true }) - .expectStderr("partitionTableExists", /WARNING: [a-z]+ signature detected on/, { result: () => true }) - .execute(); - }).then((_output) => { - return true; - }).catch(hasFlag("deviceNotFound"), (error) => { - throw chain(error, errors.InvalidPath, `Specified device '${devicePath}' does not exist`, { - path: devicePath - }); - }).catch(hasFlag("partitionTableExists"), (error) => { - throw chain(error, errors.PartitionExists, `Refused to create a Physical Volume, as a partition or partition table already exists on device '${devicePath}'`, { - path: devicePath - }); - }); - }, - destroyPhysicalVolume: function ({ devicePath }) { - return Promise.try(() => { - return execBinary("pvremove", [devicePath]) - .asRoot() - .atLeastOneResult() - .expectStdout("success", /Labels on physical volume "[^"]+" successfully wiped\./) - .expectStderr("deviceNotFound", /Device .+ not found\./, { result: () => true }) - .expectStderr("notAPhysicalVolume", /No PV label found on .+\./, { result: () => true }) - .execute(); - }).then((_output) => { - return true; - }).catch(hasFlag("deviceNotFound"), (error) => { - throw chain(error, errors.InvalidPath, `Specified device '${devicePath}' does not exist`, { - path: devicePath - }); - }).catch(hasFlag("notAPhysicalVolume"), (error) => { - throw chain(error, errors.InvalidPath, `Specified device '${devicePath}' is not a Physical Volume`, { - path: devicePath - }); - }); - }, - createVolumeGroup: function ({ name, physicalVolumes }) { - return Promise.try(() => { - if (/^[a-zA-Z0-9_][a-zA-Z0-9+_.-]*$/.test(name)) { - return execBinary("vgcreate", [name, ...physicalVolumes]) - .asRoot() - .withModifier(unattendedFlags) - .expectStderr("volumeGroupExists", /A volume group called ([^"]+) already exists\./, { result: () => true }) - .expectStderr("partitionTableExists", /WARNING: [a-z]+ signature detected on (.+) at offset/g, { - result: ([device]) => device, - matchAll: true - }) - .expectStderr("deviceNotFound", /Device (.+) not found\./g, { - result: ([device]) => device, - matchAll: true - }) - .expectStderr("physicalVolumeInUse", /Physical volume '([^']+)' is already in volume group '([^']+)'/g, { - result: ([device, volumeGroup]) => ({device, volumeGroup}), - matchAll: true - }) - .execute(); - } else { - throw new errors.InvalidName(`The specified Volume Group name '${name}' contains invalid characters`); - } - }).then((_output) => { - return true; - }).catch(hasFlag("deviceNotFound"), (error) => { - let failedDevices = error.getAllContext().result.deviceNotFound; - - throw chain(error, errors.InvalidPath, `The following specified devices do not exist: ${failedDevices.join(", ")}`, { - paths: failedDevices - }); - }).catch(hasFlag("partitionTableExists"), (error) => { - let failedDevices = error.getAllContext().result.partitionTableExists; - - throw chain(error, errors.PartitionExists, `Refused to create a Volume Group, as partitions or partition tables already exist on the following devices: ${failedDevices.join(", ")}`, { - paths: failedDevices - }); - }).catch(hasFlag("volumeGroupExists"), (error) => { - throw chain(error, errors.VolumeGroupExists, `A volume group with the name '${name}' already exists`, { - volumeGroupName: name - }); - }).catch(hasFlag("physicalVolumeInUse"), (error) => { - let failedItems = error.getAllContext().result.physicalVolumeInUse; - - let failedItemString = failedItems.map(({device, volumeGroup}) => { - return `${device} (${volumeGroup})`; - }).join(", "); - - throw chain(error, errors.PhysicalVolumeInUse, `The following specified Physical Volumes are already in use in another Volume Group: ${failedItemString}`, { - volumes: failedItems - }); - }); - }, - addVolumeToVolumeGroup: function ({ physicalVolume, volumeGroup }) { - return Promise.try(() => { - return execBinary("vgextend", [volumeGroup, physicalVolume]) - .asRoot() - .withModifier(unattendedFlags) - .expectStderr("deviceNotFound", /Device .+ not found\./, { result: () => true }) - .expectStderr("volumeGroupNotFound", /Volume group "[^"]+" not found/, { result: () => true }) - .expectStderr("partitionTableExists", /WARNING: [a-z]+ signature detected on/, { result: () => true }) - .expectStderr("physicalVolumeInUse", /Physical volume '([^']+)' is already in volume group '([^']+)'/, { - result: ([device, volumeGroup]) => ({device, volumeGroup}) - }) - .execute(); - }).then((_output) => { - return true; - }).catch(hasFlag("deviceNotFound"), (error) => { - throw chain(error, errors.InvalidPath, `Specified device '${physicalVolume}' does not exist`, { - path: physicalVolume - }); - }).catch(hasFlag("volumeGroupNotFound"), (error) => { - throw chain(error, errors.InvalidVolumeGroup, `Specified Volume Group '${volumeGroup}' does not exist`, { - volumeGroupName: volumeGroup - }); - }).catch(hasFlag("physicalVolumeInUse"), (error) => { - let volume = error.getAllContext().result.physicalVolumeInUse; - - throw chain(error, errors.PhysicalVolumeInUse, `Specified Physical Volume '${physicalVolume}' is already in use in another Volume Group (${volume.volumeGroup})`, { - volume: volume - }); - }).catch(hasFlag("partitionTableExists"), (error) => { - throw chain(error, errors.PartitionExists, `Refused to add device to Volume Group, as a partition or partition table already exists on device '${physicalVolume}'`, { - path: physicalVolume - }); - }); - } + getVersions: require("./commands/version"), + getPhysicalVolumes: require("./commands/get-physical-volumes"), + getVolumeGroups: require("./commands/get-volume-groups"), + getLogicalVolumes: require("./commands/get-logical-volumes"), + createPhysicalVolume: require("./commands/create-physical-volume"), + destroyPhysicalVolume: require("./commands/destroy-physical-volume"), + createVolumeGroup: require("./commands/create-volume-group"), + addVolumeToVolumeGroup: require("./commands/add-volume-to-volume-group") }; // TODO: Need to check if cache service running? +// TODO: Wrap errors in commands in the appropriate chained error types, beyond a generic CommandExecutionFailed from exec-binary? diff --git a/src/packages/exec-lvm/map-flag.js b/src/packages/exec-lvm/map-flag.js new file mode 100644 index 0000000..35c7af5 --- /dev/null +++ b/src/packages/exec-lvm/map-flag.js @@ -0,0 +1,7 @@ +"use strict"; + +const matchValue = require("match-value"); + +module.exports = function mapFlag(flagString, index, mapper) { + return matchValue(flagString[index], mapper); +}; diff --git a/src/packages/exec-lvm/map-version-title.js b/src/packages/exec-lvm/map-version-title.js new file mode 100644 index 0000000..dc6cd24 --- /dev/null +++ b/src/packages/exec-lvm/map-version-title.js @@ -0,0 +1,12 @@ +"use strict"; + +const matchValue = require("match-value"); + +module.exports = function mapVersionTitle(title) { + return matchValue(title, { + "LVM version": "lvm", + "Library version": "library", + "Driver version": "driver", + "Configuration": "configuration" + }); +}; diff --git a/src/packages/exec-lvm/modifiers/as-json.js b/src/packages/exec-lvm/modifiers/as-json.js new file mode 100644 index 0000000..5581b9d --- /dev/null +++ b/src/packages/exec-lvm/modifiers/as-json.js @@ -0,0 +1,14 @@ +"use strict"; + +const createJSONParser = require("../../text-parser-json"); + +module.exports = function asJson(resultMapper) { + return function (command) { + return command + .requireOnStdout(createJSONParser(resultMapper)) + .withFlags({ + reportformat: "json", + units: "h" // Prevent < rounding indicator in output + }); + }; +}; diff --git a/src/packages/exec-lvm/modifiers/force-flags.js b/src/packages/exec-lvm/modifiers/force-flags.js new file mode 100644 index 0000000..498cafa --- /dev/null +++ b/src/packages/exec-lvm/modifiers/force-flags.js @@ -0,0 +1,8 @@ +"use strict"; + +module.exports = function forceFlags(command) { + /* This will force-bypass safety checks, for when the administrator has indicated that they want to take the risk. */ + return command.withFlags({ + force: true + }); +}; diff --git a/src/packages/exec-lvm/modifiers/handle-device-in-use.js b/src/packages/exec-lvm/modifiers/handle-device-in-use.js new file mode 100644 index 0000000..d07345d --- /dev/null +++ b/src/packages/exec-lvm/modifiers/handle-device-in-use.js @@ -0,0 +1,21 @@ +"use strict"; + +const { errorResult } = require("../../text-parser"); +const createRegexParser = require("../../text-parser-regex"); + +const errors = require("../errors"); + +module.exports = function (devicePath) { + return function handleDeviceInUse(command) { + return command.expectOnStderr(createRegexParser(/Can't initialize physical volume "([^"]+)" of volume group "([^"]+)" without -ff/, (match) => { + let [ _device, existingVolumeGroup ] = match.subMatches; + + return errorResult(new errors.DeviceInUse(`Specified device '${devicePath}' is already in use as a Physical Volume in another Volume Group (${existingVolumeGroup})`, { + volume: { + device: devicePath, + volumeGroup: existingVolumeGroup + } + })); + })); + }; +}; diff --git a/src/packages/exec-lvm/modifiers/handle-device-not-found.js b/src/packages/exec-lvm/modifiers/handle-device-not-found.js new file mode 100644 index 0000000..f8bb965 --- /dev/null +++ b/src/packages/exec-lvm/modifiers/handle-device-not-found.js @@ -0,0 +1,16 @@ +"use strict"; + +const { errorResult } = require("../../text-parser"); +const createRegexParser = require("../../text-parser-regex"); + +const errors = require("../errors"); + +module.exports = function (devicePath) { + return function handleDeviceNotFound(command) { + return command.expectOnStderr(createRegexParser(/Device .+ not found\./, () => { + return errorResult(new errors.InvalidPath(`Specified device '${devicePath}' does not exist`, { + path: devicePath + })); + })); + }; +}; diff --git a/src/packages/exec-lvm/modifiers/handle-incompatible-device.js b/src/packages/exec-lvm/modifiers/handle-incompatible-device.js new file mode 100644 index 0000000..26d3859 --- /dev/null +++ b/src/packages/exec-lvm/modifiers/handle-incompatible-device.js @@ -0,0 +1,16 @@ +"use strict"; + +const { errorResult } = require("../../text-parser"); +const createRegexParser = require("../../text-parser-regex"); + +const errors = require("../errors"); + +module.exports = function (devicePath, action) { + return function handleIncompatibleDevice(command) { + return command.expectOnStderr(createRegexParser(/Device .+ excluded by a filter\./, () => { + return errorResult(new errors.IncompatibleDevice(`Specified device '${devicePath}' could not be ${action} because it is incompatible; perhaps it's too small?`, { + path: devicePath + })); + })); + }; +}; diff --git a/src/packages/exec-lvm/modifiers/handle-partition-exists.js b/src/packages/exec-lvm/modifiers/handle-partition-exists.js new file mode 100644 index 0000000..0cdc49f --- /dev/null +++ b/src/packages/exec-lvm/modifiers/handle-partition-exists.js @@ -0,0 +1,16 @@ +"use strict"; + +const { errorResult } = require("../../text-parser"); +const createRegexParser = require("../../text-parser-regex"); + +const errors = require("../errors"); + +module.exports = function (devicePath, action) { + return function handlePartitionExists(command) { + return command.expectOnStderr(createRegexParser(/WARNING: [a-z]+ signature detected on/, () => { + return errorResult(new errors.PartitionExists(`Refused to ${action}, as a partition or partition table already exists on device '${devicePath}'`, { + path: devicePath + })); + })); + }; +}; diff --git a/src/packages/exec-lvm/modifiers/handle-physical-volume-in-use.js b/src/packages/exec-lvm/modifiers/handle-physical-volume-in-use.js new file mode 100644 index 0000000..8e9fbcb --- /dev/null +++ b/src/packages/exec-lvm/modifiers/handle-physical-volume-in-use.js @@ -0,0 +1,35 @@ +"use strict"; + +const { errorResult } = require("../../text-parser"); +const createRegexParser = require("../../text-parser-regex"); + +const errors = require("../errors"); + +module.exports = function (physicalVolume) { + return function handlePhysicalVolumeInUse(command) { + return command + .expectOnStderr(createRegexParser(/Physical volume '([^']+)' is already in volume group '([^']+)'/, (match) => { + let [ _device, existingVolumeGroup ] = match.subMatches; + + return errorResult(new errors.PhysicalVolumeInUse(`Specified Physical Volume '${physicalVolume}' is already in use in another Volume Group (${existingVolumeGroup})`, { + volume: { + device: physicalVolume, + volumeGroup: existingVolumeGroup + } + })); + })) + .expectOnStderr(createRegexParser(/PV (.+) is used by VG (.+) so please use vgreduce first\./, (match) => { + let [ _device, existingVolumeGroup ] = match.subMatches; + + // FIXME: Improve context structure here? + return errorResult(new errors.PhysicalVolumeInUse(`Specified Physical Volume '${physicalVolume}' is still in use in Volume Group '${existingVolumeGroup}'`, { + volume: { + device: physicalVolume, + volumeGroup: existingVolumeGroup + } + })); + })); + }; +}; + +// /dev/loop0 is used by VG vg-name so please use vgreduce first. diff --git a/src/packages/exec-lvm/modifiers/handle-volume-group-not-found.js b/src/packages/exec-lvm/modifiers/handle-volume-group-not-found.js new file mode 100644 index 0000000..6bba66a --- /dev/null +++ b/src/packages/exec-lvm/modifiers/handle-volume-group-not-found.js @@ -0,0 +1,16 @@ +"use strict"; + +const { errorResult } = require("../../text-parser"); +const createRegexParser = require("../../text-parser-regex"); + +const errors = require("../errors"); + +module.exports = function (volumeGroup) { + return function handleVolumeGroupNotFound(command) { + return command.expectOnStderr(createRegexParser(/Volume group "[^"]+" not found/, () => { + return errorResult(new errors.InvalidVolumeGroup(`Specified Volume Group '${volumeGroup}' does not exist`, { + volumeGroupName: volumeGroup + })); + })); + }; +}; diff --git a/src/packages/exec-lvm/modifiers/unattended-flags.js b/src/packages/exec-lvm/modifiers/unattended-flags.js new file mode 100644 index 0000000..cb3fb9b --- /dev/null +++ b/src/packages/exec-lvm/modifiers/unattended-flags.js @@ -0,0 +1,8 @@ +"use strict"; + +module.exports = function unattendedFlags(command) { + /* This will answer "no" to any safety prompts, cancelling the operation if safety issues arise. */ + return command.withFlags({ + q: [true, true] + }); +}; diff --git a/src/packages/exec-lvm/parse-optional-date.js b/src/packages/exec-lvm/parse-optional-date.js new file mode 100644 index 0000000..f8c2649 --- /dev/null +++ b/src/packages/exec-lvm/parse-optional-date.js @@ -0,0 +1,9 @@ +"use strict"; + +module.exports = function parseOptionalString(string) { + if (string.length === 0) { + return undefined; + } else { + return new Date(string); + } +}; diff --git a/src/packages/exec-lvm/parse-optional-string.js b/src/packages/exec-lvm/parse-optional-string.js new file mode 100644 index 0000000..5439987 --- /dev/null +++ b/src/packages/exec-lvm/parse-optional-string.js @@ -0,0 +1,9 @@ +"use strict"; + +module.exports = function parseOptionalString(string) { + if (string.length === 0) { + return undefined; + } else { + return string; + } +}; diff --git a/src/packages/exec-lvm/parse-string-list.js b/src/packages/exec-lvm/parse-string-list.js new file mode 100644 index 0000000..8f07f51 --- /dev/null +++ b/src/packages/exec-lvm/parse-string-list.js @@ -0,0 +1,9 @@ +"use strict"; + +module.exports = function parseStringList(string) { + if (string.length === 0) { + return []; + } else { + return string.split(","); + } +}; diff --git a/src/packages/exec-nvme-cli/index.js b/src/packages/exec-nvme-cli/index.js index e116298..7a3f91c 100644 --- a/src/packages/exec-nvme-cli/index.js +++ b/src/packages/exec-nvme-cli/index.js @@ -11,7 +11,7 @@ function createNamespaceParser() { return { namespaces: execAll(/^\[\s*[0-9]+\]:(?:(0)|0x([0-9A-F]+))$/gm, input) .map((match) => { - let [ idLiteral, idHex ] = match.sub; + let [ idLiteral, idHex ] = match.subMatches; if (idLiteral != null) { /* NOTE: This is a special case for when the value is exactly 0 - and maybe there are others too, hence still doing a parseInt, so we can easily change the regex later if needed: diff --git a/src/packages/exec-smartctl/index.js b/src/packages/exec-smartctl/index.js index 1e0edbc..0bae53f 100644 --- a/src/packages/exec-smartctl/index.js +++ b/src/packages/exec-smartctl/index.js @@ -2,8 +2,8 @@ const Promise = require("bluebird"); const path = require("path"); -const execBinary = require("../exec-binary"); const createPegParser = require("../text-parser-pegjs"); +const execBinary = require("../exec-binary"); const itemsToObject = require("../items-to-object"); /* FIXME: Error handling, eg. device not found errors */ diff --git a/src/packages/exec-smartctl/parsers/commands/attributes.pegjs b/src/packages/exec-smartctl/parsers/commands/attributes.pegjs index bbd57f0..27f1a9f 100644 --- a/src/packages/exec-smartctl/parsers/commands/attributes.pegjs +++ b/src/packages/exec-smartctl/parsers/commands/attributes.pegjs @@ -2,8 +2,9 @@ import { Integer } from "../../../peg-number" import { HexInteger } from "../../../peg-hex-number" import { Newline } from "../../../peg-newline" import { SameLine as _ } from "../../../peg-whitespace" +import { RestOfLine } from "../../../peg-rest-of-line" -import { RestOfLine, IdentifierValue } from "../primitives" +import { IdentifierValue } from "../primitives" import { Header } from "../shared" { diff --git a/src/packages/exec-smartctl/parsers/commands/info.pegjs b/src/packages/exec-smartctl/parsers/commands/info.pegjs index 02a98ca..af55576 100644 --- a/src/packages/exec-smartctl/parsers/commands/info.pegjs +++ b/src/packages/exec-smartctl/parsers/commands/info.pegjs @@ -2,8 +2,9 @@ import { Integer } from "../../../peg-number" import { CommaDelimitedInteger as GroupedNumber } from "../../../peg-grouped-number" import { Newline } from "../../../peg-newline" import { SameLine as _ } from "../../../peg-whitespace" +import { RestOfLine } from "../../../peg-rest-of-line" -import { RestOfLine, BytesValue } from "../primitives" +import { BytesValue } from "../primitives" import { Header } from "../shared" { diff --git a/src/packages/exec-smartctl/parsers/commands/scan.pegjs b/src/packages/exec-smartctl/parsers/commands/scan.pegjs index 9084b51..ed8a2ee 100644 --- a/src/packages/exec-smartctl/parsers/commands/scan.pegjs +++ b/src/packages/exec-smartctl/parsers/commands/scan.pegjs @@ -1,6 +1,5 @@ import { SameLine as _ } from "../../../peg-whitespace" - -import { RestOfLine } from "../primitives" +import { RestOfLine } from "../../../peg-rest-of-line" RootScan = devices:ScanDevice* { diff --git a/src/packages/exec-smartctl/parsers/primitives.pegjs b/src/packages/exec-smartctl/parsers/primitives.pegjs index 72e7e2c..49bd098 100644 --- a/src/packages/exec-smartctl/parsers/primitives.pegjs +++ b/src/packages/exec-smartctl/parsers/primitives.pegjs @@ -6,11 +6,6 @@ import { CommaDelimitedInteger as GroupedInteger } from "../../peg-grouped-numbe const {B} = require("../../unit-bytes-iec"); } -RestOfLine - = content:$[^\n]+ Newline { - return content; - } - BytesValue = value:GroupedInteger { return B(value); diff --git a/src/packages/exec-smartctl/parsers/shared.pegjs b/src/packages/exec-smartctl/parsers/shared.pegjs index 5fba5b5..4cb1960 100644 --- a/src/packages/exec-smartctl/parsers/shared.pegjs +++ b/src/packages/exec-smartctl/parsers/shared.pegjs @@ -1,6 +1,5 @@ import { Newline } from "../../peg-newline" - -import { RestOfLine } from "./primitives" +import { RestOfLine } from "../../peg-rest-of-line" Header 'header' = "smartctl " versionString:RestOfLine "Copyright" copyrightStatement:RestOfLine Newline { diff --git a/src/packages/make-units/index.js b/src/packages/make-units/index.js index 05ecc93..6dc57fd 100644 --- a/src/packages/make-units/index.js +++ b/src/packages/make-units/index.js @@ -4,6 +4,8 @@ toDisplay conversion between unit scales (eg. IEC -> metric bytes) ensure NaN is handled correctly +Track the originally-constructed value internally, so that stacked conversions can be done losslessly? + Additionally perhaps an isExact method that returns whether the current representation was the original one? */ const util = require("util"); diff --git a/src/packages/map-maybe-array/index.js b/src/packages/map-maybe-array/index.js new file mode 100644 index 0000000..255cb05 --- /dev/null +++ b/src/packages/map-maybe-array/index.js @@ -0,0 +1,9 @@ +"use strict"; + +module.exports = function mapMaybeArray(value, handler) { + if (Array.isArray(value)) { + return value.map(handler); + } else { + return handler(value); + } +}; diff --git a/src/packages/parse-int-strict/index.js b/src/packages/parse-int-strict/index.js new file mode 100644 index 0000000..ac61248 --- /dev/null +++ b/src/packages/parse-int-strict/index.js @@ -0,0 +1,14 @@ +"use strict"; + +const integerRegex = /^-?[0-9]+(?:e[0-9]+)?$/; + +// TODO: Other bases than 10 +module.exports = function parseIntStrict(number) { + if (typeof number === "number" && Number.isInteger(number)) { + return number; + } else if (typeof number === "string" && integerRegex.test(number)) { + return parseInt(number); + } else { + throw new TypeError(`Input is not an integer or integer string`); + } +}; diff --git a/src/packages/parse-mount-options/index.js b/src/packages/parse-mount-options/index.js index 1d83b40..7d23e44 100644 --- a/src/packages/parse-mount-options/index.js +++ b/src/packages/parse-mount-options/index.js @@ -325,6 +325,10 @@ let mountOptionMap = { [Include]: ["fat"] /* FIXME */ }, + udf: { + // https://www.kernel.org/doc/Documentation/filesystems/udf.txt + // TODO + }, devpts: { uid: { newPTYOwnerId: Value }, gid: { newPTYGroupId: Value }, @@ -408,6 +412,14 @@ let mountOptionMap = { // TODO [Include]: [ "fuse" ] }, + "fuse.fuseiso": { + // TODO + [Include]: [ "fuse" ] + }, + "fuse.portal": { + // TODO + [Include]: [ "fuse" ] + }, fusectl: { // TODO } diff --git a/src/packages/peg-rest-of-line/index.pegjs b/src/packages/peg-rest-of-line/index.pegjs new file mode 100644 index 0000000..9aa011c --- /dev/null +++ b/src/packages/peg-rest-of-line/index.pegjs @@ -0,0 +1,6 @@ +import Newline from "../peg-newline" + +RestOfLine + = content:$[^\n]+ Newline { + return content; + } diff --git a/src/packages/text-parser-json/index.js b/src/packages/text-parser-json/index.js index 4b4ee9a..8fdd759 100644 --- a/src/packages/text-parser-json/index.js +++ b/src/packages/text-parser-json/index.js @@ -1,10 +1,27 @@ "use strict"; -module.exports = function createJsonParser() { +const { chain } = require("error-chain"); +const ParseError = require("../text-parser"); + +module.exports = function createJsonParser(resultMapper) { return { supportsStreams: false, parse: function (text) { - return JSON.parse(text); + try { + let parsed = JSON.parse(text); + + if (resultMapper != null) { + return resultMapper(parsed); + } else { + return parsed; + } + } catch (error) { + if (error instanceof SyntaxError) { + throw chain(error, ParseError, "JSON parsing failed with a syntax error"); + } else { + throw error; + } + } } }; }; diff --git a/src/packages/text-parser-pegjs/index.js b/src/packages/text-parser-pegjs/index.js index 829a559..59e4e00 100644 --- a/src/packages/text-parser-pegjs/index.js +++ b/src/packages/text-parser-pegjs/index.js @@ -6,7 +6,7 @@ const moduleEval = require("eval"); const vm = require("vm"); const asExpression = require("as-expression"); const { chain } = require("error-chain"); -const textParser = require("../text-parser"); +const { ParseError } = require("../text-parser"); const { validateOptions } = require("@validatem/core"); const isString = require("@validatem/is-string"); @@ -63,7 +63,7 @@ module.exports = function createPegParser(_options) { return parser.parse(text); } catch (error) { if (error.name === "SyntaxError") { - throw chain(error, textParser.NoResult, "Parsing output failed"); + throw chain(error, ParseError, "Parsing output failed"); } else { throw error; } diff --git a/src/packages/text-parser-regex/index.js b/src/packages/text-parser-regex/index.js new file mode 100644 index 0000000..b40b200 --- /dev/null +++ b/src/packages/text-parser-regex/index.js @@ -0,0 +1,27 @@ +"use strict"; + +const execall = require("execall"); +const { ParseError } = require("../text-parser"); + +module.exports = function createRegexParser(regex, resultMapper) { + return { + supportsStreams: false, + parse: function (text) { + let matches = execall(regex, text); + + if (matches.length > 0) { + let matchResult = (regex.global === true) + ? matches + : matches[0]; + + if (resultMapper != null) { + return resultMapper(matchResult); + } else { + return matchResult; + } + } else { + throw new ParseError(`Input did not match regular expression ${regex}`); + } + } + }; +}; diff --git a/src/packages/text-parser/index.js b/src/packages/text-parser/index.js index 612df91..c08a5c4 100644 --- a/src/packages/text-parser/index.js +++ b/src/packages/text-parser/index.js @@ -7,5 +7,24 @@ module.exports = { return parser.parse(text); }, // FIXME: Force global implementation! - NoResult: errorChain.create("NoResult") + ParseError: errorChain.create("ParseError"), + errorResult: function (error) { + // FIXME: Validatem + if (!(error instanceof Error)) { + throw new Error(`Attempted to initialize an errorResult with a value that is not an Error; this is invalid`); + } + + return { + __textParser_isErrorResult: true, + get: function () { + return error; + }, + throw: function () { + throw error; + } + }; + }, + isErrorResult: function (value) { + return (value != null && value.__textParser_isErrorResult === true); + } }; diff --git a/src/packages/treecutter/index.js b/src/packages/treecutter/index.js index bd7856c..340272c 100644 --- a/src/packages/treecutter/index.js +++ b/src/packages/treecutter/index.js @@ -2,6 +2,7 @@ const assureArray = require("assure-array"); const shallowMerge = require("../shallow-merge"); +const syncpipe = require("syncpipe"); const { validateArguments } = require("@validatem/core"); const required = require("@validatem/required"); @@ -112,5 +113,16 @@ module.exports = { } return topLevel; + }, + map: function (tree, mapFunc) { + return syncpipe(tree, [ + (_) => this.flatten(_), + (_) => _.map((item) => ({ + ... mapFunc(item), + _treecutterDepth: item._treecutterDepth, + _treecutterSequenceNumber: item._treecutterSequenceNumber, + })), + (_) => this.rebuild(_) + ]); } }; diff --git a/src/routes/resource-pools.js b/src/routes/resource-pools.js new file mode 100644 index 0000000..8c245b0 --- /dev/null +++ b/src/routes/resource-pools.js @@ -0,0 +1,13 @@ +'use strict'; + +const Promise = require("bluebird"); + +module.exports = function({db}) { + let router = require("express-promise-router")(); + + router.get("/storage", (req, res) => { + res.render("resource-pools/storage/list"); + }); + + return router; +}; diff --git a/src/schemas/main.gql b/src/schemas/main.gql index 07b5212..1f231ca 100644 --- a/src/schemas/main.gql +++ b/src/schemas/main.gql @@ -368,6 +368,39 @@ type LVMVolumeGroup { name: String! } +interface Image { + id: String! + name: String! + description: String + thumbnail: String + originalSource: String! + # The below are only available after the image has been downloaded + filesize: ByteSize + storagePath: String +} + +type InstallationMedium implements Image { + id: String! + name: String! + description: String + thumbnail: String + originalSource: String! + # The below are only available after the image has been downloaded + filesize: ByteSize + storagePath: String +} + +type VMImage implements Image { + id: String! + name: String! + description: String + thumbnail: String + originalSource: String! + # The below are only available after the image has been downloaded + filesize: ByteSize + storagePath: String +} + type HardwareQuery { drives(paths: [String]): [PhysicalDrive!]! } @@ -377,9 +410,16 @@ type LVMQuery { volumeGroups: [LVMVolumeGroup!]! } +type ImagesQuery { + installationMedia: [InstallationMedium!]! + vmImages: [VMImage!]! +} + type ResourcesQuery { blockDevices: [BlockDevice!]! lvm: LVMQuery + # TODO: RAID + images: ImagesQuery } type Query { diff --git a/src/test-wrapper.js b/src/test-wrapper.js index ed0189e..0cf5511 100644 --- a/src/test-wrapper.js +++ b/src/test-wrapper.js @@ -2,6 +2,7 @@ const Promise = require("bluebird"); const util = require("util"); +const { render, getContext } = require("error-chain"); const lsblk = require("./packages/exec-lsblk"); const lvm = require("./packages/exec-lvm"); @@ -10,9 +11,10 @@ const findmnt = require("./packages/exec-findmnt"); const nvmeCli = require("./packages/exec-nvme-cli"); return Promise.try(() => { - // return lvm.getVersions(); + return lvm.getVersions(); // return lvm.getPhysicalVolumes(); // return lvm.createPhysicalVolume({ devicePath: "/dev/loop0" }); + // return lvm.createPhysicalVolume({ devicePath: "/dev/loopasdfasdfasdf" }); // return lvm.createPhysicalVolume({ devicePath: process.argv[2] }); // return lvm.createVolumeGroup({ name: "not a valid name", physicalVolumes: ["/dev/loop0", "/dev/asdfasdfasdf", "/dev/gasdfgasdf"] }); // return lvm.createVolumeGroup({ name: "vg-name", physicalVolumes: ["/dev/loop0", "/dev/asdfasdfasdf", "/dev/gasdfgasdf"] }); @@ -26,7 +28,7 @@ return Promise.try(() => { // return lvm.addVolumeToVolumeGroup({ volumeGroup: "vg-name", physicalVolume: "/dev/loop1" }); // return lvm.destroyPhysicalVolume({ devicePath: "/dev/loop0" }); // return lsblk(); - return smartctl.scan(); + // return smartctl.scan(); // return smartctl.info({ devicePath: "/dev/sda" }) // return smartctl.info({ devicePath: process.argv[2] }) // return smartctl.attributes({ devicePath: process.argv[2] }); @@ -35,16 +37,21 @@ return Promise.try(() => { }).then((result) => { console.log(util.inspect(result, {colors: true, depth: null})); }).catch((err) => { - if (err.getAllContext != null) { - let context = err.getAllContext() - console.log(context); - console.log("####################\n"); - } + // if (err.getAllContext != null) { + // let context = err.getAllContext() + // console.log(context); + // console.log("####################\n"); + // } - if (err.showChain != null) { - // console.log(err.showChain({ allStacktraces: true })); - console.log(err.showChain({})); - } else { - console.log(err.stack); - } + console.log(getContext(err)); + console.log("################\n"); + console.log(render(err)); + + + // if (err.showChain != null) { + // // console.log(err.showChain({ allStacktraces: true })); + // console.log(err.showChain({})); + // } else { + // console.log(err.stack); + // } }); diff --git a/src/views/disk-images/installation-media/list.jsx b/src/views/disk-images/installation-media/list.jsx new file mode 100644 index 0000000..8ab7572 --- /dev/null +++ b/src/views/disk-images/installation-media/list.jsx @@ -0,0 +1,72 @@ +"use strict"; + +const React = require("react"); +const classnames = require("classnames"); +const syncpipe = require("syncpipe"); +const splitFilterN = require("split-filter-n"); +const gql = require("../../../packages/graphql-interface/tag"); +const { B } = require("../../../packages/unit-bytes-iec"); + +const Layout = require("../layout"); + +// FIXME: For disk image feeds (eg. third-party image providers), have the admin specify a prefix which gets colon-prefixed to every named image in that feed (so that images may be auto-updated) + +module.exports = { + query: gql` + query { + images { + installationMedia { + id + name + filesize + description + thumbnail + originalSource # URL/path + storagePath + } + } + } + `, + template: function StorageDeviceList({data}) { + return ( + + + + + + + + + + {data.images.installationMedia.map((image) => { + return ( + + + + + + ); + })} +
NameDescriptionSizeActions
+ {(image.thumbnail != null) + ? {`${image.name} + : null + } + {image.name} + {image.description} + +
+
Source
+
{image.originalSource}
+ +
Stored at
+
{image.storagePath}
+
+
+
+ ); + } +}; diff --git a/src/views/disk-images/layout.jsx b/src/views/disk-images/layout.jsx new file mode 100644 index 0000000..546a503 --- /dev/null +++ b/src/views/disk-images/layout.jsx @@ -0,0 +1,23 @@ +"use strict"; + +const React = require("react"); + +const MainLayout = require("../layout"); +const MenuItem = require("../components/menu-item"); + +const prefixTitle = require("../../packages/maybe-prefix"); + +function Submenu() { + return (<> + VM Images + Installation Media + ); +} + +module.exports = function DiskImagesLayout({ children, title }) { + return ( + } title={prefixTitle("Disk Images >", title)}> + {children} + + ); +}; diff --git a/src/views/hardware/layout.jsx b/src/views/hardware/layout.jsx index b5d17e7..eefddbd 100644 --- a/src/views/hardware/layout.jsx +++ b/src/views/hardware/layout.jsx @@ -11,6 +11,8 @@ function Submenu() { return (<> System Information Storage Devices + LVM + RAID Network Interfaces ); } diff --git a/src/views/hardware/storage-devices/list.jsx b/src/views/hardware/storage-devices/list.jsx index 62ad8bf..0e2c776 100644 --- a/src/views/hardware/storage-devices/list.jsx +++ b/src/views/hardware/storage-devices/list.jsx @@ -2,10 +2,25 @@ const React = require("react"); const classnames = require("classnames"); -const gql = require("../../../packages/graphql-interface/tag"); +const syncpipe = require("syncpipe"); +const splitFilterN = require("split-filter-n"); +const { B } = require("../../../packages/unit-bytes-iec"); +const treecutter = require("../../../packages/treecutter"); const Layout = require("../layout"); +function sum(values) { + return values.reduce((total, value) => total + value, 0); +} + +function sumDriveSizes(drives) { + return syncpipe(drives, [ + (_) => _.map((drive) => drive.size.toB().amount), + (_) => sum(_), + (_) => B(_) + ]); +} + function Indented({ depth, children }) { return (
@@ -52,11 +67,12 @@ function PartitionEntry({partition, isLast}) { } function DriveEntry({drive}) { - let hasPartitions = (drive.partitions.length > 0); + let flattenedPartitions = treecutter.flatten(drive.partitions); + let hasPartitions = (flattenedPartitions.length > 0); return (<> - + {drive.path} {drive.size.toDisplay(2).toString()} @@ -70,48 +86,66 @@ function DriveEntry({drive}) { {drive.modelFamily} {drive.firmwareVersion} - {drive.partitions.map((partition, i) => { - let isLast = (i === drive.partitions.length - 1); + {flattenedPartitions.map((partition, i) => { + let isLast = (i === flattenedPartitions.length - 1); return ; })} ); } +function TallyRow({ label, rowClass, labelClass, children }) { + return ( + + {label} + {children} + + + ); +} + module.exports = { - query: gql` - query { - hardware { - drives { - path - smartHealth - size - rpm - serialNumber - model - modelFamily - firmwareVersion - - blockDevice { - name - } + query: { + hardware: { + drives: { + path: true, + smartHealth: true, + size: true, + rpm: true, + serialNumber: true, + model: true, + modelFamily: true, + firmwareVersion: true, - partitions: allBlockDevices { - _treecutterDepth - _treecutterSequenceNumber + blockDevice: { + name: true + }, - name - size + partitions: { + $key: "allBlockDevices", + name: true, + size: true, - mounts { - mountpoint - } + mounts: { + mountpoint: true + }, + + children: { + $recurse: true, + $recurseLimit: Infinity, // 3 by default } } } } - `, + }, template: function StorageDeviceList({data}) { + let drivesByStatus = splitFilterN(data.hardware.drives, [ "HEALTHY", "DETERIORATING", "FAILING" ], (drive) => drive.smartHealth); + + let totalStorage = sumDriveSizes(data.hardware.drives); + let totalHealthyStorage = sumDriveSizes(drivesByStatus.HEALTHY); + let totalAtRiskStorage = sumDriveSizes(drivesByStatus.DETERIORATING); + let totalFailingStorage = sumDriveSizes(drivesByStatus.FAILING); + return ( @@ -126,6 +160,18 @@ module.exports = { {data.hardware.drives.map((drive) => )} + + {totalStorage.toDisplay(2).toString()} + + + {totalHealthyStorage.toDisplay(2).toString()} + + + {totalAtRiskStorage.toDisplay(2).toString()} + + + {totalFailingStorage.toDisplay(2).toString()} +
Firmware version
); diff --git a/src/views/resource-pools/layout.jsx b/src/views/resource-pools/layout.jsx new file mode 100644 index 0000000..6f652a0 --- /dev/null +++ b/src/views/resource-pools/layout.jsx @@ -0,0 +1,23 @@ +"use strict"; + +const React = require("react"); + +const MainLayout = require("../layout"); +const MenuItem = require("../components/menu-item"); + +const prefixTitle = require("../../packages/maybe-prefix"); + +function Submenu() { + return (<> + Storage Pools + Network Pools + ); +} + +module.exports = function HardwareLayout({ children, title }) { + return ( + } title={prefixTitle("Resource Pools >", title)}> + {children} + + ); +}; diff --git a/src/views/resource-pools/storage/list.jsx b/src/views/resource-pools/storage/list.jsx new file mode 100644 index 0000000..9342366 --- /dev/null +++ b/src/views/resource-pools/storage/list.jsx @@ -0,0 +1,29 @@ +"use strict"; + +const React = require("react"); +const gql = require("../../../packages/graphql-interface/tag"); + +const Layout = require("../layout"); + +module.exports = { + query: gql` + query { + resources { + storagePools { + id + type + name + path + isLocal + } + } + } + `, + template: function StorageDeviceList({data}) { + return ( + + Storage pools go here + + ); + } +}; diff --git a/src/wrappers/smartctl/index.js b/src/wrappers/smartctl/index.js deleted file mode 100644 index ade39b7..0000000 --- a/src/wrappers/smartctl/index.js +++ /dev/null @@ -1,58 +0,0 @@ -"use strict"; - -const Promise = require("bluebird"); -const path = require("path"); - -const execBinary = require("../exec-binary"); -const createPegParser = require("../text-parser-pegjs"); -const itemsToObject = require("../../packages/items-to-object"); - -/* FIXME: Error handling, eg. device not found errors */ - -function outputParser(rootRule) { - return createPegParser({ - grammarFile: path.join(__dirname, "./parser.pegjs"), - options: { - allowedStartRules: [ rootRule ] - } - }); -} - -module.exports = { - attributes: function ({ devicePath }) { - return Promise.try(() => { - return execBinary("smartctl", [devicePath]) - .asRoot() - .withFlags({ attributes: true }) - .requireOnStdout(outputParser("RootAttributes")) - .execute(); - }).then((output) => { - // NOTE: Ignore the header, for now - return output.result.attributes; - }); - }, - info: function ({ devicePath }) { - return Promise.try(() => { - return execBinary("smartctl", [devicePath]) - .asRoot() - .withFlags({ info: true }) - .requireOnStdout(outputParser("RootInfo")) - .execute(); - }).then((output) => { - // NOTE: Ignore the header, for now - return itemsToObject(output.result.fields); - }); - }, - scan: function () { - return Promise.try(() => { - return execBinary("smartctl") - .asRoot() - .withFlags({ scan: true }) - .requireOnStdout(outputParser("RootScan")) - .execute(); - }).then((output) => { - // NOTE: Ignore the header, for now - return output.result.devices; - }); - } -}; diff --git a/try/api.js b/try/api.js new file mode 100644 index 0000000..dd35e9c --- /dev/null +++ b/try/api.js @@ -0,0 +1,72 @@ +"use strict"; + +require("@babel/register"); +const Promise = require("bluebird"); +const createAPI = require("../src/api"); + +// const query = { +// hardware: { +// drives: { +// path: true, +// smartHealth: true, +// size: true, +// rpm: true, +// serialNumber: true, +// model: true, +// modelFamily: true, +// firmwareVersion: true, + +// blockDevice: { +// name: true +// }, + +// partitions: { +// $key: "allBlockDevices", +// name: true, +// size: true, + +// mounts: { +// mountpoint: true +// }, + +// children: { +// $recurse: true, +// $recurseLimit: Infinity, // 3 by default +// } +// } +// } +// } +// }; + +const query = { + resources: { + lvm: { + physicalVolumes: { + path: true, + totalSpace: true, + freeSpace: true, + status: true, + + volumeGroup: { + name: true, + totalSpace: true, + freeSpace: true, + logicalVolumeCount: true, + mode: true, + + physicalVolumes: { + path: true + } + } + } + } + } +}; + +const api = createAPI(); + +return Promise.try(() => { + return api.query(query); +}).then((result) => { + console.dir(result, { depth: null }); +}); diff --git a/try/lib.js b/try/lib.js new file mode 100644 index 0000000..62b576d --- /dev/null +++ b/try/lib.js @@ -0,0 +1,15 @@ +"use strict"; + +require("@babel/register"); +const Promise = require("bluebird"); +const execLvm = require("../src/packages/exec-lvm"); +const errorChain = require("error-chain"); + +return Promise.try(() => { + // return execLvm.getVolumeGroups(); + return execLvm.getLogicalVolumes(); +}).then((result) => { + console.dir(result, { depth: null }); +}).catch((error) => { + console.error(errorChain.render(error)); +}); diff --git a/try/source.js b/try/source.js new file mode 100644 index 0000000..8fd906e --- /dev/null +++ b/try/source.js @@ -0,0 +1,14 @@ +"use strict"; + +require("@babel/register"); +const Promise = require("bluebird"); +const createLoaders = require("../src/api/loaders"); +const All = require("../src/packages/graphql-interface/symbols/all"); + +let loaders = createLoaders(); + +return Promise.try(() => { + return loaders.lvmPhysicalVolumes.load(All); +}).then((result) => { + console.dir(result, { depth: null }); +}); diff --git a/yarn.lock b/yarn.lock index 43a8d8a..eef1ab4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,223 +2,204 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" + integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== dependencies: - "@babel/highlight" "^7.10.4" + "@babel/highlight" "^7.12.13" -"@babel/compat-data@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.1.tgz#d7386a689aa0ddf06255005b4b991988021101a0" - integrity sha512-725AQupWJZ8ba0jbKceeFblZTY90McUBWMwHhkFQ9q1zKPJ95GUktljFcgcsIVwRnTnRKlcYzfiNImg5G9m6ZQ== +"@babel/compat-data@^7.13.0", "@babel/compat-data@^7.13.5": + version "7.13.6" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.6.tgz#11972d07db4c2317afdbf41d6feb3a730301ef4e" + integrity sha512-VhgqKOWYVm7lQXlvbJnWOzwfAQATd2nV52koT0HZ/LdDH0m4DUDwkKYsH+IwpXb+bKPyBJzawA4I6nBKqZcpQw== "@babel/core@^7.0.0", "@babel/core@^7.8.4": - version "7.12.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.3.tgz#1b436884e1e3bff6fb1328dc02b208759de92ad8" - integrity sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.1" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helpers" "^7.12.1" - "@babel/parser" "^7.12.3" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.12.1" - "@babel/types" "^7.12.1" + version "7.13.1" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.1.tgz#7ddd027176debe40f13bb88bac0c21218c5b1ecf" + integrity sha512-FzeKfFBG2rmFtGiiMdXZPFt/5R5DXubVi82uYhjGX4Msf+pgYQMCFIqFXZWs5vbIYbf14VeBIgdGI03CDOOM1w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.13.0" + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-transforms" "^7.13.0" + "@babel/helpers" "^7.13.0" + "@babel/parser" "^7.13.0" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.0" convert-source-map "^1.7.0" debug "^4.1.0" - gensync "^1.0.0-beta.1" + gensync "^1.0.0-beta.2" json5 "^2.1.2" lodash "^4.17.19" - resolve "^1.3.2" - semver "^5.4.1" + semver "7.0.0" source-map "^0.5.0" -"@babel/generator@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.1.tgz#0d70be32bdaa03d7c51c8597dda76e0df1f15468" - integrity sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg== +"@babel/generator@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.0.tgz#bd00d4394ca22f220390c56a0b5b85568ec1ec0c" + integrity sha512-zBZfgvBB/ywjx0Rgc2+BwoH/3H+lDtlgD4hBOpEv5LxRnYsm/753iRuLepqnYlynpjC3AdQxtxsoeHJoEEwOAw== dependencies: - "@babel/types" "^7.12.1" + "@babel/types" "^7.13.0" jsesc "^2.5.1" source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" - integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" - integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-builder-react-jsx-experimental@^7.12.1": - version "7.12.4" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.12.4.tgz#55fc1ead5242caa0ca2875dcb8eed6d311e50f48" - integrity sha512-AjEa0jrQqNk7eDQOo0pTfUOwQBMF+xVqrausQwT9/rTKy0g04ggFNaJpaE09IQMn9yExluigWMJcj0WC7bq+Og== +"@babel/helper-annotate-as-pure@^7.10.4", "@babel/helper-annotate-as-pure@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" + integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-module-imports" "^7.12.1" - "@babel/types" "^7.12.1" + "@babel/types" "^7.12.13" -"@babel/helper-builder-react-jsx@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz#8095cddbff858e6fa9c326daee54a2f2732c1d5d" - integrity sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc" + integrity sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/helper-explode-assignable-expression" "^7.12.13" + "@babel/types" "^7.12.13" -"@babel/helper-compilation-targets@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.1.tgz#310e352888fbdbdd8577be8dfdd2afb9e7adcf50" - integrity sha512-jtBEif7jsPwP27GPHs06v4WBV0KrE8a/P7n0N0sSvHn2hwUCYnolP/CLmz51IzAW4NlN+HuoBtb9QcwnRo9F/g== +"@babel/helper-compilation-targets@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.0.tgz#c9cf29b82a76fd637f0faa35544c4ace60a155a1" + integrity sha512-SOWD0JK9+MMIhTQiUVd4ng8f3NXhPVQvTv7D3UN4wbp/6cAHnB2EmMaU1zZA2Hh1gwme+THBrVSqTFxHczTh0Q== dependencies: - "@babel/compat-data" "^7.12.1" - "@babel/helper-validator-option" "^7.12.1" - browserslist "^4.12.0" - semver "^5.5.0" + "@babel/compat-data" "^7.13.0" + "@babel/helper-validator-option" "^7.12.17" + browserslist "^4.14.5" + semver "7.0.0" -"@babel/helper-create-class-features-plugin@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz#3c45998f431edd4a9214c5f1d3ad1448a6137f6e" - integrity sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w== +"@babel/helper-create-class-features-plugin@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.0.tgz#28d04ad9cfbd1ed1d8b988c9ea7b945263365846" + integrity sha512-twwzhthM4/+6o9766AW2ZBHpIHPSGrPGk1+WfHiu13u/lBnggXGNYCpeAyVfNwGDKfkhEDp+WOD/xafoJ2iLjA== dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-member-expression-to-functions" "^7.12.1" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/helper-replace-supers" "^7.12.1" - "@babel/helper-split-export-declaration" "^7.10.4" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-member-expression-to-functions" "^7.13.0" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/helper-replace-supers" "^7.13.0" + "@babel/helper-split-export-declaration" "^7.12.13" -"@babel/helper-create-regexp-features-plugin@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz#18b1302d4677f9dc4740fe8c9ed96680e29d37e8" - integrity sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA== +"@babel/helper-create-regexp-features-plugin@^7.12.13": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7" + integrity sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-regex" "^7.10.4" + "@babel/helper-annotate-as-pure" "^7.12.13" regexpu-core "^4.7.1" -"@babel/helper-define-map@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30" - integrity sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ== - dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/types" "^7.10.5" - lodash "^4.17.19" +"@babel/helper-define-polyfill-provider@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.2.tgz#619f01afe1deda460676c25c463b42eaefdb71a2" + integrity sha512-hWeolZJivTNGHXHzJjQz/NwDaG4mGXf22ZroOP8bQYgvHNzaQ5tylsVbAcAS2oDjXBwpu8qH2I/654QFS2rDpw== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" -"@babel/helper-explode-assignable-expression@^7.10.4": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz#8006a466695c4ad86a2a5f2fb15b5f2c31ad5633" - integrity sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA== +"@babel/helper-explode-assignable-expression@^7.12.13": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz#17b5c59ff473d9f956f40ef570cf3a76ca12657f" + integrity sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA== dependencies: - "@babel/types" "^7.12.1" + "@babel/types" "^7.13.0" -"@babel/helper-function-name@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" - integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== +"@babel/helper-function-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" + integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== dependencies: - "@babel/helper-get-function-arity" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/helper-get-function-arity" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/types" "^7.12.13" -"@babel/helper-get-function-arity@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" - integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== +"@babel/helper-get-function-arity@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" + integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== dependencies: - "@babel/types" "^7.10.4" + "@babel/types" "^7.12.13" -"@babel/helper-hoist-variables@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" - integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA== +"@babel/helper-hoist-variables@^7.12.13": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz#5d5882e855b5c5eda91e0cadc26c6e7a2c8593d8" + integrity sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g== dependencies: - "@babel/types" "^7.10.4" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.0" -"@babel/helper-member-expression-to-functions@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz#fba0f2fcff3fba00e6ecb664bb5e6e26e2d6165c" - integrity sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ== +"@babel/helper-member-expression-to-functions@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.0.tgz#6aa4bb678e0f8c22f58cdb79451d30494461b091" + integrity sha512-yvRf8Ivk62JwisqV1rFRMxiSMDGnN6KH1/mDMmIrij4jztpQNRoHqqMG3U6apYbGRPJpgPalhva9Yd06HlUxJQ== dependencies: - "@babel/types" "^7.12.1" + "@babel/types" "^7.13.0" -"@babel/helper-module-imports@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz#1644c01591a15a2f084dd6d092d9430eb1d1216c" - integrity sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA== +"@babel/helper-module-imports@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0" + integrity sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g== dependencies: - "@babel/types" "^7.12.1" + "@babel/types" "^7.12.13" -"@babel/helper-module-transforms@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" - integrity sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w== - dependencies: - "@babel/helper-module-imports" "^7.12.1" - "@babel/helper-replace-supers" "^7.12.1" - "@babel/helper-simple-access" "^7.12.1" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/helper-validator-identifier" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.12.1" - "@babel/types" "^7.12.1" +"@babel/helper-module-transforms@^7.12.13", "@babel/helper-module-transforms@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.0.tgz#42eb4bd8eea68bab46751212c357bfed8b40f6f1" + integrity sha512-Ls8/VBwH577+pw7Ku1QkUWIyRRNHpYlts7+qSqBBFCW3I8QteB9DxfcZ5YJpOwH6Ihe/wn8ch7fMGOP1OhEIvw== + dependencies: + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-replace-supers" "^7.13.0" + "@babel/helper-simple-access" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-validator-identifier" "^7.12.11" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.0" lodash "^4.17.19" -"@babel/helper-optimise-call-expression@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" - integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== +"@babel/helper-optimise-call-expression@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" + integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" - integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + "@babel/types" "^7.12.13" -"@babel/helper-regex@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0" - integrity sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg== - dependencies: - lodash "^4.17.19" +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" + integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== -"@babel/helper-remap-async-to-generator@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz#8c4dbbf916314f6047dc05e6a2217074238347fd" - integrity sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A== +"@babel/helper-remap-async-to-generator@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz#376a760d9f7b4b2077a9dd05aa9c3927cadb2209" + integrity sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-wrap-function" "^7.10.4" - "@babel/types" "^7.12.1" + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-wrap-function" "^7.13.0" + "@babel/types" "^7.13.0" -"@babel/helper-replace-supers@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz#f15c9cc897439281891e11d5ce12562ac0cf3fa9" - integrity sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw== +"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.0.tgz#6034b7b51943094cb41627848cb219cb02be1d24" + integrity sha512-Segd5me1+Pz+rmN/NFBOplMbZG3SqRJOBlY+mA0SxAv6rjj7zJqr1AVr3SfzUVTLCv7ZLU5FycOM/SBGuLPbZw== dependencies: - "@babel/helper-member-expression-to-functions" "^7.12.1" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/traverse" "^7.12.1" - "@babel/types" "^7.12.1" + "@babel/helper-member-expression-to-functions" "^7.13.0" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.0" -"@babel/helper-simple-access@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz#32427e5aa61547d38eb1e6eaf5fd1426fdad9136" - integrity sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA== +"@babel/helper-simple-access@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz#8478bcc5cacf6aa1672b251c1d2dde5ccd61a6c4" + integrity sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA== dependencies: - "@babel/types" "^7.12.1" + "@babel/types" "^7.12.13" "@babel/helper-skip-transparent-expression-wrappers@^7.12.1": version "7.12.1" @@ -227,176 +208,175 @@ dependencies: "@babel/types" "^7.12.1" -"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" - integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== +"@babel/helper-split-export-declaration@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" + integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== dependencies: - "@babel/types" "^7.11.0" + "@babel/types" "^7.12.13" -"@babel/helper-validator-identifier@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" - integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== +"@babel/helper-validator-identifier@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== -"@babel/helper-validator-option@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz#175567380c3e77d60ff98a54bb015fe78f2178d9" - integrity sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A== +"@babel/helper-validator-option@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" + integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== -"@babel/helper-wrap-function@^7.10.4": - version "7.12.3" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz#3332339fc4d1fbbf1c27d7958c27d34708e990d9" - integrity sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow== +"@babel/helper-wrap-function@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz#bdb5c66fda8526ec235ab894ad53a1235c79fcc4" + integrity sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA== dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/helper-function-name" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.0" -"@babel/helpers@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.1.tgz#8a8261c1d438ec18cb890434df4ec768734c1e79" - integrity sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g== +"@babel/helpers@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.13.0.tgz#7647ae57377b4f0408bf4f8a7af01c42e41badc0" + integrity sha512-aan1MeFPxFacZeSz6Ld7YZo5aPuqnKlD7+HZY75xQsueczFccP9A7V05+oe0XpLwHK3oLorPe9eaAUljL7WEaQ== dependencies: - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.12.1" - "@babel/types" "^7.12.1" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.0" -"@babel/highlight@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" - integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== +"@babel/highlight@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.12.13.tgz#8ab538393e00370b26271b01fa08f7f27f2e795c" + integrity sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" + "@babel/helper-validator-identifier" "^7.12.11" chalk "^2.0.0" js-tokens "^4.0.0" "@babel/node@^7.8.4": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/node/-/node-7.12.1.tgz#66b5ae07b6bf76636e83906405fcfa69bab16c8a" - integrity sha512-S4tWOqo3V3ZuJjJNuheSMFIlDaQd6kbvqnQll+tdJTirksTdFHrauQf3d/xW4rgAM+mHJpxTZMHVeIXjCiDViw== + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/node/-/node-7.13.0.tgz#300ea0f4d516a7586c76797404b951c709bfa821" + integrity sha512-WJcD7YMnTs7qFo45lstvAOR7Sa370sydddnF8JNpD5xen3BwMlhHd0XVVDIB0crYIlSav/W/+dVw+D1wJQUZBQ== dependencies: - "@babel/register" "^7.12.1" + "@babel/register" "^7.13.0" commander "^4.0.1" core-js "^3.2.1" lodash "^4.17.19" node-environment-flags "^1.0.5" regenerator-runtime "^0.13.4" - resolve "^1.13.1" v8flags "^3.1.1" -"@babel/parser@^7.10.4", "@babel/parser@^7.12.1", "@babel/parser@^7.12.3", "@babel/parser@^7.7.0": - version "7.12.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.3.tgz#a305415ebe7a6c7023b40b5122a0662d928334cd" - integrity sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw== +"@babel/parser@^7.12.13", "@babel/parser@^7.13.0", "@babel/parser@^7.7.0": + version "7.13.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.4.tgz#340211b0da94a351a6f10e63671fa727333d13ab" + integrity sha512-uvoOulWHhI+0+1f9L4BoozY7U5cIkZ9PgJqvb041d6vypgUmtVPG4vmGm4pSggjl8BELzvHyUeJSUyEMY6b+qA== -"@babel/plugin-proposal-async-generator-functions@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz#dc6c1170e27d8aca99ff65f4925bd06b1c90550e" - integrity sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A== +"@babel/plugin-proposal-async-generator-functions@^7.13.5": + version "7.13.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.5.tgz#69e3fbb9958949b09036e27b26eba1aafa1ba3db" + integrity sha512-8cErJEDzhZgNKzYyjCKsHuyPqtWxG8gc9h4OFSUDJu0vCAOsObPU2LcECnW0kJwh/b+uUz46lObVzIXw0fzAbA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-remap-async-to-generator" "^7.12.1" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-remap-async-to-generator" "^7.13.0" "@babel/plugin-syntax-async-generators" "^7.8.0" -"@babel/plugin-proposal-class-properties@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de" - integrity sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w== +"@babel/plugin-proposal-class-properties@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz#146376000b94efd001e57a40a88a525afaab9f37" + integrity sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-create-class-features-plugin" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-proposal-dynamic-import@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz#43eb5c2a3487ecd98c5c8ea8b5fdb69a2749b2dc" - integrity sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ== +"@babel/plugin-proposal-dynamic-import@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.17.tgz#e0ebd8db65acc37eac518fa17bead2174e224512" + integrity sha512-ZNGoFZqrnuy9H2izB2jLlnNDAfVPlGl5NhFEiFe4D84ix9GQGygF+CWMGHKuE+bpyS/AOuDQCnkiRNqW2IzS1Q== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-dynamic-import" "^7.8.0" -"@babel/plugin-proposal-export-namespace-from@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz#8b9b8f376b2d88f5dd774e4d24a5cc2e3679b6d4" - integrity sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw== +"@babel/plugin-proposal-export-namespace-from@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d" + integrity sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz#d45423b517714eedd5621a9dfdc03fa9f4eb241c" - integrity sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw== +"@babel/plugin-proposal-json-strings@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.13.tgz#ced7888a2db92a3d520a2e35eb421fdb7fcc9b5d" + integrity sha512-v9eEi4GiORDg8x+Dmi5r8ibOe0VXoKDeNPYcTTxdGN4eOWikrJfDJCJrr1l5gKGvsNyGJbrfMftC2dTL6oz7pg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-json-strings" "^7.8.0" -"@babel/plugin-proposal-logical-assignment-operators@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz#f2c490d36e1b3c9659241034a5d2cd50263a2751" - integrity sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA== +"@babel/plugin-proposal-logical-assignment-operators@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.13.tgz#575b5d9a08d8299eeb4db6430da6e16e5cf14350" + integrity sha512-fqmiD3Lz7jVdK6kabeSr1PZlWSUVqSitmHEe3Z00dtGTKieWnX9beafvavc32kjORa5Bai4QNHgFDwWJP+WtSQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz#3ed4fff31c015e7f3f1467f190dbe545cd7b046c" - integrity sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.0.tgz#1a96fdf2c43109cfe5568513c5379015a23f5380" + integrity sha512-UkAvFA/9+lBBL015gjA68NvKiCReNxqFLm3SdNKaM3XXoDisA7tMAIX4PmIwatFoFqMxxT3WyG9sK3MO0Kting== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -"@babel/plugin-proposal-numeric-separator@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz#0e2c6774c4ce48be412119b4d693ac777f7685a6" - integrity sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA== +"@babel/plugin-proposal-numeric-separator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" + integrity sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" - integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== +"@babel/plugin-proposal-object-rest-spread@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.0.tgz#8f19ad247bb96bd5ad2d4107e6eddfe0a789937b" + integrity sha512-B4qphdSTp0nLsWcuei07JPKeZej4+Hd22MdnulJXQa1nCcGSBlk8FiqenGERaPZ+PuYhz4Li2Wjc8yfJvHgUMw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.12.1" + "@babel/plugin-transform-parameters" "^7.13.0" -"@babel/plugin-proposal-optional-catch-binding@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz#ccc2421af64d3aae50b558a71cede929a5ab2942" - integrity sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g== +"@babel/plugin-proposal-optional-catch-binding@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.13.tgz#4640520afe57728af14b4d1574ba844f263bcae5" + integrity sha512-9+MIm6msl9sHWg58NvqpNpLtuFbmpFYk37x8kgnGzAHvX35E1FyAwSUt5hIkSoWJFSAH+iwU8bJ4fcD1zKXOzg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz#cce122203fc8a32794296fc377c6dedaf4363797" - integrity sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw== +"@babel/plugin-proposal-optional-chaining@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.0.tgz#75b41ce0d883d19e8fe635fc3f846be3b1664f4d" + integrity sha512-OVRQOZEBP2luZrvEbNSX5FfWDousthhdEoAOpej+Tpe58HFLvqRClT89RauIvBuCDFEip7GW1eT86/5lMy2RNA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-proposal-private-methods@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz#86814f6e7a21374c980c10d38b4493e703f4a389" - integrity sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w== +"@babel/plugin-proposal-private-methods@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz#04bd4c6d40f6e6bbfa2f57e2d8094bad900ef787" + integrity sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q== dependencies: - "@babel/helper-create-class-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-create-class-features-plugin" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz#2a183958d417765b9eae334f47758e5d6a82e072" - integrity sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w== +"@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" + integrity sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-async-generators@^7.8.0": version "7.8.4" @@ -405,12 +385,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz#bcb297c5366e79bebadef509549cd93b04f19978" - integrity sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA== +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-dynamic-import@^7.8.0": version "7.8.3" @@ -426,12 +406,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-flow@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.1.tgz#a77670d9abe6d63e8acadf4c31bb1eb5a506bbdd" - integrity sha512-1lBLLmtxrwpm4VKmtVFselI/P3pX+G63fAtUUt6b2Nzgao77KNDwyuRt90Mj2/9pKobtt68FdvjfqohZjg/FCA== +"@babel/plugin-syntax-flow@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.13.tgz#5df9962503c0a9c918381c929d51d4d6949e7e86" + integrity sha512-J/RYxnlSLXZLVR7wTRsozxKT8qbsx1mNKJzXEEjQ0Kjx1ZACcyHgbanNWNCFtc36IzuWhYWPpvJFFoexoOWFmA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-json-strings@^7.8.0": version "7.8.3" @@ -440,12 +420,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926" - integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== +"@babel/plugin-syntax-jsx@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz#044fb81ebad6698fe62c478875575bcbb9b70f15" + integrity sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" @@ -489,244 +469,228 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz#dd6c0b357ac1bb142d98537450a319625d13d2a0" - integrity sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A== +"@babel/plugin-syntax-top-level-await@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" + integrity sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-arrow-functions@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz#8083ffc86ac8e777fbe24b5967c4b2521f3cb2b3" - integrity sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A== +"@babel/plugin-transform-arrow-functions@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz#10a59bebad52d637a027afa692e8d5ceff5e3dae" + integrity sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-async-to-generator@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz#3849a49cc2a22e9743cbd6b52926d30337229af1" - integrity sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A== +"@babel/plugin-transform-async-to-generator@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz#8e112bf6771b82bf1e974e5e26806c5c99aa516f" + integrity sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg== dependencies: - "@babel/helper-module-imports" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-remap-async-to-generator" "^7.12.1" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-remap-async-to-generator" "^7.13.0" -"@babel/plugin-transform-block-scoped-functions@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz#f2a1a365bde2b7112e0a6ded9067fdd7c07905d9" - integrity sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA== +"@babel/plugin-transform-block-scoped-functions@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4" + integrity sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-block-scoping@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz#f0ee727874b42a208a48a586b84c3d222c2bbef1" - integrity sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w== +"@babel/plugin-transform-block-scoping@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz#f36e55076d06f41dfd78557ea039c1b581642e61" + integrity sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-classes@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz#65e650fcaddd3d88ddce67c0f834a3d436a32db6" - integrity sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog== +"@babel/plugin-transform-classes@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz#0265155075c42918bf4d3a4053134176ad9b533b" + integrity sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-define-map" "^7.10.4" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-replace-supers" "^7.12.1" - "@babel/helper-split-export-declaration" "^7.10.4" + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-replace-supers" "^7.13.0" + "@babel/helper-split-export-declaration" "^7.12.13" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz#d68cf6c9b7f838a8a4144badbe97541ea0904852" - integrity sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg== +"@babel/plugin-transform-computed-properties@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz#845c6e8b9bb55376b1fa0b92ef0bdc8ea06644ed" + integrity sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-destructuring@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz#b9a570fe0d0a8d460116413cb4f97e8e08b2f847" - integrity sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw== +"@babel/plugin-transform-destructuring@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz#c5dce270014d4e1ebb1d806116694c12b7028963" + integrity sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz#a1d16c14862817b6409c0a678d6f9373ca9cd975" - integrity sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA== +"@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad" + integrity sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-duplicate-keys@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz#745661baba295ac06e686822797a69fbaa2ca228" - integrity sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw== +"@babel/plugin-transform-duplicate-keys@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz#6f06b87a8b803fd928e54b81c258f0a0033904de" + integrity sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-exponentiation-operator@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz#b0f2ed356ba1be1428ecaf128ff8a24f02830ae0" - integrity sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug== +"@babel/plugin-transform-exponentiation-operator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz#4d52390b9a273e651e4aba6aee49ef40e80cd0a1" + integrity sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-transform-flow-strip-types@^7.0.0": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz#8430decfa7eb2aea5414ed4a3fa6e1652b7d77c4" - integrity sha512-8hAtkmsQb36yMmEtk2JZ9JnVyDSnDOdlB+0nEGzIDLuK4yR3JcEjfuFPYkdEPSh8Id+rAMeBEn+X0iVEyho6Hg== + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.13.0.tgz#58177a48c209971e8234e99906cb6bd1122addd3" + integrity sha512-EXAGFMJgSX8gxWD7PZtW/P6M+z74jpx3wm/+9pn+c2dOawPpBkUX7BrfyPvo6ZpXbgRIEuwgwDb/MGlKvu2pOg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-flow" "^7.12.1" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-flow" "^7.12.13" -"@babel/plugin-transform-for-of@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz#07640f28867ed16f9511c99c888291f560921cfa" - integrity sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg== +"@babel/plugin-transform-for-of@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz#c799f881a8091ac26b54867a845c3e97d2696062" + integrity sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-function-name@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz#2ec76258c70fe08c6d7da154003a480620eba667" - integrity sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw== +"@babel/plugin-transform-function-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051" + integrity sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ== dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-literals@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz#d73b803a26b37017ddf9d3bb8f4dc58bfb806f57" - integrity sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ== +"@babel/plugin-transform-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz#2ca45bafe4a820197cf315794a4d26560fe4bdb9" + integrity sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-member-expression-literals@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz#496038602daf1514a64d43d8e17cbb2755e0c3ad" - integrity sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg== +"@babel/plugin-transform-member-expression-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz#5ffa66cd59b9e191314c9f1f803b938e8c081e40" + integrity sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-modules-amd@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz#3154300b026185666eebb0c0ed7f8415fefcf6f9" - integrity sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ== +"@babel/plugin-transform-modules-amd@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz#19f511d60e3d8753cc5a6d4e775d3a5184866cc3" + integrity sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ== dependencies: - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-module-transforms" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz#fa403124542636c786cf9b460a0ffbb48a86e648" - integrity sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag== +"@babel/plugin-transform-modules-commonjs@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.0.tgz#276932693a20d12c9776093fdc99c0d9995e34c6" + integrity sha512-j7397PkIB4lcn25U2dClK6VLC6pr2s3q+wbE8R3vJvY6U1UTBBj0n6F+5v6+Fd/UwfDPAorMOs2TV+T4M+owpQ== dependencies: - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-simple-access" "^7.12.1" + "@babel/helper-module-transforms" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-simple-access" "^7.12.13" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz#663fea620d593c93f214a464cd399bf6dc683086" - integrity sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q== +"@babel/plugin-transform-modules-systemjs@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.13.tgz#351937f392c7f07493fc79b2118201d50404a3c5" + integrity sha512-aHfVjhZ8QekaNF/5aNdStCGzwTbU7SI5hUybBKlMzqIMC7w7Ho8hx5a4R/DkTHfRfLwHGGxSpFt9BfxKCoXKoA== dependencies: - "@babel/helper-hoist-variables" "^7.10.4" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-validator-identifier" "^7.10.4" + "@babel/helper-hoist-variables" "^7.12.13" + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-validator-identifier" "^7.12.11" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz#eb5a218d6b1c68f3d6217b8fa2cc82fec6547902" - integrity sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q== +"@babel/plugin-transform-modules-umd@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz#8a3d96a97d199705b9fd021580082af81c06e70b" + integrity sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw== dependencies: - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-module-transforms" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-named-capturing-groups-regex@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz#b407f5c96be0d9f5f88467497fa82b30ac3e8753" - integrity sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q== +"@babel/plugin-transform-named-capturing-groups-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9" + integrity sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.1" + "@babel/helper-create-regexp-features-plugin" "^7.12.13" -"@babel/plugin-transform-new-target@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz#80073f02ee1bb2d365c3416490e085c95759dec0" - integrity sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw== +"@babel/plugin-transform-new-target@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz#e22d8c3af24b150dd528cbd6e685e799bf1c351c" + integrity sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-object-super@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz#4ea08696b8d2e65841d0c7706482b048bed1066e" - integrity sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw== +"@babel/plugin-transform-object-super@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz#b4416a2d63b8f7be314f3d349bd55a9c1b5171f7" + integrity sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-replace-supers" "^7.12.1" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" -"@babel/plugin-transform-parameters@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz#d2e963b038771650c922eff593799c96d853255d" - integrity sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg== +"@babel/plugin-transform-parameters@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz#8fa7603e3097f9c0b7ca1a4821bc2fb52e9e5007" + integrity sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-property-literals@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz#41bc81200d730abb4456ab8b3fbd5537b59adecd" - integrity sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ== +"@babel/plugin-transform-property-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81" + integrity sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-react-display-name@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz#1cbcd0c3b1d6648c55374a22fc9b6b7e5341c00d" - integrity sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w== +"@babel/plugin-transform-react-display-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz#c28effd771b276f4647411c9733dbb2d2da954bd" + integrity sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-react-jsx-development@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.1.tgz#0b8f8cd531dcf7991f1e5f2c10a2a4f1cfc78e36" - integrity sha512-IilcGWdN1yNgEGOrB96jbTplRh+V2Pz1EoEwsKsHfX1a/L40cUYuD71Zepa7C+ujv7kJIxnDftWeZbKNEqZjCQ== - dependencies: - "@babel/helper-builder-react-jsx-experimental" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-jsx" "^7.12.1" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-react-jsx-self@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.1.tgz#ef43cbca2a14f1bd17807dbe4376ff89d714cf28" - integrity sha512-FbpL0ieNWiiBB5tCldX17EtXgmzeEZjFrix72rQYeq9X6nUK38HCaxexzVQrZWXanxKJPKVVIU37gFjEQYkPkA== +"@babel/plugin-transform-react-jsx-development@^7.12.12": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz#f510c0fa7cd7234153539f9a362ced41a5ca1447" + integrity sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-transform-react-jsx" "^7.12.17" -"@babel/plugin-transform-react-jsx-source@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.1.tgz#d07de6863f468da0809edcf79a1aa8ce2a82a26b" - integrity sha512-keQ5kBfjJNRc6zZN1/nVHCd6LLIHq4aUKcVnvE/2l+ZZROSbqoiGFRtT5t3Is89XJxBQaP7NLZX2jgGHdZvvFQ== +"@babel/plugin-transform-react-jsx@^7.12.13", "@babel/plugin-transform-react-jsx@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.17.tgz#dd2c1299f5e26de584939892de3cfc1807a38f24" + integrity sha512-mwaVNcXV+l6qJOuRhpdTEj8sT/Z0owAVWf9QujTZ0d2ye9X/K+MTOTSizcgKOj18PGnTc/7g1I4+cIUjsKhBcw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-react-jsx@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.1.tgz#c2d96c77c2b0e4362cc4e77a43ce7c2539d478cb" - integrity sha512-RmKejwnT0T0QzQUzcbP5p1VWlpnP8QHtdhEtLG55ZDQnJNalbF3eeDyu3dnGKvGzFIQiBzFhBYTwvv435p9Xpw== - dependencies: - "@babel/helper-builder-react-jsx" "^7.10.4" - "@babel/helper-builder-react-jsx-experimental" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-jsx" "^7.12.1" + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-jsx" "^7.12.13" + "@babel/types" "^7.12.17" "@babel/plugin-transform-react-pure-annotations@^7.12.1": version "7.12.1" @@ -736,97 +700,95 @@ "@babel/helper-annotate-as-pure" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-regenerator@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz#5f0a28d842f6462281f06a964e88ba8d7ab49753" - integrity sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng== +"@babel/plugin-transform-regenerator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz#b628bcc9c85260ac1aeb05b45bde25210194a2f5" + integrity sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA== dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz#6fdfc8cc7edcc42b36a7c12188c6787c873adcd8" - integrity sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A== +"@babel/plugin-transform-reserved-words@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz#7d9988d4f06e0fe697ea1d9803188aa18b472695" + integrity sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-shorthand-properties@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz#0bf9cac5550fce0cfdf043420f661d645fdc75e3" - integrity sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw== +"@babel/plugin-transform-shorthand-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz#db755732b70c539d504c6390d9ce90fe64aff7ad" + integrity sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-spread@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz#527f9f311be4ec7fdc2b79bb89f7bf884b3e1e1e" - integrity sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng== +"@babel/plugin-transform-spread@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz#84887710e273c1815ace7ae459f6f42a5d31d5fd" + integrity sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" -"@babel/plugin-transform-sticky-regex@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.1.tgz#5c24cf50de396d30e99afc8d1c700e8bce0f5caf" - integrity sha512-CiUgKQ3AGVk7kveIaPEET1jNDhZZEl1RPMWdTBE1799bdz++SwqDHStmxfCtDfBhQgCl38YRiSnrMuUMZIWSUQ== +"@babel/plugin-transform-sticky-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f" + integrity sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-regex" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-template-literals@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz#b43ece6ed9a79c0c71119f576d299ef09d942843" - integrity sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw== +"@babel/plugin-transform-template-literals@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz#a36049127977ad94438dee7443598d1cefdf409d" + integrity sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-typeof-symbol@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz#9ca6be343d42512fbc2e68236a82ae64bc7af78a" - integrity sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q== +"@babel/plugin-transform-typeof-symbol@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f" + integrity sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-unicode-escapes@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz#5232b9f81ccb07070b7c3c36c67a1b78f1845709" - integrity sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q== +"@babel/plugin-transform-unicode-escapes@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz#840ced3b816d3b5127dd1d12dcedc5dead1a5e74" + integrity sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-unicode-regex@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz#cc9661f61390db5c65e3febaccefd5c6ac3faecb" - integrity sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg== +"@babel/plugin-transform-unicode-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz#b52521685804e155b1202e83fc188d34bb70f5ac" + integrity sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/preset-env@^7.0.0", "@babel/preset-env@^7.8.4": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.1.tgz#9c7e5ca82a19efc865384bb4989148d2ee5d7ac2" - integrity sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg== - dependencies: - "@babel/compat-data" "^7.12.1" - "@babel/helper-compilation-targets" "^7.12.1" - "@babel/helper-module-imports" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-validator-option" "^7.12.1" - "@babel/plugin-proposal-async-generator-functions" "^7.12.1" - "@babel/plugin-proposal-class-properties" "^7.12.1" - "@babel/plugin-proposal-dynamic-import" "^7.12.1" - "@babel/plugin-proposal-export-namespace-from" "^7.12.1" - "@babel/plugin-proposal-json-strings" "^7.12.1" - "@babel/plugin-proposal-logical-assignment-operators" "^7.12.1" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" - "@babel/plugin-proposal-numeric-separator" "^7.12.1" - "@babel/plugin-proposal-object-rest-spread" "^7.12.1" - "@babel/plugin-proposal-optional-catch-binding" "^7.12.1" - "@babel/plugin-proposal-optional-chaining" "^7.12.1" - "@babel/plugin-proposal-private-methods" "^7.12.1" - "@babel/plugin-proposal-unicode-property-regex" "^7.12.1" + version "7.13.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.13.5.tgz#68b3bbc821a97fcdbf4bd0f6895b83d07f84f33e" + integrity sha512-xUeKBIIcbwxGevyWMSWZOW98W1lp7toITvVsMxSddCEQy932yYiF4fCB+CG3E/MXzFX3KbefgvCqEQ7TDoE6UQ== + dependencies: + "@babel/compat-data" "^7.13.5" + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-validator-option" "^7.12.17" + "@babel/plugin-proposal-async-generator-functions" "^7.13.5" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-dynamic-import" "^7.12.17" + "@babel/plugin-proposal-export-namespace-from" "^7.12.13" + "@babel/plugin-proposal-json-strings" "^7.12.13" + "@babel/plugin-proposal-logical-assignment-operators" "^7.12.13" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.0" + "@babel/plugin-proposal-numeric-separator" "^7.12.13" + "@babel/plugin-proposal-object-rest-spread" "^7.13.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.12.13" + "@babel/plugin-proposal-optional-chaining" "^7.13.0" + "@babel/plugin-proposal-private-methods" "^7.13.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" "@babel/plugin-syntax-async-generators" "^7.8.0" - "@babel/plugin-syntax-class-properties" "^7.12.1" + "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-dynamic-import" "^7.8.0" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-syntax-json-strings" "^7.8.0" @@ -836,43 +798,46 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-syntax-top-level-await" "^7.12.1" - "@babel/plugin-transform-arrow-functions" "^7.12.1" - "@babel/plugin-transform-async-to-generator" "^7.12.1" - "@babel/plugin-transform-block-scoped-functions" "^7.12.1" - "@babel/plugin-transform-block-scoping" "^7.12.1" - "@babel/plugin-transform-classes" "^7.12.1" - "@babel/plugin-transform-computed-properties" "^7.12.1" - "@babel/plugin-transform-destructuring" "^7.12.1" - "@babel/plugin-transform-dotall-regex" "^7.12.1" - "@babel/plugin-transform-duplicate-keys" "^7.12.1" - "@babel/plugin-transform-exponentiation-operator" "^7.12.1" - "@babel/plugin-transform-for-of" "^7.12.1" - "@babel/plugin-transform-function-name" "^7.12.1" - "@babel/plugin-transform-literals" "^7.12.1" - "@babel/plugin-transform-member-expression-literals" "^7.12.1" - "@babel/plugin-transform-modules-amd" "^7.12.1" - "@babel/plugin-transform-modules-commonjs" "^7.12.1" - "@babel/plugin-transform-modules-systemjs" "^7.12.1" - "@babel/plugin-transform-modules-umd" "^7.12.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.1" - "@babel/plugin-transform-new-target" "^7.12.1" - "@babel/plugin-transform-object-super" "^7.12.1" - "@babel/plugin-transform-parameters" "^7.12.1" - "@babel/plugin-transform-property-literals" "^7.12.1" - "@babel/plugin-transform-regenerator" "^7.12.1" - "@babel/plugin-transform-reserved-words" "^7.12.1" - "@babel/plugin-transform-shorthand-properties" "^7.12.1" - "@babel/plugin-transform-spread" "^7.12.1" - "@babel/plugin-transform-sticky-regex" "^7.12.1" - "@babel/plugin-transform-template-literals" "^7.12.1" - "@babel/plugin-transform-typeof-symbol" "^7.12.1" - "@babel/plugin-transform-unicode-escapes" "^7.12.1" - "@babel/plugin-transform-unicode-regex" "^7.12.1" + "@babel/plugin-syntax-top-level-await" "^7.12.13" + "@babel/plugin-transform-arrow-functions" "^7.13.0" + "@babel/plugin-transform-async-to-generator" "^7.13.0" + "@babel/plugin-transform-block-scoped-functions" "^7.12.13" + "@babel/plugin-transform-block-scoping" "^7.12.13" + "@babel/plugin-transform-classes" "^7.13.0" + "@babel/plugin-transform-computed-properties" "^7.13.0" + "@babel/plugin-transform-destructuring" "^7.13.0" + "@babel/plugin-transform-dotall-regex" "^7.12.13" + "@babel/plugin-transform-duplicate-keys" "^7.12.13" + "@babel/plugin-transform-exponentiation-operator" "^7.12.13" + "@babel/plugin-transform-for-of" "^7.13.0" + "@babel/plugin-transform-function-name" "^7.12.13" + "@babel/plugin-transform-literals" "^7.12.13" + "@babel/plugin-transform-member-expression-literals" "^7.12.13" + "@babel/plugin-transform-modules-amd" "^7.13.0" + "@babel/plugin-transform-modules-commonjs" "^7.13.0" + "@babel/plugin-transform-modules-systemjs" "^7.12.13" + "@babel/plugin-transform-modules-umd" "^7.13.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" + "@babel/plugin-transform-new-target" "^7.12.13" + "@babel/plugin-transform-object-super" "^7.12.13" + "@babel/plugin-transform-parameters" "^7.13.0" + "@babel/plugin-transform-property-literals" "^7.12.13" + "@babel/plugin-transform-regenerator" "^7.12.13" + "@babel/plugin-transform-reserved-words" "^7.12.13" + "@babel/plugin-transform-shorthand-properties" "^7.12.13" + "@babel/plugin-transform-spread" "^7.13.0" + "@babel/plugin-transform-sticky-regex" "^7.12.13" + "@babel/plugin-transform-template-literals" "^7.13.0" + "@babel/plugin-transform-typeof-symbol" "^7.12.13" + "@babel/plugin-transform-unicode-escapes" "^7.12.13" + "@babel/plugin-transform-unicode-regex" "^7.12.13" "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.12.1" - core-js-compat "^3.6.2" - semver "^5.5.0" + "@babel/types" "^7.13.0" + babel-plugin-polyfill-corejs2 "^0.1.4" + babel-plugin-polyfill-corejs3 "^0.1.3" + babel-plugin-polyfill-regenerator "^0.1.2" + core-js-compat "^3.9.0" + semver "7.0.0" "@babel/preset-modules@^0.1.3": version "0.1.4" @@ -886,22 +851,20 @@ esutils "^2.0.2" "@babel/preset-react@^7.0.0": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.1.tgz#7f022b13f55b6dd82f00f16d1c599ae62985358c" - integrity sha512-euCExymHCi0qB9u5fKw7rvlw7AZSjw/NaB9h7EkdTt5+yHRrXdiRTh7fkG3uBPpJg82CqLfp1LHLqWGSCrab+g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-react-display-name" "^7.12.1" - "@babel/plugin-transform-react-jsx" "^7.12.1" - "@babel/plugin-transform-react-jsx-development" "^7.12.1" - "@babel/plugin-transform-react-jsx-self" "^7.12.1" - "@babel/plugin-transform-react-jsx-source" "^7.12.1" + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.13.tgz#5f911b2eb24277fa686820d5bd81cad9a0602a0a" + integrity sha512-TYM0V9z6Abb6dj1K7i5NrEhA13oS5ujUYQYDfqIBXYHOc2c2VkFgc+q9kyssIyUfy4/hEwqrgSlJ/Qgv8zJLsA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-react-display-name" "^7.12.13" + "@babel/plugin-transform-react-jsx" "^7.12.13" + "@babel/plugin-transform-react-jsx-development" "^7.12.12" "@babel/plugin-transform-react-pure-annotations" "^7.12.1" -"@babel/register@^7.0.0", "@babel/register@^7.12.1", "@babel/register@^7.8.3": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.12.1.tgz#cdb087bdfc4f7241c03231f22e15d211acf21438" - integrity sha512-XWcmseMIncOjoydKZnWvWi0/5CUCD+ZYKhRwgYlWOrA8fGZ/FjuLRpqtIhLOVD/fvR1b9DQHtZPn68VvhpYf+Q== +"@babel/register@^7.0.0", "@babel/register@^7.13.0", "@babel/register@^7.8.3": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.13.0.tgz#865eb78a3ed94c6ad72d0e550180b3d6566dfb8d" + integrity sha512-nswFANDBcO661RvGOHfVKVRBZIe9wJuFFIJYJWpO8LwYn8WI+h/2JZhceLvlxjxEvMH6/oGkEBgz5SnqUUMkCg== dependencies: find-cache-dir "^2.0.0" lodash "^4.17.19" @@ -910,42 +873,42 @@ source-map-support "^0.5.16" "@babel/runtime@^7.0.0", "@babel/runtime@^7.8.4": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.1.tgz#b4116a6b6711d010b2dad3b7b6e43bf1b9954740" - integrity sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA== + version "7.13.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.7.tgz#d494e39d198ee9ca04f4dcb76d25d9d7a1dc961a" + integrity sha512-h+ilqoX998mRVM5FtB5ijRuHUDVt5l3yfoOi2uh18Z/O3hvyaHQ39NpxVkCIG5yFs+mLq/ewFp8Bss6zmWv6ZA== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" - integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/parser" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.7.0": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.1.tgz#941395e0c5cc86d5d3e75caa095d3924526f0c1e" - integrity sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.1" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.12.1" - "@babel/types" "^7.12.1" +"@babel/template@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" + integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/parser" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/traverse@^7.13.0", "@babel/traverse@^7.7.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.0.tgz#6d95752475f86ee7ded06536de309a65fc8966cc" + integrity sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.13.0" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/parser" "^7.13.0" + "@babel/types" "^7.13.0" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.19" -"@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.1.tgz#e109d9ab99a8de735be287ee3d6a9947a190c4ae" - integrity sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA== +"@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.12.17", "@babel/types@^7.13.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.0.tgz#74424d2816f0171b4100f0ab34e9a374efdf7f80" + integrity sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" + "@babel/helper-validator-identifier" "^7.12.11" lodash "^4.17.19" to-fast-properties "^2.0.0" @@ -1415,11 +1378,6 @@ ansi-styles@^1.1.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" integrity sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94= -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" @@ -1456,13 +1414,13 @@ are-we-there-yet@~1.1.2: readable-stream "^2.0.6" argon2@^0.27.0: - version "0.27.0" - resolved "https://registry.yarnpkg.com/argon2/-/argon2-0.27.0.tgz#0e92acfab23041544208d184acf8c3ca61a67e3f" - integrity sha512-IkhJhz/4qaZ6RpYyRZvAMOu+EysF40z3J8jksvv0V9LvQFo13d2WBQr5lPuMzZid2k5XpdbQd2oVsgXR4Oi8TQ== + version "0.27.1" + resolved "https://registry.yarnpkg.com/argon2/-/argon2-0.27.1.tgz#4ff1dda0de4f5a2089f373bba5c2c6962e0f0668" + integrity sha512-On68kSinTh4DOlLVCEYgQYpx0yuGRsqU9UwV7jUB26PWv+092r8Uz891KFVEqdsksiDXDhA7kXL4z3in/FBItg== dependencies: "@phc/format" "^1.0.0" - node-addon-api "^3.0.0" - node-pre-gyp "^0.15.0" + node-addon-api "^3.0.2" + node-pre-gyp "^0.17.0" opencollective-postinstall "^2.0.3" argparse@^1.0.7: @@ -1472,19 +1430,12 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= - dependencies: - arr-flatten "^1.0.1" - 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.0.1, arr-flatten@^1.1.0: +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== @@ -1494,50 +1445,59 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= +array-each@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" + integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8= + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= -array-includes@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" - integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== +array-includes@^3.1.1, array-includes@^3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" + integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0" + es-abstract "^1.18.0-next.2" + get-intrinsic "^1.1.1" is-string "^1.0.5" +array-slice@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" + integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w== + 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.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= - 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= array.prototype.flat@^1.2.1, array.prototype.flat@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" - integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" + integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + es-abstract "^1.18.0-next.1" array.prototype.flatmap@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz#1c13f84a178566042dd63de4414440db9222e443" - integrity sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg== + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz#94cfd47cc1556ec0747d97f7c7738c58122004c9" + integrity sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + es-abstract "^1.18.0-next.1" function-bind "^1.1.1" arraybuffer.slice@~0.0.7: @@ -1624,13 +1584,29 @@ babel-plugin-dynamic-import-node@^2.3.3: dependencies: object.assign "^4.1.0" -babel-runtime@^6.11.6: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= +babel-plugin-polyfill-corejs2@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.5.tgz#8fc4779965311393594a1b9ad3adefab3860c8fe" + integrity sha512-5IzdFIjYWqlOFVr/hMYUpc+5fbfuvJTAISwIY58jhH++ZtawtNlcJnxAixlk8ahVwHCz1ipW/kpXYliEBp66wg== + dependencies: + "@babel/compat-data" "^7.13.0" + "@babel/helper-define-polyfill-provider" "^0.1.2" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.4.tgz#2ae290200e953bade30907b7a3bebcb696e6c59d" + integrity sha512-ysSzFn/qM8bvcDAn4mC7pKk85Y5dVaoa9h4u0mHxOEpDzabsseONhUpR7kHxpUinfj1bjU7mUZqD23rMZBoeSg== dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" + "@babel/helper-define-polyfill-provider" "^0.1.2" + core-js-compat "^3.8.1" + +babel-plugin-polyfill-regenerator@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.3.tgz#350f857225fc640ae1ec78d1536afcbb457db841" + integrity sha512-hRjTJQiOYt/wBKEc+8V8p9OJ9799blAJcuKzn1JXh3pApHoWl1Emxh2BHc6MC7Qt6bbr3uDpNxaYQnATLIudEg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.1.2" babelify@^10.0.0: version "10.0.0" @@ -1652,15 +1628,10 @@ base64-arraybuffer@0.1.4: resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI= -base64-arraybuffer@0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" - integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= - base64-js@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" - integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== base64id@2.0.0: version "2.0.0" @@ -1680,17 +1651,10 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" -better-assert@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" - integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI= - dependencies: - callsite "1.0.0" - bhttp@^1.2.4: - version "1.2.6" - resolved "https://registry.yarnpkg.com/bhttp/-/bhttp-1.2.6.tgz#2ec1bef7a90e116242772f65ffdba2ca2c18e248" - integrity sha512-c0ar+LpFYTQMU3VHfdG5+mkslAZ0zHWL8qEzq90Ko/N4e2UQ9Mw55uGbO+TmphkEX6pgyx0mjFVoBv8g8eDS2g== + version "1.2.8" + resolved "https://registry.yarnpkg.com/bhttp/-/bhttp-1.2.8.tgz#8172ef69f16239bd77c30fa67f72c89737af24b2" + integrity sha512-ZwEA5FKEUhc98EHRX+BkNmUOs48RTnglvfze2+p0HrMPwhQBtVw1aAYyylnCtRl6x6vltCkzGo2+twQ6LVfm6Q== dependencies: bluebird "^2.8.2" concat-stream "^1.4.7" @@ -1744,15 +1708,15 @@ bluebird@^3.4.1, bluebird@^3.4.6, bluebird@^3.7.2: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: - version "4.11.9" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" - integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.1.1: - version "5.1.3" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" - integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== body-parser@1.19.0, body-parser@^1.15.2: version "1.19.0" @@ -1800,15 +1764,6 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -1825,7 +1780,7 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" -brorand@^1.0.1: +brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= @@ -1896,11 +1851,11 @@ browserify-hmr@^0.3.7: through2 "^2.0.0" browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== dependencies: - bn.js "^4.1.0" + bn.js "^5.0.0" randombytes "^2.0.1" browserify-sign@^4.0.0: @@ -1979,20 +1934,21 @@ browserify@^16.1.0, browserify@^16.2.3, browserify@^16.5.0: vm-browserify "^1.0.0" xtend "^4.0.0" -browserslist@^4.12.0, browserslist@^4.8.5: - version "4.14.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.5.tgz#1c751461a102ddc60e40993639b709be7f2c4015" - integrity sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA== +browserslist@^4.14.5, browserslist@^4.16.3: + version "4.16.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717" + integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== dependencies: - caniuse-lite "^1.0.30001135" - electron-to-chromium "^1.3.571" - escalade "^3.1.0" - node-releases "^1.1.61" + caniuse-lite "^1.0.30001181" + colorette "^1.2.1" + electron-to-chromium "^1.3.649" + escalade "^3.1.1" + node-releases "^1.1.70" budo-express@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/budo-express/-/budo-express-1.0.4.tgz#441374cfc8fc301377c1b22fae00a8013e612af0" - integrity sha512-UcZjxX8LbU/cdFWJzHGgAKjosjn/W+uoS0w+xKG2G2Ue3N2pdeM7yVfzmC00tOJVsBZchRXF/tcXN4CSNWvgww== + version "1.0.6" + resolved "https://registry.yarnpkg.com/budo-express/-/budo-express-1.0.6.tgz#3aaf09de84ae9ffdf3febebce8a42be6eb179aab" + integrity sha512-SowIzmi6nhRaIQFM224mgKsj75w/V3XpiSfpRGwQzfLRDfeS1JuFDOWrPH4La6c8C1RMplb4T1QpAdodrr7KGw== dependencies: assure-array "^1.0.0" bluebird "^3.7.2" @@ -2045,10 +2001,10 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== -buffer-writer@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-1.0.1.tgz#22a936901e3029afcd7547eb4487ceb697a3bf08" - integrity sha1-Iqk2kB4wKa/NdUfrRIfOtpejvwg= +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== buffer-xor@^1.0.3: version "1.0.3" @@ -2106,10 +2062,13 @@ cached-path-relative@^1.0.0, cached-path-relative@^1.0.2: resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.2.tgz#a13df4196d26776220cc3356eb147a52dba2c6db" integrity sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg== -callsite@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" - integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" callsites@^3.0.0: version "3.1.0" @@ -2121,10 +2080,10 @@ camelcase@^4.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= -caniuse-lite@^1.0.30001135: - version "1.0.30001151" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001151.tgz#1ddfde5e6fff02aad7940b4edb7d3ac76b0cb00b" - integrity sha512-Zh3sHqskX6mHNrqUerh+fkf0N72cMxrmflzje/JyVImfpknscMnkeJrlFGJcqTmaa0iszdYptGpWMJCRQDkBVw== +caniuse-lite@^1.0.30001181: + version "1.0.30001191" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001191.tgz#bacb432b6701f690c8c5f7c680166b9a9f0843d9" + integrity sha512-xJJqzyd+7GCJXkcoBiQ1GuxEiOBCLQ0aVW9HMekifZsAVGdj5eJ4mFB9fEhSHipq9IOk/QXFJUiIr9lZT+EsGw== capitalize@^2.0.0: version "2.0.3" @@ -2147,17 +2106,6 @@ chalk@^0.5.1: strip-ansi "^0.3.0" supports-color "^0.2.0" -chalk@^1.0.0: - 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.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -2272,14 +2220,6 @@ cli-width@^3.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== -clone-regexp@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-1.0.1.tgz#051805cd33173375d82118fc0918606da39fd60f" - integrity sha512-Fcij9IwRW27XedRIJnSOEupS7RVcXtObJXbcUOX93UCLqqOdRpkvzKywOOSizmEK/Is3S/RHX9dLdfo6R1Q1mw== - dependencies: - is-regexp "^1.0.0" - is-supported-regexp-flag "^1.0.0" - clone-regexp@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-2.2.0.tgz#7d65e00885cd8796405c35a737e7a86b7429e36f" @@ -2352,6 +2292,11 @@ color@3.0.x: color-convert "^1.9.1" color-string "^1.5.2" +colorette@1.2.1, colorette@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" + integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== + colornames@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/colornames/-/colornames-1.1.1.tgz#f8889030685c7c4ff9e2a559f5077eb76a816f96" @@ -2384,7 +2329,7 @@ combined-stream2@^1.0.2: debug "^2.1.1" stream-length "^1.0.1" -commander@^2.19.0, commander@^2.2.0: +commander@^2.19.0: 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== @@ -2399,6 +2344,11 @@ commander@^5.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== +commander@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -2424,6 +2374,11 @@ component-inherit@0.0.3: resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= +concat-arrays@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/concat-arrays/-/concat-arrays-2.0.0.tgz#268628e3e0639a8f6a60fdb70d47c484f7fc3fd9" + integrity sha512-KqWFprduDocx4A7M8tzz+fvtjX550Q9RnCspro1E7ZFGatdD7HhIiAFo4B4J5kkIJi/rSJcMnAUBrRuxZMzJzw== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -2513,38 +2468,33 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= -cookie@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" - integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= - cookie@0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== +cookie@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + 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.6.2: - version "3.6.5" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c" - integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng== +core-js-compat@^3.8.1, core-js-compat@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.9.0.tgz#29da39385f16b71e1915565aa0385c4e0963ad56" + integrity sha512-YK6fwFjCOKWwGnjFUR3c544YsnA/7DoLL0ysncuOJ4pwbriAtOpvM2bygdlcXbvQCQZ7bBU9CL4t7tGl7ETRpQ== dependencies: - browserslist "^4.8.5" + browserslist "^4.16.3" semver "7.0.0" -core-js@^2.4.0: - version "2.6.11" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" - integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== - core-js@^3.2.1: - version "3.6.5" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" - integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== + version "3.9.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.9.0.tgz#790b1bb11553a2272b36e2625c7179db345492f8" + integrity sha512-PyFBJaLq93FlyYdsndE5VaueA9K5cNB7CGzeCj191YYLhkQM0gdZR2SKihM70oF0wdqKSKClv/tEBOpoRmdOVQ== "core-util-is@>=1.0.1 <1.1.0-0", core-util-is@~1.0.0: version "1.0.2" @@ -2669,13 +2619,20 @@ debounce@^1.0.0: resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131" integrity sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg== -debug@2.6.9, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: +debug@2.6.9, debug@^2.1.1, debug@^2.2.0, debug@^2.3.3, 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.3.1, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + debug@=3.1.0, debug@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" @@ -2684,19 +2641,12 @@ debug@=3.1.0, debug@~3.1.0: ms "2.0.0" debug@^3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" - integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== - dependencies: - ms "2.1.2" - debug@~4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" @@ -2820,14 +2770,12 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -detect-file@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" - integrity sha1-STXe39lIhkjgBrASlWbpOGcR6mM= - dependencies: - fs-exists-sync "^0.1.0" +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= -detect-libc@^1.0.2: +detect-libc@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= @@ -2918,9 +2866,9 @@ dot-prop@^4.2.1: is-obj "^1.0.0" dotty@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/dotty/-/dotty-0.1.0.tgz#da371ccd931a37282f8f7f77adada7d54539708a" - integrity sha512-VJzcXJZEckXowvj6yGJC2JH66DLEEm1d1QOB0hik1EvlbUpULvcYt411JeFuy8rNC96FG8V2N7pMkyjvK8LYwQ== + version "0.1.1" + resolved "https://registry.yarnpkg.com/dotty/-/dotty-0.1.1.tgz#2871f6712749c014079b5837c7c8e8bf3aca1fea" + integrity sha512-t6qr6vUPhYwE6t5+5vtk/1UQiAMzmgSUWxXK+oxPIhGy1w3cO15zbdSe9VMH/MMd0tqQuYiewoOG/BfwwU3QLA== duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2: version "0.1.4" @@ -2949,23 +2897,23 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.571: - version "1.3.583" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.583.tgz#47a9fde74740b1205dba96db2e433132964ba3ee" - integrity sha512-L9BwLwJohjZW9mQESI79HRzhicPk1DFgM+8hOCfGgGCFEcA3Otpv7QK6SGtYoZvfQfE3wKLh0Hd5ptqUFv3gvQ== +electron-to-chromium@^1.3.649: + version "1.3.673" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.673.tgz#b4f81c930b388f962b7eba20d0483299aaa40913" + integrity sha512-ms+QR2ckfrrpEAjXweLx6kNCbpAl66DcW//3BZD4BV5KhUgr0RZRce1ON/9J3QyA3JO28nzgb5Xv8DnPr05ILg== elliptic@^6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" - integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" + bn.js "^4.11.9" + brorand "^1.1.0" hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" emoji-regex@^7.0.1: version "7.0.3" @@ -3001,10 +2949,10 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -engine.io-client@~3.4.0: - version "3.4.4" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.4.4.tgz#77d8003f502b0782dd792b073a4d2cf7ca5ab967" - integrity sha512-iU4CRr38Fecj8HoZEnFtm2EiKGbYZcPn3cHxqNGl/tmdWRf60KhK+9vE0JeSjgnlS/0oynEfLgKbT9ALpim0sQ== +engine.io-client@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.5.0.tgz#fc1b4d9616288ce4f2daf06dcf612413dec941c7" + integrity sha512-12wPRfMrugVw/DNyJk34GQ5vIVArEcVMXWugQGGuw2XxUSztFNmJggZmv8IZlLyEdnpO1QB9LkcjeWewO2vxtA== dependencies: component-emitter "~1.3.0" component-inherit "0.0.3" @@ -3014,7 +2962,7 @@ engine.io-client@~3.4.0: indexof "0.0.1" parseqs "0.0.6" parseuri "0.0.6" - ws "~6.1.0" + ws "~7.4.2" xmlhttprequest-ssl "~1.5.4" yeast "0.1.2" @@ -3029,22 +2977,22 @@ engine.io-parser@~2.2.0: blob "0.0.5" has-binary2 "~1.0.2" -engine.io@~3.4.0: - version "3.4.2" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.4.2.tgz#8fc84ee00388e3e228645e0a7d3dfaeed5bd122c" - integrity sha512-b4Q85dFkGw+TqgytGPrGgACRUhsdKc9S9ErRAXpPGy/CXKs4tYoHDkvIRdsseAF7NjfVwjRFIn6KTnbw7LwJZg== +engine.io@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.5.0.tgz#9d6b985c8a39b1fe87cd91eb014de0552259821b" + integrity sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA== dependencies: accepts "~1.3.4" base64id "2.0.0" - cookie "0.3.1" + cookie "~0.4.1" debug "~4.1.0" engine.io-parser "~2.2.0" - ws "^7.1.2" + ws "~7.4.2" entities@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" - integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== env-variable@0.0.x: version "0.0.6" @@ -3052,9 +3000,9 @@ env-variable@0.0.x: integrity sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg== error-chain@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/error-chain/-/error-chain-0.1.2.tgz#2310dd2d94bf949e68f717c9fea6f05d217fa753" - integrity sha512-ICu3R7FK/ln5qQ8X7quvz47FKgGZ7fiTy0pnQnFV7UlwcKosBVVkV2tMcL8SKG14CN/NgTuqsskBngui2h2uPw== + version "0.1.3" + resolved "https://registry.yarnpkg.com/error-chain/-/error-chain-0.1.3.tgz#5575bdeca295224f6301123bb85b52a79547bdcd" + integrity sha512-Hx/Yd7w6ku+bTIGzPxdgKAoZSADCf4EnM9CEcIyr75vw/FH/wbZ23YnKKv7ZQB80F4s7ZSVJ/9UPXk03SQsACQ== dependencies: "@validatem/allow-extra-properties" "^0.1.0" "@validatem/core" "^0.3.10" @@ -3086,40 +3034,25 @@ errors@^0.2.0: resolved "https://registry.yarnpkg.com/errors/-/errors-0.2.0.tgz#0f51e889daa3e11b19e7186d11f104aa66eb2403" integrity sha1-D1Hoidqj4RsZ5xhtEfEEqmbrJAM= -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: - version "1.17.7" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" - integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== +es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2: + version "1.18.0-next.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.2.tgz#088101a55f0541f595e7e057199e27ddc8f3a5c2" + integrity sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw== dependencies: + call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" + get-intrinsic "^1.0.2" has "^1.0.3" has-symbols "^1.0.1" is-callable "^1.2.2" + is-negative-zero "^2.0.1" is-regex "^1.1.1" - object-inspect "^1.8.0" + object-inspect "^1.9.0" object-keys "^1.1.1" - object.assign "^4.1.1" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" - -es-abstract@^1.18.0-next.0, es-abstract@^1.18.0-next.1: - version "1.18.0-next.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" - integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.2" - is-negative-zero "^2.0.0" - is-regex "^1.1.1" - object-inspect "^1.8.0" - object-keys "^1.1.1" - object.assign "^4.1.1" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.3" + string.prototype.trimstart "^1.0.3" es-to-primitive@^1.2.1: version "1.2.1" @@ -3130,7 +3063,7 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: +es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: version "0.10.53" resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== @@ -3166,7 +3099,7 @@ es6-symbol@^3.1.1, es6-symbol@~3.1.3: d "^1.0.1" ext "^1.1.2" -es6-weak-map@^2.0.2: +es6-weak-map@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== @@ -3176,7 +3109,7 @@ es6-weak-map@^2.0.2: es6-iterator "^2.0.3" es6-symbol "^3.1.1" -escalade@^3.1.0: +escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== @@ -3186,7 +3119,7 @@ escape-html@^1.0.3, escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.0, 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= @@ -3244,9 +3177,9 @@ eslint-plugin-react-hooks@^2.4.0: integrity sha512-Y2c4b55R+6ZzwtTppKwSmK/Kar8AdLiC2f9NADCuxbcTgPPg41Gyqa6b9GppgXSvCtkRw43ZE86CT5sejKC6/g== eslint-plugin-react@^7.12.4: - version "7.21.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.21.5.tgz#50b21a412b9574bfe05b21db176e8b7b3b15bff3" - integrity sha512-8MaEggC2et0wSF6bUeywF7qQ46ER81irOdWS4QWxnnlAEsnzeBevk1sWh7fhpCghPpXb+8Ks7hvaft6L/xsR6g== + version "7.22.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.22.0.tgz#3d1c542d1d3169c45421c1215d9470e341707269" + integrity sha512-p30tuX3VS+NWv9nQot9xIGAHBXR0+xJVaZriEsHoJrASGCJZDJ8JLNM0YqKqI0AKm6Uxaa1VUHoNEibxRCMQHA== dependencies: array-includes "^3.1.1" array.prototype.flatmap "^1.2.3" @@ -3328,6 +3261,11 @@ eslint@^6.8.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" +esm@^3.2.25: + version "3.2.25" + resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" + integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== + espree@^6.1.2: version "6.2.1" resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" @@ -3343,9 +3281,9 @@ esprima@^4.0.0: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.0.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" - integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" @@ -3377,9 +3315,9 @@ etag@~1.8.1: integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= eval@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/eval/-/eval-0.1.4.tgz#e05dbe0dab4b9330215cbb7bf4886eb24bd58700" - integrity sha512-npGsebJejyjMRnLdFu+T/97dnigqIU0Ov3IGrZ8ygd1v7RL1vGkEKtvyWZobqUH1AQgKlg0Yqqe2BtMA9/QZLw== + version "0.1.6" + resolved "https://registry.yarnpkg.com/eval/-/eval-0.1.6.tgz#9620d7d8c85515e97e6b47c5814f46ae381cb3cc" + integrity sha512-o0XUw+5OGkXw4pJZzQoXUk+H87DHuC+7ZE//oSrRGtatTmr12oTnLfg6QOq9DyTt0c/p4TwzgmkKrBzWTSizyQ== dependencies: require-like ">= 0.1.1" @@ -3435,13 +3373,6 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execall@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execall/-/execall-1.0.0.tgz#73d0904e395b3cab0658b08d09ec25307f29bb73" - integrity sha1-c9CQTjlbPKsGWLCNCewlMH8pu3M= - dependencies: - clone-regexp "^1.0.0" - execall@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/execall/-/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45" @@ -3449,13 +3380,6 @@ execall@^2.0.0: dependencies: clone-regexp "^2.1.0" -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= - dependencies: - is-posix-bracket "^0.1.0" - expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -3469,19 +3393,12 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= - dependencies: - fill-range "^2.1.0" - -expand-tilde@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" - integrity sha1-C4HrqJflo9MdHD0QL48BRB5VlEk= +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= dependencies: - os-homedir "^1.0.1" + homedir-polyfill "^1.0.1" express-promise-router@^1.1.0: version "1.1.1" @@ -3576,13 +3493,6 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= - dependencies: - is-extglob "^1.0.0" - extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -3636,22 +3546,6 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= - -fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -3698,20 +3592,31 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -findup-sync@^0.4.2: - version "0.4.3" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" - integrity sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI= +findup-sync@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" + integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +fined@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b" + integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng== dependencies: - detect-file "^0.1.0" - is-glob "^2.0.1" - micromatch "^2.3.7" - resolve-dir "^0.1.0" + expand-tilde "^2.0.2" + is-plain-object "^2.0.3" + object.defaults "^1.1.0" + object.pick "^1.2.0" + parse-filepath "^1.0.1" -flagged-respawn@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5" - integrity sha1-/xke3c1wiKZ1smEP/8l2vpuAdLU= +flagged-respawn@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41" + integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q== flat-cache@^2.0.1: version "2.0.1" @@ -3744,10 +3649,10 @@ for-in@^1.0.1, for-in@^1.0.2: resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs= dependencies: for-in "^1.0.1" @@ -3800,14 +3705,9 @@ from2@^2.0.3: readable-stream "^2.0.0" fromentries@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.0.tgz#508bd33f0d704a836c9b18e05df59792c82668bc" - integrity sha512-+pKvlQHvpxxSTF+tWZ4DjxD0Sz4G26EjAP4z7D2k8VLJ19hrLbSgaQLx/u2mVQn7hiA2s/3DyutOyFwTuDsRgA== - -fs-exists-sync@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" - integrity sha1-mC1ok6+RjnLQjeyehnP/K1qNat0= + version "1.3.2" + resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" + integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== fs-extra@^3.0.1: version "3.0.1" @@ -3888,26 +3788,25 @@ generate-lookup-table@^1.0.0: resolved "https://registry.yarnpkg.com/generate-lookup-table/-/generate-lookup-table-1.0.0.tgz#73087f12afefac12bc5ec97674d4edefbb931207" integrity sha512-Yn+IXQPwp9hpsRRTw98KJ+zlQUMarr+MWMp1USwvpk2h2Z+A++wh26e4v1jU8l8YjTE1eJ8kYfwCBojm+ETycQ== -generic-pool@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-2.4.3.tgz#780c36f69dfad05a5a045dd37be7adca11a4f6ff" - integrity sha1-eAw29p360FpaBF3Te+etyhGk9v8= - -generic-pool@^2.4.2: - version "2.5.4" - resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-2.5.4.tgz#38c6188513e14030948ec6e5cf65523d9779299b" - integrity sha1-OMYYhRPhQDCUjsblz2VSPZd5KZs= - -gensync@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" - integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-assigned-identifiers@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1" integrity sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + get-ports@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/get-ports/-/get-ports-1.0.3.tgz#f40bd580aca7ec0efb7b96cbfcbeb03ef894b5e8" @@ -3939,20 +3838,10 @@ get-value@^2.0.3, get-value@^2.0.6: resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= - dependencies: - is-glob "^2.0.0" +getopts@2.2.5: + version "2.2.5" + resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.2.5.tgz#67a0fe471cacb9c687d817cab6450b96dde8313b" + integrity sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA== glob-parent@^3.1.0: version "3.1.0" @@ -3988,23 +3877,25 @@ global-dirs@^0.1.0: dependencies: ini "^1.3.4" -global-modules@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" - integrity sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0= +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== dependencies: - global-prefix "^0.1.4" - is-windows "^0.2.0" + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" -global-prefix@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" - integrity sha1-jTvGuNo8qBEqFg2NSW/wRiv+948= +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= dependencies: - homedir-polyfill "^1.0.0" + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" ini "^1.3.4" - is-windows "^0.2.0" - which "^1.2.12" + is-windows "^1.0.1" + which "^1.2.14" global@^4.3.0: version "4.4.0" @@ -4061,9 +3952,9 @@ got@^9.6.0: url-parse-lax "^3.0.0" graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== graphql@^14.2.1: version "14.7.0" @@ -4079,13 +3970,6 @@ has-ansi@^0.1.0: dependencies: ansi-regex "^0.2.0" -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-binary2@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" @@ -4173,7 +4057,7 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hmac-drbg@^1.0.0: +hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= @@ -4189,7 +4073,7 @@ hoist-non-react-statics@^3.3.0: dependencies: react-is "^16.7.0" -homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: +homedir-polyfill@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== @@ -4246,9 +4130,9 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: safer-buffer ">= 2.1.2 < 3" ieee754@^1.1.4: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore-by-default@^1.0.1: version "1.0.1" @@ -4268,9 +4152,9 @@ ignore@^4.0.6: integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== import-fresh@^3.0.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" - integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -4324,9 +4208,9 @@ inherits@2.0.3: integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= ini@^1.3.4, 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== + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== inject-lr-script@^2.1.0: version "2.2.0" @@ -4385,34 +4269,34 @@ internal-ip@^3.0.1: default-gateway "^2.6.0" ipaddr.js "^1.5.2" -internal-slot@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" - integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== dependencies: - es-abstract "^1.17.0-next.1" + get-intrinsic "^1.1.0" has "^1.0.3" - side-channel "^1.0.2" - -interpret@^0.6.5: - version "0.6.6" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-0.6.6.tgz#fecd7a18e7ce5ca6abfb953e1f86213a49f1625b" - integrity sha1-/s16GOfOXKar+5U+H4YhOknxYls= + side-channel "^1.0.4" interpret@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + ip-regex@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= ip-regex@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.2.0.tgz#a03f5eb661d9a154e3973a03de8b23dd0ad6892e" - integrity sha512-n5cDDeTWWRwK1EBoWwRti+8nP4NbytBBY0pldmnIkq6Z55KNFmWofh4rl9dPZpj+U/nVq7gweR3ylrvMt4YZ5A== + version "4.3.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" + integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== ip@^1.1.5: version "1.1.5" @@ -4424,6 +4308,14 @@ ipaddr.js@1.9.1, ipaddr.js@^1.5.2: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +is-absolute@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" + integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== + dependencies: + is-relative "^1.0.0" + is-windows "^1.0.1" + 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" @@ -4439,9 +4331,11 @@ is-accessor-descriptor@^1.0.0: kind-of "^6.0.0" is-arguments@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" - integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9" + integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg== + dependencies: + call-bind "^1.0.0" is-arrayish@^0.2.1: version "0.2.1" @@ -4461,9 +4355,11 @@ is-binary-path@^1.0.0: binary-extensions "^1.0.0" is-boolean-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.1.tgz#10edc0900dd127697a92f6f9807c7617d68ac48e" - integrity sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.0.tgz#e2aaad3a3a8fca34c28f6eee135b156ed2587ff0" + integrity sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA== + dependencies: + call-bind "^1.0.0" is-buffer@^1.1.0, is-buffer@^1.1.5, is-buffer@~1.1.6: version "1.1.6" @@ -4471,9 +4367,9 @@ is-buffer@^1.1.0, is-buffer@^1.1.5, is-buffer@~1.1.6: integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-callable@^1.1.4, is-callable@^1.1.5, is-callable@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" - integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== + version "1.2.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" + integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== is-ci@^1.0.10: version "1.2.1" @@ -4482,10 +4378,10 @@ is-ci@^1.0.10: dependencies: ci-info "^1.5.0" -is-core-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.0.0.tgz#58531b70aed1db7c0e8d4eb1a0a2d1ddd64bd12d" - integrity sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw== +is-core-module@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" + integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== dependencies: has "^1.0.3" @@ -4526,18 +4422,6 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= - dependencies: - is-primitive "^2.0.0" - 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" @@ -4550,11 +4434,6 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= - 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" @@ -4582,13 +4461,6 @@ is-fullwidth-code-point@^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@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= - dependencies: - is-extglob "^1.0.0" - is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -4628,10 +4500,10 @@ is-iterable@^1.1.1: resolved "https://registry.yarnpkg.com/is-iterable/-/is-iterable-1.1.1.tgz#71f9aa6f113e1d968ebe1d41cff4c8fb23a817bc" integrity sha512-EdOZCr0NsGE00Pot+x1ZFx9MJK3C6wy91geZpXwvwexDLJvA4nzYyZf7r+EIwSeVsOLDdBz7ATg9NqKTzuNYuQ== -is-negative-zero@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" - integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== is-npm@^1.0.0: version "1.0.0" @@ -4643,13 +4515,6 @@ is-number-object@^1.0.4: resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= - dependencies: - kind-of "^3.0.2" - is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -4657,11 +4522,6 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== - is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" @@ -4689,6 +4549,11 @@ is-plain-obj@^2.0.0, is-plain-obj@^2.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + 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" @@ -4696,17 +4561,7 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= - -is-promise@^2.1: +is-promise@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== @@ -4717,22 +4572,25 @@ is-redirect@^1.0.0: integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= is-regex@^1.0.5, is-regex@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" - integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" + integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== dependencies: + call-bind "^1.0.2" has-symbols "^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-regexp@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-2.1.0.tgz#cd734a56864e23b956bf4e7c66c396a4c0b22c2d" integrity sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA== +is-relative@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" + integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== + dependencies: + is-unc-path "^1.0.0" + is-retry-allowed@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" @@ -4753,11 +4611,6 @@ is-string@^1.0.5: resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== -is-supported-regexp-flag@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.1.tgz#21ee16518d2c1dd3edd3e9a0d57e50207ac364ca" - integrity sha512-3vcJecUUrpgCqc/ca0aWeNu64UGgxcvO60K/Fkr1N6RSvfGCTU60UKN68JDmKokgba0rFFJs12EnzOQa14ubKQ== - is-symbol@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" @@ -4765,12 +4618,14 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.1" -is-windows@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" - integrity sha1-3hqm1j6indJIc3tp8f+LgALSEIw= +is-unc-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" + integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== + dependencies: + unc-path-regex "^0.1.2" -is-windows@^1.0.2: +is-windows@^1.0.1, 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== @@ -4818,9 +4673,9 @@ iterall@^1.2.2: integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== js-beautify@^1.7.3: - version "1.13.0" - resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.13.0.tgz#a056d5d3acfd4918549aae3ab039f9f3c51eebb2" - integrity sha512-/Tbp1OVzZjbwzwJQFIlYLm9eWQ+3aYbBXLSaqb1mEJzhcQAfrqMMQYtjb6io+U6KpD0ID4F+Id3/xcjH3l/sqA== + version "1.13.5" + resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.13.5.tgz#a08a97890cae55daf1d758d3f6577bd4a64d7014" + integrity sha512-MsXlH6Z/BiRYSkSRW3clNDqDjSpiSNOiG8xYVUBXt4k0LnGvDhlTGOlHX1VFtAdoLmtwjxMG5qiWKy/g+Ipv5w== dependencies: config-chain "^1.1.12" editorconfig "^0.15.3" @@ -4828,20 +4683,15 @@ js-beautify@^1.7.3: mkdirp "^1.0.4" nopt "^5.0.0" -js-string-escape@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" - integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= - "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: - version "3.14.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" - integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -4891,9 +4741,9 @@ json5@^1.0.1: minimist "^1.2.0" json5@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" - integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== dependencies: minimist "^1.2.5" @@ -4915,12 +4765,12 @@ jsonparse@^1.2.0: integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= "jsx-ast-utils@^2.4.1 || ^3.0.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.1.0.tgz#642f1d7b88aa6d7eb9d8f2210e166478444fa891" - integrity sha512-d4/UOjg+mxAWxCiF0c5UTSwyqbchkbqCvK87aBovhnh8GtysTjWmgC63tY0cJx/HzGgm9qnA147jVBdpOiQ2RA== + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz#41108d2cec408c3453c1bbe8a4aae9e1e2bd8f82" + integrity sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q== dependencies: - array-includes "^3.1.1" - object.assign "^4.1.1" + array-includes "^3.1.2" + object.assign "^4.1.2" keyv@^3.0.0: version "3.1.0" @@ -4953,29 +4803,23 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -knex@^0.13.0: - version "0.13.0" - resolved "https://registry.yarnpkg.com/knex/-/knex-0.13.0.tgz#08dd494f6bb64928934eec9dac34787a14ca5fa4" - integrity sha1-CN1JT2u2SSiTTuydrDR4ehTKX6Q= - dependencies: - babel-runtime "^6.11.6" - bluebird "^3.4.6" - chalk "^1.0.0" - commander "^2.2.0" - debug "^2.1.3" - generic-pool "^2.4.2" - inherits "~2.0.1" - interpret "^0.6.5" - liftoff "~2.2.0" - lodash "^4.6.0" - minimist "~1.1.0" - mkdirp "^0.5.0" - pg-connection-string "^0.1.3" - readable-stream "^1.1.12" - safe-buffer "^5.0.1" - tildify "~1.0.0" - uuid "^3.0.0" - v8flags "^2.0.2" +knex@^0.21.18: + version "0.21.18" + resolved "https://registry.yarnpkg.com/knex/-/knex-0.21.18.tgz#ca16e95b8b5c0891a6b012fb3fb34185e067b0e2" + integrity sha512-hP4Qyy2LjQLsabQYc6YgDFHb+CJJBjQz1TMPTKyN85CF2NLIsZsF4FDe0NvQXeXMeak3E/kKr5iJog1JBm6ZCQ== + dependencies: + colorette "1.2.1" + commander "^6.2.0" + debug "4.3.1" + esm "^3.2.25" + getopts "2.2.5" + interpret "^2.2.0" + liftoff "3.1.0" + lodash "^4.17.20" + pg-connection-string "2.4.0" + tarn "^3.0.1" + tildify "2.0.0" + v8flags "^3.2.0" kuler@1.0.x: version "1.0.1" @@ -5007,14 +4851,17 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -liftoff@~2.2.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.2.5.tgz#998c2876cff484b103e4423b93d356da44734c91" - integrity sha1-mYwods/0hLED5EI7k9NW2kRzTJE= +liftoff@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-3.1.0.tgz#c9ba6081f908670607ee79062d700df062c52ed3" + integrity sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog== dependencies: extend "^3.0.0" - findup-sync "^0.4.2" - flagged-respawn "^0.3.2" + findup-sync "^3.0.0" + fined "^1.0.1" + flagged-respawn "^1.0.0" + is-plain-object "^2.0.4" + object.map "^1.0.0" rechoir "^0.6.2" resolve "^1.1.7" @@ -5058,6 +4905,11 @@ lodash.clonedeep@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + lodash.escaperegexp@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" @@ -5073,10 +4925,10 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.0.0, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.6.0: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== +lodash@^4.0.0, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.20: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-symbols@^3.0.0: version "3.0.0" @@ -5115,7 +4967,7 @@ lru-cache@^4.0.1, lru-cache@^4.1.5: pseudomap "^1.0.2" yallist "^2.1.2" -lru-queue@0.1: +lru-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM= @@ -5137,7 +4989,14 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -map-cache@^0.2.2: +make-iterator@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" + integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw== + dependencies: + kind-of "^6.0.2" + +map-cache@^0.2.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= @@ -5149,10 +5008,10 @@ map-limit@0.0.1: dependencies: once "~1.3.0" -map-obj@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-3.1.0.tgz#3be9810d926db2f8612c728a2e95e03b7f109241" - integrity sha512-Xg1iyYz/+iIW6YoMldux47H/e5QZyDSB41Kb0ev+YYHh3FJnyyzY0vTk/WbVeWcCvdXd70cOriUBmhP8alUFBA== +map-obj@^4.2.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== map-visit@^1.0.0: version "1.0.0" @@ -5166,11 +5025,6 @@ match-value@^1.1.0: resolved "https://registry.yarnpkg.com/match-value/-/match-value-1.1.0.tgz#ad311ef8bbe2d344a53ec3104e28fe221984b98e" integrity sha512-NOvpobcmkX+l9Eb6r2s3BkR1g1ZwzExDFdXA9d6p1r1O1olLbo88KuzMiBmg43xSpodfm7I6Hqlx2OoySquEgg== -math-random@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" - integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== - md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -5195,18 +5049,18 @@ media-typer@0.3.0: integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= memoizee@^0.4.14: - version "0.4.14" - resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57" - integrity sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg== + version "0.4.15" + resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.15.tgz#e6f3d2da863f318d02225391829a6c5956555b72" + integrity sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ== dependencies: - d "1" - es5-ext "^0.10.45" - es6-weak-map "^2.0.2" + d "^1.0.1" + es5-ext "^0.10.53" + es6-weak-map "^2.0.3" event-emitter "^0.3.5" - is-promise "^2.1" - lru-queue "0.1" - next-tick "1" - timers-ext "^0.1.5" + is-promise "^2.2.2" + lru-queue "^0.1.0" + next-tick "^1.1.0" + timers-ext "^0.1.7" merge-descriptors@1.0.1: version "1.0.1" @@ -5218,26 +5072,7 @@ methods@^1.0.0, methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^2.3.7: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -micromatch@^3.1.10, micromatch@^3.1.4: +micromatch@^3.0.4, 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== @@ -5269,17 +5104,17 @@ millisecond@~0.1.2: resolved "https://registry.yarnpkg.com/millisecond/-/millisecond-0.1.2.tgz#6cc5ad386241cab8e78aff964f87028eec92dac5" integrity sha1-bMWtOGJByrjniv+WT4cCjuyS2sU= -mime-db@1.44.0: - version "1.44.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" - integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== +mime-db@1.46.0: + version "1.46.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee" + integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== mime-types@~2.1.24: - version "2.1.27" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== + version "2.1.29" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz#1d4ab77da64b91f5f72489df29236563754bb1b2" + integrity sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ== dependencies: - mime-db "1.44.0" + mime-db "1.46.0" mime@1.6.0, mime@^1.3.4: version "1.6.0" @@ -5308,7 +5143,7 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: +minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= @@ -5325,11 +5160,6 @@ minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -minimist@~1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8" - integrity sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag= - 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" @@ -5358,7 +5188,7 @@ mkdirp-classic@^0.5.2: resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3: +mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.5: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -5401,11 +5231,16 @@ ms@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.2, ms@^2.1.1: +ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + mute-stream@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" @@ -5443,10 +5278,10 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -needle@^2.5.0: - version "2.5.2" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.5.2.tgz#cf1a8fce382b5a280108bba90a14993c00e4010a" - integrity sha512-LbRIwS9BfkPvNwNHlsA41Q29kL2L/6VaOJ0qisM5lLWsTV3nP15abO5ITL6L81zqFhzjRKDAYjpcBcwM0AVvLQ== +needle@^2.5.2: + version "2.6.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.6.0.tgz#24dbb55f2509e2324b4a99d61f413982013ccdbe" + integrity sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg== dependencies: debug "^3.2.6" iconv-lite "^0.4.4" @@ -5457,7 +5292,7 @@ negotiator@0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== -next-tick@1: +next-tick@1, next-tick@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== @@ -5479,10 +5314,10 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" -node-addon-api@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.0.2.tgz#04bc7b83fd845ba785bb6eae25bc857e1ef75681" - integrity sha512-+D4s2HCnxPd5PjjI0STKwncjXTUKKqm74MDMz9OPXavjsGmjkvwgLtA5yoxJUdmpj52+2u+RrXgPipahKczMKg== +node-addon-api@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.1.0.tgz#98b21931557466c6729e51cb77cd39c965f42239" + integrity sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw== node-environment-flags@^1.0.5: version "1.0.6" @@ -5497,26 +5332,26 @@ node-modules-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= -node-pre-gyp@^0.15.0: - version "0.15.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.15.0.tgz#c2fc383276b74c7ffa842925241553e8b40f1087" - integrity sha512-7QcZa8/fpaU/BKenjcaeFF9hLz2+7S9AqyXFhlH/rilsQ/hPZKK32RtR5EQHJElgu+q5RfbJ34KriI79UWaorA== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.3" - needle "^2.5.0" - 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.4.2" - -node-releases@^1.1.61: - version "1.1.64" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.64.tgz#71b4ae988e9b1dd7c1ffce58dd9e561752dfebc5" - integrity sha512-Iec8O9166/x2HRMJyLLLWkd0sFFLrFNy+Xf+JQfSQsdBJzPcHpNl3JQ9gD4j+aJxmCa25jNsIbM4bmACtSbkSg== +node-pre-gyp@^0.17.0: + version "0.17.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.17.0.tgz#5af3f7b4c3848b5ed00edc3d298ff836daae5f1d" + integrity sha512-abzZt1hmOjkZez29ppg+5gGqdPLUuJeAEwVPtHYEJgx0qzttCbcKFpxrCQn2HYbwCv2c+7JwH4BgEzFkUGpn4A== + dependencies: + detect-libc "^1.0.3" + mkdirp "^0.5.5" + needle "^2.5.2" + nopt "^4.0.3" + npm-packlist "^1.4.8" + npmlog "^4.1.2" + rc "^1.2.8" + rimraf "^2.7.1" + semver "^5.7.1" + tar "^4.4.13" + +node-releases@^1.1.70: + version "1.1.71" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" + integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== nodemon@^1.18.11: version "1.19.4" @@ -5534,7 +5369,7 @@ nodemon@^1.18.11: undefsafe "^2.0.2" update-notifier "^2.5.0" -nopt@^4.0.1: +nopt@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== @@ -5566,7 +5401,7 @@ normalize-package-data@^2.3.2: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.1, normalize-path@^2.1.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= @@ -5608,7 +5443,7 @@ npm-normalize-package-bin@^1.0.1: resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== -npm-packlist@^1.1.6: +npm-packlist@^1.4.8: version "1.4.8" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== @@ -5624,7 +5459,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npmlog@^4.0.2: +npmlog@^4.1.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== @@ -5639,21 +5474,11 @@ number-is-nan@^1.0.0: 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.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" - integrity sha1-ejs9DpgGPUP0wD8uiubNUahog6A= - object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= -object-component@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" - integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE= - object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" @@ -5663,10 +5488,10 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" - integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== +object-inspect@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" + integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" @@ -5680,52 +5505,64 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0, object.assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.1.tgz#303867a666cdd41936ecdedfb1f8f3e32a478cdd" - integrity sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA== +object.assign@^4.1.0, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.18.0-next.0" has-symbols "^1.0.1" object-keys "^1.1.1" +object.defaults@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" + integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8= + dependencies: + array-each "^1.0.1" + array-slice "^1.0.0" + for-own "^1.0.0" + isobject "^3.0.0" + object.entries@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add" - integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA== + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.3.tgz#c601c7f168b62374541a07ddbd3e2d5e4f7711a6" + integrity sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.5" + es-abstract "^1.18.0-next.1" has "^1.0.3" object.fromentries@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" - integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== + version "2.0.4" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.4.tgz#26e1ba5c4571c5c6f0890cef4473066456a120b8" + integrity sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" + es-abstract "^1.18.0-next.2" has "^1.0.3" object.getownpropertydescriptors@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" - integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + version "2.1.2" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" + integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + es-abstract "^1.18.0-next.2" -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= +object.map@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" + integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc= dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" + for-own "^1.0.0" + make-iterator "^1.0.0" -object.pick@^1.3.0: +object.pick@^1.2.0, 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= @@ -5733,13 +5570,13 @@ object.pick@^1.3.0: isobject "^3.0.1" object.values@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" - integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.3.tgz#eaa8b1e17589f02f698db093f7c62ee1699742ee" + integrity sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" + es-abstract "^1.18.0-next.2" has "^1.0.3" on-finished@^2.3.0, on-finished@~2.3.0: @@ -5818,7 +5655,7 @@ os-browserify@~0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= -os-homedir@^1.0.0, os-homedir@^1.0.1: +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= @@ -5930,10 +5767,10 @@ package-json@^4.0.0: registry-url "^3.0.3" semver "^5.1.0" -packet-reader@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-0.3.1.tgz#cd62e60af8d7fea8a705ec4ff990871c46871f27" - integrity sha1-zWLmCvjX/qinBexP+ZCHHEaHHyc= +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== pad-left@^2.0.0: version "2.1.0" @@ -5979,15 +5816,14 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5: pbkdf2 "^3.0.3" safe-buffer "^5.1.1" -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= +parse-filepath@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" + integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE= dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" + is-absolute "^1.0.0" + map-cache "^0.2.0" + path-root "^0.1.1" parse-json@^2.2.0: version "2.2.0" @@ -6006,25 +5842,11 @@ parse-passwd@^1.0.0: resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= -parseqs@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" - integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0= - dependencies: - better-assert "~1.0.0" - parseqs@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5" integrity sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w== -parseuri@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" - integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo= - dependencies: - better-assert "~1.0.0" - parseuri@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.6.tgz#e1496e829e3ac2ff47f39a4dd044b32823c4a25a" @@ -6080,6 +5902,18 @@ path-platform@~0.11.15: resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2" integrity sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I= +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0= + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc= + dependencies: + path-root-regex "^0.1.0" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -6118,50 +5952,51 @@ pem@^1.13.2: os-tmpdir "^1.0.1" which "^2.0.2" -pg-connection-string@0.1.3, 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-connection-string@2.4.0, pg-connection-string@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.4.0.tgz#c979922eb47832999a204da5dbe1ebf2341b6a10" + integrity sha512-3iBXuv7XKvxeMrIgym7njT+HlZkwZqqGX4Bu9cci8xHZNT+Um1gWKqCsAzcC0d95rcKMU5WBg6YRUcHyV0HZKQ== 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@1.*: - version "1.8.0" - resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-1.8.0.tgz#f7ec73824c37a03f076f51bfdf70e340147c4f37" - integrity sha1-9+xzgkw3oD8Hb1G/33DjQBR8Tzc= - dependencies: - generic-pool "2.4.3" - object-assign "4.1.0" +pg-pool@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.2.2.tgz#a560e433443ed4ad946b84d774b3f22452694dff" + integrity sha512-ORJoFxAlmmros8igi608iVEbQNNZlp89diFVx6yV5v+ehmpMY9sK6QgpmgoXbmkNaBAx8cOOZh9g80kJv1ooyA== + +pg-protocol@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.4.0.tgz#43a71a92f6fe3ac559952555aa3335c8cb4908be" + integrity sha512-El+aXWcwG/8wuFICMQjM5ZSAm6OWiJicFdNYo+VY3QP+8vI4SvLIWVe51PppTzMhikUJR+PsyIFKqfdXPz/yxA== -pg-types@1.*: - version "1.13.0" - resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-1.13.0.tgz#75f490b8a8abf75f1386ef5ec4455ecf6b345c63" - integrity sha512-lfKli0Gkl/+za/+b6lzENajczwZHc7D5kiUCZfgm914jipD2kIOIvEkAhZ8GrW3/TUoP9w8FHjwpPObBye5KQQ== +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 "~1.0.0" + postgres-array "~2.0.0" postgres-bytea "~1.0.0" - postgres-date "~1.0.0" + postgres-date "~1.0.4" postgres-interval "^1.1.0" -pg@^6.1.0: - version "6.4.2" - resolved "https://registry.yarnpkg.com/pg/-/pg-6.4.2.tgz#c364011060eac7a507a2ae063eb857ece910e27f" - integrity sha1-w2QBEGDqx6UHoq4GPrhX7OkQ4n8= - dependencies: - buffer-writer "1.0.1" - js-string-escape "1.0.1" - packet-reader "0.3.1" - pg-connection-string "0.1.3" - pg-pool "1.*" - pg-types "1.*" - pgpass "1.*" - semver "4.3.2" - -pgpass@1.*: +pg@^8.5.1: + version "8.5.1" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.5.1.tgz#34dcb15f6db4a29c702bf5031ef2e1e25a06a120" + integrity sha512-9wm3yX9lCfjvA98ybCyw2pADUivyNWT/yIP4ZcDVpMN0og70BUWYEGXPCTAQdGTAqnytfRADb7NERrY1qxhIqw== + dependencies: + buffer-writer "2.0.0" + packet-reader "1.0.0" + pg-connection-string "^2.4.0" + pg-pool "^3.2.2" + pg-protocol "^1.4.0" + pg-types "^2.1.0" + pgpass "1.x" + +pgpass@1.x: version "1.0.4" resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.4.tgz#85eb93a83800b20f8057a2b029bf05abaf94ea9c" integrity sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w== @@ -6214,17 +6049,17 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -postgres-array@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-1.0.3.tgz#c561fc3b266b21451fc6555384f4986d78ec80f5" - integrity sha512-5wClXrAP0+78mcsNX3/ithQ5exKvCyK5lr5NEEEeGwwM6NJdQgzIJBVxLvRW+huFpX92F2QnZ5CcokH0VhK2qQ== +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.0: +postgres-date@~1.0.4: version "1.0.7" resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8" integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== @@ -6258,11 +6093,6 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= - prettier-bytes@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/prettier-bytes/-/prettier-bytes-1.0.4.tgz#994b02aa46f699c50b6257b5faaa7fe2557e62d6" @@ -6342,9 +6172,9 @@ public-encrypt@^4.0.0: safe-buffer "^5.1.2" public-ip@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/public-ip/-/public-ip-4.0.2.tgz#83158edd7665da6d51138ccdfa0413f0936fb7ff" - integrity sha512-ZHqUjaYT/+FuSiy5/o2gBxvj0PF7M3MXGnaLJBsJNMCyXI4jzuXXHJKrk0gDxx1apiF/jYsBwjTQOM9V8G6oCQ== + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-ip/-/public-ip-4.0.3.tgz#ca96979ddbd3e14d3378fd92b94a657b5696f288" + integrity sha512-IofiJJWoZ8hZHBk25l4ozLvcET0pjZSxocbUfh4sGkjidMOm4iZNzzWxezGqGsVY7HuxiK7SkyJKHNeT0YQ7uw== dependencies: dns-socket "^4.2.1" got "^9.6.0" @@ -6396,15 +6226,6 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= -randomatic@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" - randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -6435,7 +6256,7 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" -rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: +rc@^1.0.1, rc@^1.1.6, rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -6522,16 +6343,6 @@ read-pkg@^2.0.0: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^1.1.12: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -6578,14 +6389,9 @@ regenerate-unicode-properties@^8.2.0: regenerate "^1.4.0" regenerate@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f" - integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A== - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.13.4: version "0.13.7" @@ -6599,13 +6405,6 @@ regenerator-transform@^0.14.2: dependencies: "@babel/runtime" "^7.8.4" -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== - dependencies: - is-equal-shallow "^0.1.3" - 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" @@ -6614,13 +6413,13 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" - integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== +regexp.prototype.flags@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" regexpp@^2.0.1: version "2.0.1" @@ -6660,9 +6459,9 @@ regjsgen@^0.5.1: integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== regjsparser@^0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" - integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== + version "0.6.7" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.7.tgz#c00164e1e6713c2e3ee641f1701c4b7aa0a7f86c" + integrity sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ== dependencies: jsesc "~0.5.0" @@ -6693,13 +6492,13 @@ repeat-string@^1.5.2, repeat-string@^1.5.4, repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa" integrity sha1-rW8wwTvs15cBDEaK+ndcDAprR/o= -resolve-dir@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" - integrity sha1-shklmlYC+sXFxJatiUpujMQwJh4= +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= dependencies: - expand-tilde "^1.2.2" - global-modules "^0.2.3" + expand-tilde "^2.0.0" + global-modules "^1.0.0" resolve-from@^4.0.0: version "4.0.0" @@ -6711,12 +6510,12 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.3.2, resolve@^1.4.0: - version "1.18.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" - integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== +resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.4.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== dependencies: - is-core-module "^2.0.0" + is-core-module "^2.2.0" path-parse "^1.0.6" resp-modifier@^6.0.0: @@ -6759,7 +6558,7 @@ rimraf@2.6.3: dependencies: glob "^7.1.3" -rimraf@^2.6.1: +rimraf@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -6838,22 +6637,17 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: 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@7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^6.1.2: +semver@^6.1.1, semver@^6.1.2: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -6968,13 +6762,14 @@ shelljs@^0.8.4: interpret "^1.0.0" rechoir "^0.6.2" -side-channel@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.3.tgz#cdc46b057550bbab63706210838df5d4c19519c3" - integrity sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g== +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: - es-abstract "^1.18.0-next.0" - object-inspect "^1.8.0" + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" sigmund@^1.0.1: version "1.0.1" @@ -7056,36 +6851,16 @@ socket.io-adapter@~1.1.0: resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz#ab3f0d6f66b8fc7fca3959ab5991f82221789be9" integrity sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g== -socket.io-client@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.3.0.tgz#14d5ba2e00b9bcd145ae443ab96b3f86cbcc1bb4" - integrity sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA== - dependencies: - backo2 "1.0.2" - base64-arraybuffer "0.1.5" - component-bind "1.0.0" - component-emitter "1.2.1" - debug "~4.1.0" - engine.io-client "~3.4.0" - has-binary2 "~1.0.2" - has-cors "1.1.0" - indexof "0.0.1" - object-component "0.0.3" - parseqs "0.0.5" - parseuri "0.0.5" - socket.io-parser "~3.3.0" - to-array "0.1.4" - -socket.io-client@^2.0.4: - version "2.3.1" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.3.1.tgz#91a4038ef4d03c19967bb3c646fec6e0eaa78cff" - integrity sha512-YXmXn3pA8abPOY//JtYxou95Ihvzmg8U6kQyolArkIyLd0pgVhrfor/iMsox8cn07WCOOvvuJ6XKegzIucPutQ== +socket.io-client@2.4.0, socket.io-client@^2.0.4: + version "2.4.0" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.4.0.tgz#aafb5d594a3c55a34355562fc8aea22ed9119a35" + integrity sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ== dependencies: backo2 "1.0.2" component-bind "1.0.0" component-emitter "~1.3.0" debug "~3.1.0" - engine.io-client "~3.4.0" + engine.io-client "~3.5.0" has-binary2 "~1.0.2" indexof "0.0.1" parseqs "0.0.6" @@ -7094,9 +6869,9 @@ socket.io-client@^2.0.4: to-array "0.1.4" socket.io-parser@~3.3.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.1.tgz#f07d9c8cb3fb92633aa93e76d98fd3a334623199" - integrity sha512-1QLvVAe8dTz+mKmZ07Swxt+LAo4Y1ff50rlyoEx00TQmDFVQYPfcqGvIDJLGaBdhdNCecXtyKpD+EgKGcmmbuQ== + version "3.3.2" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.2.tgz#ef872009d0adcf704f2fbe830191a14752ad50b6" + integrity sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg== dependencies: component-emitter "~1.3.0" debug "~3.1.0" @@ -7112,15 +6887,15 @@ socket.io-parser@~3.4.0: isarray "2.0.1" socket.io@^2.0.4: - version "2.3.0" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.3.0.tgz#cd762ed6a4faeca59bc1f3e243c0969311eb73fb" - integrity sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg== + version "2.4.1" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.4.1.tgz#95ad861c9a52369d7f1a68acf0d4a1b16da451d2" + integrity sha512-Si18v0mMXGAqLqCVpTxBa8MGqriHGQh8ccEOhmsmNS3thNCGBwO8WGrwMibANsWtQQ5NStdZwHqZR3naJVFc3w== dependencies: debug "~4.1.0" - engine.io "~3.4.0" + engine.io "~3.5.0" has-binary2 "~1.0.2" socket.io-adapter "~1.1.0" - socket.io-client "2.3.0" + socket.io-client "2.4.0" socket.io-parser "~3.4.0" source-map-resolve@^0.5.0: @@ -7143,9 +6918,9 @@ source-map-support@^0.5.16: source-map "^0.6.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= + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== source-map@^0.5.0, source-map@^0.5.6, source-map@~0.5.3: version "0.5.7" @@ -7191,9 +6966,9 @@ spdx-expression-validate@^2.0.0: spdx-expression-parse "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.6" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz#c80757383c28abf7296744998cbc106ae8b854ce" - integrity sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw== + version "3.0.7" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" + integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== split-filter-n@^1.1.2: version "1.1.2" @@ -7348,32 +7123,33 @@ string-width@^4.1.0: strip-ansi "^6.0.0" string.prototype.matchall@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" - integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== + version "4.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.4.tgz#608f255e93e072107f5de066f81a2dfb78cf6b29" + integrity sha512-pknFIWVachNcyqRfaQSeu/FUfpvJTe4uskUSZ9Wc1RijsPuzbZ8TyYT8WCNnntCjUEqQ3vUHMAfVj2+wLAisPQ== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0" + es-abstract "^1.18.0-next.2" has-symbols "^1.0.1" - internal-slot "^1.0.2" - regexp.prototype.flags "^1.3.0" - side-channel "^1.0.2" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.3.1" + side-channel "^1.0.4" -string.prototype.trimend@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz#6ddd9a8796bc714b489a3ae22246a208f37bfa46" - integrity sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw== +string.prototype.trimend@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" -string.prototype.trimstart@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz#22d45da81015309cd0cdd79787e8919fc5c613e7" - integrity sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg== +string.prototype.trimstart@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" string_decoder@^1.1.1: version "1.3.0" @@ -7466,11 +7242,6 @@ supports-color@^0.2.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" integrity sha1-2S3iaU6z9nMjlz1649i1W0wiGQo= -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" @@ -7516,7 +7287,7 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" -tar@^4.4.2: +tar@^4.4.13: version "4.4.13" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== @@ -7529,6 +7300,11 @@ tar@^4.4.2: safe-buffer "^5.1.2" yallist "^3.0.3" +tarn@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/tarn/-/tarn-3.0.1.tgz#ebac2c6dbc6977d34d4526e0a7814200386a8aec" + integrity sha512-6usSlV9KyHsspvwu2duKH+FMUhqJnAh6J5J/4MITl8s94iSUQTLkJggdiewKv4RyARQccnigV48Z+khiuVZDJw== + term-color@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/term-color/-/term-color-1.0.1.tgz#38e192553a473e35e41604ff5199846bf8117a3a" @@ -7599,12 +7375,10 @@ through@2, "through@>=2.2.7 <3", through@^2.3.6: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -tildify@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.0.0.tgz#2a021db5e8fbde0a8f8b4df37adaa8fb1d39d7dd" - integrity sha1-KgIdtej73gqPi03zetqo+x05190= - dependencies: - user-home "^1.0.0" +tildify@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tildify/-/tildify-2.0.0.tgz#f205f3674d677ce698b7067a99e949ce03b4754a" + integrity sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw== timed-out@^4.0.0: version "4.0.1" @@ -7618,7 +7392,7 @@ timers-browserify@^1.0.1: dependencies: process "~0.11.0" -timers-ext@^0.1.5: +timers-ext@^0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== @@ -7749,9 +7523,9 @@ type@^1.0.1: integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== type@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.1.0.tgz#9bdc22c648cf8cf86dd23d32336a41cfb6475e3f" - integrity sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.3.0.tgz#ada7c045f07ead08abf9e2edd29be1a0c0661132" + integrity sha512-rgPIqOdfK/4J9FhiVrZ3cveAjRRo5rsQBAIhnylX874y1DX/kEKSVdLsnuHB6l1KTjHyU01VjiMBHgU2adejyg== typedarray@^0.0.6: version "0.0.6" @@ -7768,6 +7542,11 @@ umd@^3.0.0: resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.3.tgz#aa9fe653c42b9097678489c01000acb69f0b26cf" integrity sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow== +unc-path-regex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= + undeclared-identifiers@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz#9254c1d37bdac0ac2b52de4b6722792d2a91e30f" @@ -7871,9 +7650,9 @@ update-notifier@^2.5.0: xdg-basedir "^3.0.0" uri-js@^4.2.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" - integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" @@ -7914,11 +7693,6 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -user-home@^1.0.0, user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA= - util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -7948,24 +7722,12 @@ uuid@^2.0.1, uuid@^2.0.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" integrity sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho= -uuid@^3.0.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - v8-compile-cache@^2.0.3: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" - integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== - -v8flags@^2.0.2: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" - integrity sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ= - dependencies: - user-home "^1.1.1" + version "2.2.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" + integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== -v8flags@^3.1.1: +v8flags@^3.1.1, v8flags@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.2.0.tgz#b243e3b4dfd731fa774e7492128109a0fe66d656" integrity sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg== @@ -8032,7 +7794,7 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -which@^1.2.12, which@^1.2.9: +which@^1.2.14, which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -8101,17 +7863,10 @@ ws@^6.2.1: dependencies: async-limiter "~1.0.0" -ws@^7.1.2: - version "7.3.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8" - integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA== - -ws@~6.1.0: - version "6.1.4" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.4.tgz#5b5c8800afab925e94ccb29d153c8d02c1776ef9" - integrity sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA== - dependencies: - async-limiter "~1.0.0" +ws@~7.4.2: + version "7.4.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.3.tgz#1f9643de34a543b8edb124bdcbc457ae55a6e5cd" + integrity sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA== xdg-basedir@^3.0.0: version "3.0.0"