diff --git a/.gitignore b/.gitignore
index d30f40e..b8dca37 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,3 +19,5 @@
npm-debug.log*
yarn-debug.log*
yarn-error.log*
+
+.idea
diff --git a/app/brightness.js b/app/brightness.js
new file mode 100644
index 0000000..f72bb48
--- /dev/null
+++ b/app/brightness.js
@@ -0,0 +1,94 @@
+const _ = require("lodash");
+const {updateBrightness, getCurrentBrightness} = require("../db/controllers/brightness");
+const {discoverPixelBlazes, sendCommand} = require("./pixelBlazeUtils");
+
+let currentBrightness
+let pixelBlazeData = []
+let pixelBlazeIds = []
+init = async () => {
+ getCurrentBrightness()
+ .then((brightness) => {
+ try {
+ currentBrightness = brightness[0].value
+ } catch (err) {
+ console.warn(`Error: ${err}`)
+ }
+ })
+ pixelBlazeData = discoverPixelBlazes()
+ pixelBlazeIds = _.map(pixelBlazeData, 'id')
+}
+
+initInterval = setInterval(init, 100)
+
+class Brightness {
+ constructor(utils) {
+ this.utils = utils ? utils : null
+ }
+ adjustBrightness = async (brightness) => {
+ await new Promise((resolve) => {
+ const tempBrightness = (brightness) ? brightness : currentBrightness
+ this.delayedSaveBrightness(resolve, tempBrightness)
+ })
+ }
+ delayedSaveBrightness = _.debounce(async (resolve, brightness) => {
+ sendCommand(pixelBlazeIds, null, brightness)
+ await this.storeBrightness(brightness);
+ currentBrightness = brightness
+ await this.sendBrightnessMessage(currentBrightness)
+ }, 1000)
+ getBrightness = async () =>{
+ await this.sendBrightnessMessage(currentBrightness)
+ }
+ storeBrightness = async (brightness) => {
+ const body = {
+ value: brightness
+ }
+ await updateBrightness(body)
+ }
+ sendBrightnessMessage = async (currentBrightness) => {
+ // skipping this if utils is not initialized due to no websocket connections
+ if (this.utils) {
+ await this.utils.broadcastMessage({currentBrightness: currentBrightness})
+ }
+ }
+}
+// Initializing the brightness loop outside the websocket
+// because we might not always have a browser open when
+// starting/restarting the node-server... it should send
+// commands and operate on the brightness w/o the need of an
+// active websocket connection
+initThis = async () => {
+ // halting the brightness message until we get it from the db
+ while (currentBrightness === undefined) {
+ await new Promise(resolve => {
+ setTimeout(resolve, 100)
+ })
+ }
+ let initThe = new Brightness()
+ await initThe.adjustBrightness(currentBrightness)
+}
+initThis().then(()=>{})
+
+
+module.exports.BrightnessWebsocketMessageHandler = function (utils) {
+ const brightness = new Brightness(utils)
+ this.utils = utils
+
+ this.receiveMessage = async function (data) {
+ let message
+ try {
+ message = JSON.parse(data);
+ } catch (err) {
+ this.utils.sendError(err)
+ return
+ }
+ if (message.type === 'ADJUST_BRIGHTNESS') {
+ // console.log('received adjust brightness message!')
+ await brightness.adjustBrightness(parseFloat(message.brightness))
+ }
+ if (message.type === 'GET_CURRENT_BRIGHTNESS') {
+ // console.log('received get current brightness message!')
+ await brightness.getBrightness()
+ }
+ }
+}
diff --git a/app/controller.js b/app/controller.js
index 3a99a91..ddb8ab4 100644
--- a/app/controller.js
+++ b/app/controller.js
@@ -103,12 +103,12 @@ module.exports = class PixelblazeController {
this.reconectTimeout = setTimeout(this.connect, 1000);
}
- handleMessage(msg) {
+ handleMessage(msg, isBinary) {
this.lastSeen = new Date().getTime();
// console.log("data from " + this.props.id + " at " + this.props.address, typeof msg, msg);
let props = this.props;
- if (typeof msg === "string") {
+ if (!isBinary) {
try {
_.assign(this.props, _.pick(JSON.parse(msg), PROPFIELDS));
} catch (err) {
diff --git a/app/firestormWebsocket.js b/app/firestormWebsocket.js
new file mode 100644
index 0000000..0aac750
--- /dev/null
+++ b/app/firestormWebsocket.js
@@ -0,0 +1,32 @@
+const WebSocketServer = require('ws').Server
+const {PlaylistWebSocketMessageHandler} = require('./playlist')
+const {Utils} = require('./utils')
+const {BrightnessWebsocketMessageHandler} = require("./brightness");
+
+// start FireStorm WebSocket server
+const address = '0.0.0.0';
+const port = 1890;
+const firestormServer = new WebSocketServer({host: address , port: port});
+console.log(`Firestorm server is running on ${address}:${port}`);
+
+firestormServer.on('connection', function (connection) {
+ const utils = new Utils(connection)
+ const brightnessWebsocketMessageHandler = new BrightnessWebsocketMessageHandler(utils)
+ const playlistWebSocketMessageHandler = new PlaylistWebSocketMessageHandler(utils)
+ if(utils.addFirestormClient(connection)) {
+ return
+ }
+ connection.on('message', async function message(data, isBinary) {
+ const message = isBinary ? data : data.toString();
+ // console.log(`incoming msg from: ${utils.getFirestormClientBySocket(connection)}, message: ${message}`)
+ if (await playlistWebSocketMessageHandler.receiveMessage(message)) {
+ return
+ }
+ if (await brightnessWebsocketMessageHandler.receiveMessage(message)) {
+ return
+ }
+ })
+ connection.on('close', function() {
+ console.log('closed connection')
+ })
+})
\ No newline at end of file
diff --git a/app/pixelBlazeUtils.js b/app/pixelBlazeUtils.js
new file mode 100644
index 0000000..8fd57ac
--- /dev/null
+++ b/app/pixelBlazeUtils.js
@@ -0,0 +1,35 @@
+const _ = require("lodash");
+const {discoveries} = require("./discovery");
+
+module.exports.discoverPixelBlazes = () => {
+ return _.map(discoveries, function (v, k) {
+ let res = _.pick(v, ['lastSeen', 'address']);
+ _.assign(res, v.controller.props);
+ return res;
+ })
+}
+
+module.exports.sendCommand = (pixelBlazeIds, name, brightness) => {
+ _.each(pixelBlazeIds, async id => {
+ id = String(id);
+ let controller = discoveries[id] && discoveries[id].controller;
+ if (controller) {
+ let command = null
+ if(name !== null && name !== undefined) {
+ command = {
+ programName: name
+ }
+ }
+ if(brightness !== null && brightness !== undefined){
+ command = {
+ brightness: brightness
+ }
+ }
+ if (command) {
+ await controller.setCommand(command);
+ } else {
+ console.log(`No command sent to Pixelblazes command is ${command}`)
+ }
+ }
+ })
+}
\ No newline at end of file
diff --git a/app/playlist.js b/app/playlist.js
new file mode 100644
index 0000000..993129b
--- /dev/null
+++ b/app/playlist.js
@@ -0,0 +1,181 @@
+const _ = require("lodash");
+const {getPlaylistFromDB, addPatternToPlaylist, removeAllPatterns} = require("../db/controllers/playlist");
+const {discoverPixelBlazes, sendCommand} = require("./pixelBlazeUtils");
+
+let currentPlaylist = []
+let currentRunningPattern = null
+let initInterval
+let pixelBlazeData = []
+let pixelBlazeIds = []
+let playlistLoopTimeout
+let playlistTimeout
+
+init = async () => {
+ getPlaylistFromDB()
+ .then((data) => {
+ try {
+ currentPlaylist = [] // resetting current playlist so it doesn't grow to infinity
+ currentPlaylist.push(...data) // adding new playlist items to list
+ } catch (err) {
+ console.warn(`Error: ${err}`)
+ }
+ })
+ .catch('there was an error gathering playlist details')
+
+ // gather pixelBlaze data
+ pixelBlazeData = discoverPixelBlazes()
+ pixelBlazeIds = _.map(pixelBlazeData, 'id')
+}
+
+initInterval = setInterval(init, 100)
+
+class Playlist {
+ constructor(utils) {
+ this.utils = utils ? utils : null
+ }
+
+ playlistLoop = async () => {
+ while(true) {
+ await new Promise(resolve => {
+ playlistLoopTimeout = setTimeout(resolve, 100)
+ });
+ if(pixelBlazeIds.length) {
+ await this.iterateOnPlaylist()
+ }
+ initInterval = null
+ playlistLoopTimeout = null
+ playlistTimeout = null
+ }
+ }
+ iterateOnPlaylist = async () => {
+ for (let index = 0; index < currentPlaylist.length; index++) {
+ const pattern = currentPlaylist[index]
+ await this.delaySendPattern(pattern)
+ await new Promise(resolve => {
+ playlistTimeout = setTimeout(resolve, pattern.duration * 1000)
+ });
+ }
+ }
+ delaySendPattern = async (pattern) => {
+ await new Promise((resolve) => {
+ resolve(
+ this.sendPattern(pattern)
+ )
+ })
+ }
+ disableAllPatterns = async () => {
+ await removeAllPatterns()
+ await this.runPlaylistLoopNow()
+ }
+ enableAllPatterns = async (duration) => {
+ const pixelBlazePatterns = this.gatherPatternData(pixelBlazeData)
+ const enableAll = new Promise((resolve) => {
+ _.each(pixelBlazePatterns, pattern => {
+ pattern['duration'] = duration
+ let body = {
+ name: pattern.name,
+ duration: pattern.duration
+ }
+ addPatternToPlaylist(body)
+ })
+ resolve();
+ });
+ enableAll
+ .then(() => {
+ this.runPlaylistLoopNow()
+ })
+ }
+ gatherPatternData = (pixelBlazeData) => {
+ let groupByPatternName = {};
+ _.each(pixelBlazeData, d => {
+ d.name = d.name || "Pixelblaze_" + d.id // set name if missing
+ _.each(d.programList, p => {
+ let pb = {
+ id: d.id,
+ name: d.name
+ };
+ if (groupByPatternName[p.name]) {
+ groupByPatternName[p.name].push(pb);
+ } else {
+ groupByPatternName[p.name] = [pb];
+ }
+ })
+ })
+ let groups = _.chain(groupByPatternName)
+ .map((v, k) => ({name: k}))
+ .sortBy('name')
+ .value();
+ return groups
+ }
+ getCurrentProgramState = async () => {
+ let message = {
+ currentRunningPattern: currentRunningPattern,
+ currentPlaylist: currentPlaylist
+ }
+ await this.sendPlaylistMessage(message)
+ }
+ runPlaylistLoopNow = async () => {
+ clearInterval(initInterval)
+ clearInterval(playlistTimeout)
+ clearInterval(playlistLoopTimeout)
+
+ await this.playlistLoop()
+ }
+ sendPattern = async (pattern) => {
+ const name = pattern.name
+ currentRunningPattern = name
+ sendCommand(pixelBlazeIds, name)
+ let message = {
+ currentRunningPattern: name,
+ currentPlaylist: currentPlaylist
+ }
+ await this.sendPlaylistMessage(message)
+ }
+ sendPlaylistMessage = async (message) => {
+ // skipping this if utils is not initialized due to no websocket connections
+ if(this.utils) {
+ this.utils.broadcastMessage(message)
+ }
+ }
+
+}
+// Initializing the playlist loop outside the websocket
+// because we might not always have a browser open when
+// starting/restarting the node-server... it should send
+// commands and operate on the playlist w/o the need of an
+// active websocket connection
+initThe = new Playlist()
+initThe.playlistLoop()
+ .then(() => {})
+
+
+module.exports.PlaylistWebSocketMessageHandler = function (utils) {
+ const playlist = new Playlist(utils)
+ this.utils = utils
+
+ this.receiveMessage = async function (data) {
+ let message
+ try {
+ message = JSON.parse(data);
+ } catch (err) {
+ this.utils.sendError(err)
+ return
+ }
+ if (message.type === 'DISABLE_ALL_PATTERNS') {
+ // console.log('received message to disable all patterns!')
+ await playlist.disableAllPatterns(message.duration)
+ }
+ if (message.type === 'ENABLE_ALL_PATTERNS') {
+ // console.log('received message to enable all patterns!')
+ await playlist.enableAllPatterns(message.duration)
+ }
+ if (message.type === 'GET_CURRENT_PROGRAM_STATE') {
+ // console.log('received get current program state message!')
+ await playlist.getCurrentProgramState()
+ }
+ if (message.type === 'LAUNCH_PLAYLIST_NOW') {
+ // console.log('received launch playlist now message!')
+ await playlist.runPlaylistLoopNow()
+ }
+ }
+}
diff --git a/app/utils.js b/app/utils.js
new file mode 100644
index 0000000..50d9ac3
--- /dev/null
+++ b/app/utils.js
@@ -0,0 +1,85 @@
+const {v4: uuidv4} = require("uuid");
+const _ = require("lodash");
+module.exports.Utils = function (connection) {
+ this.connection = connection
+ this.firestormClients = new Array()
+
+ this.addFirestormClient = function (connection) {
+ const clientId = uuidv4()
+ const client = new FirestormClient(`FirestormClient_${clientId}`, connection)
+ console.log(`Received a new connection.`);
+ this.firestormClients.push(client)
+ console.log(`${client} is now connected.`);
+ }
+ this.broadcastMessage = function (message) {
+ const data = JSON.stringify(message);
+ let that = this
+ this.forEachFirestormClient(function (client, i) {
+ that.sendToFirestormClient(client, data)
+ })
+ }
+ this.getFirestormClientBySocket = function (connection) {
+ for (let i = this.firestormClients.length - 1; i >= 0; i--) {
+ if (this.firestormClients[i].connection === connection) {
+ return this.firestormClients[i]
+ }
+ }
+ return null
+ }
+ this.forEachFirestormClient = function (callBack) {
+ for (let i = this.firestormClients.length - 1; i >= 0; i--) {
+ if (!this.firestormClients[i]) {
+ this.firestormClients.splice(i, 1)
+ continue
+ }
+
+ callBack(this.firestormClients[i], i)
+ }
+ }
+
+ this.removeFirestormClient = function (connection, name) {
+ const removedClients = new Array()
+ for (let i = this.firestormClients.length - 1; i >= 0; i--) {
+ if (connection && this.firestormClients[i].connection == connection) {
+ removedClients.push(this.firestormClients[i])
+ this.firestormClients.splice(i, 1)
+ }
+ if (name && this.firestormClients[i].name == name) {
+ removedClients.push(this.firestormClients[i])
+ this.firestormClients.splice(i, 1)
+ }
+ }
+ for (let i = removedClients.length - 1; i >= 0; i--) {
+ console.log(`removing client ${removedClients[i]} since its connection is detected to be closed.`)
+ }
+ }
+
+ this.sendError = function (message) {
+ const messageObject = {
+ type: 'ERROR',
+ payload: `Wrong format: ${message}`,
+ };
+ this.connection.send(JSON.stringify(messageObject));
+ }
+ this.sendToFirestormClient = function (client, message) {
+ try {
+ client.send(message)
+ } catch (error) {
+ console.log(`there was an error sending message, removing client, error: ${error}`)
+ this.removeFirestormClient(null, client.name)
+ }
+ }
+}
+class FirestormClient {
+ constructor(name, connection) {
+ this.name = name
+ this.connection = connection
+ }
+ send = function (message) {
+ this.connection.send(message)
+ }
+ toString = function (message) {
+ return this.name
+ }
+}
+
diff --git a/db/api/router.js b/db/api/router.js
new file mode 100644
index 0000000..40df271
--- /dev/null
+++ b/db/api/router.js
@@ -0,0 +1,9 @@
+const playlistDbRoutes = require('../controllers/playlist')
+
+// Create router
+module.exports = function (app) {
+ app.get('/playlist/getPatterns', playlistDbRoutes.getAllPlaylistPatterns)
+ app.post('/playlist/addPattern', playlistDbRoutes.addPatternToPlaylist)
+ app.put('/playlist/removePattern', playlistDbRoutes.removePatternFromPlaylist)
+ app.put('/playlist/newPlaylist', playlistDbRoutes.newPlaylist)
+}
diff --git a/db/controllers/brightness.js b/db/controllers/brightness.js
new file mode 100644
index 0000000..3691303
--- /dev/null
+++ b/db/controllers/brightness.js
@@ -0,0 +1,75 @@
+const knex = require('../db')
+const _ = require("lodash");
+const brightness_table = 'brightness'
+exports.doesBrightnessExistInTable = async (req) => {
+ return await knex
+ .select('*')
+ .from(brightness_table)
+ .where('id', "!=", null)
+ .then((res) => {
+ if (res.length === 0) return false
+ if (res.length !== 0) return true
+ })
+}
+
+exports.getCurrentBrightness = async (req, res) => {
+ return await knex
+ .select('*')
+ .from(brightness_table)
+ .then((data) => {
+ if(res) {
+ res.status(200)
+ .json(data);
+ } else {
+ return data
+ }
+ })
+ .catch(err => {
+ console.log(`There was an error retrieving brightness: ${err}`)
+ })
+}
+
+exports.updateBrightness = async (req, res) => {
+ let brightnessValue = ''
+ try {
+ brightnessValue = req.body.value
+ } catch(err) {
+ brightnessValue = req.value
+ }
+ await knex.transaction(async trx => {
+ //clear table first
+ await knex
+ .into(brightness_table)
+ .where('id','!=', 'null')
+ .del()
+ .transacting(trx);
+ // insert new pattern
+ await knex
+ .insert({
+ value: brightnessValue,
+ })
+ .into(brightness_table)
+ .transacting(trx);
+ })
+ .then( () => {
+ if(res) {
+ res.status(200)
+ .json({message: `Creating a new brightness with level '${brightnessValue}'.`})
+ } else {
+ return JSON.stringify({message: 'ok'})
+ }
+ })
+ .catch(err => {
+ if(res) {
+ res.status(500)
+ .json({
+ message: `There was an error creating a new brightness with level '${brightnessValue}', error: ${err}`
+ })
+ } else {
+ return JSON.stringify({
+ code: 500,
+ message: `There was an error creating a new brightness with level '${brightnessValue}', error: ${err}`
+ })
+ }
+ })
+}
\ No newline at end of file
diff --git a/db/controllers/playlist.js b/db/controllers/playlist.js
new file mode 100644
index 0000000..a3d0209
--- /dev/null
+++ b/db/controllers/playlist.js
@@ -0,0 +1,165 @@
+const knex = require('../db')
+const _ = require("lodash");
+const playlist_table = 'playlist'
+
+exports.doesPatternExistInPlaylist = async (name) => {
+ return await knex
+ .select('*')
+ .from(playlist_table)
+ .where('name', "=", name)
+ .then((res) => {
+ if (res.length === 0) return false
+ if (res.length !== 0) return true
+ })
+}
+exports.getPlaylistFromDB = async () => {
+ return await knex
+ .select('*')
+ .from(playlist_table)
+ .then((data) => {
+ return data
+ })
+ .catch(err => {
+ console.log(`There was an error retrieving playlist items: ${err}`)
+ })
+}
+exports.getAllPlaylistPatterns = async (req, res) => {
+ this.getPlaylistFromDB().then(playlistData => {
+ res.status(200)
+ .json(playlistData);
+ })
+ .catch(err => {
+ res.status(500)
+ .json({message: `There was an error retrieving playlist items: ${err}`})
+ })
+}
+
+exports.addPatternToPlaylist = async (req, res) => {
+ let duration = ''
+ let name = ''
+ try {
+ duration = req.body.duration
+ name = req.body.name
+ } catch(err) {
+ duration = req.duration
+ name = req.name
+ }
+ const doesPatternExistInPlaylist = await this.doesPatternExistInPlaylist(name)
+ .then((condition) => {
+ return condition
+ })
+ // update existing pattern in playlist
+ if(doesPatternExistInPlaylist) {
+ await knex
+ .update({
+ duration: duration
+ })
+ .into(playlist_table)
+ .where(
+ 'name', '=', name
+ )
+ .then(() => {
+ if (res) {
+ res.status(200).json({message: `Pattern \'${name}\' with a duration of ${duration} created.`})
+ } else {
+ return JSON.stringify({message: 'ok'})
+ }
+ })
+ .catch(err => {
+ if (res) {
+ res.status(500).json({message: `There was an error adding the ${name} pattern: ${err}`})
+ } else {
+ return JSON.stringify({code: 500, message: `There was an error adding the ${name} pattern: ${err}`})
+ }
+ })
+ }
+ // insert new pattern into playlist
+ if(!doesPatternExistInPlaylist) {
+ await knex
+ .insert({
+ name: name,
+ duration: duration,
+ })
+ .into(playlist_table)
+ .then(() => {
+ if (res) {
+ res.status(200)
+ .json({message: `Pattern \'${name}\' with a duration of ${duration} created.`})
+ } else {
+ return JSON.stringify({message: 'ok'})
+ }
+
+ })
+ .catch(err => {
+ if (res) {
+ res.status(500)
+ .json({message: `There was an error adding the ${name} pattern: ${err}`})
+ } else {
+ return JSON.stringify({code: 500, message: `There was an error adding the ${name} pattern: ${err}`})
+ }
+
+ })
+ }
+}
+
+exports.removePatternFromPlaylist = async (req, res) => {
+ await knex
+ .into(playlist_table)
+ .where('name', req.body.name)
+ .del()
+ .then( () => {
+ res.status(200)
+ .json({ message: `Removed pattern '${req.body.name}' from playlist.`});
+ }
+ )
+ .catch(err => {
+ res.status(500)
+ .json({
+ message: `There was an error removing the pattern '${req.body.name}', error: ${err}`
+ })
+ })
+}
+
+exports.newPlaylist = async (req, res) => {
+ await knex.transaction(async trx => {
+ //clear table first
+ await knex
+ .into(playlist_table)
+ .where('id','!=', 'null')
+ .del()
+ .transacting(trx);
+ // insert new pattern
+ await knex
+ .insert({
+ name: req.body.name,
+ duration: req.body.duration,
+ })
+ .into(playlist_table)
+ .transacting(trx);
+ })
+ .then( () => {
+ res.status(200)
+ .json({ message: `Creating a new playlist with pattern '${req.body.name}' from playlist.`});
+ }
+ )
+ .catch(err => {
+ res.status(500)
+ .json({
+ message: `There was an error creating a new playlist with pattern '${req.body.name}', error: ${err}`
+ })
+ })
+}
+
+exports.removeAllPatterns = async (req, res) => {
+ await knex
+ .into(playlist_table)
+ .where('id','!=', 'null')
+ .del()
+ .then( () => {
+ return JSON.stringify({ message: `Removing all patterns from playlist.`})
+ }
+ )
+ .catch(err => {
+ return JSON.stringify({code: 500, message: `There was an error while removing all patterns from the playlist. Error: ${err}`})
+ })
+}
\ No newline at end of file
diff --git a/db/db.js b/db/db.js
new file mode 100644
index 0000000..d0862da
--- /dev/null
+++ b/db/db.js
@@ -0,0 +1,60 @@
+const path = require('path')
+
+const dbPath = path.resolve(__dirname, "./store/database.sqlite")
+
+const knex = require('knex')({
+ client: 'sqlite3',
+ connection: {
+ filename: dbPath,
+ },
+ useNullAsDefault: true
+})
+
+knex.schema
+ .hasTable('playlist')
+ .then((exists) => {
+ if (!exists) {
+ return knex.schema.createTable('playlist', (table) => {
+ table.increments('id').primary()
+ table.string('name')
+ table.float('duration')
+ })
+ .then(() => {
+ console.log('Table \'playlist\' created')
+ })
+ .catch((error) => {
+ console.error(`There was an error creating the playlist table: ${error}`)
+ })
+ }
+ })
+ .catch((error) => {
+ console.error(`There was an error setting up the database: ${error}`)
+ })
+
+knex.schema
+ .hasTable('brightness')
+ .then((exists) => {
+ if (!exists) {
+ return knex.schema.createTable('brightness', (table) => {
+ table.increments('id').primary()
+ table.float('value')
+ })
+ .then(function () {
+ return knex("brightness").insert([
+ {value: 0}
+ ]);
+ }
+ )
+ .then(() => {
+ console.log('Table \'brightness\' created')
+ })
+ .catch((error) => {
+ console.error(`There was an error creating the brightness table: ${error}`)
+ })
+ }
+ })
+ .catch((error) => {
+ console.error(`There was an error setting up the database: ${error}`)
+ })
+
+module.exports = knex
\ No newline at end of file
diff --git a/db/store/database.sqlite b/db/store/database.sqlite
new file mode 100644
index 0000000..e69de29
diff --git a/package.json b/package.json
index b388ad2..1ab1ed9 100644
--- a/package.json
+++ b/package.json
@@ -9,12 +9,15 @@
"compression": "^1.7.4",
"express": "^4.17.1",
"form-data": "^3.0.0",
+ "knex": "^2.4.2",
"lodash": "^4.17.21",
"node-fetch": "^3.0.0",
"react": "^16.4.2",
"react-dom": "^16.13.1",
"react-scripts": "^3.4.1",
- "ws": "^7.4.6"
+ "sqlite3": "^5.1.6",
+ "uuid": "^9.0.0",
+ "ws": "^8.13.0"
},
"scripts": {
"start": "react-scripts start",
diff --git a/server.js b/server.js
index d7879b3..2669c5b 100644
--- a/server.js
+++ b/server.js
@@ -4,7 +4,7 @@ const app = express()
const bodyParser = require('body-parser');
const compression = require('compression');
const repl = require('repl');
-
+require("./app/firestormWebsocket");
discovery.start({
host: '0.0.0.0',
port: 1889
@@ -16,6 +16,7 @@ app.use(bodyParser.json());
const {PORT = 80} = process.env
require("./app/api")(app);
+require('./db/api/router')(app);
app.use(compression())
app.use(express.static('build'));
@@ -25,6 +26,7 @@ app.listen(PORT)
const r = repl.start('> ');
+
r.on('exit', () => {
console.log('Received "exit" event from repl!');
process.exit();
diff --git a/src/App.css b/src/App.css
index 18f2d5d..ac70bef 100644
--- a/src/App.css
+++ b/src/App.css
@@ -42,3 +42,29 @@
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
+
+.navbrightness {
+ white-space: nowrap;
+}
+
+.navbrightness label {
+ font-size: 170%;
+ margin: 4px 6px;
+ float: left;
+}
+
+#brightness {
+ padding: initial;
+}
+
+.navbrightness input {
+ width: 10em;
+ display: inline-block;
+ border: none;
+ height: 1em;
+ margin-right: 1em;
+}
+
+.clone-btn {
+ margin-left: 10px;
+}
diff --git a/src/App.js b/src/App.js
index 71a37c4..d2eb9af 100644
--- a/src/App.js
+++ b/src/App.js
@@ -1,28 +1,34 @@
import React, {Component} from 'react';
import './App.css';
import _ from 'lodash';
+import {check, connect, sendMessage, ws} from "./utils";
import PatternView from './PatternView'
-const PLAYLIST_KEY = "firestorm:playlists:0"
-
class App extends Component {
constructor(props) {
super(props);
this.state = {
+ brightness: 0,
+ deactivateDisableAllButton: true,
+ deactivateEnableAllButton: false,
discoveries: [],
- groups: [], // Currently duscovered patterns and their controllers
+ downloadingDumpArchive: false,
+ isProcessing: false,
+ groups: [], // Currently discovered patterns and their controllers
runningPatternName: null,
+ message: [],
+ newPlaylist: [],
playlist: [], // Browser-persisted single playlist singleton
playlistIndex: 0,
playlistDefaultInterval: 15,
cloneSource: null,
cloneDest: {},
cloneInProgress: false,
- showDevControls: false
+ showDevControls: false,
+ showCurrentPlaylist: false,
+ ws: null
}
- // The playlist is the only thing currently persisted and it is per-broswer
- this.state.playlist = JSON.parse(localStorage.getItem(PLAYLIST_KEY)) || []
if (this.state.playlist.length) {
this.state.playlistDefaultInterval = _(this.state.playlist).last().duration
@@ -30,16 +36,61 @@ class App extends Component {
this.poll = this.poll.bind(this);
- this._playlistInterval = null
-
this.cloneDialogRef = React.createRef();
+ this.playlistDialogRef = React.createRef();
+ };
+
+ filterMessage(){
+ const message = this.state.message
+ if(message) {
+ message.filter((item) => {
+ if ( item.currentRunningPattern && item.currentPlaylist ){
+ this.setState({
+ runningPatternName: (this.state.runningPatternName === item.currentRunningPattern) ? this.state.runningPatternName : item.currentRunningPattern,
+ playlist: JSON.parse((JSON.stringify(this.state.playlist) === JSON.stringify(item.currentPlaylist)) ? JSON.stringify(this.state.playlist) : JSON.stringify(item.currentPlaylist)),
+ })
+ }
+ if ( item.currentBrightness){
+ this.setState({
+ brightness: (this.state.brightness === item.currentBrightness) ? this.state.brightness : item.currentBrightness,
+ })
+ }
+ return this
+ })
+ }
+ }
+ receiveMessage(message) {
+ if (message) {
+ this.setState({
+ message: [JSON.parse(message.data)]
+ })
+ }
+ this.filterMessage()
+ }
+ async apiRequest(method, body?, route) {
+ const payload = {
+ method: method,
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json'
+ }
+ }
+ if (method !== 'GET') payload['body'] = body
+ try {
+ const result = await fetch(route, payload)
+ .then((res) => {
+ return res.json();
+ })
+ return result
+ } catch(err) {
+ console.warn(`unable to fetch request for some reason ${err}`)
+ }
}
-
async poll() {
if (this.interval)
clearTimeout(this.interval);
- let res = await fetch('./discover')
try {
+ let res = await fetch('./discover')
let discoveries = await res.json();
let groupByName = {};
@@ -62,26 +113,97 @@ class App extends Component {
.sortBy('name')
.value();
// console.log("groups", groups);
-
discoveries = _.sortBy(discoveries, "name")
this.setState({discoveries, groups})
} catch (err) {
this.setState({err})
}
+ check()
if (!this.unmounting)
this.interval = setTimeout(this.poll, 1000)
+ this._getCurrentProgramState()
}
+
async componentDidMount() {
document.addEventListener("keydown", this._handleKeyDown);
await this.poll()
- if (this.state.playlist.length) this._launchPatternAndSetTimeout()
+ // connecting to playlist websocket server
+ connect();
+ // attaching websocket event listener to receive messages
+ ws.addEventListener('message', (event) => {this.receiveMessage(event)});
+ // using setState chain to control timing of these two functions.
+ this.setState({}, () => {
+ // kicking off playlist event loops on page load
+ this._getCurrentProgramState();
+ this.setState({}, () => {
+ setTimeout(() =>{
+ // ensuring this runs after the above _launchPlaylistNow fires and completes.
+ // looking at playlist length configure bulk playlist buttons
+ if(this.state.playlist.length === this.state.groups.length){
+ this.setState({
+ deactivateEnableAllButton: true,
+ deactivateDisableAllButton: false
+ })
+ }
+ }, 1000)
+ })
+ })
+ this._getBrightnessNow();
}
componentWillUnmount() {
this.unmounting = true;
clearInterval(this.interval)
- clearInterval(this._playlistInterval)
+ ws.close()
+ ws.removeEventListener('message', (event) => {this.receiveMessage(event)});
+ }
+
+ changeBrightness = async (event) => {
+ event.preventDefault()
+ this.setState({
+ brightness: event.target.value
+ })
+ const message = {
+ type: 'ADJUST_BRIGHTNESS',
+ brightness: event.target.value
+ }
+ await sendMessage(message)
+
+ }
+
+ downloadPatternArchive = async (event, deviceId) => {
+ event.preventDefault()
+ this.setState({
+ downloadingDumpArchive: true
+ })
+ await fetch(`./controllers/${deviceId}/dump`)
+ .then(async res => {
+ let filename = ''
+ for (const header of res.headers) {
+ if (header[1].includes('filename')) {
+ const dispositionHeader = header[1]
+ // ignoring warning for `_`
+ // eslint-disable-next-line no-unused-vars
+ const [_, rawFilename] = dispositionHeader.split('=')
+ // removing double quotes
+ filename = rawFilename.replace(/^"(.+(?="$))"$/, '$1')
+ }
+ }
+ const url = URL.createObjectURL(await res.blob())
+ const element = document.createElement("a");
+ element.setAttribute("href", url);
+ element.setAttribute("download", filename);
+ element.style.display = "none";
+ document.body.appendChild(element);
+ element.click();
+ document.body.removeChild(element);
+ URL.revokeObjectURL(url);
+ this.setState({
+ downloadingDumpArchive: false
+ })
+ })
+ .catch(err => console.error(err));
}
async _launchPattern(pattern) {
@@ -89,25 +211,22 @@ class App extends Component {
console.warn(`pattern ${pattern.name} is already running, ignoring launch request`)
return
}
- // console.log('launching pattern', pattern)
- return new Promise((resolve) => {
- this.setState({ runningPatternName: pattern.name }, () => {
- const payload = {
- method: 'POST',
- headers: {
- 'Accept': 'application/json',
- 'Content-Type': 'application/json'
- },
- body: JSON.stringify({
- command: {
- programName: pattern.name
- },
- ids: _.map(pattern.pixelblazes, 'id')
- })
- }
- resolve(fetch('./command', payload))
- })
- })
+ this._launchPlaylistNow()
+ }
+
+ openPlaylistDialog = async (event) => {
+ event.preventDefault();
+ this.setState({
+ showCurrentPlaylist: true
+ });
+ setTimeout(() => {
+ this.playlistDialogRef.current && this.playlistDialogRef.current.scrollIntoView(true);
+ }, 100)
+ if( this.state.showCurrentPlaylist === true ) {
+ this.setState({
+ showCurrentPlaylist: false
+ });
+ }
}
_handlePatternClick = async (event, pattern) => {
@@ -115,65 +234,132 @@ class App extends Component {
await this._startNewPlaylist(pattern)
}
- storePlaylist = () => {
- localStorage.setItem(PLAYLIST_KEY, JSON.stringify(this.state.playlist))
+ storePlaylist = (patternNameToBeRemoved?: string, addNewPlaylist?: Object, mode) => {
+ if (patternNameToBeRemoved === null && mode === "update") {
+ console.log('trying to add to existing playlist')
+ // add pattern name to existing playlist
+ this.state.newPlaylist.map((pattern) => {
+ const body = JSON.stringify({
+ name: pattern.name,
+ duration: pattern.duration
+ })
+ return this.apiRequest('POST',body, './playlist/addPattern')
+ .then((playlistResults) => {
+ return playlistResults;
+ })
+ })
+ }
+ if (patternNameToBeRemoved && mode === "remove") {
+ // remove pattern name from playlist
+ const body = JSON.stringify({
+ name: patternNameToBeRemoved
+ })
+ return this.apiRequest('PUT', body, './playlist/removePattern')
+ .then((playlistResults) => {
+ return playlistResults;
+ })
+ }
+ if (addNewPlaylist && mode === "create") {
+ // create a new playlist with a new pattern
+ const body = JSON.stringify({
+ name: addNewPlaylist.name,
+ duration: addNewPlaylist.duration
+ })
+ this.apiRequest('PUT', body, './playlist/newPlaylist')
+ .then((playlistResults) => {
+ return playlistResults;
+ })
+ this._launchPlaylistNow()
+ }
}
_handleDurationChange = async (event, pattern, newDuration) => {
event.preventDefault()
const newValidDuration = parseFloat(newDuration) || 0
const { playlist } = this.state
- const newPlaylist = playlist.slice()
- _(newPlaylist).find(['name', pattern.name]).duration = newValidDuration
+ const newTempPlaylist = playlist.slice()
+ _(newTempPlaylist).find(['name', pattern.name]).duration = newValidDuration
this.setState({
- playlist: newPlaylist,
+ newPlaylist: newTempPlaylist,
playlistDefaultInterval: newValidDuration
- }, this.storePlaylist)
+ }, () => {
+ setTimeout(() => {
+ this.storePlaylist(null, null, "update")
+ }, 10)
+ })
+ }
+
+ addNewPatternToPlaylist = async (pattern, playlist, interval) => {
+ console.log(`adding pattern ${pattern.name} to playlist`)
+ playlist.push({ name: pattern.name, duration: interval })
+ this.setState(
+ { newPlaylist: playlist }, () => {
+ setTimeout(() => {
+ this.storePlaylist(null, null, "update")
+ }, 10)
+ })
+ this._launchPlaylistNow()
+ }
+
+ removePatternFromPlaylist = async (pattern, clickedPlaylistIndex, playlistIndex) => {
+ console.log(`removing pattern ${pattern.name} from playlist`)
+ const newTempPlaylist = this.state.playlist.slice()
+ newTempPlaylist.splice(clickedPlaylistIndex, 1)
+ setTimeout(() => {
+ const name = pattern.name
+ this.storePlaylist(name, null, "remove")
+ }, 100)
+ this._launchPlaylistNow()
}
_handleAddClick = async (event, pattern) => {
event.preventDefault()
- const { playlist, playlistIndex, playlistDefaultInterval } = this.state
+ const {playlist, playlistIndex, playlistDefaultInterval} = this.state
const clickedPlaylistIndex = _(playlist).findIndex(['name', pattern.name])
if (clickedPlaylistIndex === -1) {
if (!playlist.length) {
- this._startNewPlaylist(pattern)
+ await this._startNewPlaylist(pattern)
} else {
- // console.log(`adding pattern ${pattern.name} to playlist`)
- const newPlaylist = playlist.slice()
- newPlaylist.push({ name: pattern.name, duration: playlistDefaultInterval })
- this.setState({ playlist: newPlaylist }, this.storePlaylist)
+ const newTempPlaylist = playlist.slice()
+ await this.addNewPatternToPlaylist(pattern, newTempPlaylist, playlistDefaultInterval)
}
} else {
- if (clickedPlaylistIndex !== playlistIndex) {
- // console.log(`removing pattern ${pattern.name} from playlist`)
- const newPlaylist = playlist.slice()
- newPlaylist.splice(clickedPlaylistIndex, 1)
- this.setState({ playlist: newPlaylist }, this.storePlaylist)
- }
+ await this.removePatternFromPlaylist(pattern, clickedPlaylistIndex, playlistIndex)
}
}
async _startNewPlaylist(startingPattern) {
- clearInterval(this._playlistInterval)
+ const newTempPlaylist = { name: startingPattern.name, duration: this.state.playlistDefaultInterval }
this.setState({
- playlist: [{ name: startingPattern.name, duration: this.state.playlistDefaultInterval }],
+ playlist: newTempPlaylist,
playlistIndex: 0
}, () => {
- this.storePlaylist()
- this._launchPatternAndSetTimeout()
+ setTimeout(() => {
+ this.storePlaylist(null, newTempPlaylist, "create");
+ }, 100)
})
}
-
+ _launchPlaylistNow() {
+ const message = {
+ type: 'LAUNCH_PLAYLIST_NOW'
+ }
+ sendMessage(message)
+ }
+ _getBrightnessNow() {
+ const message = {
+ type: 'GET_CURRENT_BRIGHTNESS'
+ }
+ sendMessage(message)
+ }
+ _getCurrentProgramState() {
+ const message = {
+ type: 'GET_CURRENT_PROGRAM_STATE'
+ }
+ sendMessage(message)
+ }
async _launchPatternAndSetTimeout() {
await this._launchCurrentPattern()
- const { playlist, playlistIndex } = this.state
- this._playlistInterval = setTimeout(() => {
- const { playlist, playlistIndex } = this.state
- const nextIndex = (playlistIndex + 1) % playlist.length
- this.setState({ playlistIndex: nextIndex }, () => this._launchPatternAndSetTimeout())
- }, playlist[playlistIndex].duration * 1000)
}
async _launchCurrentPattern() {
@@ -189,6 +375,58 @@ class App extends Component {
}
}
+ enableAllPatterns = (event) => {
+
+ if (this.state.deactivateEnableAllButton) {
+ return;
+ }
+ const message = {
+ type: 'ENABLE_ALL_PATTERNS',
+ duration: this.state.playlistDefaultInterval
+ }
+ sendMessage(message)
+ // react processes state updates in batches and its
+ // lifecycles make presenting this spinner awfully weird
+ // this is a cruel hack to show a loader while processing all the patterns
+ this.setState({ isProcessing: true }, () => {
+ // const newPlaylist = this.state.playlist.slice();
+ // await (this.state.groups).forEach((pattern) => {
+ for (const pattern of this.state.groups) {
+ // await (this.state.groups).forEach((pattern) => {
+ if (((this.state.playlist).some(item => item.name !== pattern.name)) || (!(this.state.playlist.length))) {
+ // this.addNewPatternToPlaylist(pattern, newPlaylist, this.state.playlistDefaultInterval)
+ };
+ }
+ setTimeout( () => {
+ this.setState({
+ isProcessing: false,
+ deactivateEnableAllButton: true,
+ deactivateDisableAllButton: false
+ });
+ }, 100)
+ })
+ }
+
+ disableAllPatterns = () => {
+ // for some reason we still have one enabled here... must remove them all
+ if (this.state.deactivateDisableAllButton) {
+ return;
+ }
+
+ const message = {
+ type: 'DISABLE_ALL_PATTERNS'
+ }
+ sendMessage(message)
+ // resetting playlist state to force UI to rerender
+ this.setState({
+ playlist: []
+ })
+ this.setState({
+ deactivateEnableAllButton: false,
+ deactivateDisableAllButton: true,
+ });
+ }
+
handleReload = async (event) => {
event.preventDefault();
await fetch("/reload", {method:"POST"});
@@ -215,7 +453,6 @@ class App extends Component {
cloneDest: {}
});
}
-
setCloneDest = (id, checked) => {
this.setState((state, props) => {
let cloneDest = Object.assign({}, state.cloneDest);
@@ -255,13 +492,22 @@ class App extends Component {
if(event.key === '/') {
// Toggle developer controls
this.setState({
- showDevControls: !this.state.showDevControls
+ showDevControls: !this.state.showDevControls
});
}
}
render() {
+ const getStatus = (name) => {
+ if (name === this.state.runningPatternName) {
+ return 'running'
+ } else if (_(this.state.playlist).map('name').includes(name)) {
+ return 'queued'
+ } else {
+ return 'available'
+ }
+ }
let cloneDialog = null;
if (this.state.cloneSource) {
// console.log("discoveries", this.state.discoveries);
@@ -295,18 +541,99 @@ class App extends Component {
)}
{!this.state.cloneInProgress && (
- <>
- Cancel
- Clone
-
- Cloning is destructive and cannot be undone! After cloning, the destination controllers will exactly match the source.
+ <>
+
Cancel
+
Clone
+
+ Cloning is destructive and cannot be undone! After cloning, the destination controllers will exactly match the source.
+
+ >
+ )}
+
+
+
+
+ )
+ }
+ let playlistDialog = null
+ if (this.state.showCurrentPlaylist) {
+ playlistDialog = (
+ <>
+
+
+
+
+
+
+ Enable All
+
+
+
+
+ Disable All
+
+
+
+ this.openPlaylistDialog(e)}>
+ Current Playlist
+
+
+
+
+
+
+
+
+
+
+ {Array.isArray(this.state.playlist) && (this.state.playlist).map( (pattern, index) =>
+
+
+ {pattern.name}
+
+
+ {pattern.duration}
- >
+ {(getStatus(pattern.name) === 'running') ? (
+
+ running
+
+ ) : (
+
+ queued
+
+ )}
+
)}
+ >
)
}
@@ -326,22 +653,60 @@ class App extends Component {
-
-
-
-
Controllers
- ↻
-
-
+
+
+
+
+
Controllers
+
+
+ ↻
+
+
+
+
+
+
+ 💡
+ {
+ await this.changeBrightness(e)
+ }}
+ min="0"
+ max="1"
+ step=".005"
+ title={`Brightness ${Math.round(this.state.brightness * 100) }%`}
+ value={(this.state.brightness !== null) && this.state.brightness}
+ />
+
+
+
+
+ {(this.state.downloadingDumpArchive) &&
+
+ WARNING: Do not navigate from or refresh this page.
+ Currently downloading patterns from PixelBlaze.
+ Please wait until finished for browser to download archive. It should complete in a few seconds.
+
+ }
+
+
+
{this.state.discoveries.map(d => {
const dName = d.name
return (
-
- Dump
- this.openCloneDialog(event, d.id)}>Clone
- Open
- {dName} v{d.ver} @ {d.address}
-
+
+ await this.downloadPatternArchive(event, d.id)}>
+ Dump
+
+ this.openCloneDialog(event, d.id)}>Clone
+ Open
+ {dName} v{d.ver} @ {d.address}
+
)
})}
@@ -350,36 +715,74 @@ class App extends Component {
{cloneDialog}
-
-
Patterns
+ {playlistDialog}
+
+
+
+
+
+
+ Enable All
+
+
+
+
+ Disable All
+
+
+
+ this.openPlaylistDialog(e)}>
+ Current Playlist
+
+
+
+
+
+ {(this.state.isProcessing) &&
+
+
+
Adding patterns to playlist, please wait
+
+ Loading...
+
+
+
+ }
{this.state.groups.map((pattern) => {
- const getStatus = () => {
- if (pattern.name === this.state.runningPatternName) {
- return 'running'
- } else if (_(this.state.playlist).map('name').includes(pattern.name)) {
- return 'queued'
- } else {
- return 'available'
- }
- }
- const getDuraton = () => {
+ const getDuration = () => {
const playlistIndex = _(this.state.playlist).findIndex(['name', pattern.name])
if (playlistIndex === -1) return ''
return this.state.playlist[playlistIndex].duration
}
return (
-
1)}
- duration={getDuraton()}
- />
+ 1)}
+ duration={getDuration()}
+ />
)
})}
diff --git a/src/utils.js b/src/utils.js
new file mode 100644
index 0000000..2ecf5b6
--- /dev/null
+++ b/src/utils.js
@@ -0,0 +1,49 @@
+const hostname = window.location.hostname
+export const ws = new WebSocket(`ws://${hostname}:1890/ws`);
+const timeout = 250;
+export const connect = () => {
+ let connectInterval;
+
+ ws.onopen = () => {
+ console.log("Connected to FireStorm WebSocket Server");
+
+ this.setState({ ws: ws });
+
+ clearTimeout(connectInterval);
+ };
+
+ ws.onclose = e => {
+ console.log(
+ `WebSocket is closed. Reconnect will be attempted in ${Math.min(
+ 10000 / 1000,
+ (timeout + timeout) / 1000
+ )} second.`,
+ e.reason
+ );
+
+ let retryTimeout = timeout + timeout;
+ connectInterval = setTimeout(check, Math.min(10000, retryTimeout));
+ };
+
+ ws.onerror = err => {
+ console.error(
+ "WebSocket encountered error: ",
+ err.message,
+ "Closing socket"
+ );
+
+ ws.close();
+ };
+};
+
+export const check = () => {
+ if (!ws || ws.readyState === WebSocket.CLOSED) connect();
+};
+
+export const sendMessage = (data) => {
+ try {
+ ws.send(JSON.stringify(data))
+ } catch (error) {
+ console.log(error)
+ }
+}
\ No newline at end of file
diff --git a/yarn.lock b/yarn.lock
index c3f2b42..4e9eb5b 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1125,6 +1125,11 @@
resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18"
integrity sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==
+"@gar/promisify@^1.0.1":
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6"
+ integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==
+
"@hapi/address@2.x.x":
version "2.1.4"
resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5"
@@ -1305,6 +1310,21 @@
"@types/istanbul-reports" "^1.1.1"
"@types/yargs" "^13.0.0"
+"@mapbox/node-pre-gyp@^1.0.0":
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz#8e6735ccebbb1581e5a7e652244cadc8a844d03c"
+ integrity sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==
+ dependencies:
+ detect-libc "^2.0.0"
+ https-proxy-agent "^5.0.0"
+ make-dir "^3.1.0"
+ node-fetch "^2.6.7"
+ nopt "^5.0.0"
+ npmlog "^5.0.1"
+ rimraf "^3.0.2"
+ semver "^7.3.5"
+ tar "^6.1.11"
+
"@mrmlnc/readdir-enhanced@^2.2.1":
version "2.2.1"
resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
@@ -1318,6 +1338,22 @@
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
+"@npmcli/fs@^1.0.0":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257"
+ integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==
+ dependencies:
+ "@gar/promisify" "^1.0.1"
+ semver "^7.3.5"
+
+"@npmcli/move-file@^1.0.1":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674"
+ integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==
+ dependencies:
+ mkdirp "^1.0.4"
+ rimraf "^3.0.2"
+
"@svgr/babel-plugin-add-jsx-attribute@^4.2.0":
version "4.2.0"
resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz#dadcb6218503532d6884b210e7f3c502caaa44b1"
@@ -1421,6 +1457,11 @@
"@svgr/plugin-svgo" "^4.3.1"
loader-utils "^1.2.3"
+"@tootallnate/once@1":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
+ integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
+
"@types/babel__core@^7.1.0":
version "7.1.9"
resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.9.tgz#77e59d438522a6fb898fa43dc3455c6e72f3963d"
@@ -1738,6 +1779,11 @@ abab@^2.0.0:
resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a"
integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==
+abbrev@1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+ integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
+
accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7:
version "1.3.7"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
@@ -1795,6 +1841,22 @@ adjust-sourcemap-loader@2.0.0:
object-path "0.11.4"
regex-parser "2.2.10"
+agent-base@6, agent-base@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
+ integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
+ dependencies:
+ debug "4"
+
+agentkeepalive@^4.1.3:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255"
+ integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==
+ dependencies:
+ debug "^4.1.0"
+ depd "^2.0.0"
+ humanize-ms "^1.2.1"
+
aggregate-error@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0"
@@ -1870,6 +1932,11 @@ ansi-regex@^5.0.0:
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
ansi-styles@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
@@ -1906,6 +1973,11 @@ anymatch@~3.1.1:
normalize-path "^3.0.0"
picomatch "^2.0.4"
+"aproba@^1.0.3 || ^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc"
+ integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==
+
aproba@^1.1.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
@@ -1940,6 +2012,22 @@ archiver@^5.0.2:
tar-stream "^2.1.4"
zip-stream "^4.0.0"
+are-we-there-yet@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c"
+ integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^3.6.0"
+
+are-we-there-yet@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd"
+ integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^3.6.0"
+
argparse@^1.0.7:
version "1.0.10"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
@@ -2642,6 +2730,30 @@ cacache@^13.0.1:
ssri "^7.0.0"
unique-filename "^1.1.1"
+cacache@^15.2.0:
+ version "15.3.0"
+ resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb"
+ integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==
+ dependencies:
+ "@npmcli/fs" "^1.0.0"
+ "@npmcli/move-file" "^1.0.1"
+ chownr "^2.0.0"
+ fs-minipass "^2.0.0"
+ glob "^7.1.4"
+ infer-owner "^1.0.4"
+ lru-cache "^6.0.0"
+ minipass "^3.1.1"
+ minipass-collect "^1.0.2"
+ minipass-flush "^1.0.5"
+ minipass-pipeline "^1.2.2"
+ mkdirp "^1.0.3"
+ p-map "^4.0.0"
+ promise-inflight "^1.0.1"
+ rimraf "^3.0.2"
+ ssri "^8.0.1"
+ tar "^6.0.2"
+ unique-filename "^1.1.1"
+
cache-base@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
@@ -2808,6 +2920,11 @@ chownr@^1.1.1, chownr@^1.1.2:
resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
+chownr@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
+ integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
+
chrome-trace-event@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4"
@@ -2964,6 +3081,11 @@ color-string@^1.5.2:
color-name "^1.0.0"
simple-swizzle "^0.2.2"
+color-support@^1.1.2, color-support@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
+ integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
+
color@^3.0.0:
version "3.1.2"
resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10"
@@ -2972,6 +3094,11 @@ color@^3.0.0:
color-convert "^1.9.1"
color-string "^1.5.2"
+colorette@2.0.19:
+ version "2.0.19"
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798"
+ integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==
+
colorette@^1.2.0:
version "1.2.1"
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b"
@@ -2994,6 +3121,11 @@ commander@^4.1.1:
resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
+commander@^9.1.0:
+ version "9.5.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30"
+ integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==
+
common-tags@^1.8.0:
version "1.8.0"
resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937"
@@ -3076,6 +3208,11 @@ console-browserify@^1.1.0:
resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==
+console-control-strings@^1.0.0, console-control-strings@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+ integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==
+
constants-browserify@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
@@ -3531,6 +3668,13 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9:
dependencies:
ms "2.0.0"
+debug@4, debug@4.3.4, debug@^4.3.3:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+ dependencies:
+ ms "2.1.2"
+
debug@^3.1.1, debug@^3.2.5:
version "3.2.6"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
@@ -3627,6 +3771,16 @@ delayed-stream@~1.0.0:
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+ integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==
+
+depd@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
+ integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
+
depd@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
@@ -3645,6 +3799,11 @@ destroy@~1.0.4:
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
+detect-libc@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd"
+ integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==
+
detect-newline@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
@@ -3883,6 +4042,13 @@ encodeurl@~1.0.2:
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
+encoding@^0.1.12:
+ version "0.1.13"
+ resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9"
+ integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==
+ dependencies:
+ iconv-lite "^0.6.2"
+
end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1:
version "1.4.4"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
@@ -3909,6 +4075,16 @@ entities@^2.0.0:
resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f"
integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==
+env-paths@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
+ integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
+
+err-code@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9"
+ integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==
+
errno@^0.1.3, errno@~0.1.7:
version "0.1.7"
resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
@@ -3980,6 +4156,11 @@ escalade@^3.0.1:
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.2.tgz#6a580d70edb87880f22b4c91d0d56078df6962c4"
integrity sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==
+escalade@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
escape-html@~1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
@@ -4182,6 +4363,11 @@ eslint@^6.6.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"
@@ -4771,6 +4957,35 @@ functional-red-black-tree@^1.0.1:
resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+gauge@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395"
+ integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==
+ dependencies:
+ aproba "^1.0.3 || ^2.0.0"
+ color-support "^1.1.2"
+ console-control-strings "^1.0.0"
+ has-unicode "^2.0.1"
+ object-assign "^4.1.1"
+ signal-exit "^3.0.0"
+ string-width "^4.2.3"
+ strip-ansi "^6.0.1"
+ wide-align "^1.1.2"
+
+gauge@^4.0.3:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce"
+ integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==
+ dependencies:
+ aproba "^1.0.3 || ^2.0.0"
+ color-support "^1.1.3"
+ console-control-strings "^1.1.0"
+ has-unicode "^2.0.1"
+ signal-exit "^3.0.7"
+ string-width "^4.2.3"
+ strip-ansi "^6.0.1"
+ wide-align "^1.1.5"
+
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"
@@ -4791,6 +5006,11 @@ get-own-enumerable-property-symbols@^3.0.0:
resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664"
integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==
+get-package-type@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
+ integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
+
get-stream@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
@@ -4803,6 +5023,11 @@ 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=
+getopts@2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.3.0.tgz#71e5593284807e03e2427449d4f6712a268666f4"
+ integrity sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==
+
getpass@^0.1.1:
version "0.1.7"
resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
@@ -4899,6 +5124,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
+graceful-fs@^4.2.6:
+ version "4.2.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
growly@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
@@ -4957,6 +5187,11 @@ has-symbols@^1.0.0, has-symbols@^1.0.1:
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8"
integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==
+has-unicode@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+ integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==
+
has-value@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
@@ -5115,6 +5350,11 @@ htmlparser2@^3.3.0:
inherits "^2.0.1"
readable-stream "^3.1.1"
+http-cache-semantics@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a"
+ integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==
+
http-deceiver@^1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"
@@ -5157,6 +5397,15 @@ http-parser-js@>=0.5.1:
resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.2.tgz#da2e31d237b393aae72ace43882dd7e270a8ff77"
integrity sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ==
+http-proxy-agent@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a"
+ integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==
+ dependencies:
+ "@tootallnate/once" "1"
+ agent-base "6"
+ debug "4"
+
http-proxy-middleware@0.19.1:
version "0.19.1"
resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a"
@@ -5190,6 +5439,21 @@ https-browserify@^1.0.0:
resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
+https-proxy-agent@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6"
+ integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==
+ dependencies:
+ agent-base "6"
+ debug "4"
+
+humanize-ms@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
+ integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==
+ dependencies:
+ ms "^2.0.0"
+
iconv-lite@0.4.24, iconv-lite@^0.4.24:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
@@ -5197,6 +5461,13 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24:
dependencies:
safer-buffer ">= 2.1.2 < 3"
+iconv-lite@^0.6.2:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
+ integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3.0.0"
+
icss-utils@^4.0.0, icss-utils@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467"
@@ -5377,6 +5648,11 @@ internal-slot@^1.0.2:
has "^1.0.3"
side-channel "^1.0.2"
+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==
+
invariant@^2.2.2, invariant@^2.2.4:
version "2.2.4"
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
@@ -5399,6 +5675,11 @@ ip@^1.1.0, ip@^1.1.5:
resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=
+ip@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da"
+ integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==
+
ipaddr.js@1.9.1, ipaddr.js@^1.9.0:
version "1.9.1"
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
@@ -5486,6 +5767,13 @@ is-color-stop@^1.0.0:
rgb-regex "^1.0.1"
rgba-regex "^1.0.0"
+is-core-module@^2.12.0:
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.0.tgz#36ad62f6f73c8253fd6472517a12483cf03e7ec4"
+ integrity sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==
+ dependencies:
+ has "^1.0.3"
+
is-data-descriptor@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
@@ -5586,6 +5874,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
dependencies:
is-extglob "^2.1.1"
+is-lambda@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5"
+ integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==
+
is-number@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
@@ -6385,6 +6678,26 @@ kleur@^3.0.3:
resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
+knex@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/knex/-/knex-2.4.2.tgz#a34a289d38406dc19a0447a78eeaf2d16ebedd61"
+ integrity sha512-tMI1M7a+xwHhPxjbl/H9K1kHX+VncEYcvCx5K00M16bWvpYPKAZd6QrCu68PtHAdIZNQPWZn0GVhqVBEthGWCg==
+ dependencies:
+ colorette "2.0.19"
+ commander "^9.1.0"
+ debug "4.3.4"
+ escalade "^3.1.1"
+ esm "^3.2.25"
+ get-package-type "^0.1.0"
+ getopts "2.3.0"
+ interpret "^2.2.0"
+ lodash "^4.17.21"
+ pg-connection-string "2.5.0"
+ rechoir "^0.8.0"
+ resolve-from "^5.0.0"
+ tarn "^3.0.2"
+ tildify "2.0.0"
+
last-call-webpack-plugin@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555"
@@ -6612,6 +6925,13 @@ lru-cache@^5.1.1:
dependencies:
yallist "^3.0.2"
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
+
make-dir@^2.0.0, make-dir@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
@@ -6620,13 +6940,35 @@ make-dir@^2.0.0, make-dir@^2.1.0:
pify "^4.0.1"
semver "^5.6.0"
-make-dir@^3.0.2:
+make-dir@^3.0.2, make-dir@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
dependencies:
semver "^6.0.0"
+make-fetch-happen@^9.1.0:
+ version "9.1.0"
+ resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968"
+ integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==
+ dependencies:
+ agentkeepalive "^4.1.3"
+ cacache "^15.2.0"
+ http-cache-semantics "^4.1.0"
+ http-proxy-agent "^4.0.1"
+ https-proxy-agent "^5.0.0"
+ is-lambda "^1.0.1"
+ lru-cache "^6.0.0"
+ minipass "^3.1.3"
+ minipass-collect "^1.0.2"
+ minipass-fetch "^1.3.2"
+ minipass-flush "^1.0.5"
+ minipass-pipeline "^1.2.4"
+ negotiator "^0.6.2"
+ promise-retry "^2.0.1"
+ socks-proxy-agent "^6.0.0"
+ ssri "^8.0.0"
+
makeerror@1.0.x:
version "1.0.11"
resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c"
@@ -6834,6 +7176,17 @@ minipass-collect@^1.0.2:
dependencies:
minipass "^3.0.0"
+minipass-fetch@^1.3.2:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6"
+ integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==
+ dependencies:
+ minipass "^3.1.0"
+ minipass-sized "^1.0.3"
+ minizlib "^2.0.0"
+ optionalDependencies:
+ encoding "^0.1.12"
+
minipass-flush@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373"
@@ -6841,13 +7194,20 @@ minipass-flush@^1.0.5:
dependencies:
minipass "^3.0.0"
-minipass-pipeline@^1.2.2:
+minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c"
integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==
dependencies:
minipass "^3.0.0"
+minipass-sized@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70"
+ integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==
+ dependencies:
+ minipass "^3.0.0"
+
minipass@^3.0.0, minipass@^3.1.1:
version "3.1.3"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd"
@@ -6855,6 +7215,26 @@ minipass@^3.0.0, minipass@^3.1.1:
dependencies:
yallist "^4.0.0"
+minipass@^3.1.0, minipass@^3.1.3:
+ version "3.3.6"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a"
+ integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==
+ dependencies:
+ yallist "^4.0.0"
+
+minipass@^4.0.0:
+ version "4.2.8"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a"
+ integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==
+
+minizlib@^2.0.0, minizlib@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
+ integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
+ dependencies:
+ minipass "^3.0.0"
+ yallist "^4.0.0"
+
mississippi@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022"
@@ -6894,6 +7274,11 @@ mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1:
dependencies:
minimist "^1.2.5"
+mkdirp@^1.0.3, mkdirp@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
move-concurrently@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
@@ -6916,11 +7301,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.1:
+ms@2.1.2, ms@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+ms@^2.0.0:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
multicast-dns-service-types@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901"
@@ -6971,6 +7361,11 @@ negotiator@0.6.2:
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
+negotiator@^0.6.2:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
+ integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
+
neo-async@^2.5.0, neo-async@^2.6.1:
version "2.6.2"
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
@@ -6994,6 +7389,18 @@ no-case@^3.0.3:
lower-case "^2.0.1"
tslib "^1.10.0"
+node-addon-api@^4.2.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f"
+ integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==
+
+node-fetch@^2.6.7:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6"
+ integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==
+ dependencies:
+ whatwg-url "^5.0.0"
+
node-fetch@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.0.0.tgz#79da7146a520036f2c5f644e4a26095f17e411ea"
@@ -7007,6 +7414,22 @@ node-forge@0.9.0:
resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579"
integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==
+node-gyp@8.x:
+ version "8.4.1"
+ resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.4.1.tgz#3d49308fc31f768180957d6b5746845fbd429937"
+ integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==
+ dependencies:
+ env-paths "^2.2.0"
+ glob "^7.1.4"
+ graceful-fs "^4.2.6"
+ make-fetch-happen "^9.1.0"
+ nopt "^5.0.0"
+ npmlog "^6.0.0"
+ rimraf "^3.0.2"
+ semver "^7.3.5"
+ tar "^6.1.2"
+ which "^2.0.2"
+
node-int64@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
@@ -7062,6 +7485,13 @@ node-releases@^1.1.52, node-releases@^1.1.58:
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.60.tgz#6948bdfce8286f0b5d0e5a88e8384e954dfe7084"
integrity sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==
+nopt@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88"
+ integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==
+ dependencies:
+ abbrev "1"
+
normalize-package-data@^2.3.2:
version "2.5.0"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
@@ -7111,6 +7541,26 @@ npm-run-path@^2.0.0:
dependencies:
path-key "^2.0.0"
+npmlog@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0"
+ integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==
+ dependencies:
+ are-we-there-yet "^2.0.0"
+ console-control-strings "^1.1.0"
+ gauge "^3.0.0"
+ set-blocking "^2.0.0"
+
+npmlog@^6.0.0:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830"
+ integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==
+ dependencies:
+ are-we-there-yet "^3.0.0"
+ console-control-strings "^1.1.0"
+ gauge "^4.0.3"
+ set-blocking "^2.0.0"
+
nth-check@^1.0.2, nth-check@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
@@ -7402,6 +7852,13 @@ p-map@^3.0.0:
dependencies:
aggregate-error "^3.0.0"
+p-map@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b"
+ integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==
+ dependencies:
+ aggregate-error "^3.0.0"
+
p-reduce@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa"
@@ -7565,7 +8022,7 @@ path-key@^3.1.0:
resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
-path-parse@^1.0.6:
+path-parse@^1.0.6, path-parse@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
@@ -7610,6 +8067,11 @@ performance-now@^2.1.0:
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
+pg-connection-string@2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.5.0.tgz#538cadd0f7e603fc09a12590f3b8a452c2c0cf34"
+ integrity sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==
+
picomatch@^2.0.4, picomatch@^2.2.1:
version "2.2.2"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
@@ -8424,6 +8886,14 @@ promise-inflight@^1.0.1:
resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
+promise-retry@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22"
+ integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==
+ dependencies:
+ err-code "^2.0.2"
+ retry "^0.12.0"
+
promise@^8.0.3:
version "8.1.0"
resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e"
@@ -8810,6 +9280,13 @@ realpath-native@^1.1.0:
dependencies:
util.promisify "^1.0.0"
+rechoir@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22"
+ integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==
+ dependencies:
+ resolve "^1.20.0"
+
recursive-readdir@2.2.2:
version "2.2.2"
resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f"
@@ -9011,6 +9488,11 @@ resolve-from@^4.0.0:
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+resolve-from@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
+ integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+
resolve-url-loader@3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz#28931895fa1eab9be0647d3b2958c100ae3c0bf0"
@@ -9051,6 +9533,15 @@ resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.15.1, resolve@^1.3
dependencies:
path-parse "^1.0.6"
+resolve@^1.20.0:
+ version "1.22.3"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.3.tgz#4b4055349ffb962600972da1fdc33c46a4eb3283"
+ integrity sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==
+ dependencies:
+ is-core-module "^2.12.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
restore-cursor@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
@@ -9106,6 +9597,13 @@ rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1:
dependencies:
glob "^7.1.3"
+rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
ripemd160@^2.0.0, ripemd160@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
@@ -9155,7 +9653,7 @@ safe-regex@^1.1.0:
dependencies:
ret "~0.1.10"
-"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
version "2.1.2"
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
@@ -9261,6 +9759,13 @@ semver@^7.3.2:
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938"
integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==
+semver@^7.3.5:
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.4.0.tgz#8481c92feffc531ab1e012a8ffc15bdd3a0f4318"
+ integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==
+ dependencies:
+ lru-cache "^6.0.0"
+
send@0.17.1:
version "0.17.1"
resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
@@ -9417,6 +9922,11 @@ signal-exit@^3.0.0, signal-exit@^3.0.2:
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
+signal-exit@^3.0.7:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
+ integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+
simple-swizzle@^0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
@@ -9453,6 +9963,11 @@ slice-ansi@^2.1.0:
astral-regex "^1.0.0"
is-fullwidth-code-point "^2.0.0"
+smart-buffer@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae"
+ integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==
+
snapdragon-node@^2.0.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
@@ -9503,6 +10018,23 @@ sockjs@0.3.19:
faye-websocket "^0.10.0"
uuid "^3.0.1"
+socks-proxy-agent@^6.0.0:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz#2687a31f9d7185e38d530bef1944fe1f1496d6ce"
+ integrity sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==
+ dependencies:
+ agent-base "^6.0.2"
+ debug "^4.3.3"
+ socks "^2.6.2"
+
+socks@^2.6.2:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55"
+ integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==
+ dependencies:
+ ip "^2.0.0"
+ smart-buffer "^4.2.0"
+
sort-keys@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
@@ -9610,6 +10142,17 @@ sprintf-js@~1.0.2:
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+sqlite3@^5.1.6:
+ version "5.1.6"
+ resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-5.1.6.tgz#1d4fbc90fe4fbd51e952e0a90fd8f6c2b9098e97"
+ integrity sha512-olYkWoKFVNSSSQNvxVUfjiVbz3YtBwTJj+mfV5zpHmqW3sELx2Cf4QCdirMelhM5Zh+KDVaKgQHqCxrqiWHybw==
+ dependencies:
+ "@mapbox/node-pre-gyp" "^1.0.0"
+ node-addon-api "^4.2.0"
+ tar "^6.1.11"
+ optionalDependencies:
+ node-gyp "8.x"
+
sshpk@^1.7.0:
version "1.16.1"
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
@@ -9640,6 +10183,13 @@ ssri@^7.0.0:
figgy-pudding "^3.5.1"
minipass "^3.1.1"
+ssri@^8.0.0, ssri@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af"
+ integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==
+ dependencies:
+ minipass "^3.1.1"
+
stable@^0.1.8:
version "0.1.8"
resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
@@ -9730,6 +10280,15 @@ string-width@^1.0.1:
is-fullwidth-code-point "^1.0.0"
strip-ansi "^3.0.0"
+"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
string-width@^2.0.0, string-width@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
@@ -9835,6 +10394,13 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
dependencies:
ansi-regex "^4.1.0"
+strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
strip-bom@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
@@ -9901,6 +10467,11 @@ supports-color@^7.0.0, supports-color@^7.1.0:
dependencies:
has-flag "^4.0.0"
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
svg-parser@^2.0.0:
version "2.0.4"
resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5"
@@ -9956,6 +10527,23 @@ tar-stream@^2.1.4:
inherits "^2.0.3"
readable-stream "^3.1.1"
+tar@^6.0.2, tar@^6.1.11, tar@^6.1.2:
+ version "6.1.13"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b"
+ integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==
+ dependencies:
+ chownr "^2.0.0"
+ fs-minipass "^2.0.0"
+ minipass "^4.0.0"
+ minizlib "^2.1.1"
+ mkdirp "^1.0.3"
+ yallist "^4.0.0"
+
+tarn@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/tarn/-/tarn-3.0.2.tgz#73b6140fbb881b71559c4f8bfde3d9a4b3d27693"
+ integrity sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==
+
terser-webpack-plugin@2.3.5:
version "2.3.5"
resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz#5ad971acce5c517440ba873ea4f09687de2f4a81"
@@ -10033,6 +10621,11 @@ thunky@^1.0.2:
resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d"
integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==
+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==
+
timers-browserify@^2.0.4:
version "2.0.11"
resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f"
@@ -10119,6 +10712,11 @@ tr46@^1.0.1:
dependencies:
punycode "^2.1.0"
+tr46@~0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
+ integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
+
ts-pnp@1.1.6:
version "1.1.6"
resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.6.tgz#389a24396d425a0d3162e96d2b4638900fdc289a"
@@ -10467,6 +11065,11 @@ web-streams-polyfill@^3.0.3:
resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.1.1.tgz#1516f2d4ea8f1bdbfed15eb65cb2df87098c8364"
integrity sha512-Czi3fG883e96T4DLEPRvufrF2ydhOOW1+1a6c3gNjH2aIh50DNFBdfwh2AKoOf1rXvpvavAoA11Qdq9+BKjE0Q==
+webidl-conversions@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
+ integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==
+
webidl-conversions@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
@@ -10608,6 +11211,14 @@ whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0:
resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==
+whatwg-url@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
+ integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==
+ dependencies:
+ tr46 "~0.0.3"
+ webidl-conversions "^3.0.0"
+
whatwg-url@^6.4.1:
version "6.5.0"
resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8"
@@ -10638,13 +11249,20 @@ which@^1.2.9, which@^1.3.0, which@^1.3.1:
dependencies:
isexe "^2.0.0"
-which@^2.0.1:
+which@^2.0.1, which@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
dependencies:
isexe "^2.0.0"
+wide-align@^1.1.2, wide-align@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3"
+ integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==
+ dependencies:
+ string-width "^1.0.2 || 2 || 3 || 4"
+
word-wrap@~1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
@@ -10851,10 +11469,10 @@ ws@^6.1.2, ws@^6.2.1:
dependencies:
async-limiter "~1.0.0"
-ws@^7.4.6:
- version "7.4.6"
- resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"
- integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
+ws@^8.13.0:
+ version "8.13.0"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0"
+ integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==
xml-name-validator@^3.0.0:
version "3.0.0"