├── .gitignore ├── .husky ├── .gitignore └── pre-commit ├── .markdownlint.json ├── .node-version ├── .travis.yml ├── LICENSE ├── README.md ├── examples └── basic.js ├── index.js ├── lib ├── config.js ├── device.js ├── gateway.js ├── ljson.js ├── mqtt.js └── peripheral.js ├── package-lock.json ├── package.json └── test ├── integration ├── device-spec.js ├── gateway-spec.js └── peripheral-spec.js └── unit ├── device-spec.js └── gateway-spec.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | coverage 3 | local 4 | .vscode -------------------------------------------------------------------------------- /.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ 2 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | npm run lint-staged 5 | -------------------------------------------------------------------------------- /.markdownlint.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": true, 3 | "MD009": { "br_spaces": 2 }, 4 | "MD013": false, 5 | "MD033": false, 6 | "MD041": false, 7 | "MD014": false, 8 | "MD034": false, 9 | "MD026": false 10 | } -------------------------------------------------------------------------------- /.node-version: -------------------------------------------------------------------------------- 1 | 14.17.4 -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "16" 4 | - "15" 5 | - "14" 6 | - "13" 7 | - "12" 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2023 Losant IoT, Inc. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Losant JavaScript MQTT Client 2 | 3 | [![Build Status](https://travis-ci.com/Losant/losant-mqtt-js.svg?branch=master)](https://travis-ci.com/Losant/losant-mqtt-js) [![npm version](https://badge.fury.io/js/losant-mqtt.svg)](https://badge.fury.io/js/losant-mqtt) 4 | 5 | The [Losant](https://www.losant.com) MQTT client provides a simple way for 6 | custom things to communicate with the Losant platform over MQTT. You can 7 | authenticate as a device, publish device state, and listen for device commands. 8 | 9 | This client works with Node.js v4.0 and newer. It uses the Node.js [MQTT client](https://github.com/mqttjs/MQTT.js) for all underlying communication. 10 | 11 | ## Installation 12 | 13 | The Losant JavaScript MQTT Client is installed using npm. 14 | 15 | ```bash 16 | npm install losant-mqtt 17 | ``` 18 | 19 | ## Example 20 | 21 | Below is a high-level example of using the Losant JavaScript MQTT client to send the value of a temperature sensor to the Losant platform. 22 | 23 | ```javascript 24 | var Device = require('losant-mqtt').Device; 25 | 26 | // Construct device. 27 | var device = new Device({ 28 | id: 'my-device-id', 29 | key: 'my-app-access-key', 30 | secret: 'my-app-access-secret' 31 | }); 32 | 33 | // Connect to Losant. 34 | device.connect(); 35 | 36 | // Listen for commands. 37 | device.on('command', function(command) { 38 | console.log('Command received.'); 39 | console.log(command.name); 40 | console.log(command.payload); 41 | }); 42 | 43 | // Send temperature once every second. 44 | setInterval(function() { 45 | device.sendState({ temperature: readAnalogIn() }); 46 | }, 1000); 47 | ``` 48 | 49 |
50 | 51 | ## API Documentation 52 | 53 | * [`Device`](#device) 54 | * [`device.connect()`](#device-connect) 55 | * [`device.isConnected()`](#device-isconnected) 56 | * [`device.sendState()`](#device-sendstate) 57 | * [`device.disconnect()`](#device-disconnect) 58 | * [`Event: 'command'`](#device-eventcommand) 59 | * [`Event: 'connect'`](#device-eventconnect) 60 | * [`Event: 'reconnect'`](#device-eventreconnect) 61 | * [`Event: 'reconnected'`](#device-eventreconnected) 62 | * [`Event: 'close'`](#device-eventclose) 63 | * [`Event: 'offline'`](#device-eventoffline) 64 | * [`Event: 'error'`](#device-eventerror) 65 | * [`Gateway`](#gateway) 66 | * [`gateway.addPeripheral()`](#gateway-addperipheral) 67 | * [`Peripheral`](#peripheral) 68 | * [`peripheral.sendState()`](#peripheral-sendstate) 69 | * [`Event: 'command'`](#peripheral-eventcommand) 70 | 71 | ## Device 72 | 73 | A device represents a single thing or widget that you'd like to connect to the Losant platform. A single device can contain many different sensors or other attached peripherals. Devices can either report state or respond to commands. 74 | 75 | A device's state represents a snapshot of the device at some point in time. If the device has a temperature sensor, it might report state every few seconds with the temperature. If a device has a button, it might only report state when the button is pressed. Devices can report state as often as needed by your specific application. 76 | 77 | Commands instruct a device to take a specific action. Commands are defined as a name and an optional payload. For example, if the device is a scrolling marquee, the command might be "update text" and the payload would include the text to update. 78 | 79 | ```javascript 80 | var Device = require('losant-mqtt').Device; 81 | 82 | var device = new Device({ 83 | id: 'my-device-id', 84 | key: 'my-app-access-key', 85 | secret: 'my-app-access-secret' 86 | transport: 'tls' 87 | }); 88 | ``` 89 | 90 | * `id`: The device's ID. Obtained by first registering a device using the Losant platform. 91 | * `key`: The Losant access key. 92 | * `secret`: The Losant access secret. 93 | * `transport`: The underlying transport mechanism. Supports `tcp`, `tls`, `ws` (WebSocket), and `wss` (Secure WebSocket). Optional. Defaults to `tls`. 94 | * `qosPublish`: The QoS level to use for publishing messages. Defaults to 0. Valid levels are 0 and 1 - QoS level 2 is not supported. 95 | * `mqttEndpoint`: If using a dedicated install of Losant, set this to your broker URL. For example `broker.example.com`. Optional. Defaults to `broker.losant.com`. 96 | 97 | ### device.connect([callback]) 98 | 99 | Connects the device to the Losant platform. The device will automatically retry any lost connections. 100 | When the connection has been established, the callback is invoked. In the case of a connection error, 101 | the callback will be invoked with the error. 102 | Alternately, listen for the [connect](#device-eventconnect) event to know when a connection has been successfully established. 103 | 104 | ```javascript 105 | device.connect(function (error) { 106 | if (error) { 107 | // Handle error 108 | throw error; 109 | } 110 | // Successfully connected 111 | }); 112 | ``` 113 | 114 | ### device.isConnected() 115 | 116 | Returns a boolean indicating whether or not the device is currently connected to the Losant platform. 117 | 118 | ```javascript 119 | device.isConnected(); 120 | ``` 121 | 122 | ### device.sendState(state, [time], [callback]) 123 | 124 | Sends a device state to the Losant platform. In many scenarios, device states will change rapidly. For example a GPS device will report GPS coordinates once a second or more. Because of this, sendState is typically the most invoked function. Any state data sent to Losant is stored and made available in data visualization tools and workflow triggers. 125 | 126 | ```javascript 127 | // Send the device state to Losant. 128 | device.sendState({ voltage: readAnalogIn() }); 129 | ``` 130 | 131 | * `state`: The state to send as a JavaScript object. 132 | * `time`: The Date object that the state occurred. Optional. Defaults to `new Date()`. 133 | * `callback`: Invoked when complete. `err` parameter will have details of any errors that occurred. Optional. 134 | 135 | ### device.disconnect([callback]) 136 | 137 | Disconnects the device from the Losant platform. 138 | 139 | ```javascript 140 | device.disconnect(function() { 141 | // Disconnect complete 142 | }); 143 | ``` 144 | 145 | ### Event: 'command' 146 | 147 | ```javascript 148 | device.on('command', function(command) { }); 149 | ``` 150 | 151 | Emitted whenever a command is received from the Losant platform. 152 | 153 | * `command.name`: The name of the command received. 154 | * `command.time`: The Date of when the command was originally invoked. 155 | * `command.payload`: The optional payload as a JavaScript object for the command. 156 | 157 | ### Event: 'connect' 158 | 159 | ```javascript 160 | device.on('connect', function() { }); 161 | ``` 162 | 163 | Emitted on the very first successful connection. All reconnects will emit the 'reconnect' event. 164 | 165 | ### Event: 'reconnect' 166 | 167 | ```javascript 168 | device.on('reconnect', function() { }); 169 | ``` 170 | 171 | Emitted by the underlying MQTT client whenever a reconnect starts. 172 | 173 | ### Event: 'reconnected' 174 | 175 | ```javascript 176 | device.on('reconnected', function() { }); 177 | ``` 178 | 179 | Emitted by the underlying MQTT client whenever a reconnect succeeds. 180 | 181 | ### Event: 'close' 182 | 183 | ```javascript 184 | device.on('close', function() { }); 185 | ``` 186 | 187 | Emitted by the underlying MQTT client after a disconnection. 188 | 189 | ### Event: 'offline' 190 | 191 | ```javascript 192 | device.on('offline', function() { }); 193 | ``` 194 | 195 | Emitted by the underlying MQTT client when it goes offline. 196 | 197 | ### Event: 'error' 198 | 199 | ```javascript 200 | device.on('error', function(err) { }); 201 | ``` 202 | 203 | Emitted by the underlying MQTT client when it cannot connect. 204 | 205 | * `err`: The error that occurred. 206 | 207 | ## Gateway 208 | 209 | The Gateway object extends the Device object, therefore all device functions, properties, and events are available on the gateway. 210 | 211 | A gateway works exactly like a device accept that it can also report state and receive commands on behalf of peripherals. Peripherals are things that are not directly connected to Losant. For example a Raspberry Pi could be a gateway that is reporting state for one or more Bluetooth peripherals. 212 | 213 | ```javascript 214 | var Gateway = require('losant-mqtt').Gateway; 215 | 216 | var gateway = new Gateway({ 217 | id: 'my-device-id', 218 | key: 'my-app-access-key', 219 | secret: 'my-app-access-secret' 220 | }); 221 | 222 | gateway.connect(); 223 | 224 | // Add a peripheral to the gateway. 225 | var peripheral = gateway.addPeripheral('my-peripheral-id'); 226 | 227 | // Report the peripheral's state. 228 | // How the gateway communicates to the peripheral (e.g. Bluetooth) is up to 229 | // the specific environment and implementation. 230 | peripheral.sendState({ temperature: myReadPeripheralTemp() }); 231 | 232 | // Listen for commands sent to peripherals. 233 | peripheral.on('command', function(command) { 234 | console.log(command.name); 235 | console.log(command.payload); 236 | // The gateway can now communicate to the peripheral however needed 237 | // to complete this command. 238 | }); 239 | 240 | ``` 241 | 242 | ### gateway.addPeripheral(id) 243 | 244 | Adds a peripheral to the gateway and returns the peripheral instance. The id is a Losant device id that is created when the device is added to a Losant application. The device must be configured as a peripheral device type when created. 245 | 246 | ```javascript 247 | var peripheral = gateway.addPeripheral('my-peripheral-id'); 248 | ``` 249 | 250 | * `id`: The Losant peripheral device id. 251 | 252 | ## Peripheral 253 | 254 | Peripherals device types do not connect directly to Losant. Gateways report state and handle commands on their behalf. Peripheral instances are not directly constructed. They are created by calling [`addPeripheral`](#gateway-addperipheral) on the gateway. 255 | 256 | ```javascript 257 | var Gateway = require('losant-mqtt').Gateway; 258 | 259 | var gateway = new Gateway({ 260 | id: 'my-device-id', 261 | key: 'my-app-access-key', 262 | secret: 'my-app-access-secret' 263 | }); 264 | 265 | gateway.connect(); 266 | 267 | // Add a peripheral to the gateway. 268 | var peripheral = gateway.addPeripheral('my-peripheral-id'); 269 | 270 | // Report the peripheral's state. 271 | // How the gateway communicates to the peripheral (e.g. Bluetooth) is up to 272 | // the specific environment and implementation. 273 | peripheral.sendState({ temperature: myReadPeripheralTemp() }); 274 | 275 | // Listen for commands sent to peripherals. 276 | peripheral.on('command', function(command) { 277 | console.log(command.name); 278 | console.log(command.payload); 279 | // The gateway can now communicate to the peripheral however needed 280 | // to complete this command. 281 | }); 282 | 283 | ``` 284 | 285 | ### peripheral.sendState(state, [time], [callback]) 286 | 287 | Sends a peripheral device's state to the Losant platform. In many scenarios, device states will change rapidly. For example a GPS device will report GPS coordinates once a second or more. Because of this, sendState is typically the most invoked function. Any state data sent to Losant is stored and made available in data visualization tools and workflow triggers. 288 | 289 | ```javascript 290 | // Send the device state to Losant. 291 | peripheral.sendState({ voltage: myReadPeripheralVoltage() }); 292 | ``` 293 | 294 | * `state`: The state to send as a JavaScript object. 295 | * `time`: The Date object that the state occurred. Optional. Defaults to `new Date()`. 296 | * `callback`: Invoked when complete. `err` parameter will have details of any errors that occurred. Optional. 297 | 298 | ### Event: 'command' 299 | 300 | ```javascript 301 | peripheral.on('command', function(command) { }); 302 | ``` 303 | 304 | Emitted whenever a command is received from the Losant platform. 305 | 306 | * `command.name`: The name of the command received. 307 | * `command.time`: The Date of when the command was originally invoked. 308 | * `command.payload`: The optional payload as a JavaScript object for the command. 309 | 310 | ## Debugging 311 | 312 | This library uses the [Debug](https://github.com/visionmedia/debug) module for additional debug output. You can enable it by setting the `DEBUG` environment variable to `losant*`. 313 | 314 | ```text 315 | DEBUG=losant* node index.js 316 | ``` 317 | 318 |
319 | 320 | ***** 321 | 322 | Copyright (c) 2023 Losant IoT, Inc 323 | 324 | 325 | -------------------------------------------------------------------------------- /examples/basic.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Basic example of connecting to the Losant platform. 3 | * 4 | * Copyright (c) 2023 Losant IoT, Inc. All rights reserved. 5 | * https://www.losant.com 6 | * 7 | */ 8 | 9 | /* eslint no-console: "off" */ 10 | 11 | const Device = require('losant-mqtt').Device; // eslint-disable-line import/no-unresolved 12 | 13 | // Construct a device instance. 14 | const device = new Device({ 15 | id: 'my-device-id', 16 | key: 'my-access-key', 17 | secret: 'my-access-secret' 18 | }); 19 | 20 | // Connect device to Losant. 21 | device.connect(); 22 | 23 | 24 | // Attach event listener for commands. 25 | device.on('command', function(command) { 26 | console.log(command.name); 27 | console.log(command.payload); 28 | }); 29 | 30 | // Once a second, report state to Losant. 31 | setInterval(function() { 32 | 33 | // Report state to Losant. 34 | if (device.isConnected()) { 35 | device.sendState({ key: 'value' }); 36 | } 37 | 38 | }, 1000); 39 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2023 Losant IoT, Inc. 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | */ 24 | 25 | module.exports = { 26 | Device: require('./lib/device'), 27 | Gateway: require('./lib/gateway'), 28 | Peripheral: require('./lib/peripheral') 29 | }; 30 | -------------------------------------------------------------------------------- /lib/config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2023 Losant IoT, Inc. 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | */ 24 | 25 | module.exports = { 26 | 27 | // Format string that takes deviceId for losant mqtt topic for sending device state. 28 | topicFormatState: process.env.LOSANT_TOPIC_FORMAT_STATE || 'losant/%s/state', 29 | 30 | // Format string that takes deviceId for losant mqtt topic for receiving commands. 31 | topicFormatCommand: process.env.LOSANT_TOPIC_FORMAT_MESSAGE || 'losant/%s/command', 32 | 33 | // The losant mqtt endpoint. 34 | mqttEndpoint: process.env.LOSANT_MQTT_ENDPOINT || 'broker.losant.com' 35 | }; 36 | -------------------------------------------------------------------------------- /lib/device.js: -------------------------------------------------------------------------------- 1 | /** 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2023 Losant IoT, Inc. 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | */ 24 | 25 | const util = require('util'); 26 | const EventEmitter = require('events').EventEmitter; 27 | const debug = require('debug')('losant:device'); 28 | const LJSON = require('./ljson'); 29 | const config = require('./config'); 30 | const MQTT = require('./mqtt'); 31 | 32 | /** 33 | * Device constructor. 34 | * @param {Object} options - id, key and secret 35 | * @return {undefined} undefined 36 | */ 37 | const Device = function(options) { 38 | 39 | EventEmitter.call(this); 40 | 41 | // Check required fields. 42 | if (!options || !options.id) { 43 | throw new Error('ID is required.'); 44 | } 45 | 46 | this.options = options; 47 | this.id = options.id; 48 | 49 | // Default the options and remove whitespace. 50 | options.id = (options.id || '').replace(/ /g, ''); 51 | options.key = (options.key || '').replace(/ /g, ''); 52 | options.secret = (options.secret || '').replace(/ /g, ''); 53 | 54 | // The MQTT topics that this device will use. 55 | this.commandTopic = util.format(config.topicFormatCommand, options.id); 56 | this.stateTopic = util.format(config.topicFormatState, options.id); 57 | 58 | this.mqtt = options.mqtt || new MQTT(); 59 | this.mqtt.on('message', this.handleMessage.bind(this)); 60 | 61 | // Only want 'connect' to be emitted the first time. Every time after 62 | // will only emit the reconnected event. 63 | let firstConnect = true; 64 | this.mqtt.on('connect', (function() { 65 | this.handleConnect(); 66 | if (firstConnect) { 67 | firstConnect = false; 68 | this.emit('connect'); 69 | } else { 70 | this.emit('reconnected'); 71 | } 72 | }).bind(this)); 73 | 74 | this.mqtt.on('reconnect', (function() { 75 | this.emit('reconnect'); 76 | }).bind(this)); 77 | 78 | this.mqtt.on('close', (function() { 79 | this.emit('close'); 80 | }).bind(this)); 81 | 82 | this.mqtt.on('offline', (function() { 83 | this.emit('offline'); 84 | }).bind(this)); 85 | 86 | this.mqtt.on('error', (function(err) { 87 | this.emit('error', err); 88 | }).bind(this)); 89 | }; 90 | 91 | util.inherits(Device, EventEmitter); 92 | 93 | /** 94 | * Returns whether or not the device is connected. 95 | * @return {Boolean} true if the device is connceted 96 | */ 97 | Device.prototype.isConnected = function() { 98 | return this.mqtt.isConnected(); 99 | }; 100 | 101 | /** 102 | * Occurs whenever the underlying mqtt client connects or reconnects. 103 | * @return {Undefined} undefined 104 | */ 105 | Device.prototype.handleConnect = function() { 106 | debug(`Subscribing to MQTT topic: ${this.commandTopic}`); 107 | this.mqtt.subscribe(this.commandTopic); 108 | }; 109 | 110 | /** 111 | * Connects to the Losant platform. 112 | * @param {Function} callback a function that will be run when the connection occurs 113 | * @return {Undefined} undefined 114 | */ 115 | Device.prototype.connect = function(callback) { 116 | this.mqtt.connect(this.options, callback); 117 | }; 118 | 119 | /** 120 | * Disconnects the underlying mqtt connection. 121 | * @param {Function} callback a callback that will be called when the device has disconncted 122 | * @return {Undefined} undefined 123 | */ 124 | Device.prototype.disconnect = function(callback) { 125 | debug('Disconnect MQTT client.'); 126 | if (this.mqtt.client) { 127 | this.mqtt.client.end(callback); 128 | } else { 129 | return callback(); 130 | } 131 | }; 132 | 133 | /** 134 | * Handles a message sent from the Losant broker. 135 | * @param {String} topic the mqtt topic 136 | * @param {Buffer} message the message as a buffer 137 | * @return {Object|Null} null if message is invalid. Returns the parsed JavaScript 138 | * object if the message is valid. 139 | */ 140 | Device.prototype.handleMessage = function(topic, message) { 141 | 142 | // This message is not intended for this device. 143 | if (topic !== this.commandTopic) { 144 | return null; 145 | } 146 | 147 | message = this.parseMessage(message); 148 | if (!message) { 149 | return null; 150 | } 151 | 152 | debug(`Received MQTT message on topic: ${topic}`); 153 | debug(LJSON.stringify(message)); 154 | 155 | this.emit('command', message); 156 | 157 | return message; 158 | }; 159 | 160 | /** 161 | * Parses an incoming mqtt message from the Losant broker. 162 | * @param {Buffer} message the incoming Buffer to parse and validate. 163 | * @return {Object|Null} null if message is invalid. Returns the parsed JavaScript 164 | * object if the message is valid. 165 | */ 166 | Device.prototype.parseMessage = function(message) { 167 | 168 | // Attempt to parse the message. 169 | try { 170 | message = LJSON.parse(message.toString()); 171 | } catch (e) { 172 | return null; 173 | } 174 | 175 | // The message has to be something. 176 | if (!message) { 177 | return null; 178 | } 179 | 180 | return message; 181 | }; 182 | 183 | /** 184 | * Sends device state to Losant. 185 | * deviceId: the ID of the device to report state for. 186 | * @param {String} state the state to send. Typically an object with { attribute: value } 187 | * @param {Date} time (optional) the time at which the state occurred (defaults to now) 188 | * @param {Function} callback: the callback handling the response. 189 | * @return {Object} an object containing topic and payload 190 | */ 191 | Device.prototype.sendState = function(state, time, callback) { 192 | 193 | if (typeof(time) === 'function') { 194 | callback = time; 195 | time = null; 196 | } 197 | 198 | time = time || new Date(); 199 | const payload = { time: time, data: state }; 200 | 201 | debug('Publishing state:'); 202 | debug(LJSON.stringify(payload)); 203 | debug(`Topic: ${this.stateTopic}`); 204 | 205 | this.mqtt.publish(this.stateTopic, LJSON.stringify(payload), callback); 206 | 207 | return { topic: this.stateTopic, payload: payload }; 208 | }; 209 | 210 | module.exports = Device; 211 | -------------------------------------------------------------------------------- /lib/gateway.js: -------------------------------------------------------------------------------- 1 | /** 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2023 Losant IoT, Inc. 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | */ 24 | 25 | const util = require('util'); 26 | const Device = require('./device'); 27 | const Peripheral = require('./peripheral'); 28 | const debug = require('debug')('losant:gateway'); 29 | 30 | /** 31 | * Gateway constructor. 32 | * @param {Object} options - options to pass to the device class such as id, key and secret 33 | * @return {undefined} undefined 34 | */ 35 | const Gateway = function(options) { 36 | Device.call(this, options); 37 | 38 | this.peripherals = {}; 39 | }; 40 | 41 | util.inherits(Gateway, Device); 42 | 43 | Gateway.prototype.addPeripheral = function(deviceId) { 44 | 45 | if (this.peripherals[deviceId]) { 46 | return this.peripherals[deviceId]; 47 | } 48 | 49 | debug(`Adding peripheral to gateway: ${deviceId}`); 50 | const peripheral = new Peripheral({ id: deviceId, mqtt: this.mqtt, gateway: this }); 51 | this.peripherals[deviceId] = peripheral; 52 | 53 | return peripheral; 54 | }; 55 | 56 | module.exports = Gateway; 57 | -------------------------------------------------------------------------------- /lib/ljson.js: -------------------------------------------------------------------------------- 1 | /** 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2023 Losant IoT, Inc. 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | */ 24 | 25 | 26 | // https://github.com/mongodb-js/extended-json/blob/master/lib/modes/strict.js#L139 27 | const dateReviver = function(value) { 28 | if (typeof(value.$date) === 'object') { 29 | value = value.$date.$numberLong; 30 | } else { 31 | value = value.$date; 32 | } 33 | let date = new Date(); 34 | if (isNaN(date.setTime(value))) { 35 | date = new Date(value); 36 | } 37 | 38 | return date; 39 | }; 40 | 41 | const replacer = function(key, value) { 42 | // can't trust the passed in value, it won't always be the original 43 | const origValue = this[key]; 44 | if (origValue === undefined) { return { $undefined: true }; } 45 | if (origValue === null) { return null; } 46 | if (typeof(origValue.toISOString) === 'function') { 47 | return { $date: isNaN(origValue) ? 'NaN' : origValue.toISOString() }; 48 | } 49 | 50 | return value; 51 | }; 52 | 53 | const buildReviver = function(undefinedTracker) { 54 | return function(key, value) { 55 | if (value === null || typeof value !== 'object') { return value; } 56 | if (value.$undefined) { 57 | undefinedTracker.push([ 58 | this, 59 | key 60 | ]); 61 | 62 | return undefined; 63 | } 64 | if (value.$date) { return dateReviver(value); } 65 | 66 | return value; 67 | }; 68 | }; 69 | 70 | module.exports = { 71 | stringify: function(value) { 72 | return JSON.stringify(value, replacer); 73 | }, 74 | parse: function(value) { 75 | const undefinedTracker = []; 76 | const parsed = JSON.parse(value, buildReviver(undefinedTracker)); 77 | undefinedTracker.forEach(function(entry) { entry[0][entry[1]] = undefined; }); 78 | 79 | return parsed; 80 | } 81 | }; 82 | -------------------------------------------------------------------------------- /lib/mqtt.js: -------------------------------------------------------------------------------- 1 | /** 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2023 Losant IoT, Inc. 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | */ 24 | 25 | const mqtt = require('mqtt'); 26 | const util = require('util'); 27 | const EventEmitter = require('events').EventEmitter; 28 | const config = require('./config'); 29 | const debug = require('debug')('losant:mqtt'); 30 | 31 | // Map of transport types to the corresponding url prefixes. 32 | const transportPrefixes = { 33 | tcp: { prefix: 'mqtt://', port: 1883 }, 34 | tls: { prefix: 'mqtts://', port: 8883 }, 35 | ws: { prefix: 'ws://', port: 80 }, 36 | wss: { prefix: 'wss://', port: 443 } 37 | }; 38 | 39 | /** 40 | * MQTT constructor. 41 | * @return {undefined} undefined 42 | */ 43 | const MQTT = function() { 44 | EventEmitter.call(this); 45 | this.client = null; 46 | }; 47 | 48 | util.inherits(MQTT, EventEmitter); 49 | 50 | MQTT.prototype.connect = function(options, callback) { 51 | 52 | // Grab the prefix and port. Default to tls if not provided. 53 | const prefixPort = transportPrefixes[options.transport] || 54 | transportPrefixes.tls; 55 | 56 | const url = prefixPort.prefix + (options.mqttEndpoint || config.mqttEndpoint); 57 | 58 | this.qosPublish = Number(options.qosPublish) > 0 ? 1 : 0; 59 | callback = callback || function() {}; 60 | 61 | debug(`MQTT connecting to ${url}`); 62 | 63 | // Connect to mqtt broker. 64 | this.client = mqtt.connect( 65 | url, 66 | { 67 | clientId: options.id, 68 | username: options.key, 69 | password: options.secret, 70 | port: options.port || prefixPort.port 71 | } 72 | ); 73 | 74 | this.client.on('connect', (function() { 75 | debug(`MQTT successfully connected to ${url}`); 76 | this.emit('connect'); 77 | }).bind(this)); 78 | 79 | let connectComplete = false; 80 | 81 | this.client.once('connect', function() { 82 | if (!connectComplete) { 83 | connectComplete = true; 84 | return callback(); 85 | } 86 | }); 87 | 88 | this.client.once('error', function(err) { 89 | if (!connectComplete) { 90 | connectComplete = true; 91 | return callback(err); 92 | } 93 | }); 94 | 95 | this.client.on('reconnect', (function() { 96 | debug(`MQTT reconnecting to ${url}`); 97 | this.emit('reconnect'); 98 | }).bind(this)); 99 | 100 | this.client.on('close', (function() { 101 | debug(`MQTT disconnected from ${url}`); 102 | this.emit('close'); 103 | }).bind(this)); 104 | 105 | this.client.on('offline', (function() { 106 | debug(`MQTT offline from ${url}`); 107 | this.emit('offline'); 108 | }).bind(this)); 109 | 110 | this.client.on('error', (function(err) { 111 | debug(`MQTT error to ${url} ${err}`); 112 | this.emit('error', err); 113 | }).bind(this)); 114 | 115 | this.client.on('message', (function(topic, message) { 116 | this.emit('message', topic, message); 117 | }).bind(this)); 118 | 119 | return this; 120 | }; 121 | 122 | /** 123 | * Whether or not the underlying mqtt client is connected. 124 | * @return {Boolean} true if the client is connected 125 | */ 126 | MQTT.prototype.isConnected = function() { 127 | return this.client ? this.client.connected : false; 128 | }; 129 | 130 | /** 131 | * Publishes a message to the underlying mqtt client. 132 | * @param {String} topic the topic to publish on 133 | * @param {String} message the message to publish 134 | * @param {Function} callback a function that will be called when the message is published or errored trying 135 | * @return {Undefined} undefined 136 | */ 137 | MQTT.prototype.publish = function(topic, message, callback) { 138 | if (this.client) { 139 | this.client.publish(topic, message, { qos: this.qosPublish }, callback); 140 | } else { 141 | if (callback) { return callback(new Error('Device never connected.')); } 142 | } 143 | }; 144 | 145 | /** 146 | * Subscribes to a topic. 147 | * @param {String} topic the topic to publish on 148 | * @param {Function} callback a function that will be called when the subscription completed or errored trying 149 | * @return {Udefined} undefined 150 | */ 151 | MQTT.prototype.subscribe = function(topic, callback) { 152 | if (this.client) { 153 | this.client.subscribe(topic, callback); 154 | } else { 155 | if (callback) { return callback(new Error('Device never connected.')); } 156 | } 157 | }; 158 | 159 | module.exports = MQTT; 160 | -------------------------------------------------------------------------------- /lib/peripheral.js: -------------------------------------------------------------------------------- 1 | /** 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2023 Losant IoT, Inc. 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | */ 24 | 25 | const util = require('util'); 26 | const Device = require('./device'); 27 | 28 | /** 29 | * Gateway constructor. 30 | * @param {Object} options - options to pass to device such as id key and secret 31 | * @return {undefined} undefined 32 | */ 33 | const Peripheral = function(options) { 34 | Device.call(this, options); 35 | 36 | this.gateway = options.gateway; 37 | }; 38 | 39 | util.inherits(Peripheral, Device); 40 | 41 | module.exports = Peripheral; 42 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "losant-mqtt", 3 | "version": "5.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.12.11", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", 10 | "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.10.4" 14 | } 15 | }, 16 | "@babel/generator": { 17 | "version": "7.14.8", 18 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.8.tgz", 19 | "integrity": "sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg==", 20 | "dev": true, 21 | "requires": { 22 | "@babel/types": "^7.14.8", 23 | "jsesc": "^2.5.1", 24 | "source-map": "^0.5.0" 25 | } 26 | }, 27 | "@babel/helper-function-name": { 28 | "version": "7.14.5", 29 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", 30 | "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", 31 | "dev": true, 32 | "requires": { 33 | "@babel/helper-get-function-arity": "^7.14.5", 34 | "@babel/template": "^7.14.5", 35 | "@babel/types": "^7.14.5" 36 | } 37 | }, 38 | "@babel/helper-get-function-arity": { 39 | "version": "7.14.5", 40 | "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", 41 | "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", 42 | "dev": true, 43 | "requires": { 44 | "@babel/types": "^7.14.5" 45 | } 46 | }, 47 | "@babel/helper-hoist-variables": { 48 | "version": "7.14.5", 49 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", 50 | "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", 51 | "dev": true, 52 | "requires": { 53 | "@babel/types": "^7.14.5" 54 | } 55 | }, 56 | "@babel/helper-split-export-declaration": { 57 | "version": "7.14.5", 58 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", 59 | "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", 60 | "dev": true, 61 | "requires": { 62 | "@babel/types": "^7.14.5" 63 | } 64 | }, 65 | "@babel/helper-validator-identifier": { 66 | "version": "7.14.8", 67 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", 68 | "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==", 69 | "dev": true 70 | }, 71 | "@babel/highlight": { 72 | "version": "7.14.5", 73 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", 74 | "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", 75 | "dev": true, 76 | "requires": { 77 | "@babel/helper-validator-identifier": "^7.14.5", 78 | "chalk": "^2.0.0", 79 | "js-tokens": "^4.0.0" 80 | }, 81 | "dependencies": { 82 | "chalk": { 83 | "version": "2.4.2", 84 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 85 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 86 | "dev": true, 87 | "requires": { 88 | "ansi-styles": "^3.2.1", 89 | "escape-string-regexp": "^1.0.5", 90 | "supports-color": "^5.3.0" 91 | } 92 | }, 93 | "escape-string-regexp": { 94 | "version": "1.0.5", 95 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 96 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 97 | "dev": true 98 | } 99 | } 100 | }, 101 | "@babel/parser": { 102 | "version": "7.14.8", 103 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.8.tgz", 104 | "integrity": "sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA==", 105 | "dev": true 106 | }, 107 | "@babel/template": { 108 | "version": "7.14.5", 109 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", 110 | "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", 111 | "dev": true, 112 | "requires": { 113 | "@babel/code-frame": "^7.14.5", 114 | "@babel/parser": "^7.14.5", 115 | "@babel/types": "^7.14.5" 116 | }, 117 | "dependencies": { 118 | "@babel/code-frame": { 119 | "version": "7.14.5", 120 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", 121 | "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", 122 | "dev": true, 123 | "requires": { 124 | "@babel/highlight": "^7.14.5" 125 | } 126 | } 127 | } 128 | }, 129 | "@babel/traverse": { 130 | "version": "7.14.8", 131 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.8.tgz", 132 | "integrity": "sha512-kexHhzCljJcFNn1KYAQ6A5wxMRzq9ebYpEDV4+WdNyr3i7O44tanbDOR/xjiG2F3sllan+LgwK+7OMk0EmydHg==", 133 | "dev": true, 134 | "requires": { 135 | "@babel/code-frame": "^7.14.5", 136 | "@babel/generator": "^7.14.8", 137 | "@babel/helper-function-name": "^7.14.5", 138 | "@babel/helper-hoist-variables": "^7.14.5", 139 | "@babel/helper-split-export-declaration": "^7.14.5", 140 | "@babel/parser": "^7.14.8", 141 | "@babel/types": "^7.14.8", 142 | "debug": "^4.1.0", 143 | "globals": "^11.1.0" 144 | }, 145 | "dependencies": { 146 | "@babel/code-frame": { 147 | "version": "7.14.5", 148 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", 149 | "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", 150 | "dev": true, 151 | "requires": { 152 | "@babel/highlight": "^7.14.5" 153 | } 154 | }, 155 | "globals": { 156 | "version": "11.12.0", 157 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 158 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 159 | "dev": true 160 | } 161 | } 162 | }, 163 | "@babel/types": { 164 | "version": "7.14.8", 165 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", 166 | "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", 167 | "dev": true, 168 | "requires": { 169 | "@babel/helper-validator-identifier": "^7.14.8", 170 | "to-fast-properties": "^2.0.0" 171 | } 172 | }, 173 | "@eslint/eslintrc": { 174 | "version": "0.4.3", 175 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", 176 | "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", 177 | "dev": true, 178 | "requires": { 179 | "ajv": "^6.12.4", 180 | "debug": "^4.1.1", 181 | "espree": "^7.3.0", 182 | "globals": "^13.9.0", 183 | "ignore": "^4.0.6", 184 | "import-fresh": "^3.2.1", 185 | "js-yaml": "^3.13.1", 186 | "minimatch": "^3.0.4", 187 | "strip-json-comments": "^3.1.1" 188 | }, 189 | "dependencies": { 190 | "debug": { 191 | "version": "4.3.2", 192 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 193 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 194 | "dev": true, 195 | "requires": { 196 | "ms": "2.1.2" 197 | } 198 | } 199 | } 200 | }, 201 | "@humanwhocodes/config-array": { 202 | "version": "0.5.0", 203 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", 204 | "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", 205 | "dev": true, 206 | "requires": { 207 | "@humanwhocodes/object-schema": "^1.2.0", 208 | "debug": "^4.1.1", 209 | "minimatch": "^3.0.4" 210 | }, 211 | "dependencies": { 212 | "debug": { 213 | "version": "4.3.2", 214 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 215 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 216 | "dev": true, 217 | "requires": { 218 | "ms": "2.1.2" 219 | } 220 | } 221 | } 222 | }, 223 | "@humanwhocodes/object-schema": { 224 | "version": "1.2.0", 225 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", 226 | "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", 227 | "dev": true 228 | }, 229 | "@losant/eslint-config-losant": { 230 | "version": "1.4.3", 231 | "resolved": "https://registry.npmjs.org/@losant/eslint-config-losant/-/eslint-config-losant-1.4.3.tgz", 232 | "integrity": "sha512-bQSbFnzsQdVvrBq7qY8LZ0EtxSMy7b/OXb229rtwWqPaPWHFMLqcP8CuP2v+rOrbfo6aHB/nIP4XnKgz8BBG7w==", 233 | "dev": true, 234 | "requires": { 235 | "babel-eslint": "^10.1.0", 236 | "confusing-browser-globals": "^2.0.0-next.281", 237 | "eslint": "^7.17.0", 238 | "eslint-plugin-import": "^2.22.1", 239 | "eslint-plugin-no-only-tests": "^2.4.0", 240 | "eslint-plugin-node": "^11.1.0", 241 | "eslint-plugin-react": "^7.22.0", 242 | "eslint-plugin-react-hooks": "^4.2.0", 243 | "eslint-watch": "^7.0.0" 244 | } 245 | }, 246 | "@types/parse-json": { 247 | "version": "4.0.0", 248 | "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", 249 | "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", 250 | "dev": true 251 | }, 252 | "@ungap/promise-all-settled": { 253 | "version": "1.1.2", 254 | "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", 255 | "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", 256 | "dev": true 257 | }, 258 | "acorn": { 259 | "version": "7.4.1", 260 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 261 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 262 | "dev": true 263 | }, 264 | "acorn-jsx": { 265 | "version": "5.3.2", 266 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 267 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 268 | "dev": true 269 | }, 270 | "aggregate-error": { 271 | "version": "3.1.0", 272 | "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", 273 | "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", 274 | "dev": true, 275 | "requires": { 276 | "clean-stack": "^2.0.0", 277 | "indent-string": "^4.0.0" 278 | } 279 | }, 280 | "ajv": { 281 | "version": "6.12.6", 282 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 283 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 284 | "dev": true, 285 | "requires": { 286 | "fast-deep-equal": "^3.1.1", 287 | "fast-json-stable-stringify": "^2.0.0", 288 | "json-schema-traverse": "^0.4.1", 289 | "uri-js": "^4.2.2" 290 | } 291 | }, 292 | "ansi-colors": { 293 | "version": "4.1.1", 294 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 295 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 296 | "dev": true 297 | }, 298 | "ansi-escapes": { 299 | "version": "4.3.2", 300 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", 301 | "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", 302 | "dev": true, 303 | "requires": { 304 | "type-fest": "^0.21.3" 305 | }, 306 | "dependencies": { 307 | "type-fest": { 308 | "version": "0.21.3", 309 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", 310 | "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", 311 | "dev": true 312 | } 313 | } 314 | }, 315 | "ansi-regex": { 316 | "version": "5.0.0", 317 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 318 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 319 | "dev": true 320 | }, 321 | "ansi-styles": { 322 | "version": "3.2.1", 323 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 324 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 325 | "dev": true, 326 | "requires": { 327 | "color-convert": "^1.9.0" 328 | } 329 | }, 330 | "anymatch": { 331 | "version": "3.1.2", 332 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 333 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 334 | "dev": true, 335 | "requires": { 336 | "normalize-path": "^3.0.0", 337 | "picomatch": "^2.0.4" 338 | } 339 | }, 340 | "argparse": { 341 | "version": "1.0.10", 342 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 343 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 344 | "dev": true, 345 | "requires": { 346 | "sprintf-js": "~1.0.2" 347 | } 348 | }, 349 | "array-includes": { 350 | "version": "3.1.3", 351 | "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", 352 | "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", 353 | "dev": true, 354 | "requires": { 355 | "call-bind": "^1.0.2", 356 | "define-properties": "^1.1.3", 357 | "es-abstract": "^1.18.0-next.2", 358 | "get-intrinsic": "^1.1.1", 359 | "is-string": "^1.0.5" 360 | } 361 | }, 362 | "array.prototype.flat": { 363 | "version": "1.2.4", 364 | "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", 365 | "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", 366 | "dev": true, 367 | "requires": { 368 | "call-bind": "^1.0.0", 369 | "define-properties": "^1.1.3", 370 | "es-abstract": "^1.18.0-next.1" 371 | } 372 | }, 373 | "array.prototype.flatmap": { 374 | "version": "1.2.4", 375 | "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", 376 | "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", 377 | "dev": true, 378 | "requires": { 379 | "call-bind": "^1.0.0", 380 | "define-properties": "^1.1.3", 381 | "es-abstract": "^1.18.0-next.1", 382 | "function-bind": "^1.1.1" 383 | } 384 | }, 385 | "astral-regex": { 386 | "version": "2.0.0", 387 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", 388 | "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", 389 | "dev": true 390 | }, 391 | "babel-eslint": { 392 | "version": "10.1.0", 393 | "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", 394 | "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", 395 | "dev": true, 396 | "requires": { 397 | "@babel/code-frame": "^7.0.0", 398 | "@babel/parser": "^7.7.0", 399 | "@babel/traverse": "^7.7.0", 400 | "@babel/types": "^7.7.0", 401 | "eslint-visitor-keys": "^1.0.0", 402 | "resolve": "^1.12.0" 403 | }, 404 | "dependencies": { 405 | "eslint-visitor-keys": { 406 | "version": "1.3.0", 407 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 408 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 409 | "dev": true 410 | } 411 | } 412 | }, 413 | "balanced-match": { 414 | "version": "1.0.2", 415 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 416 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 417 | }, 418 | "base64-js": { 419 | "version": "1.5.1", 420 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 421 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 422 | }, 423 | "binary-extensions": { 424 | "version": "2.2.0", 425 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 426 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 427 | "dev": true 428 | }, 429 | "bl": { 430 | "version": "4.1.0", 431 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 432 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 433 | "requires": { 434 | "buffer": "^5.5.0", 435 | "inherits": "^2.0.4", 436 | "readable-stream": "^3.4.0" 437 | } 438 | }, 439 | "brace-expansion": { 440 | "version": "1.1.11", 441 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 442 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 443 | "requires": { 444 | "balanced-match": "^1.0.0", 445 | "concat-map": "0.0.1" 446 | } 447 | }, 448 | "braces": { 449 | "version": "3.0.2", 450 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 451 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 452 | "dev": true, 453 | "requires": { 454 | "fill-range": "^7.0.1" 455 | } 456 | }, 457 | "browser-stdout": { 458 | "version": "1.3.1", 459 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 460 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 461 | "dev": true 462 | }, 463 | "buffer": { 464 | "version": "5.7.1", 465 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 466 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 467 | "requires": { 468 | "base64-js": "^1.3.1", 469 | "ieee754": "^1.1.13" 470 | } 471 | }, 472 | "buffer-from": { 473 | "version": "1.1.1", 474 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 475 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 476 | }, 477 | "call-bind": { 478 | "version": "1.0.2", 479 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 480 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 481 | "dev": true, 482 | "requires": { 483 | "function-bind": "^1.1.1", 484 | "get-intrinsic": "^1.0.2" 485 | } 486 | }, 487 | "callsites": { 488 | "version": "3.1.0", 489 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 490 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 491 | "dev": true 492 | }, 493 | "camelcase": { 494 | "version": "6.2.0", 495 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", 496 | "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", 497 | "dev": true 498 | }, 499 | "chalk": { 500 | "version": "4.1.1", 501 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", 502 | "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", 503 | "dev": true, 504 | "requires": { 505 | "ansi-styles": "^4.1.0", 506 | "supports-color": "^7.1.0" 507 | }, 508 | "dependencies": { 509 | "ansi-styles": { 510 | "version": "4.3.0", 511 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 512 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 513 | "dev": true, 514 | "requires": { 515 | "color-convert": "^2.0.1" 516 | } 517 | }, 518 | "color-convert": { 519 | "version": "2.0.1", 520 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 521 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 522 | "dev": true, 523 | "requires": { 524 | "color-name": "~1.1.4" 525 | } 526 | }, 527 | "color-name": { 528 | "version": "1.1.4", 529 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 530 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 531 | "dev": true 532 | }, 533 | "has-flag": { 534 | "version": "4.0.0", 535 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 536 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 537 | "dev": true 538 | }, 539 | "supports-color": { 540 | "version": "7.2.0", 541 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 542 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 543 | "dev": true, 544 | "requires": { 545 | "has-flag": "^4.0.0" 546 | } 547 | } 548 | } 549 | }, 550 | "chokidar": { 551 | "version": "3.5.2", 552 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", 553 | "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", 554 | "dev": true, 555 | "requires": { 556 | "anymatch": "~3.1.2", 557 | "braces": "~3.0.2", 558 | "fsevents": "~2.3.2", 559 | "glob-parent": "~5.1.2", 560 | "is-binary-path": "~2.1.0", 561 | "is-glob": "~4.0.1", 562 | "normalize-path": "~3.0.0", 563 | "readdirp": "~3.6.0" 564 | } 565 | }, 566 | "clean-stack": { 567 | "version": "2.2.0", 568 | "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", 569 | "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", 570 | "dev": true 571 | }, 572 | "cli-cursor": { 573 | "version": "3.1.0", 574 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 575 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 576 | "dev": true, 577 | "requires": { 578 | "restore-cursor": "^3.1.0" 579 | } 580 | }, 581 | "cli-truncate": { 582 | "version": "2.1.0", 583 | "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", 584 | "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", 585 | "dev": true, 586 | "requires": { 587 | "slice-ansi": "^3.0.0", 588 | "string-width": "^4.2.0" 589 | }, 590 | "dependencies": { 591 | "ansi-styles": { 592 | "version": "4.3.0", 593 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 594 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 595 | "dev": true, 596 | "requires": { 597 | "color-convert": "^2.0.1" 598 | } 599 | }, 600 | "color-convert": { 601 | "version": "2.0.1", 602 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 603 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 604 | "dev": true, 605 | "requires": { 606 | "color-name": "~1.1.4" 607 | } 608 | }, 609 | "color-name": { 610 | "version": "1.1.4", 611 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 612 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 613 | "dev": true 614 | }, 615 | "slice-ansi": { 616 | "version": "3.0.0", 617 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", 618 | "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", 619 | "dev": true, 620 | "requires": { 621 | "ansi-styles": "^4.0.0", 622 | "astral-regex": "^2.0.0", 623 | "is-fullwidth-code-point": "^3.0.0" 624 | } 625 | } 626 | } 627 | }, 628 | "cliui": { 629 | "version": "7.0.4", 630 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 631 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 632 | "dev": true, 633 | "requires": { 634 | "string-width": "^4.2.0", 635 | "strip-ansi": "^6.0.0", 636 | "wrap-ansi": "^7.0.0" 637 | } 638 | }, 639 | "color-convert": { 640 | "version": "1.9.3", 641 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 642 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 643 | "dev": true, 644 | "requires": { 645 | "color-name": "1.1.3" 646 | } 647 | }, 648 | "color-name": { 649 | "version": "1.1.3", 650 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 651 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 652 | "dev": true 653 | }, 654 | "colorette": { 655 | "version": "1.2.2", 656 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", 657 | "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", 658 | "dev": true 659 | }, 660 | "commander": { 661 | "version": "6.2.1", 662 | "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", 663 | "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", 664 | "dev": true 665 | }, 666 | "commist": { 667 | "version": "1.1.0", 668 | "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz", 669 | "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==", 670 | "requires": { 671 | "leven": "^2.1.0", 672 | "minimist": "^1.1.0" 673 | } 674 | }, 675 | "concat-map": { 676 | "version": "0.0.1", 677 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 678 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 679 | }, 680 | "concat-stream": { 681 | "version": "2.0.0", 682 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", 683 | "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", 684 | "requires": { 685 | "buffer-from": "^1.0.0", 686 | "inherits": "^2.0.3", 687 | "readable-stream": "^3.0.2", 688 | "typedarray": "^0.0.6" 689 | } 690 | }, 691 | "confusing-browser-globals": { 692 | "version": "2.0.0-next.fb6e6f70", 693 | "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-2.0.0-next.fb6e6f70.tgz", 694 | "integrity": "sha512-zQuZ6JpoZJIx5KYxfHk/O+pUreXqtrpeXabvxQ2qQXyk5HWCElX0FF+emK+Kc/WuQKDmaEP1ErZcNnxDnWPEKQ==", 695 | "dev": true 696 | }, 697 | "core-js": { 698 | "version": "3.16.0", 699 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.16.0.tgz", 700 | "integrity": "sha512-5+5VxRFmSf97nM8Jr2wzOwLqRo6zphH2aX+7KsAUONObyzakDNq2G/bgbhinxB4PoV9L3aXQYhiDKyIKWd2c8g==", 701 | "dev": true 702 | }, 703 | "cosmiconfig": { 704 | "version": "7.0.0", 705 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", 706 | "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", 707 | "dev": true, 708 | "requires": { 709 | "@types/parse-json": "^4.0.0", 710 | "import-fresh": "^3.2.1", 711 | "parse-json": "^5.0.0", 712 | "path-type": "^4.0.0", 713 | "yaml": "^1.10.0" 714 | }, 715 | "dependencies": { 716 | "parse-json": { 717 | "version": "5.2.0", 718 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", 719 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 720 | "dev": true, 721 | "requires": { 722 | "@babel/code-frame": "^7.0.0", 723 | "error-ex": "^1.3.1", 724 | "json-parse-even-better-errors": "^2.3.0", 725 | "lines-and-columns": "^1.1.6" 726 | } 727 | }, 728 | "path-type": { 729 | "version": "4.0.0", 730 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 731 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 732 | "dev": true 733 | } 734 | } 735 | }, 736 | "cross-spawn": { 737 | "version": "7.0.3", 738 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 739 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 740 | "dev": true, 741 | "requires": { 742 | "path-key": "^3.1.0", 743 | "shebang-command": "^2.0.0", 744 | "which": "^2.0.1" 745 | } 746 | }, 747 | "debug": { 748 | "version": "4.3.2", 749 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 750 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 751 | "requires": { 752 | "ms": "2.1.2" 753 | } 754 | }, 755 | "decamelize": { 756 | "version": "4.0.0", 757 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 758 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 759 | "dev": true 760 | }, 761 | "dedent": { 762 | "version": "0.7.0", 763 | "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", 764 | "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", 765 | "dev": true 766 | }, 767 | "deep-is": { 768 | "version": "0.1.3", 769 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 770 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 771 | "dev": true 772 | }, 773 | "define-properties": { 774 | "version": "1.1.3", 775 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 776 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 777 | "dev": true, 778 | "requires": { 779 | "object-keys": "^1.0.12" 780 | } 781 | }, 782 | "diff": { 783 | "version": "5.0.0", 784 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 785 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 786 | "dev": true 787 | }, 788 | "doctrine": { 789 | "version": "3.0.0", 790 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 791 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 792 | "dev": true, 793 | "requires": { 794 | "esutils": "^2.0.2" 795 | } 796 | }, 797 | "duplexify": { 798 | "version": "4.1.2", 799 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", 800 | "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", 801 | "requires": { 802 | "end-of-stream": "^1.4.1", 803 | "inherits": "^2.0.3", 804 | "readable-stream": "^3.1.1", 805 | "stream-shift": "^1.0.0" 806 | } 807 | }, 808 | "emoji-regex": { 809 | "version": "8.0.0", 810 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 811 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 812 | "dev": true 813 | }, 814 | "end-of-stream": { 815 | "version": "1.4.4", 816 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 817 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 818 | "requires": { 819 | "once": "^1.4.0" 820 | } 821 | }, 822 | "enquirer": { 823 | "version": "2.3.6", 824 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", 825 | "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", 826 | "dev": true, 827 | "requires": { 828 | "ansi-colors": "^4.1.1" 829 | } 830 | }, 831 | "error-ex": { 832 | "version": "1.3.2", 833 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 834 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 835 | "dev": true, 836 | "requires": { 837 | "is-arrayish": "^0.2.1" 838 | } 839 | }, 840 | "es-abstract": { 841 | "version": "1.18.4", 842 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.4.tgz", 843 | "integrity": "sha512-xjDAPJRxKc1uoTkdW8MEk7Fq/2bzz3YoCADYniDV7+KITCUdu9c90fj1aKI7nEZFZxRrHlDo3wtma/C6QkhlXQ==", 844 | "dev": true, 845 | "requires": { 846 | "call-bind": "^1.0.2", 847 | "es-to-primitive": "^1.2.1", 848 | "function-bind": "^1.1.1", 849 | "get-intrinsic": "^1.1.1", 850 | "has": "^1.0.3", 851 | "has-symbols": "^1.0.2", 852 | "internal-slot": "^1.0.3", 853 | "is-callable": "^1.2.3", 854 | "is-negative-zero": "^2.0.1", 855 | "is-regex": "^1.1.3", 856 | "is-string": "^1.0.6", 857 | "object-inspect": "^1.11.0", 858 | "object-keys": "^1.1.1", 859 | "object.assign": "^4.1.2", 860 | "string.prototype.trimend": "^1.0.4", 861 | "string.prototype.trimstart": "^1.0.4", 862 | "unbox-primitive": "^1.0.1" 863 | } 864 | }, 865 | "es-to-primitive": { 866 | "version": "1.2.1", 867 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 868 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 869 | "dev": true, 870 | "requires": { 871 | "is-callable": "^1.1.4", 872 | "is-date-object": "^1.0.1", 873 | "is-symbol": "^1.0.2" 874 | } 875 | }, 876 | "escalade": { 877 | "version": "3.1.1", 878 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 879 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 880 | "dev": true 881 | }, 882 | "escape-string-regexp": { 883 | "version": "4.0.0", 884 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 885 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 886 | "dev": true 887 | }, 888 | "eslint": { 889 | "version": "7.31.0", 890 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.31.0.tgz", 891 | "integrity": "sha512-vafgJpSh2ia8tnTkNUkwxGmnumgckLh5aAbLa1xRmIn9+owi8qBNGKL+B881kNKNTy7FFqTEkpNkUvmw0n6PkA==", 892 | "dev": true, 893 | "requires": { 894 | "@babel/code-frame": "7.12.11", 895 | "@eslint/eslintrc": "^0.4.3", 896 | "@humanwhocodes/config-array": "^0.5.0", 897 | "ajv": "^6.10.0", 898 | "chalk": "^4.0.0", 899 | "cross-spawn": "^7.0.2", 900 | "debug": "^4.0.1", 901 | "doctrine": "^3.0.0", 902 | "enquirer": "^2.3.5", 903 | "escape-string-regexp": "^4.0.0", 904 | "eslint-scope": "^5.1.1", 905 | "eslint-utils": "^2.1.0", 906 | "eslint-visitor-keys": "^2.0.0", 907 | "espree": "^7.3.1", 908 | "esquery": "^1.4.0", 909 | "esutils": "^2.0.2", 910 | "fast-deep-equal": "^3.1.3", 911 | "file-entry-cache": "^6.0.1", 912 | "functional-red-black-tree": "^1.0.1", 913 | "glob-parent": "^5.1.2", 914 | "globals": "^13.6.0", 915 | "ignore": "^4.0.6", 916 | "import-fresh": "^3.0.0", 917 | "imurmurhash": "^0.1.4", 918 | "is-glob": "^4.0.0", 919 | "js-yaml": "^3.13.1", 920 | "json-stable-stringify-without-jsonify": "^1.0.1", 921 | "levn": "^0.4.1", 922 | "lodash.merge": "^4.6.2", 923 | "minimatch": "^3.0.4", 924 | "natural-compare": "^1.4.0", 925 | "optionator": "^0.9.1", 926 | "progress": "^2.0.0", 927 | "regexpp": "^3.1.0", 928 | "semver": "^7.2.1", 929 | "strip-ansi": "^6.0.0", 930 | "strip-json-comments": "^3.1.0", 931 | "table": "^6.0.9", 932 | "text-table": "^0.2.0", 933 | "v8-compile-cache": "^2.0.3" 934 | }, 935 | "dependencies": { 936 | "debug": { 937 | "version": "4.3.2", 938 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 939 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 940 | "dev": true, 941 | "requires": { 942 | "ms": "2.1.2" 943 | } 944 | } 945 | } 946 | }, 947 | "eslint-import-resolver-node": { 948 | "version": "0.3.4", 949 | "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", 950 | "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", 951 | "dev": true, 952 | "requires": { 953 | "debug": "^2.6.9", 954 | "resolve": "^1.13.1" 955 | }, 956 | "dependencies": { 957 | "debug": { 958 | "version": "2.6.9", 959 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 960 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 961 | "dev": true, 962 | "requires": { 963 | "ms": "2.0.0" 964 | } 965 | }, 966 | "ms": { 967 | "version": "2.0.0", 968 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 969 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 970 | "dev": true 971 | } 972 | } 973 | }, 974 | "eslint-module-utils": { 975 | "version": "2.6.1", 976 | "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", 977 | "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", 978 | "dev": true, 979 | "requires": { 980 | "debug": "^3.2.7", 981 | "pkg-dir": "^2.0.0" 982 | }, 983 | "dependencies": { 984 | "debug": { 985 | "version": "3.2.7", 986 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 987 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 988 | "dev": true, 989 | "requires": { 990 | "ms": "^2.1.1" 991 | } 992 | } 993 | } 994 | }, 995 | "eslint-plugin-es": { 996 | "version": "3.0.1", 997 | "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", 998 | "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", 999 | "dev": true, 1000 | "requires": { 1001 | "eslint-utils": "^2.0.0", 1002 | "regexpp": "^3.0.0" 1003 | } 1004 | }, 1005 | "eslint-plugin-import": { 1006 | "version": "2.23.4", 1007 | "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz", 1008 | "integrity": "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==", 1009 | "dev": true, 1010 | "requires": { 1011 | "array-includes": "^3.1.3", 1012 | "array.prototype.flat": "^1.2.4", 1013 | "debug": "^2.6.9", 1014 | "doctrine": "^2.1.0", 1015 | "eslint-import-resolver-node": "^0.3.4", 1016 | "eslint-module-utils": "^2.6.1", 1017 | "find-up": "^2.0.0", 1018 | "has": "^1.0.3", 1019 | "is-core-module": "^2.4.0", 1020 | "minimatch": "^3.0.4", 1021 | "object.values": "^1.1.3", 1022 | "pkg-up": "^2.0.0", 1023 | "read-pkg-up": "^3.0.0", 1024 | "resolve": "^1.20.0", 1025 | "tsconfig-paths": "^3.9.0" 1026 | }, 1027 | "dependencies": { 1028 | "debug": { 1029 | "version": "2.6.9", 1030 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1031 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1032 | "dev": true, 1033 | "requires": { 1034 | "ms": "2.0.0" 1035 | } 1036 | }, 1037 | "doctrine": { 1038 | "version": "2.1.0", 1039 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 1040 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 1041 | "dev": true, 1042 | "requires": { 1043 | "esutils": "^2.0.2" 1044 | } 1045 | }, 1046 | "find-up": { 1047 | "version": "2.1.0", 1048 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 1049 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 1050 | "dev": true, 1051 | "requires": { 1052 | "locate-path": "^2.0.0" 1053 | } 1054 | }, 1055 | "locate-path": { 1056 | "version": "2.0.0", 1057 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 1058 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 1059 | "dev": true, 1060 | "requires": { 1061 | "p-locate": "^2.0.0", 1062 | "path-exists": "^3.0.0" 1063 | } 1064 | }, 1065 | "ms": { 1066 | "version": "2.0.0", 1067 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1068 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1069 | "dev": true 1070 | }, 1071 | "p-limit": { 1072 | "version": "1.3.0", 1073 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", 1074 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", 1075 | "dev": true, 1076 | "requires": { 1077 | "p-try": "^1.0.0" 1078 | } 1079 | }, 1080 | "p-locate": { 1081 | "version": "2.0.0", 1082 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 1083 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 1084 | "dev": true, 1085 | "requires": { 1086 | "p-limit": "^1.1.0" 1087 | } 1088 | }, 1089 | "path-exists": { 1090 | "version": "3.0.0", 1091 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1092 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1093 | "dev": true 1094 | } 1095 | } 1096 | }, 1097 | "eslint-plugin-no-only-tests": { 1098 | "version": "2.6.0", 1099 | "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-2.6.0.tgz", 1100 | "integrity": "sha512-T9SmE/g6UV1uZo1oHAqOvL86XWl7Pl2EpRpnLI8g/bkJu+h7XBCB+1LnubRZ2CUQXj805vh4/CYZdnqtVaEo2Q==", 1101 | "dev": true 1102 | }, 1103 | "eslint-plugin-node": { 1104 | "version": "11.1.0", 1105 | "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", 1106 | "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", 1107 | "dev": true, 1108 | "requires": { 1109 | "eslint-plugin-es": "^3.0.0", 1110 | "eslint-utils": "^2.0.0", 1111 | "ignore": "^5.1.1", 1112 | "minimatch": "^3.0.4", 1113 | "resolve": "^1.10.1", 1114 | "semver": "^6.1.0" 1115 | }, 1116 | "dependencies": { 1117 | "ignore": { 1118 | "version": "5.1.8", 1119 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", 1120 | "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", 1121 | "dev": true 1122 | }, 1123 | "semver": { 1124 | "version": "6.3.0", 1125 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1126 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1127 | "dev": true 1128 | } 1129 | } 1130 | }, 1131 | "eslint-plugin-react": { 1132 | "version": "7.24.0", 1133 | "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.24.0.tgz", 1134 | "integrity": "sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q==", 1135 | "dev": true, 1136 | "requires": { 1137 | "array-includes": "^3.1.3", 1138 | "array.prototype.flatmap": "^1.2.4", 1139 | "doctrine": "^2.1.0", 1140 | "has": "^1.0.3", 1141 | "jsx-ast-utils": "^2.4.1 || ^3.0.0", 1142 | "minimatch": "^3.0.4", 1143 | "object.entries": "^1.1.4", 1144 | "object.fromentries": "^2.0.4", 1145 | "object.values": "^1.1.4", 1146 | "prop-types": "^15.7.2", 1147 | "resolve": "^2.0.0-next.3", 1148 | "string.prototype.matchall": "^4.0.5" 1149 | }, 1150 | "dependencies": { 1151 | "doctrine": { 1152 | "version": "2.1.0", 1153 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 1154 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 1155 | "dev": true, 1156 | "requires": { 1157 | "esutils": "^2.0.2" 1158 | } 1159 | }, 1160 | "resolve": { 1161 | "version": "2.0.0-next.3", 1162 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", 1163 | "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", 1164 | "dev": true, 1165 | "requires": { 1166 | "is-core-module": "^2.2.0", 1167 | "path-parse": "^1.0.6" 1168 | } 1169 | } 1170 | } 1171 | }, 1172 | "eslint-plugin-react-hooks": { 1173 | "version": "4.2.0", 1174 | "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", 1175 | "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==", 1176 | "dev": true 1177 | }, 1178 | "eslint-scope": { 1179 | "version": "5.1.1", 1180 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 1181 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 1182 | "dev": true, 1183 | "requires": { 1184 | "esrecurse": "^4.3.0", 1185 | "estraverse": "^4.1.1" 1186 | } 1187 | }, 1188 | "eslint-utils": { 1189 | "version": "2.1.0", 1190 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", 1191 | "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", 1192 | "dev": true, 1193 | "requires": { 1194 | "eslint-visitor-keys": "^1.1.0" 1195 | }, 1196 | "dependencies": { 1197 | "eslint-visitor-keys": { 1198 | "version": "1.3.0", 1199 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 1200 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 1201 | "dev": true 1202 | } 1203 | } 1204 | }, 1205 | "eslint-visitor-keys": { 1206 | "version": "2.1.0", 1207 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 1208 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 1209 | "dev": true 1210 | }, 1211 | "eslint-watch": { 1212 | "version": "7.0.0", 1213 | "resolved": "https://registry.npmjs.org/eslint-watch/-/eslint-watch-7.0.0.tgz", 1214 | "integrity": "sha512-xwEm3blWQbBoYI1eZTfpPAXfqkCteQPgMa28u8k/J97tFwtffSgDc7hCOoR1vxsSzmRLtEthxB0a6pwimPTgLQ==", 1215 | "dev": true, 1216 | "requires": { 1217 | "chokidar": "^3.1.1", 1218 | "core-js": "^3.2.1", 1219 | "debug": "^4.1.0", 1220 | "execa": "^4.0.1", 1221 | "keypress": "^0.2.1", 1222 | "lodash.debounce": "^4.0.8", 1223 | "lodash.isempty": "^4.4.0", 1224 | "lodash.isequal": "^4.5.0", 1225 | "lodash.kebabcase": "^4.1.1", 1226 | "lodash.unionwith": "^4.6.0", 1227 | "optionator": "^0.9.1", 1228 | "source-map-support": "^0.5.13" 1229 | } 1230 | }, 1231 | "espree": { 1232 | "version": "7.3.1", 1233 | "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", 1234 | "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", 1235 | "dev": true, 1236 | "requires": { 1237 | "acorn": "^7.4.0", 1238 | "acorn-jsx": "^5.3.1", 1239 | "eslint-visitor-keys": "^1.3.0" 1240 | }, 1241 | "dependencies": { 1242 | "eslint-visitor-keys": { 1243 | "version": "1.3.0", 1244 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 1245 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 1246 | "dev": true 1247 | } 1248 | } 1249 | }, 1250 | "esprima": { 1251 | "version": "4.0.1", 1252 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 1253 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 1254 | "dev": true 1255 | }, 1256 | "esquery": { 1257 | "version": "1.4.0", 1258 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", 1259 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", 1260 | "dev": true, 1261 | "requires": { 1262 | "estraverse": "^5.1.0" 1263 | }, 1264 | "dependencies": { 1265 | "estraverse": { 1266 | "version": "5.2.0", 1267 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", 1268 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", 1269 | "dev": true 1270 | } 1271 | } 1272 | }, 1273 | "esrecurse": { 1274 | "version": "4.3.0", 1275 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1276 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1277 | "dev": true, 1278 | "requires": { 1279 | "estraverse": "^5.2.0" 1280 | }, 1281 | "dependencies": { 1282 | "estraverse": { 1283 | "version": "5.2.0", 1284 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", 1285 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", 1286 | "dev": true 1287 | } 1288 | } 1289 | }, 1290 | "estraverse": { 1291 | "version": "4.3.0", 1292 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 1293 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 1294 | "dev": true 1295 | }, 1296 | "esutils": { 1297 | "version": "2.0.3", 1298 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1299 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1300 | "dev": true 1301 | }, 1302 | "execa": { 1303 | "version": "4.1.0", 1304 | "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", 1305 | "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", 1306 | "dev": true, 1307 | "requires": { 1308 | "cross-spawn": "^7.0.0", 1309 | "get-stream": "^5.0.0", 1310 | "human-signals": "^1.1.1", 1311 | "is-stream": "^2.0.0", 1312 | "merge-stream": "^2.0.0", 1313 | "npm-run-path": "^4.0.0", 1314 | "onetime": "^5.1.0", 1315 | "signal-exit": "^3.0.2", 1316 | "strip-final-newline": "^2.0.0" 1317 | } 1318 | }, 1319 | "fast-deep-equal": { 1320 | "version": "3.1.3", 1321 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1322 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1323 | "dev": true 1324 | }, 1325 | "fast-json-stable-stringify": { 1326 | "version": "2.1.0", 1327 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1328 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1329 | "dev": true 1330 | }, 1331 | "fast-levenshtein": { 1332 | "version": "2.0.6", 1333 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1334 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 1335 | "dev": true 1336 | }, 1337 | "file-entry-cache": { 1338 | "version": "6.0.1", 1339 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 1340 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 1341 | "dev": true, 1342 | "requires": { 1343 | "flat-cache": "^3.0.4" 1344 | } 1345 | }, 1346 | "fill-range": { 1347 | "version": "7.0.1", 1348 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1349 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1350 | "dev": true, 1351 | "requires": { 1352 | "to-regex-range": "^5.0.1" 1353 | } 1354 | }, 1355 | "find-up": { 1356 | "version": "5.0.0", 1357 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1358 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1359 | "dev": true, 1360 | "requires": { 1361 | "locate-path": "^6.0.0", 1362 | "path-exists": "^4.0.0" 1363 | } 1364 | }, 1365 | "flat": { 1366 | "version": "5.0.2", 1367 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 1368 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 1369 | "dev": true 1370 | }, 1371 | "flat-cache": { 1372 | "version": "3.0.4", 1373 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 1374 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 1375 | "dev": true, 1376 | "requires": { 1377 | "flatted": "^3.1.0", 1378 | "rimraf": "^3.0.2" 1379 | } 1380 | }, 1381 | "flatted": { 1382 | "version": "3.2.1", 1383 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.1.tgz", 1384 | "integrity": "sha512-OMQjaErSFHmHqZe+PSidH5n8j3O0F2DdnVh8JB4j4eUQ2k6KvB0qGfrKIhapvez5JerBbmWkaLYUYWISaESoXg==", 1385 | "dev": true 1386 | }, 1387 | "fs.realpath": { 1388 | "version": "1.0.0", 1389 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1390 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 1391 | }, 1392 | "fsevents": { 1393 | "version": "2.3.2", 1394 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1395 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1396 | "dev": true, 1397 | "optional": true 1398 | }, 1399 | "function-bind": { 1400 | "version": "1.1.1", 1401 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1402 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1403 | "dev": true 1404 | }, 1405 | "functional-red-black-tree": { 1406 | "version": "1.0.1", 1407 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 1408 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 1409 | "dev": true 1410 | }, 1411 | "get-caller-file": { 1412 | "version": "2.0.5", 1413 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1414 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1415 | "dev": true 1416 | }, 1417 | "get-intrinsic": { 1418 | "version": "1.1.1", 1419 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", 1420 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", 1421 | "dev": true, 1422 | "requires": { 1423 | "function-bind": "^1.1.1", 1424 | "has": "^1.0.3", 1425 | "has-symbols": "^1.0.1" 1426 | } 1427 | }, 1428 | "get-own-enumerable-property-symbols": { 1429 | "version": "3.0.2", 1430 | "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", 1431 | "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", 1432 | "dev": true 1433 | }, 1434 | "get-stream": { 1435 | "version": "5.2.0", 1436 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", 1437 | "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", 1438 | "dev": true, 1439 | "requires": { 1440 | "pump": "^3.0.0" 1441 | } 1442 | }, 1443 | "glob": { 1444 | "version": "7.1.7", 1445 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", 1446 | "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", 1447 | "requires": { 1448 | "fs.realpath": "^1.0.0", 1449 | "inflight": "^1.0.4", 1450 | "inherits": "2", 1451 | "minimatch": "^3.0.4", 1452 | "once": "^1.3.0", 1453 | "path-is-absolute": "^1.0.0" 1454 | } 1455 | }, 1456 | "glob-parent": { 1457 | "version": "5.1.2", 1458 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1459 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1460 | "dev": true, 1461 | "requires": { 1462 | "is-glob": "^4.0.1" 1463 | } 1464 | }, 1465 | "globals": { 1466 | "version": "13.10.0", 1467 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", 1468 | "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", 1469 | "dev": true, 1470 | "requires": { 1471 | "type-fest": "^0.20.2" 1472 | } 1473 | }, 1474 | "graceful-fs": { 1475 | "version": "4.2.6", 1476 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", 1477 | "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", 1478 | "dev": true 1479 | }, 1480 | "growl": { 1481 | "version": "1.10.5", 1482 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 1483 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 1484 | "dev": true 1485 | }, 1486 | "has": { 1487 | "version": "1.0.3", 1488 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1489 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1490 | "dev": true, 1491 | "requires": { 1492 | "function-bind": "^1.1.1" 1493 | } 1494 | }, 1495 | "has-bigints": { 1496 | "version": "1.0.1", 1497 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", 1498 | "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", 1499 | "dev": true 1500 | }, 1501 | "has-flag": { 1502 | "version": "3.0.0", 1503 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1504 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1505 | "dev": true 1506 | }, 1507 | "has-symbols": { 1508 | "version": "1.0.2", 1509 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", 1510 | "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", 1511 | "dev": true 1512 | }, 1513 | "he": { 1514 | "version": "1.2.0", 1515 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 1516 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 1517 | "dev": true 1518 | }, 1519 | "help-me": { 1520 | "version": "3.0.0", 1521 | "resolved": "https://registry.npmjs.org/help-me/-/help-me-3.0.0.tgz", 1522 | "integrity": "sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ==", 1523 | "requires": { 1524 | "glob": "^7.1.6", 1525 | "readable-stream": "^3.6.0" 1526 | } 1527 | }, 1528 | "hosted-git-info": { 1529 | "version": "2.8.9", 1530 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", 1531 | "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", 1532 | "dev": true 1533 | }, 1534 | "human-signals": { 1535 | "version": "1.1.1", 1536 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", 1537 | "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", 1538 | "dev": true 1539 | }, 1540 | "husky": { 1541 | "version": "6.0.0", 1542 | "resolved": "https://registry.npmjs.org/husky/-/husky-6.0.0.tgz", 1543 | "integrity": "sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ==", 1544 | "dev": true 1545 | }, 1546 | "ieee754": { 1547 | "version": "1.2.1", 1548 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1549 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 1550 | }, 1551 | "ignore": { 1552 | "version": "4.0.6", 1553 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 1554 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 1555 | "dev": true 1556 | }, 1557 | "import-fresh": { 1558 | "version": "3.3.0", 1559 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1560 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1561 | "dev": true, 1562 | "requires": { 1563 | "parent-module": "^1.0.0", 1564 | "resolve-from": "^4.0.0" 1565 | } 1566 | }, 1567 | "imurmurhash": { 1568 | "version": "0.1.4", 1569 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1570 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 1571 | "dev": true 1572 | }, 1573 | "indent-string": { 1574 | "version": "4.0.0", 1575 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", 1576 | "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", 1577 | "dev": true 1578 | }, 1579 | "inflight": { 1580 | "version": "1.0.6", 1581 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1582 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1583 | "requires": { 1584 | "once": "^1.3.0", 1585 | "wrappy": "1" 1586 | } 1587 | }, 1588 | "inherits": { 1589 | "version": "2.0.4", 1590 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1591 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1592 | }, 1593 | "internal-slot": { 1594 | "version": "1.0.3", 1595 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", 1596 | "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", 1597 | "dev": true, 1598 | "requires": { 1599 | "get-intrinsic": "^1.1.0", 1600 | "has": "^1.0.3", 1601 | "side-channel": "^1.0.4" 1602 | } 1603 | }, 1604 | "is-arrayish": { 1605 | "version": "0.2.1", 1606 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1607 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 1608 | "dev": true 1609 | }, 1610 | "is-bigint": { 1611 | "version": "1.0.2", 1612 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", 1613 | "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", 1614 | "dev": true 1615 | }, 1616 | "is-binary-path": { 1617 | "version": "2.1.0", 1618 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1619 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1620 | "dev": true, 1621 | "requires": { 1622 | "binary-extensions": "^2.0.0" 1623 | } 1624 | }, 1625 | "is-boolean-object": { 1626 | "version": "1.1.1", 1627 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", 1628 | "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", 1629 | "dev": true, 1630 | "requires": { 1631 | "call-bind": "^1.0.2" 1632 | } 1633 | }, 1634 | "is-callable": { 1635 | "version": "1.2.3", 1636 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", 1637 | "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", 1638 | "dev": true 1639 | }, 1640 | "is-core-module": { 1641 | "version": "2.5.0", 1642 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", 1643 | "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", 1644 | "dev": true, 1645 | "requires": { 1646 | "has": "^1.0.3" 1647 | } 1648 | }, 1649 | "is-date-object": { 1650 | "version": "1.0.4", 1651 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", 1652 | "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", 1653 | "dev": true 1654 | }, 1655 | "is-extglob": { 1656 | "version": "2.1.1", 1657 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1658 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1659 | "dev": true 1660 | }, 1661 | "is-fullwidth-code-point": { 1662 | "version": "3.0.0", 1663 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1664 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1665 | "dev": true 1666 | }, 1667 | "is-glob": { 1668 | "version": "4.0.1", 1669 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 1670 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 1671 | "dev": true, 1672 | "requires": { 1673 | "is-extglob": "^2.1.1" 1674 | } 1675 | }, 1676 | "is-negative-zero": { 1677 | "version": "2.0.1", 1678 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", 1679 | "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", 1680 | "dev": true 1681 | }, 1682 | "is-number": { 1683 | "version": "7.0.0", 1684 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1685 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1686 | "dev": true 1687 | }, 1688 | "is-number-object": { 1689 | "version": "1.0.5", 1690 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", 1691 | "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", 1692 | "dev": true 1693 | }, 1694 | "is-obj": { 1695 | "version": "1.0.1", 1696 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", 1697 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", 1698 | "dev": true 1699 | }, 1700 | "is-plain-obj": { 1701 | "version": "2.1.0", 1702 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 1703 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 1704 | "dev": true 1705 | }, 1706 | "is-regex": { 1707 | "version": "1.1.3", 1708 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", 1709 | "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", 1710 | "dev": true, 1711 | "requires": { 1712 | "call-bind": "^1.0.2", 1713 | "has-symbols": "^1.0.2" 1714 | } 1715 | }, 1716 | "is-regexp": { 1717 | "version": "1.0.0", 1718 | "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", 1719 | "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", 1720 | "dev": true 1721 | }, 1722 | "is-stream": { 1723 | "version": "2.0.1", 1724 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 1725 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", 1726 | "dev": true 1727 | }, 1728 | "is-string": { 1729 | "version": "1.0.6", 1730 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", 1731 | "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", 1732 | "dev": true 1733 | }, 1734 | "is-symbol": { 1735 | "version": "1.0.4", 1736 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", 1737 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", 1738 | "dev": true, 1739 | "requires": { 1740 | "has-symbols": "^1.0.2" 1741 | } 1742 | }, 1743 | "is-unicode-supported": { 1744 | "version": "0.1.0", 1745 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 1746 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 1747 | "dev": true 1748 | }, 1749 | "isexe": { 1750 | "version": "2.0.0", 1751 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1752 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1753 | "dev": true 1754 | }, 1755 | "js-tokens": { 1756 | "version": "4.0.0", 1757 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1758 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1759 | "dev": true 1760 | }, 1761 | "js-yaml": { 1762 | "version": "3.14.1", 1763 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 1764 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 1765 | "dev": true, 1766 | "requires": { 1767 | "argparse": "^1.0.7", 1768 | "esprima": "^4.0.0" 1769 | } 1770 | }, 1771 | "jsesc": { 1772 | "version": "2.5.2", 1773 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 1774 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 1775 | "dev": true 1776 | }, 1777 | "json-parse-better-errors": { 1778 | "version": "1.0.2", 1779 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 1780 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", 1781 | "dev": true 1782 | }, 1783 | "json-parse-even-better-errors": { 1784 | "version": "2.3.1", 1785 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 1786 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", 1787 | "dev": true 1788 | }, 1789 | "json-schema-traverse": { 1790 | "version": "0.4.1", 1791 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1792 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1793 | "dev": true 1794 | }, 1795 | "json-stable-stringify-without-jsonify": { 1796 | "version": "1.0.1", 1797 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1798 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 1799 | "dev": true 1800 | }, 1801 | "json5": { 1802 | "version": "2.2.0", 1803 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", 1804 | "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", 1805 | "dev": true, 1806 | "requires": { 1807 | "minimist": "^1.2.5" 1808 | } 1809 | }, 1810 | "jsx-ast-utils": { 1811 | "version": "3.2.0", 1812 | "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz", 1813 | "integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==", 1814 | "dev": true, 1815 | "requires": { 1816 | "array-includes": "^3.1.2", 1817 | "object.assign": "^4.1.2" 1818 | } 1819 | }, 1820 | "keypress": { 1821 | "version": "0.2.1", 1822 | "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.2.1.tgz", 1823 | "integrity": "sha1-HoBFQlABjbrUw/6USX1uZ7YmnHc=", 1824 | "dev": true 1825 | }, 1826 | "leven": { 1827 | "version": "2.1.0", 1828 | "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", 1829 | "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" 1830 | }, 1831 | "levn": { 1832 | "version": "0.4.1", 1833 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1834 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1835 | "dev": true, 1836 | "requires": { 1837 | "prelude-ls": "^1.2.1", 1838 | "type-check": "~0.4.0" 1839 | } 1840 | }, 1841 | "lines-and-columns": { 1842 | "version": "1.1.6", 1843 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", 1844 | "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", 1845 | "dev": true 1846 | }, 1847 | "lint-staged": { 1848 | "version": "10.5.4", 1849 | "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.4.tgz", 1850 | "integrity": "sha512-EechC3DdFic/TdOPgj/RB3FicqE6932LTHCUm0Y2fsD9KGlLB+RwJl2q1IYBIvEsKzDOgn0D4gll+YxG5RsrKg==", 1851 | "dev": true, 1852 | "requires": { 1853 | "chalk": "^4.1.0", 1854 | "cli-truncate": "^2.1.0", 1855 | "commander": "^6.2.0", 1856 | "cosmiconfig": "^7.0.0", 1857 | "debug": "^4.2.0", 1858 | "dedent": "^0.7.0", 1859 | "enquirer": "^2.3.6", 1860 | "execa": "^4.1.0", 1861 | "listr2": "^3.2.2", 1862 | "log-symbols": "^4.0.0", 1863 | "micromatch": "^4.0.2", 1864 | "normalize-path": "^3.0.0", 1865 | "please-upgrade-node": "^3.2.0", 1866 | "string-argv": "0.3.1", 1867 | "stringify-object": "^3.3.0" 1868 | } 1869 | }, 1870 | "listr2": { 1871 | "version": "3.11.0", 1872 | "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.11.0.tgz", 1873 | "integrity": "sha512-XLJVe2JgXCyQTa3FbSv11lkKExYmEyA4jltVo8z4FX10Vt1Yj8IMekBfwim0BSOM9uj1QMTJvDQQpHyuPbB/dQ==", 1874 | "dev": true, 1875 | "requires": { 1876 | "cli-truncate": "^2.1.0", 1877 | "colorette": "^1.2.2", 1878 | "log-update": "^4.0.0", 1879 | "p-map": "^4.0.0", 1880 | "rxjs": "^6.6.7", 1881 | "through": "^2.3.8", 1882 | "wrap-ansi": "^7.0.0" 1883 | } 1884 | }, 1885 | "load-json-file": { 1886 | "version": "4.0.0", 1887 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", 1888 | "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", 1889 | "dev": true, 1890 | "requires": { 1891 | "graceful-fs": "^4.1.2", 1892 | "parse-json": "^4.0.0", 1893 | "pify": "^3.0.0", 1894 | "strip-bom": "^3.0.0" 1895 | } 1896 | }, 1897 | "locate-path": { 1898 | "version": "6.0.0", 1899 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1900 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1901 | "dev": true, 1902 | "requires": { 1903 | "p-locate": "^5.0.0" 1904 | } 1905 | }, 1906 | "lodash.clonedeep": { 1907 | "version": "4.5.0", 1908 | "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", 1909 | "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", 1910 | "dev": true 1911 | }, 1912 | "lodash.debounce": { 1913 | "version": "4.0.8", 1914 | "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", 1915 | "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", 1916 | "dev": true 1917 | }, 1918 | "lodash.isempty": { 1919 | "version": "4.4.0", 1920 | "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", 1921 | "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=", 1922 | "dev": true 1923 | }, 1924 | "lodash.isequal": { 1925 | "version": "4.5.0", 1926 | "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", 1927 | "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", 1928 | "dev": true 1929 | }, 1930 | "lodash.kebabcase": { 1931 | "version": "4.1.1", 1932 | "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", 1933 | "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", 1934 | "dev": true 1935 | }, 1936 | "lodash.merge": { 1937 | "version": "4.6.2", 1938 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1939 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 1940 | "dev": true 1941 | }, 1942 | "lodash.truncate": { 1943 | "version": "4.4.2", 1944 | "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", 1945 | "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", 1946 | "dev": true 1947 | }, 1948 | "lodash.unionwith": { 1949 | "version": "4.6.0", 1950 | "resolved": "https://registry.npmjs.org/lodash.unionwith/-/lodash.unionwith-4.6.0.tgz", 1951 | "integrity": "sha1-dNFAtcqBRubGQ8NyT1FSU42awfA=", 1952 | "dev": true 1953 | }, 1954 | "log-symbols": { 1955 | "version": "4.1.0", 1956 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 1957 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 1958 | "dev": true, 1959 | "requires": { 1960 | "chalk": "^4.1.0", 1961 | "is-unicode-supported": "^0.1.0" 1962 | } 1963 | }, 1964 | "log-update": { 1965 | "version": "4.0.0", 1966 | "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", 1967 | "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", 1968 | "dev": true, 1969 | "requires": { 1970 | "ansi-escapes": "^4.3.0", 1971 | "cli-cursor": "^3.1.0", 1972 | "slice-ansi": "^4.0.0", 1973 | "wrap-ansi": "^6.2.0" 1974 | }, 1975 | "dependencies": { 1976 | "ansi-styles": { 1977 | "version": "4.3.0", 1978 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1979 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1980 | "dev": true, 1981 | "requires": { 1982 | "color-convert": "^2.0.1" 1983 | } 1984 | }, 1985 | "color-convert": { 1986 | "version": "2.0.1", 1987 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1988 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1989 | "dev": true, 1990 | "requires": { 1991 | "color-name": "~1.1.4" 1992 | } 1993 | }, 1994 | "color-name": { 1995 | "version": "1.1.4", 1996 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1997 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1998 | "dev": true 1999 | }, 2000 | "wrap-ansi": { 2001 | "version": "6.2.0", 2002 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", 2003 | "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", 2004 | "dev": true, 2005 | "requires": { 2006 | "ansi-styles": "^4.0.0", 2007 | "string-width": "^4.1.0", 2008 | "strip-ansi": "^6.0.0" 2009 | } 2010 | } 2011 | } 2012 | }, 2013 | "loose-envify": { 2014 | "version": "1.4.0", 2015 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 2016 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 2017 | "dev": true, 2018 | "requires": { 2019 | "js-tokens": "^3.0.0 || ^4.0.0" 2020 | } 2021 | }, 2022 | "lru-cache": { 2023 | "version": "6.0.0", 2024 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 2025 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 2026 | "dev": true, 2027 | "requires": { 2028 | "yallist": "^4.0.0" 2029 | } 2030 | }, 2031 | "merge-stream": { 2032 | "version": "2.0.0", 2033 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 2034 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 2035 | "dev": true 2036 | }, 2037 | "micromatch": { 2038 | "version": "4.0.4", 2039 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", 2040 | "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", 2041 | "dev": true, 2042 | "requires": { 2043 | "braces": "^3.0.1", 2044 | "picomatch": "^2.2.3" 2045 | } 2046 | }, 2047 | "mimic-fn": { 2048 | "version": "2.1.0", 2049 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 2050 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 2051 | "dev": true 2052 | }, 2053 | "minimatch": { 2054 | "version": "3.0.4", 2055 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 2056 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 2057 | "requires": { 2058 | "brace-expansion": "^1.1.7" 2059 | } 2060 | }, 2061 | "minimist": { 2062 | "version": "1.2.5", 2063 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 2064 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 2065 | }, 2066 | "mocha": { 2067 | "version": "9.0.3", 2068 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.0.3.tgz", 2069 | "integrity": "sha512-hnYFrSefHxYS2XFGtN01x8un0EwNu2bzKvhpRFhgoybIvMaOkkL60IVPmkb5h6XDmUl4IMSB+rT5cIO4/4bJgg==", 2070 | "dev": true, 2071 | "requires": { 2072 | "@ungap/promise-all-settled": "1.1.2", 2073 | "ansi-colors": "4.1.1", 2074 | "browser-stdout": "1.3.1", 2075 | "chokidar": "3.5.2", 2076 | "debug": "4.3.1", 2077 | "diff": "5.0.0", 2078 | "escape-string-regexp": "4.0.0", 2079 | "find-up": "5.0.0", 2080 | "glob": "7.1.7", 2081 | "growl": "1.10.5", 2082 | "he": "1.2.0", 2083 | "js-yaml": "4.1.0", 2084 | "log-symbols": "4.1.0", 2085 | "minimatch": "3.0.4", 2086 | "ms": "2.1.3", 2087 | "nanoid": "3.1.23", 2088 | "serialize-javascript": "6.0.0", 2089 | "strip-json-comments": "3.1.1", 2090 | "supports-color": "8.1.1", 2091 | "which": "2.0.2", 2092 | "wide-align": "1.1.3", 2093 | "workerpool": "6.1.5", 2094 | "yargs": "16.2.0", 2095 | "yargs-parser": "20.2.4", 2096 | "yargs-unparser": "2.0.0" 2097 | }, 2098 | "dependencies": { 2099 | "argparse": { 2100 | "version": "2.0.1", 2101 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 2102 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 2103 | "dev": true 2104 | }, 2105 | "debug": { 2106 | "version": "4.3.1", 2107 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 2108 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 2109 | "dev": true, 2110 | "requires": { 2111 | "ms": "2.1.2" 2112 | }, 2113 | "dependencies": { 2114 | "ms": { 2115 | "version": "2.1.2", 2116 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2117 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 2118 | "dev": true 2119 | } 2120 | } 2121 | }, 2122 | "has-flag": { 2123 | "version": "4.0.0", 2124 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 2125 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 2126 | "dev": true 2127 | }, 2128 | "js-yaml": { 2129 | "version": "4.1.0", 2130 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 2131 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 2132 | "dev": true, 2133 | "requires": { 2134 | "argparse": "^2.0.1" 2135 | } 2136 | }, 2137 | "ms": { 2138 | "version": "2.1.3", 2139 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2140 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2141 | "dev": true 2142 | }, 2143 | "supports-color": { 2144 | "version": "8.1.1", 2145 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 2146 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 2147 | "dev": true, 2148 | "requires": { 2149 | "has-flag": "^4.0.0" 2150 | } 2151 | } 2152 | } 2153 | }, 2154 | "mqtt": { 2155 | "version": "4.2.8", 2156 | "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.2.8.tgz", 2157 | "integrity": "sha512-DJYjlXODVXtSDecN8jnNzi6ItX3+ufGsEs9OB3YV24HtkRrh7kpx8L5M1LuyF0KzaiGtWr2PzDcMGAY60KGOSA==", 2158 | "requires": { 2159 | "commist": "^1.0.0", 2160 | "concat-stream": "^2.0.0", 2161 | "debug": "^4.1.1", 2162 | "duplexify": "^4.1.1", 2163 | "help-me": "^3.0.0", 2164 | "inherits": "^2.0.3", 2165 | "minimist": "^1.2.5", 2166 | "mqtt-packet": "^6.8.0", 2167 | "pump": "^3.0.0", 2168 | "readable-stream": "^3.6.0", 2169 | "reinterval": "^1.1.0", 2170 | "split2": "^3.1.0", 2171 | "ws": "^7.5.0", 2172 | "xtend": "^4.0.2" 2173 | }, 2174 | "dependencies": { 2175 | "debug": { 2176 | "version": "4.3.2", 2177 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 2178 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 2179 | "requires": { 2180 | "ms": "2.1.2" 2181 | } 2182 | } 2183 | } 2184 | }, 2185 | "mqtt-packet": { 2186 | "version": "6.10.0", 2187 | "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.10.0.tgz", 2188 | "integrity": "sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==", 2189 | "requires": { 2190 | "bl": "^4.0.2", 2191 | "debug": "^4.1.1", 2192 | "process-nextick-args": "^2.0.1" 2193 | }, 2194 | "dependencies": { 2195 | "debug": { 2196 | "version": "4.3.2", 2197 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 2198 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 2199 | "requires": { 2200 | "ms": "2.1.2" 2201 | } 2202 | } 2203 | } 2204 | }, 2205 | "ms": { 2206 | "version": "2.1.2", 2207 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2208 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 2209 | }, 2210 | "nanoid": { 2211 | "version": "3.1.23", 2212 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", 2213 | "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", 2214 | "dev": true 2215 | }, 2216 | "natural-compare": { 2217 | "version": "1.4.0", 2218 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 2219 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 2220 | "dev": true 2221 | }, 2222 | "normalize-package-data": { 2223 | "version": "2.5.0", 2224 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 2225 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 2226 | "dev": true, 2227 | "requires": { 2228 | "hosted-git-info": "^2.1.4", 2229 | "resolve": "^1.10.0", 2230 | "semver": "2 || 3 || 4 || 5", 2231 | "validate-npm-package-license": "^3.0.1" 2232 | }, 2233 | "dependencies": { 2234 | "semver": { 2235 | "version": "5.7.1", 2236 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 2237 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 2238 | "dev": true 2239 | } 2240 | } 2241 | }, 2242 | "normalize-path": { 2243 | "version": "3.0.0", 2244 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2245 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2246 | "dev": true 2247 | }, 2248 | "npm-run-path": { 2249 | "version": "4.0.1", 2250 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", 2251 | "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", 2252 | "dev": true, 2253 | "requires": { 2254 | "path-key": "^3.0.0" 2255 | } 2256 | }, 2257 | "object-assign": { 2258 | "version": "4.1.1", 2259 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2260 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 2261 | "dev": true 2262 | }, 2263 | "object-inspect": { 2264 | "version": "1.11.0", 2265 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", 2266 | "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", 2267 | "dev": true 2268 | }, 2269 | "object-keys": { 2270 | "version": "1.1.1", 2271 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 2272 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 2273 | "dev": true 2274 | }, 2275 | "object.assign": { 2276 | "version": "4.1.2", 2277 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", 2278 | "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", 2279 | "dev": true, 2280 | "requires": { 2281 | "call-bind": "^1.0.0", 2282 | "define-properties": "^1.1.3", 2283 | "has-symbols": "^1.0.1", 2284 | "object-keys": "^1.1.1" 2285 | } 2286 | }, 2287 | "object.entries": { 2288 | "version": "1.1.4", 2289 | "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz", 2290 | "integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==", 2291 | "dev": true, 2292 | "requires": { 2293 | "call-bind": "^1.0.2", 2294 | "define-properties": "^1.1.3", 2295 | "es-abstract": "^1.18.2" 2296 | } 2297 | }, 2298 | "object.fromentries": { 2299 | "version": "2.0.4", 2300 | "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", 2301 | "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", 2302 | "dev": true, 2303 | "requires": { 2304 | "call-bind": "^1.0.2", 2305 | "define-properties": "^1.1.3", 2306 | "es-abstract": "^1.18.0-next.2", 2307 | "has": "^1.0.3" 2308 | } 2309 | }, 2310 | "object.values": { 2311 | "version": "1.1.4", 2312 | "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", 2313 | "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", 2314 | "dev": true, 2315 | "requires": { 2316 | "call-bind": "^1.0.2", 2317 | "define-properties": "^1.1.3", 2318 | "es-abstract": "^1.18.2" 2319 | } 2320 | }, 2321 | "once": { 2322 | "version": "1.4.0", 2323 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2324 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2325 | "requires": { 2326 | "wrappy": "1" 2327 | } 2328 | }, 2329 | "onetime": { 2330 | "version": "5.1.2", 2331 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 2332 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 2333 | "dev": true, 2334 | "requires": { 2335 | "mimic-fn": "^2.1.0" 2336 | } 2337 | }, 2338 | "optionator": { 2339 | "version": "0.9.1", 2340 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 2341 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 2342 | "dev": true, 2343 | "requires": { 2344 | "deep-is": "^0.1.3", 2345 | "fast-levenshtein": "^2.0.6", 2346 | "levn": "^0.4.1", 2347 | "prelude-ls": "^1.2.1", 2348 | "type-check": "^0.4.0", 2349 | "word-wrap": "^1.2.3" 2350 | } 2351 | }, 2352 | "p-limit": { 2353 | "version": "3.1.0", 2354 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 2355 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 2356 | "dev": true, 2357 | "requires": { 2358 | "yocto-queue": "^0.1.0" 2359 | } 2360 | }, 2361 | "p-locate": { 2362 | "version": "5.0.0", 2363 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 2364 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 2365 | "dev": true, 2366 | "requires": { 2367 | "p-limit": "^3.0.2" 2368 | } 2369 | }, 2370 | "p-map": { 2371 | "version": "4.0.0", 2372 | "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", 2373 | "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", 2374 | "dev": true, 2375 | "requires": { 2376 | "aggregate-error": "^3.0.0" 2377 | } 2378 | }, 2379 | "p-try": { 2380 | "version": "1.0.0", 2381 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 2382 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", 2383 | "dev": true 2384 | }, 2385 | "parent-module": { 2386 | "version": "1.0.1", 2387 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 2388 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 2389 | "dev": true, 2390 | "requires": { 2391 | "callsites": "^3.0.0" 2392 | } 2393 | }, 2394 | "parse-json": { 2395 | "version": "4.0.0", 2396 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", 2397 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", 2398 | "dev": true, 2399 | "requires": { 2400 | "error-ex": "^1.3.1", 2401 | "json-parse-better-errors": "^1.0.1" 2402 | } 2403 | }, 2404 | "path-exists": { 2405 | "version": "4.0.0", 2406 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2407 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2408 | "dev": true 2409 | }, 2410 | "path-is-absolute": { 2411 | "version": "1.0.1", 2412 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2413 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 2414 | }, 2415 | "path-key": { 2416 | "version": "3.1.1", 2417 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2418 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2419 | "dev": true 2420 | }, 2421 | "path-parse": { 2422 | "version": "1.0.7", 2423 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2424 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 2425 | "dev": true 2426 | }, 2427 | "path-type": { 2428 | "version": "3.0.0", 2429 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", 2430 | "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", 2431 | "dev": true, 2432 | "requires": { 2433 | "pify": "^3.0.0" 2434 | } 2435 | }, 2436 | "picomatch": { 2437 | "version": "2.3.0", 2438 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", 2439 | "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", 2440 | "dev": true 2441 | }, 2442 | "pify": { 2443 | "version": "3.0.0", 2444 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 2445 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 2446 | "dev": true 2447 | }, 2448 | "pkg-dir": { 2449 | "version": "2.0.0", 2450 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", 2451 | "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", 2452 | "dev": true, 2453 | "requires": { 2454 | "find-up": "^2.1.0" 2455 | }, 2456 | "dependencies": { 2457 | "find-up": { 2458 | "version": "2.1.0", 2459 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 2460 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 2461 | "dev": true, 2462 | "requires": { 2463 | "locate-path": "^2.0.0" 2464 | } 2465 | }, 2466 | "locate-path": { 2467 | "version": "2.0.0", 2468 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 2469 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 2470 | "dev": true, 2471 | "requires": { 2472 | "p-locate": "^2.0.0", 2473 | "path-exists": "^3.0.0" 2474 | } 2475 | }, 2476 | "p-limit": { 2477 | "version": "1.3.0", 2478 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", 2479 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", 2480 | "dev": true, 2481 | "requires": { 2482 | "p-try": "^1.0.0" 2483 | } 2484 | }, 2485 | "p-locate": { 2486 | "version": "2.0.0", 2487 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 2488 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 2489 | "dev": true, 2490 | "requires": { 2491 | "p-limit": "^1.1.0" 2492 | } 2493 | }, 2494 | "path-exists": { 2495 | "version": "3.0.0", 2496 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 2497 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 2498 | "dev": true 2499 | } 2500 | } 2501 | }, 2502 | "pkg-up": { 2503 | "version": "2.0.0", 2504 | "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", 2505 | "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", 2506 | "dev": true, 2507 | "requires": { 2508 | "find-up": "^2.1.0" 2509 | }, 2510 | "dependencies": { 2511 | "find-up": { 2512 | "version": "2.1.0", 2513 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 2514 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 2515 | "dev": true, 2516 | "requires": { 2517 | "locate-path": "^2.0.0" 2518 | } 2519 | }, 2520 | "locate-path": { 2521 | "version": "2.0.0", 2522 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 2523 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 2524 | "dev": true, 2525 | "requires": { 2526 | "p-locate": "^2.0.0", 2527 | "path-exists": "^3.0.0" 2528 | } 2529 | }, 2530 | "p-limit": { 2531 | "version": "1.3.0", 2532 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", 2533 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", 2534 | "dev": true, 2535 | "requires": { 2536 | "p-try": "^1.0.0" 2537 | } 2538 | }, 2539 | "p-locate": { 2540 | "version": "2.0.0", 2541 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 2542 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 2543 | "dev": true, 2544 | "requires": { 2545 | "p-limit": "^1.1.0" 2546 | } 2547 | }, 2548 | "path-exists": { 2549 | "version": "3.0.0", 2550 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 2551 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 2552 | "dev": true 2553 | } 2554 | } 2555 | }, 2556 | "please-upgrade-node": { 2557 | "version": "3.2.0", 2558 | "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", 2559 | "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", 2560 | "dev": true, 2561 | "requires": { 2562 | "semver-compare": "^1.0.0" 2563 | } 2564 | }, 2565 | "prelude-ls": { 2566 | "version": "1.2.1", 2567 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 2568 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 2569 | "dev": true 2570 | }, 2571 | "process-nextick-args": { 2572 | "version": "2.0.1", 2573 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 2574 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 2575 | }, 2576 | "progress": { 2577 | "version": "2.0.3", 2578 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 2579 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 2580 | "dev": true 2581 | }, 2582 | "prop-types": { 2583 | "version": "15.7.2", 2584 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", 2585 | "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", 2586 | "dev": true, 2587 | "requires": { 2588 | "loose-envify": "^1.4.0", 2589 | "object-assign": "^4.1.1", 2590 | "react-is": "^16.8.1" 2591 | } 2592 | }, 2593 | "pump": { 2594 | "version": "3.0.0", 2595 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 2596 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 2597 | "requires": { 2598 | "end-of-stream": "^1.1.0", 2599 | "once": "^1.3.1" 2600 | } 2601 | }, 2602 | "punycode": { 2603 | "version": "2.1.1", 2604 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 2605 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 2606 | "dev": true 2607 | }, 2608 | "randombytes": { 2609 | "version": "2.1.0", 2610 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 2611 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 2612 | "dev": true, 2613 | "requires": { 2614 | "safe-buffer": "^5.1.0" 2615 | } 2616 | }, 2617 | "react-is": { 2618 | "version": "16.13.1", 2619 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 2620 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", 2621 | "dev": true 2622 | }, 2623 | "read-pkg": { 2624 | "version": "3.0.0", 2625 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", 2626 | "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", 2627 | "dev": true, 2628 | "requires": { 2629 | "load-json-file": "^4.0.0", 2630 | "normalize-package-data": "^2.3.2", 2631 | "path-type": "^3.0.0" 2632 | } 2633 | }, 2634 | "read-pkg-up": { 2635 | "version": "3.0.0", 2636 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", 2637 | "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", 2638 | "dev": true, 2639 | "requires": { 2640 | "find-up": "^2.0.0", 2641 | "read-pkg": "^3.0.0" 2642 | }, 2643 | "dependencies": { 2644 | "find-up": { 2645 | "version": "2.1.0", 2646 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 2647 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 2648 | "dev": true, 2649 | "requires": { 2650 | "locate-path": "^2.0.0" 2651 | } 2652 | }, 2653 | "locate-path": { 2654 | "version": "2.0.0", 2655 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 2656 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 2657 | "dev": true, 2658 | "requires": { 2659 | "p-locate": "^2.0.0", 2660 | "path-exists": "^3.0.0" 2661 | } 2662 | }, 2663 | "p-limit": { 2664 | "version": "1.3.0", 2665 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", 2666 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", 2667 | "dev": true, 2668 | "requires": { 2669 | "p-try": "^1.0.0" 2670 | } 2671 | }, 2672 | "p-locate": { 2673 | "version": "2.0.0", 2674 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 2675 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 2676 | "dev": true, 2677 | "requires": { 2678 | "p-limit": "^1.1.0" 2679 | } 2680 | }, 2681 | "path-exists": { 2682 | "version": "3.0.0", 2683 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 2684 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 2685 | "dev": true 2686 | } 2687 | } 2688 | }, 2689 | "readable-stream": { 2690 | "version": "3.6.0", 2691 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 2692 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 2693 | "requires": { 2694 | "inherits": "^2.0.3", 2695 | "string_decoder": "^1.1.1", 2696 | "util-deprecate": "^1.0.1" 2697 | } 2698 | }, 2699 | "readdirp": { 2700 | "version": "3.6.0", 2701 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2702 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2703 | "dev": true, 2704 | "requires": { 2705 | "picomatch": "^2.2.1" 2706 | } 2707 | }, 2708 | "regexp.prototype.flags": { 2709 | "version": "1.3.1", 2710 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", 2711 | "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", 2712 | "dev": true, 2713 | "requires": { 2714 | "call-bind": "^1.0.2", 2715 | "define-properties": "^1.1.3" 2716 | } 2717 | }, 2718 | "regexpp": { 2719 | "version": "3.2.0", 2720 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", 2721 | "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", 2722 | "dev": true 2723 | }, 2724 | "reinterval": { 2725 | "version": "1.1.0", 2726 | "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", 2727 | "integrity": "sha1-M2Hs+jymwYKDOA3Qu5VG85D17Oc=" 2728 | }, 2729 | "require-directory": { 2730 | "version": "2.1.1", 2731 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2732 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 2733 | "dev": true 2734 | }, 2735 | "require-from-string": { 2736 | "version": "2.0.2", 2737 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 2738 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", 2739 | "dev": true 2740 | }, 2741 | "resolve": { 2742 | "version": "1.20.0", 2743 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", 2744 | "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", 2745 | "dev": true, 2746 | "requires": { 2747 | "is-core-module": "^2.2.0", 2748 | "path-parse": "^1.0.6" 2749 | } 2750 | }, 2751 | "resolve-from": { 2752 | "version": "4.0.0", 2753 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2754 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2755 | "dev": true 2756 | }, 2757 | "restore-cursor": { 2758 | "version": "3.1.0", 2759 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 2760 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 2761 | "dev": true, 2762 | "requires": { 2763 | "onetime": "^5.1.0", 2764 | "signal-exit": "^3.0.2" 2765 | } 2766 | }, 2767 | "rimraf": { 2768 | "version": "3.0.2", 2769 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 2770 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 2771 | "dev": true, 2772 | "requires": { 2773 | "glob": "^7.1.3" 2774 | } 2775 | }, 2776 | "rxjs": { 2777 | "version": "6.6.7", 2778 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", 2779 | "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", 2780 | "dev": true, 2781 | "requires": { 2782 | "tslib": "^1.9.0" 2783 | } 2784 | }, 2785 | "safe-buffer": { 2786 | "version": "5.2.1", 2787 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2788 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 2789 | }, 2790 | "semver": { 2791 | "version": "7.3.5", 2792 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", 2793 | "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", 2794 | "dev": true, 2795 | "requires": { 2796 | "lru-cache": "^6.0.0" 2797 | } 2798 | }, 2799 | "semver-compare": { 2800 | "version": "1.0.0", 2801 | "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", 2802 | "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", 2803 | "dev": true 2804 | }, 2805 | "serialize-javascript": { 2806 | "version": "6.0.0", 2807 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", 2808 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", 2809 | "dev": true, 2810 | "requires": { 2811 | "randombytes": "^2.1.0" 2812 | } 2813 | }, 2814 | "shebang-command": { 2815 | "version": "2.0.0", 2816 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2817 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2818 | "dev": true, 2819 | "requires": { 2820 | "shebang-regex": "^3.0.0" 2821 | } 2822 | }, 2823 | "shebang-regex": { 2824 | "version": "3.0.0", 2825 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2826 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2827 | "dev": true 2828 | }, 2829 | "should": { 2830 | "version": "13.2.3", 2831 | "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", 2832 | "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", 2833 | "dev": true, 2834 | "requires": { 2835 | "should-equal": "^2.0.0", 2836 | "should-format": "^3.0.3", 2837 | "should-type": "^1.4.0", 2838 | "should-type-adaptors": "^1.0.1", 2839 | "should-util": "^1.0.0" 2840 | } 2841 | }, 2842 | "should-equal": { 2843 | "version": "2.0.0", 2844 | "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", 2845 | "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", 2846 | "dev": true, 2847 | "requires": { 2848 | "should-type": "^1.4.0" 2849 | } 2850 | }, 2851 | "should-format": { 2852 | "version": "3.0.3", 2853 | "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", 2854 | "integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=", 2855 | "dev": true, 2856 | "requires": { 2857 | "should-type": "^1.3.0", 2858 | "should-type-adaptors": "^1.0.1" 2859 | } 2860 | }, 2861 | "should-type": { 2862 | "version": "1.4.0", 2863 | "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", 2864 | "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=", 2865 | "dev": true 2866 | }, 2867 | "should-type-adaptors": { 2868 | "version": "1.1.0", 2869 | "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", 2870 | "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", 2871 | "dev": true, 2872 | "requires": { 2873 | "should-type": "^1.3.0", 2874 | "should-util": "^1.0.0" 2875 | } 2876 | }, 2877 | "should-util": { 2878 | "version": "1.0.1", 2879 | "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", 2880 | "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", 2881 | "dev": true 2882 | }, 2883 | "side-channel": { 2884 | "version": "1.0.4", 2885 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 2886 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 2887 | "dev": true, 2888 | "requires": { 2889 | "call-bind": "^1.0.0", 2890 | "get-intrinsic": "^1.0.2", 2891 | "object-inspect": "^1.9.0" 2892 | } 2893 | }, 2894 | "signal-exit": { 2895 | "version": "3.0.3", 2896 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 2897 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", 2898 | "dev": true 2899 | }, 2900 | "slice-ansi": { 2901 | "version": "4.0.0", 2902 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", 2903 | "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", 2904 | "dev": true, 2905 | "requires": { 2906 | "ansi-styles": "^4.0.0", 2907 | "astral-regex": "^2.0.0", 2908 | "is-fullwidth-code-point": "^3.0.0" 2909 | }, 2910 | "dependencies": { 2911 | "ansi-styles": { 2912 | "version": "4.3.0", 2913 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 2914 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 2915 | "dev": true, 2916 | "requires": { 2917 | "color-convert": "^2.0.1" 2918 | } 2919 | }, 2920 | "color-convert": { 2921 | "version": "2.0.1", 2922 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 2923 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 2924 | "dev": true, 2925 | "requires": { 2926 | "color-name": "~1.1.4" 2927 | } 2928 | }, 2929 | "color-name": { 2930 | "version": "1.1.4", 2931 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 2932 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 2933 | "dev": true 2934 | } 2935 | } 2936 | }, 2937 | "source-map": { 2938 | "version": "0.5.7", 2939 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 2940 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 2941 | "dev": true 2942 | }, 2943 | "source-map-support": { 2944 | "version": "0.5.19", 2945 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", 2946 | "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", 2947 | "dev": true, 2948 | "requires": { 2949 | "buffer-from": "^1.0.0", 2950 | "source-map": "^0.6.0" 2951 | }, 2952 | "dependencies": { 2953 | "source-map": { 2954 | "version": "0.6.1", 2955 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2956 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2957 | "dev": true 2958 | } 2959 | } 2960 | }, 2961 | "spdx-correct": { 2962 | "version": "3.1.1", 2963 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", 2964 | "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", 2965 | "dev": true, 2966 | "requires": { 2967 | "spdx-expression-parse": "^3.0.0", 2968 | "spdx-license-ids": "^3.0.0" 2969 | } 2970 | }, 2971 | "spdx-exceptions": { 2972 | "version": "2.3.0", 2973 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", 2974 | "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", 2975 | "dev": true 2976 | }, 2977 | "spdx-expression-parse": { 2978 | "version": "3.0.1", 2979 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", 2980 | "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", 2981 | "dev": true, 2982 | "requires": { 2983 | "spdx-exceptions": "^2.1.0", 2984 | "spdx-license-ids": "^3.0.0" 2985 | } 2986 | }, 2987 | "spdx-license-ids": { 2988 | "version": "3.0.9", 2989 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", 2990 | "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", 2991 | "dev": true 2992 | }, 2993 | "split2": { 2994 | "version": "3.2.2", 2995 | "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", 2996 | "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", 2997 | "requires": { 2998 | "readable-stream": "^3.0.0" 2999 | } 3000 | }, 3001 | "sprintf-js": { 3002 | "version": "1.0.3", 3003 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 3004 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 3005 | "dev": true 3006 | }, 3007 | "stream-shift": { 3008 | "version": "1.0.1", 3009 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", 3010 | "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" 3011 | }, 3012 | "string-argv": { 3013 | "version": "0.3.1", 3014 | "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", 3015 | "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", 3016 | "dev": true 3017 | }, 3018 | "string-width": { 3019 | "version": "4.2.2", 3020 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 3021 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 3022 | "dev": true, 3023 | "requires": { 3024 | "emoji-regex": "^8.0.0", 3025 | "is-fullwidth-code-point": "^3.0.0", 3026 | "strip-ansi": "^6.0.0" 3027 | } 3028 | }, 3029 | "string.prototype.matchall": { 3030 | "version": "4.0.5", 3031 | "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz", 3032 | "integrity": "sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==", 3033 | "dev": true, 3034 | "requires": { 3035 | "call-bind": "^1.0.2", 3036 | "define-properties": "^1.1.3", 3037 | "es-abstract": "^1.18.2", 3038 | "get-intrinsic": "^1.1.1", 3039 | "has-symbols": "^1.0.2", 3040 | "internal-slot": "^1.0.3", 3041 | "regexp.prototype.flags": "^1.3.1", 3042 | "side-channel": "^1.0.4" 3043 | } 3044 | }, 3045 | "string.prototype.trimend": { 3046 | "version": "1.0.4", 3047 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", 3048 | "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", 3049 | "dev": true, 3050 | "requires": { 3051 | "call-bind": "^1.0.2", 3052 | "define-properties": "^1.1.3" 3053 | } 3054 | }, 3055 | "string.prototype.trimstart": { 3056 | "version": "1.0.4", 3057 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", 3058 | "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", 3059 | "dev": true, 3060 | "requires": { 3061 | "call-bind": "^1.0.2", 3062 | "define-properties": "^1.1.3" 3063 | } 3064 | }, 3065 | "string_decoder": { 3066 | "version": "1.3.0", 3067 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 3068 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 3069 | "requires": { 3070 | "safe-buffer": "~5.2.0" 3071 | } 3072 | }, 3073 | "stringify-object": { 3074 | "version": "3.3.0", 3075 | "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", 3076 | "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", 3077 | "dev": true, 3078 | "requires": { 3079 | "get-own-enumerable-property-symbols": "^3.0.0", 3080 | "is-obj": "^1.0.1", 3081 | "is-regexp": "^1.0.0" 3082 | } 3083 | }, 3084 | "strip-ansi": { 3085 | "version": "6.0.0", 3086 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 3087 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 3088 | "dev": true, 3089 | "requires": { 3090 | "ansi-regex": "^5.0.0" 3091 | } 3092 | }, 3093 | "strip-bom": { 3094 | "version": "3.0.0", 3095 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 3096 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 3097 | "dev": true 3098 | }, 3099 | "strip-final-newline": { 3100 | "version": "2.0.0", 3101 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", 3102 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", 3103 | "dev": true 3104 | }, 3105 | "strip-json-comments": { 3106 | "version": "3.1.1", 3107 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 3108 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 3109 | "dev": true 3110 | }, 3111 | "supports-color": { 3112 | "version": "5.5.0", 3113 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 3114 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 3115 | "dev": true, 3116 | "requires": { 3117 | "has-flag": "^3.0.0" 3118 | } 3119 | }, 3120 | "table": { 3121 | "version": "6.7.1", 3122 | "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", 3123 | "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", 3124 | "dev": true, 3125 | "requires": { 3126 | "ajv": "^8.0.1", 3127 | "lodash.clonedeep": "^4.5.0", 3128 | "lodash.truncate": "^4.4.2", 3129 | "slice-ansi": "^4.0.0", 3130 | "string-width": "^4.2.0", 3131 | "strip-ansi": "^6.0.0" 3132 | }, 3133 | "dependencies": { 3134 | "ajv": { 3135 | "version": "8.6.2", 3136 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", 3137 | "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", 3138 | "dev": true, 3139 | "requires": { 3140 | "fast-deep-equal": "^3.1.1", 3141 | "json-schema-traverse": "^1.0.0", 3142 | "require-from-string": "^2.0.2", 3143 | "uri-js": "^4.2.2" 3144 | } 3145 | }, 3146 | "json-schema-traverse": { 3147 | "version": "1.0.0", 3148 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 3149 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", 3150 | "dev": true 3151 | } 3152 | } 3153 | }, 3154 | "text-table": { 3155 | "version": "0.2.0", 3156 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 3157 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 3158 | "dev": true 3159 | }, 3160 | "through": { 3161 | "version": "2.3.8", 3162 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 3163 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 3164 | "dev": true 3165 | }, 3166 | "to-fast-properties": { 3167 | "version": "2.0.0", 3168 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 3169 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", 3170 | "dev": true 3171 | }, 3172 | "to-regex-range": { 3173 | "version": "5.0.1", 3174 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 3175 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3176 | "dev": true, 3177 | "requires": { 3178 | "is-number": "^7.0.0" 3179 | } 3180 | }, 3181 | "tsconfig-paths": { 3182 | "version": "3.10.1", 3183 | "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz", 3184 | "integrity": "sha512-rETidPDgCpltxF7MjBZlAFPUHv5aHH2MymyPvh+vEyWAED4Eb/WeMbsnD/JDr4OKPOA1TssDHgIcpTN5Kh0p6Q==", 3185 | "dev": true, 3186 | "requires": { 3187 | "json5": "^2.2.0", 3188 | "minimist": "^1.2.0", 3189 | "strip-bom": "^3.0.0" 3190 | } 3191 | }, 3192 | "tslib": { 3193 | "version": "1.14.1", 3194 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 3195 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 3196 | "dev": true 3197 | }, 3198 | "type-check": { 3199 | "version": "0.4.0", 3200 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 3201 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 3202 | "dev": true, 3203 | "requires": { 3204 | "prelude-ls": "^1.2.1" 3205 | } 3206 | }, 3207 | "type-fest": { 3208 | "version": "0.20.2", 3209 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 3210 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 3211 | "dev": true 3212 | }, 3213 | "typedarray": { 3214 | "version": "0.0.6", 3215 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 3216 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 3217 | }, 3218 | "unbox-primitive": { 3219 | "version": "1.0.1", 3220 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", 3221 | "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", 3222 | "dev": true, 3223 | "requires": { 3224 | "function-bind": "^1.1.1", 3225 | "has-bigints": "^1.0.1", 3226 | "has-symbols": "^1.0.2", 3227 | "which-boxed-primitive": "^1.0.2" 3228 | } 3229 | }, 3230 | "uri-js": { 3231 | "version": "4.4.1", 3232 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 3233 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 3234 | "dev": true, 3235 | "requires": { 3236 | "punycode": "^2.1.0" 3237 | } 3238 | }, 3239 | "util-deprecate": { 3240 | "version": "1.0.2", 3241 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3242 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 3243 | }, 3244 | "v8-compile-cache": { 3245 | "version": "2.3.0", 3246 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", 3247 | "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", 3248 | "dev": true 3249 | }, 3250 | "validate-npm-package-license": { 3251 | "version": "3.0.4", 3252 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 3253 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 3254 | "dev": true, 3255 | "requires": { 3256 | "spdx-correct": "^3.0.0", 3257 | "spdx-expression-parse": "^3.0.0" 3258 | } 3259 | }, 3260 | "which": { 3261 | "version": "2.0.2", 3262 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3263 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3264 | "dev": true, 3265 | "requires": { 3266 | "isexe": "^2.0.0" 3267 | } 3268 | }, 3269 | "which-boxed-primitive": { 3270 | "version": "1.0.2", 3271 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", 3272 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", 3273 | "dev": true, 3274 | "requires": { 3275 | "is-bigint": "^1.0.1", 3276 | "is-boolean-object": "^1.1.0", 3277 | "is-number-object": "^1.0.4", 3278 | "is-string": "^1.0.5", 3279 | "is-symbol": "^1.0.3" 3280 | } 3281 | }, 3282 | "wide-align": { 3283 | "version": "1.1.3", 3284 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 3285 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 3286 | "dev": true, 3287 | "requires": { 3288 | "string-width": "^1.0.2 || 2" 3289 | }, 3290 | "dependencies": { 3291 | "ansi-regex": { 3292 | "version": "3.0.0", 3293 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 3294 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 3295 | "dev": true 3296 | }, 3297 | "is-fullwidth-code-point": { 3298 | "version": "2.0.0", 3299 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 3300 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 3301 | "dev": true 3302 | }, 3303 | "string-width": { 3304 | "version": "2.1.1", 3305 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 3306 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 3307 | "dev": true, 3308 | "requires": { 3309 | "is-fullwidth-code-point": "^2.0.0", 3310 | "strip-ansi": "^4.0.0" 3311 | } 3312 | }, 3313 | "strip-ansi": { 3314 | "version": "4.0.0", 3315 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 3316 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 3317 | "dev": true, 3318 | "requires": { 3319 | "ansi-regex": "^3.0.0" 3320 | } 3321 | } 3322 | } 3323 | }, 3324 | "word-wrap": { 3325 | "version": "1.2.3", 3326 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 3327 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 3328 | "dev": true 3329 | }, 3330 | "workerpool": { 3331 | "version": "6.1.5", 3332 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", 3333 | "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", 3334 | "dev": true 3335 | }, 3336 | "wrap-ansi": { 3337 | "version": "7.0.0", 3338 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 3339 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 3340 | "dev": true, 3341 | "requires": { 3342 | "ansi-styles": "^4.0.0", 3343 | "string-width": "^4.1.0", 3344 | "strip-ansi": "^6.0.0" 3345 | }, 3346 | "dependencies": { 3347 | "ansi-styles": { 3348 | "version": "4.3.0", 3349 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 3350 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 3351 | "dev": true, 3352 | "requires": { 3353 | "color-convert": "^2.0.1" 3354 | } 3355 | }, 3356 | "color-convert": { 3357 | "version": "2.0.1", 3358 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 3359 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 3360 | "dev": true, 3361 | "requires": { 3362 | "color-name": "~1.1.4" 3363 | } 3364 | }, 3365 | "color-name": { 3366 | "version": "1.1.4", 3367 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 3368 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 3369 | "dev": true 3370 | } 3371 | } 3372 | }, 3373 | "wrappy": { 3374 | "version": "1.0.2", 3375 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3376 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 3377 | }, 3378 | "ws": { 3379 | "version": "7.5.3", 3380 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", 3381 | "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==" 3382 | }, 3383 | "xtend": { 3384 | "version": "4.0.2", 3385 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 3386 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 3387 | }, 3388 | "y18n": { 3389 | "version": "5.0.8", 3390 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 3391 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 3392 | "dev": true 3393 | }, 3394 | "yallist": { 3395 | "version": "4.0.0", 3396 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 3397 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 3398 | "dev": true 3399 | }, 3400 | "yaml": { 3401 | "version": "1.10.2", 3402 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", 3403 | "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", 3404 | "dev": true 3405 | }, 3406 | "yargs": { 3407 | "version": "16.2.0", 3408 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 3409 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 3410 | "dev": true, 3411 | "requires": { 3412 | "cliui": "^7.0.2", 3413 | "escalade": "^3.1.1", 3414 | "get-caller-file": "^2.0.5", 3415 | "require-directory": "^2.1.1", 3416 | "string-width": "^4.2.0", 3417 | "y18n": "^5.0.5", 3418 | "yargs-parser": "^20.2.2" 3419 | } 3420 | }, 3421 | "yargs-parser": { 3422 | "version": "20.2.4", 3423 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 3424 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 3425 | "dev": true 3426 | }, 3427 | "yargs-unparser": { 3428 | "version": "2.0.0", 3429 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 3430 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 3431 | "dev": true, 3432 | "requires": { 3433 | "camelcase": "^6.0.0", 3434 | "decamelize": "^4.0.0", 3435 | "flat": "^5.0.2", 3436 | "is-plain-obj": "^2.1.0" 3437 | } 3438 | }, 3439 | "yocto-queue": { 3440 | "version": "0.1.0", 3441 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 3442 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 3443 | "dev": true 3444 | } 3445 | } 3446 | } 3447 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "losant-mqtt", 3 | "version": "5.0.0", 4 | "description": "An MQTT client for Losant", 5 | "repository": { 6 | "type": "git", 7 | "url": "https://github.com/Losant/losant-mqtt-js" 8 | }, 9 | "main": "index.js", 10 | "author": "Losant ", 11 | "license": "MIT", 12 | "scripts": { 13 | "lint": "esw . --ext .js", 14 | "lint:fix": "yarn lint --fix", 15 | "lint:watch": "yarn lint --watch", 16 | "lint:changed": "lint-staged", 17 | "test": "mocha test/unit 2>&1", 18 | "test:watch": "mocha --watch test/unit 2>&1", 19 | "reinstall": "rm -rf node_modules && npm install", 20 | "integration": "mocha test/integration 2>&1", 21 | "prepare": "husky install", 22 | "lint-staged": "lint-staged" 23 | }, 24 | "engines": { 25 | "node": ">= 12.0" 26 | }, 27 | "dependencies": { 28 | "debug": "^4.3.2", 29 | "mqtt": "^4.2.8" 30 | }, 31 | "devDependencies": { 32 | "@losant/eslint-config-losant": "^1.4.0", 33 | "husky": "^6.0.0", 34 | "lint-staged": "^10.4.2", 35 | "mocha": "^9.0.3", 36 | "should": "^13.2.3" 37 | }, 38 | "bugs": { 39 | "url": "https://github.com/Losant/losant-mqtt-js/issues" 40 | }, 41 | "homepage": "https://github.com/Losant/losant-mqtt-js#readme", 42 | "directories": { 43 | "example": "examples", 44 | "test": "test", 45 | "lib": "lib" 46 | }, 47 | "keywords": [ 48 | "IoT", 49 | "platform", 50 | "MQTT" 51 | ], 52 | "mocha": { 53 | "reporter": "spec", 54 | "recursive": true, 55 | "require": "should", 56 | "check-leaks": true 57 | }, 58 | "lint-staged": { 59 | "*.js": "esw" 60 | }, 61 | "eslintConfig": { 62 | "extends": "@losant/eslint-config-losant/env/node" 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /test/integration/device-spec.js: -------------------------------------------------------------------------------- 1 | /** 2 | * These tests perform operations against live Losant devices. In order for 3 | * these test to correctly run, the following must be setup: 4 | * Standalone device with { temperature : Number } attribute. 5 | * Workflow that triggers on standalone device and sends command back to device. 6 | * Gateway with { temperature : Number } attribute. 7 | * Peripheral with { temperature: Number } attribute. 8 | */ 9 | 10 | const standaloneDeviceId = process.env.STANDALONE_DEVICE_ID || '577bd42ecabe830100a24c10'; 11 | const accessKey = process.env.ACCESS_KEY || '59fcf8b7-0186-4385-9a74-c8292ed25470'; 12 | const accessSecret = process.env.ACCESS_SECRET; 13 | 14 | const should = require('should'); 15 | const Device = require('../../lib/device'); 16 | let device = null; 17 | 18 | describe('Device', function() { 19 | 20 | afterEach(function(done) { 21 | this.timeout(8000); 22 | if (device) { 23 | device.disconnect(done); 24 | device = null; 25 | } else { 26 | done(); 27 | } 28 | }); 29 | 30 | it('should connect with and without connect callback', function(done) { 31 | this.timeout(8000); 32 | 33 | device = new Device({ 34 | id: standaloneDeviceId, 35 | key: accessKey, 36 | secret: accessSecret 37 | }); 38 | 39 | device.connect(function(err) { 40 | setImmediate(function() { 41 | should.not.exist(err); 42 | device.disconnect(function() { 43 | setImmediate(function() { 44 | device.connect(function() { 45 | device.isConnected().should.equal(true); 46 | done(); 47 | }); 48 | }); 49 | }); 50 | }); 51 | }); 52 | }); 53 | 54 | it('should connect, send state, and receive a command', function(done) { 55 | this.timeout(8000); 56 | 57 | device = new Device({ 58 | id: standaloneDeviceId, 59 | key: accessKey, 60 | secret: accessSecret 61 | }); 62 | 63 | device.connect(function(err) { 64 | should.not.exist(err); 65 | setImmediate(function() { 66 | device.sendState({ temperature: 100 }); 67 | }); 68 | }); 69 | 70 | device.on('command', function(command) { 71 | command.payload.temperature.should.equal(100); 72 | done(); 73 | }); 74 | }); 75 | 76 | it('should reconnect, send state, and receive command', function(done) { 77 | this.timeout(8000); 78 | 79 | device = new Device({ 80 | id: standaloneDeviceId, 81 | key: accessKey, 82 | secret: accessSecret 83 | }); 84 | 85 | device.connect(function() { 86 | // Force-close the connection by 87 | // attempting to public to restricted topic. 88 | setImmediate(function() { 89 | device.mqtt.client.publish('/losant/not-this-device/state'); 90 | }); 91 | }); 92 | 93 | device.on('reconnected', function() { 94 | setImmediate(function() { 95 | device.sendState({ temperature: 50 }); 96 | }); 97 | }); 98 | 99 | device.on('command', function(command) { 100 | command.payload.temperature.should.equal(50); 101 | done(); 102 | }); 103 | }); 104 | 105 | it('should be able to connect after disconnecting', function(done) { 106 | this.timeout(8000); 107 | 108 | device = new Device({ 109 | id: standaloneDeviceId, 110 | key: accessKey, 111 | secret: accessSecret 112 | }); 113 | 114 | device.on('command', function(command) { 115 | command.payload.temperature.should.equal(100); 116 | done(); 117 | }); 118 | 119 | device.connect(function() { 120 | setImmediate(function() { 121 | device.disconnect(function() { 122 | setImmediate(function() { 123 | device.connect(function() { 124 | setImmediate(function() { 125 | device.sendState({ temperature: 100 }); 126 | }); 127 | }); 128 | }); 129 | }); 130 | }); 131 | }); 132 | }); 133 | 134 | it('should provide error in connect callback', function(done) { 135 | device = new Device({ 136 | id: standaloneDeviceId, 137 | key: accessKey, 138 | secret: 'invalid secret' 139 | }); 140 | 141 | device.on('error', function() { }); 142 | 143 | device.connect(function(err) { 144 | should.exist(err); 145 | done(); 146 | }); 147 | }); 148 | 149 | describe('isConnected', function() { 150 | it('should return correct result based on connection status', function(done) { 151 | this.timeout(8000); 152 | 153 | device = new Device({ 154 | id: standaloneDeviceId, 155 | key: accessKey, 156 | secret: accessSecret 157 | }); 158 | 159 | device.isConnected().should.equal(false); 160 | 161 | device.connect(function() { 162 | device.isConnected().should.equal(true); 163 | 164 | setImmediate(function() { 165 | device.disconnect(function() { 166 | device.isConnected().should.equal(false); 167 | device = null; 168 | done(); 169 | }); 170 | }); 171 | }); 172 | }); 173 | }); 174 | }); 175 | -------------------------------------------------------------------------------- /test/integration/gateway-spec.js: -------------------------------------------------------------------------------- 1 | /** 2 | * These tests perform operations against live Losant devices. In order for 3 | * these test to correctly run, the following must be setup: 4 | * Standalone device with { temperature : Number } attribute. 5 | * Workflow that triggers on standalone device and sends command back to device. 6 | * Gateway with { temperature : Number } attribute. 7 | * Peripheral with { temperature: Number } attribute. 8 | */ 9 | 10 | const gatewayDeviceId = process.env.GATEWAY_DEVICE_ID || '577bd4699623b80100e3b235'; 11 | const accessKey = process.env.ACCESS_KEY || '59fcf8b7-0186-4385-9a74-c8292ed25470'; 12 | const accessSecret = process.env.ACCESS_SECRET; 13 | 14 | const Gateway = require('../../lib/gateway'); 15 | let gateway = null; 16 | 17 | describe('Gateway', function() { 18 | 19 | afterEach(function(done) { 20 | this.timeout(8000); 21 | if (gateway) { 22 | gateway.disconnect(done); 23 | gateway = null; 24 | } else { 25 | done(); 26 | } 27 | }); 28 | 29 | it('should connect, send state, and receive a command', function(done) { 30 | this.timeout(8000); 31 | 32 | gateway = new Gateway({ 33 | id: gatewayDeviceId, 34 | key: accessKey, 35 | secret: accessSecret 36 | }); 37 | 38 | gateway.connect(function() { 39 | setImmediate(function() { 40 | gateway.sendState({ temperature: 100 }); 41 | }); 42 | }); 43 | 44 | gateway.on('command', function(command) { 45 | command.payload.temperature.should.equal(100); 46 | done(); 47 | }); 48 | }); 49 | 50 | it('should reconnect, send state, and receive command', function(done) { 51 | this.timeout(8000); 52 | 53 | gateway = new Gateway({ 54 | id: gatewayDeviceId, 55 | key: accessKey, 56 | secret: accessSecret 57 | }); 58 | 59 | gateway.connect(function() { 60 | // Force-close the connection by 61 | // attempting to public to restricted topic. 62 | setImmediate(function() { 63 | gateway.mqtt.client.publish('/losant/not-this-device/state'); 64 | }); 65 | }); 66 | 67 | gateway.on('reconnected', function() { 68 | setImmediate(function() { 69 | gateway.sendState({ temperature: 50 }); 70 | }); 71 | }); 72 | 73 | gateway.on('command', function(command) { 74 | command.payload.temperature.should.equal(50); 75 | done(); 76 | }); 77 | }); 78 | 79 | }); 80 | -------------------------------------------------------------------------------- /test/integration/peripheral-spec.js: -------------------------------------------------------------------------------- 1 | /** 2 | * These tests perform operations against live Losant devices. In order for 3 | * these test to correctly run, the following must be setup: 4 | * Standalone device with { temperature : Number } attribute. 5 | * Workflow that triggers on standalone device and sends command back to device. 6 | * Gateway with { temperature : Number } attribute. 7 | * Peripheral with { temperature: Number } attribute. 8 | */ 9 | 10 | const gatewayDeviceId = process.env.GATEWAY_DEVICE_ID || '577bd4699623b80100e3b235'; 11 | const peripheralDeviceId = process.env.PERIPHERAL_DEVICE_ID || '577bd49b7b3f830100d9379c'; 12 | const accessKey = process.env.ACCESS_KEY || '59fcf8b7-0186-4385-9a74-c8292ed25470'; 13 | const accessSecret = process.env.ACCESS_SECRET; 14 | 15 | const Gateway = require('../../lib/gateway'); 16 | let gateway = null; 17 | 18 | describe('Peripheral', function() { 19 | 20 | afterEach(function(done) { 21 | this.timeout(8000); 22 | if (gateway) { 23 | gateway.disconnect(done); 24 | gateway = null; 25 | } else { 26 | done(); 27 | } 28 | }); 29 | 30 | it('should connect, send state, and receive a command', function(done) { 31 | this.timeout(8000); 32 | 33 | gateway = new Gateway({ 34 | id: gatewayDeviceId, 35 | key: accessKey, 36 | secret: accessSecret 37 | }); 38 | 39 | const peripheral = gateway.addPeripheral(peripheralDeviceId); 40 | 41 | gateway.connect(function() { 42 | setImmediate(function() { 43 | peripheral.sendState({ temperature: 75 }); 44 | }); 45 | }); 46 | 47 | peripheral.on('command', function(command) { 48 | command.payload.temperature.should.equal(75); 49 | done(); 50 | }); 51 | }); 52 | 53 | it('should reconnect, send state, and receive command', function(done) { 54 | this.timeout(8000); 55 | 56 | gateway = new Gateway({ 57 | id: gatewayDeviceId, 58 | key: accessKey, 59 | secret: accessSecret 60 | }); 61 | 62 | const peripheral = gateway.addPeripheral(peripheralDeviceId); 63 | 64 | gateway.connect(function() { 65 | setImmediate(function() { 66 | gateway.mqtt.client.publish('/losant/not-this-device/state'); 67 | }); 68 | }); 69 | 70 | gateway.on('reconnected', function() { 71 | setImmediate(function() { 72 | peripheral.sendState({ temperature: 65 }); 73 | }); 74 | }); 75 | 76 | peripheral.on('command', function(command) { 77 | command.payload.temperature.should.equal(65); 78 | done(); 79 | }); 80 | }); 81 | 82 | }); 83 | -------------------------------------------------------------------------------- /test/unit/device-spec.js: -------------------------------------------------------------------------------- 1 | const should = require('should'); 2 | const Device = require('../../lib/device'); 3 | 4 | /* eslint no-new: "off", no-unused-expressions: "off"*/ 5 | 6 | describe('Device', function() { 7 | 8 | describe('constructor', function() { 9 | it('should return device object initialized correctly', function() { 10 | const device = new Device({ id: 'my-device-id' }); 11 | device.id.should.equal('my-device-id'); 12 | }); 13 | 14 | /* jshint ignore:start */ 15 | it('should throw if ID is not specified', function() { 16 | let exception = false; 17 | try { 18 | new Device(); 19 | } catch (e) { 20 | exception = true; 21 | } 22 | exception.should.be.equal(true); 23 | }); 24 | /* jshint ignore:end */ 25 | }); 26 | 27 | describe('isConnected', function() { 28 | it('should return false if never connected', function() { 29 | const device = new Device({ 30 | id: 'my-device-id', 31 | key: 'my-access-key', 32 | secret: 'my-access-secret' 33 | }); 34 | 35 | device.isConnected().should.equal(false); 36 | }); 37 | }); 38 | 39 | describe('sendState', function() { 40 | it('automatically applies time if not provided', function() { 41 | const device = new Device({ id: 'my-device-id' }); 42 | const sent = device.sendState({ test: 'value' }); 43 | sent.payload.time.should.be.ok; 44 | }); 45 | 46 | it('should use time if specified', function() { 47 | const device = new Device({ id: 'my-device-id' }); 48 | const date = new Date(2016, 1, 20); 49 | const sent = device.sendState({ test: 'value' }, date); 50 | 51 | sent.payload.time.getTime().should.equal(date.getTime()); 52 | }); 53 | 54 | it('should callback with error if not connected', function(done) { 55 | const device = new Device({ id: 'my-device-id' }); 56 | device.sendState({ test: 'value' }, function(err) { 57 | should.exist(err); 58 | done(); 59 | }); 60 | }); 61 | }); 62 | 63 | describe('handleMessage', function() { 64 | 65 | it('should return null if topic does not match device\'s command topic', function() { 66 | const device = new Device({ id: 'my-device-id' }); 67 | const result = device.handleMessage('losant/not-the-id/command', ''); 68 | should.not.exist(result); 69 | }); 70 | 71 | it('should return null if bad message', function() { 72 | const device = new Device({ id: 'my-device-id' }); 73 | const result = device.handleMessage('losant/my-device-id/command', 'not-valid-json {}'); 74 | should.not.exist(result); 75 | }); 76 | 77 | it('should return null if message is null', function() { 78 | const device = new Device({ id: 'my-device-id' }); 79 | const result = device.handleMessage('losant/my-device-id/command', 'null'); 80 | should.not.exist(result); 81 | }); 82 | 83 | it('should return message if valid', function() { 84 | const device = new Device({ id: 'my-device-id' }); 85 | const result = device.handleMessage('losant/my-device-id/command', '{ "foo" : "bar" }'); 86 | result.foo.should.equal('bar'); 87 | }); 88 | }); 89 | }); 90 | -------------------------------------------------------------------------------- /test/unit/gateway-spec.js: -------------------------------------------------------------------------------- 1 | require('should'); 2 | const Gateway = require('../../lib/gateway'); 3 | 4 | describe('Device', function() { 5 | 6 | describe('addPeripheral', function() { 7 | it('should return added peripheral', function() { 8 | const gateway = new Gateway({ id: 'my-device-id' }); 9 | const peripheral = gateway.addPeripheral('my-peripheral-id'); 10 | peripheral.id.should.equal('my-peripheral-id'); 11 | }); 12 | 13 | it('should add peripheral to collection', function() { 14 | const gateway = new Gateway({ id: 'my-device-id' }); 15 | const peripheral = gateway.addPeripheral('my-peripheral-id'); 16 | gateway.peripherals['my-peripheral-id'].should.equal(peripheral); 17 | }); 18 | 19 | it('should return same peripheral if added twice', function() { 20 | const gateway = new Gateway({ id: 'my-device-id' }); 21 | const peripheralA = gateway.addPeripheral('peripheralA'); 22 | const peripheralB = gateway.addPeripheral('peripheralA'); 23 | peripheralA.should.equal(peripheralB); 24 | }); 25 | }); 26 | }); 27 | --------------------------------------------------------------------------------