├── .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 | [](https://travis-ci.com/Losant/losant-mqtt-js) [](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 |
--------------------------------------------------------------------------------