├── .babelrc
├── .firebaserc
├── .gitignore
├── README.md
├── firebase.json
├── firestore.indexes.json
├── firestore.rules
├── firmware
├── fs
│ ├── index.html
│ └── init.js
├── mos.yml
└── src
│ └── main.c
├── functions
├── index.js
├── package-lock.json
├── package.json
└── yarn.lock
├── jsconfig.json
├── package.json
├── public
├── favicon.ico
├── index.html
└── manifest.json
├── schematic
├── AssetTracker.fzz
└── AssetTracker.png
├── src
├── App.js
├── DeviceSelectDialog.js
├── DevicesList.js
├── DevicesMap.js
├── components
│ ├── DateFilterForm.js
│ ├── DeviceCard.js
│ ├── FilterCard.js
│ ├── Header.js
│ ├── ResizeContainer.js
│ └── package.json
├── index.js
└── shared
│ ├── Colors.js
│ ├── package.json
│ └── registerServiceWorker.js
└── yarn.lock
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "plugins": [
3 | "transform-es3-property-literals",
4 | "transform-es3-property-literals"
5 | ],
6 | "presets": ["env", "react", "stage-0", "es2015"]
7 | }
8 |
--------------------------------------------------------------------------------
/.firebaserc:
--------------------------------------------------------------------------------
1 | {
2 | "projects": {
3 | "default": "asset-tracker-iot"
4 | }
5 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | bla
2 | build
3 | deps
4 | libs
5 | *.pem
6 |
7 | # dependencies
8 | node_modules
9 | functions/node_modules
10 |
11 | # testing
12 | /coverage
13 |
14 | # production
15 | /build
16 |
17 | # misc
18 | .DS_Store
19 | .env.local
20 | .env.development.local
21 | .env.test.local
22 | .env.production.local
23 |
24 | npm-debug.log*
25 | yarn-debug.log*
26 | yarn-error.log*
27 |
28 | .vscode
29 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Asset Tracker using MongooseOS and Google Cloud
2 |
3 | ## Overview
4 |
5 | IoT Project using MongooseOS with it's awesome GPRS with PPPoS. Data will be sent to Google Cloud to be analysed and visualized.
6 |
7 | WebApp: https://asset-tracker-iot.firebaseapp.com
8 |
9 | ### Upload firmware with Mongoose OS Tools
10 |
11 | To use it we need to download and install it from the official website. Follow the installation instructions on https://mongoose-os.com/docs/quickstart/setup.html.
12 |
13 | * `mos build --arch esp32`
14 | * `mos flash`
15 |
16 | ### Provision and config
17 |
18 | * `mos wifi your_ssid your_pass`
19 | * `mos gcp-iot-setup --gcp-project your_project --gcp-region us-central1 --gcp-registry your_registry`
20 |
21 | ### BOM
22 |
23 | * Any ESP32 Board (I used a Lolin32).
24 | * NEO 6M uBlox GPS module.
25 | * Sim800L GSM module.
26 | * 220 Ohm resistor for the LED.
27 | * Blue and Green LED for status of the device.
28 | * 1k Ohm resistor for the MOSFET trigger.
29 | * IRF540N MOSFET (don’t try to use a cheap MOSFET, like the TIP120, because it cannot handle the GSM Module current needs)
30 | * Jumpers
31 | * Perfboard for prototype (Optional)
32 |
33 | ### Schematic
34 |
35 | 
36 |
37 | ### Setup Firebase, deploy functions and webapp
38 |
39 | * Install firebase tools: `npm install -g firebase-tools` or `yarn global add firebase-tools`
40 | * Install webapp dependencies: `npm install` or `yarn install`
41 | * Build React Application: `yarn run build` or `yarn run build`
42 | * Install functions dependencies: `cd functions && npm install` or `cd functions && yarn install`
43 | * Associate project with Firebase: `firebase init`
44 | * Deploy all the things: `firebase deploy`
45 |
46 | ## References
47 |
48 | * https://github.com/mongoose-os-apps/example-rpc-c
49 | * https://github.com/mongoose-os-libs/pppos
50 | * GPS NMEA Tracker - https://github.com/kosma/minmea
51 |
--------------------------------------------------------------------------------
/firebase.json:
--------------------------------------------------------------------------------
1 | {
2 | "firestore": {
3 | "rules": "firestore.rules",
4 | "indexes": "firestore.indexes.json"
5 | },
6 | "hosting": {
7 | "public": "build",
8 | "ignore": ["firebase.json", "**/.*", "**/node_modules/**"],
9 | "rewrites": [
10 | { "source": "/updateDeviceConfig", "function": "updateDeviceConfig" },
11 | {
12 | "source": "**",
13 | "destination": "/index.html"
14 | }
15 | ]
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/firestore.indexes.json:
--------------------------------------------------------------------------------
1 | {
2 | // Example:
3 | //
4 | // "indexes": [
5 | // {
6 | // "collectionId": "widgets",
7 | // "fields": [
8 | // { "fieldPath": "foo", "mode": "ASCENDING" },
9 | // { "fieldPath": "bar", "mode": "DESCENDING" }
10 | // ]
11 | // }
12 | // ]
13 | "indexes": []
14 | }
--------------------------------------------------------------------------------
/firestore.rules:
--------------------------------------------------------------------------------
1 | service cloud.firestore {
2 | match /databases/{database}/documents {
3 | match /{document=**} {
4 | allow read, write;
5 | }
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/firmware/fs/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Welcome to the empty project
4 |
5 |
6 |
--------------------------------------------------------------------------------
/firmware/fs/init.js:
--------------------------------------------------------------------------------
1 | load('api_config.js');
2 | load('api_uart.js');
3 | load('api_gpio.js');
4 | load('api_net.js');
5 | load('api_mqtt.js');
6 | load('api_sys.js');
7 | load('api_timer.js');
8 | load('api_esp32.js');
9 | load('api_gps.js');
10 |
11 | let isConnected = false;
12 | let isGPSLocked = false;
13 | let telemetrySend = false;
14 | let deviceName = Cfg.get('device.id');
15 | let topic = '/devices/' + deviceName + '/events';
16 | //let stateTopic = '/devices/' + deviceName + '/state';
17 | let configTopic = '/devices/' + deviceName + '/config';
18 |
19 | let gpsStatusPin = 33;
20 | let gsmStatusPin = 32;
21 | let gsmSwitchPin = 14;
22 |
23 | GPIO.set_mode(gpsStatusPin, GPIO.MODE_OUTPUT);
24 | GPIO.set_mode(gsmStatusPin, GPIO.MODE_OUTPUT);
25 | GPIO.set_mode(gsmSwitchPin, GPIO.MODE_OUTPUT);
26 |
27 | GPIO.write(gpsStatusPin, 0); // Turn off gps led
28 | GPIO.write(gsmStatusPin, 0); // Turn off gsm led
29 | GPIO.write(gsmSwitchPin, 1); // Turn on gsm module
30 |
31 | function getTemp() {
32 | return (ESP32.temp() - 32) * 5 / 9;
33 | }
34 |
35 | function getParsedLatLon() {
36 | return GPS.getLocation();
37 | }
38 |
39 | let getInfo = function() {
40 | return JSON.stringify({
41 | total_ram: Sys.total_ram() / 1024,
42 | free_ram: Sys.free_ram() / 1024,
43 | temp: getTemp(),
44 | latlon: getParsedLatLon()
45 | });
46 | };
47 |
48 | function publishData() {
49 | let msg = getInfo();
50 | let ok = MQTT.pub(topic, msg);
51 | if (ok) {
52 | print('Published');
53 | } else {
54 | print('Error publishing');
55 | }
56 | return ok;
57 | }
58 |
59 | // Sleep function, turning off all LEDs and GSM modem.
60 | let updateTimerId = null;
61 | let gpsTimerId = null;
62 | function goToSleep() {
63 | print('Sleeping');
64 | Timer.del(gpsTimerId);
65 | Timer.del(updateTimerId);
66 | Timer.set(
67 | 8000,
68 | false,
69 | function() {
70 | GPIO.write(gpsStatusPin, 0); // Turn off gps led
71 | GPIO.write(gsmStatusPin, 0); // Turn off gsm led
72 | GPIO.write(gsmSwitchPin, 0); // Turn off gsm module
73 |
74 | let updateInterval = Cfg.get('app.update_interval');
75 |
76 | ESP32.deepSleep(updateInterval * 1000 * 1000);
77 | },
78 | null
79 | );
80 | }
81 |
82 | // Setup a timer that keep track of the time that the device is on but didn't send data yet.
83 | // After some tries it goes to sleep.
84 | let sendTelemetryTries = 0;
85 | function setUpdateTimer() {
86 | if (updateTimerId) {
87 | Timer.del(updateTimerId);
88 | }
89 | let updateInterval = Cfg.get('app.update_interval');
90 | print('Setting timer with ', updateInterval, ' seconds interval');
91 | updateTimerId = Timer.set(
92 | updateInterval * 1000,
93 | true,
94 | function() {
95 | print('Should send telemetry');
96 | sendTelemetryTries = sendTelemetryTries + 1;
97 | if (sendTelemetryTries > 1 && !telemetrySend) {
98 | goToSleep();
99 | }
100 | telemetrySend = false;
101 | },
102 | null
103 | );
104 | }
105 | setUpdateTimer();
106 |
107 | // Check if GPS has valid data.
108 | gpsTimerId = Timer.set(
109 | 1000,
110 | true,
111 | function() {
112 | let geo = getParsedLatLon();
113 | if (geo) {
114 | isGPSLocked = true;
115 | GPIO.write(gpsStatusPin, 1);
116 | } else {
117 | isGPSLocked = false;
118 | GPIO.write(gpsStatusPin, 0);
119 | }
120 | },
121 | null
122 | );
123 |
124 | // Checks if is connected to mqtt server and GPS is locked
125 | // Then send data thought mqtt and if it's all ok, go to sleep
126 | Timer.set(
127 | 5000,
128 | true,
129 | function() {
130 | if (isConnected && isGPSLocked && !telemetrySend) {
131 | let ok = publishData();
132 | telemetrySend = ok;
133 |
134 | if (telemetrySend) {
135 | goToSleep();
136 | }
137 | }
138 | },
139 | null
140 | );
141 |
142 | // Subscribe to Cloud IoT Core configuration topic
143 | MQTT.sub(
144 | configTopic,
145 | function(conn, topic, msg) {
146 | print('Got config update:', msg.slice(0, 100));
147 | if (!msg) {
148 | return;
149 | }
150 | let obj = JSON.parse(msg);
151 | if (obj) {
152 | Cfg.set({ app: obj });
153 | }
154 | setUpdateTimer();
155 | },
156 | null
157 | );
158 |
159 | // Monitor connection with MQTT server
160 | MQTT.setEventHandler(function(conn, ev) {
161 | if (ev === MQTT.EV_CONNACK) {
162 | print('MQTT CONNECTED');
163 | isConnected = true;
164 | GPIO.write(gsmStatusPin, 1);
165 | }
166 | }, null);
167 |
168 | // Monitor network connectivity.
169 | Net.setStatusEventHandler(function(ev, arg) {
170 | let evs = '???';
171 | if (ev === Net.STATUS_DISCONNECTED) {
172 | evs = 'DISCONNECTED';
173 | isConnected = false;
174 | GPIO.write(gsmStatusPin, 0);
175 | } else if (ev === Net.STATUS_CONNECTING) {
176 | evs = 'CONNECTING';
177 | } else if (ev === Net.STATUS_CONNECTED) {
178 | evs = 'CONNECTED';
179 | } else if (ev === Net.STATUS_GOT_IP) {
180 | evs = 'GOT_IP';
181 | }
182 | print('== Net event:', ev, evs);
183 | }, null);
184 |
--------------------------------------------------------------------------------
/firmware/mos.yml:
--------------------------------------------------------------------------------
1 | author: Alvaro Viebrantz
2 | description: An asset tracker project
3 | version: 1.0
4 |
5 | libs_version: 2.4.2
6 | modules_version: 2.4.2
7 | mongoose_os_version: 2.4.2
8 |
9 | # Optional. List of tags for online search.
10 | tags:
11 | - c
12 |
13 | includes:
14 | - include
15 |
16 | # List of files / directories with C sources. No slashes at the end of dir names.
17 | sources:
18 | - src
19 |
20 | # List of dirs. Files from these dirs will be copied to the device filesystem
21 | filesystem:
22 | - fs
23 |
24 | config_schema:
25 | - ["app", "o", {title: "App config"}]
26 | - ["app.update_interval", "i", 300, {title: "Update interval in seconds"}]
27 | - ["pppos.enable", true]
28 | - ["pppos.uart_no", 1]
29 | - ["pppos.baud_rate", 115200]
30 | - ["pppos.apn", "timbrasil.br"]
31 | - ["pppos.user", "tim"]
32 | - ["pppos.pass", "tim"]
33 | - ["pppos.connect_cmd", "ATD*99***1#"]
34 | - ["gps.uart_no", 2]
35 | - ["gps.baud_rate", 9600]
36 | - ["gps.update_interval", 2000]
37 | - ["wifi.sta.enable", false]
38 |
39 | # List of libraries used by this app, in order of initialisation
40 | libs:
41 | - origin: https://github.com/mongoose-os-libs/ca-bundle
42 | - origin: https://github.com/mongoose-os-libs/rpc-service-config
43 | - origin: https://github.com/mongoose-os-libs/rpc-service-fs
44 | - origin: https://github.com/mongoose-os-libs/rpc-uart
45 | - origin: https://github.com/mongoose-os-libs/wifi
46 | - origin: https://github.com/mongoose-os-libs/pppos
47 | - origin: https://github.com/mongoose-os-libs/mjs
48 | - origin: https://github.com/mongoose-os-libs/mqtt
49 | - origin: https://github.com/mongoose-os-libs/sntp
50 | - origin: https://github.com/mongoose-os-libs/gcp
51 | - origin: https://github.com/alvarowolfx/gps
52 |
53 |
54 | # Used by the mos tool to catch mos binaries incompatible with this file format
55 | manifest_version: 2017-09-29
56 |
--------------------------------------------------------------------------------
/firmware/src/main.c:
--------------------------------------------------------------------------------
1 |
2 | #include "mgos_app.h"
3 |
4 | #include "mgos.h"
5 |
6 | enum mgos_app_init_result mgos_app_init(void)
7 | {
8 | return MGOS_APP_INIT_SUCCESS;
9 | }
10 |
--------------------------------------------------------------------------------
/functions/index.js:
--------------------------------------------------------------------------------
1 | const functions = require('firebase-functions');
2 | const admin = require('firebase-admin');
3 | const Geopoint = require('geopoint');
4 | const googleapis = require('googleapis');
5 |
6 | admin.initializeApp();
7 |
8 | const GeoPointFirestore = admin.firestore.GeoPoint;
9 | const db = admin.firestore();
10 |
11 | const DISTANCE_THRESHOLD = 0.05; // 50 meters
12 |
13 | const PROJECT_ID = process.env.GCLOUD_PROJECT;
14 | const REGION = 'us-central1';
15 | const REGISTRY = 'asset-tracker-registry';
16 |
17 | /**
18 | * Receive a http request with deviceId and updateInterval, then
19 | * call modifyCloudToDeviceConfig method of Cloud IoT Core
20 | * to update the device configuration.
21 | */
22 | exports.updateDeviceConfig = functions.https.onRequest((req, res) => {
23 | let { deviceId, updateInterval } = req.query;
24 |
25 | if (!deviceId) {
26 | res.json({ err: 'Param `deviceId` is required!' });
27 | return;
28 | }
29 |
30 | updateInterval = parseInt(updateInterval, 10);
31 | if (!updateInterval) {
32 | res.json({ err: 'Param `updateInterval` is required!' });
33 | return;
34 | }
35 |
36 | getCloudIoTClient()
37 | .then(client => {
38 | const device_name = `projects/${PROJECT_ID}/locations/${REGION}/registries/${REGISTRY}/devices/${deviceId}`;
39 | //console.log(device_name);
40 |
41 | const newConfig = { update_interval: updateInterval };
42 | const data = new Buffer(JSON.stringify(newConfig), 'utf-8');
43 | const binaryData = data.toString('base64');
44 |
45 | client.projects.locations.registries.devices.modifyCloudToDeviceConfig(
46 | {
47 | name: device_name,
48 | resource: {
49 | version_to_update: 0,
50 | data: {
51 | binary_data: binaryData
52 | }
53 | }
54 | },
55 | (err, response) => {
56 | if (!err) {
57 | let deviceRef = db.collection('devices').doc(deviceId);
58 | deviceRef.set(
59 | {
60 | updateInterval
61 | },
62 | { merge: true }
63 | );
64 | }
65 | res.json({ err, response });
66 | }
67 | );
68 | })
69 | .catch(err => {
70 | res.json({ err });
71 | });
72 | });
73 |
74 | /**
75 | * Receive data from pubsub, then
76 | * Maintain last device data on Firestore 'devices' collections then
77 | * Write telemetry raw data to 'devices/location_logs' subcollection
78 | */
79 | exports.receiveTelemetry = functions.pubsub
80 | .topic('telemetry-topic')
81 | .onPublish((message, context) => {
82 | const attributes = message.attributes;
83 | const payload = message.json;
84 |
85 | const deviceId = attributes['deviceId'];
86 |
87 | const data = {
88 | deviceId: deviceId,
89 | timestamp: new Date(context.timestamp),
90 | latitude: parseFloat(payload.latlon.lat),
91 | longitude: parseFloat(payload.latlon.lon),
92 | speed: parseFloat(payload.latlon.sp),
93 | deviceTemperature: payload.temp,
94 | deviceFreeRam: payload.free_ram,
95 | deviceTotalRam: payload.total_ram
96 | };
97 |
98 | let deviceRef = db.collection('devices').doc(deviceId);
99 |
100 | return deviceRef.get().then(doc => {
101 | if (!doc.exists) {
102 | data.state = 'MOVING';
103 | return Promise.all([
104 | updateCurrentDataFirestore(deviceRef, data),
105 | insertLocationLog(deviceRef, data)
106 | ]).then(() => {
107 | return updateDeviceDateIndex(deviceRef, data, {});
108 | });
109 | }
110 |
111 | let device = doc.data();
112 |
113 | let newLocation = new Geopoint(data.latitude, data.longitude);
114 | let lastLocation = new Geopoint(
115 | device.location.latitude,
116 | device.location.longitude
117 | );
118 |
119 | let distanceKm = lastLocation.distanceTo(newLocation, true);
120 |
121 | if (distanceKm >= DISTANCE_THRESHOLD) {
122 | data.state = 'MOVING';
123 | return Promise.all([
124 | updateCurrentDataFirestore(deviceRef, data),
125 | insertLocationLog(deviceRef, data)
126 | ]).then(() => {
127 | return updateDeviceDateIndex(deviceRef, data, device.dateIndex);
128 | });
129 | } else {
130 | data.state = 'STOPPED';
131 | return updateCurrentDataFirestore(deviceRef, data);
132 | }
133 | });
134 | });
135 |
136 | const API_SCOPES = ['https://www.googleapis.com/auth/cloud-platform'];
137 | const API_VERSION = 'v1';
138 | const DISCOVERY_API = 'https://cloudiot.googleapis.com/$discovery/rest';
139 | const SERVICE_NAME = 'cloudiot';
140 | const DISCOVERY_URL = `${DISCOVERY_API}?version=${API_VERSION}`;
141 |
142 | function getCloudIoTClient() {
143 | return new Promise((resolve, reject) => {
144 | googleapis.auth.getApplicationDefault((err, auth, projectId) => {
145 | if (err) {
146 | reject(err);
147 | return;
148 | }
149 |
150 | googleapis.discoverAPI(DISCOVERY_URL, { auth }, (err, service) => {
151 | if (!err) {
152 | resolve(service);
153 | } else {
154 | reject(err);
155 | }
156 | });
157 | });
158 | });
159 | }
160 |
161 | /**
162 | * Maintain last status in Firestore
163 | */
164 | function updateCurrentDataFirestore(deviceRef, data) {
165 | let location = new GeoPointFirestore(data.latitude, data.longitude);
166 |
167 | return deviceRef.set(
168 | {
169 | location,
170 | state: data.state,
171 | lastTimestamp: data.timestamp,
172 | speed: data.speed,
173 | deviceTemperature: data.deviceTemperature,
174 | deviceFreeRam: data.deviceFreeRam,
175 | deviceTotalRam: data.deviceTotalRam
176 | },
177 | { merge: true }
178 | );
179 | }
180 |
181 | /**
182 | * Store all the log data in sub collection
183 | */
184 | function insertLocationLog(deviceRef, data) {
185 | let location = new GeoPointFirestore(data.latitude, data.longitude);
186 |
187 | return deviceRef.collection('location_logs').add({
188 | location,
189 | timestamp: data.timestamp,
190 | speed: data.speed
191 | });
192 | }
193 |
194 | /**
195 | * Update device date index with all days that have data
196 | */
197 | function updateDeviceDateIndex(deviceRef, data, dateIndex) {
198 | const key = data.timestamp.toJSON().substring(0, 10);
199 | const count = dateIndex[key];
200 | if (!count) {
201 | dateIndex[key] = 1;
202 | } else {
203 | dateIndex[key] = count + 1;
204 | }
205 | return deviceRef.update({
206 | dateIndex
207 | });
208 | }
209 |
--------------------------------------------------------------------------------
/functions/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "functions",
3 | "description": "Cloud Functions for Firebase",
4 | "scripts": {
5 | "serve": "firebase serve --only functions",
6 | "shell": "firebase experimental:functions:shell",
7 | "start": "npm run shell",
8 | "deploy": "firebase deploy --only functions",
9 | "logs": "firebase functions:log"
10 | },
11 | "dependencies": {
12 | "firebase-admin": "^6.0.0",
13 | "firebase-functions": "^2.0.4",
14 | "geopoint": "^1.0.1",
15 | "google-cloud": "^0.57.0",
16 | "googleapis": "^23.0.0"
17 | },
18 | "private": true
19 | }
20 |
--------------------------------------------------------------------------------
/functions/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | "@google-cloud/bigquery@^0.9.0":
6 | version "0.9.6"
7 | resolved "https://registry.yarnpkg.com/@google-cloud/bigquery/-/bigquery-0.9.6.tgz#beac6d486c45f8010a480438de4945252fc4ceae"
8 | dependencies:
9 | "@google-cloud/common" "^0.13.0"
10 | arrify "^1.0.0"
11 | duplexify "^3.5.0"
12 | extend "^3.0.0"
13 | is "^3.0.1"
14 | stream-events "^1.0.1"
15 | string-format-obj "^1.0.0"
16 |
17 | "@google-cloud/bigtable@^0.10.0":
18 | version "0.10.2"
19 | resolved "https://registry.yarnpkg.com/@google-cloud/bigtable/-/bigtable-0.10.2.tgz#34e679b19647dee6744e3e1efe547bd6ebd8db01"
20 | dependencies:
21 | "@google-cloud/common" "^0.13.0"
22 | "@google-cloud/common-grpc" "^0.4.0"
23 | arrify "^1.0.0"
24 | concat-stream "^1.5.0"
25 | create-error-class "^3.0.2"
26 | dot-prop "^3.0.0"
27 | extend "^3.0.0"
28 | is "^3.0.1"
29 | lodash.flatten "^4.2.0"
30 | node-int64 "^0.4.0"
31 | prop-assign "^1.0.0"
32 | pumpify "^1.3.3"
33 | string-format-obj "^1.0.0"
34 | through2 "^2.0.0"
35 |
36 | "@google-cloud/common-grpc@^0.4.0", "@google-cloud/common-grpc@^0.4.2":
37 | version "0.4.3"
38 | resolved "https://registry.yarnpkg.com/@google-cloud/common-grpc/-/common-grpc-0.4.3.tgz#83689591a1011fee57d32aa6a17fe2c5eb3a70bc"
39 | dependencies:
40 | "@google-cloud/common" "^0.13.6"
41 | dot-prop "^2.4.0"
42 | duplexify "^3.5.1"
43 | extend "^3.0.0"
44 | grpc "^1.7.1"
45 | is "^3.2.0"
46 | modelo "^4.2.0"
47 | retry-request "^3.0.0"
48 | through2 "^2.0.3"
49 |
50 | "@google-cloud/common@^0.13.0", "@google-cloud/common@^0.13.5", "@google-cloud/common@^0.13.6":
51 | version "0.13.6"
52 | resolved "https://registry.yarnpkg.com/@google-cloud/common/-/common-0.13.6.tgz#a9d8e137bc429a44aba9689fe6a0e4331784f853"
53 | dependencies:
54 | array-uniq "^1.0.3"
55 | arrify "^1.0.1"
56 | concat-stream "^1.6.0"
57 | create-error-class "^3.0.2"
58 | duplexify "^3.5.0"
59 | ent "^2.2.0"
60 | extend "^3.0.0"
61 | google-auto-auth "^0.7.1"
62 | is "^3.2.0"
63 | log-driver "^1.2.5"
64 | methmeth "^1.1.0"
65 | modelo "^4.2.0"
66 | request "^2.79.0"
67 | retry-request "^3.0.0"
68 | split-array-stream "^1.0.0"
69 | stream-events "^1.0.1"
70 | string-format-obj "^1.1.0"
71 | through2 "^2.0.3"
72 |
73 | "@google-cloud/common@^0.14.0":
74 | version "0.14.0"
75 | resolved "https://registry.yarnpkg.com/@google-cloud/common/-/common-0.14.0.tgz#c56038297247ea72a750d51455e801710976ac43"
76 | dependencies:
77 | array-uniq "^1.0.3"
78 | arrify "^1.0.1"
79 | concat-stream "^1.6.0"
80 | create-error-class "^3.0.2"
81 | duplexify "^3.5.0"
82 | ent "^2.2.0"
83 | extend "^3.0.0"
84 | google-auto-auth "^0.7.1"
85 | is "^3.2.0"
86 | log-driver "^1.2.5"
87 | methmeth "^1.1.0"
88 | modelo "^4.2.0"
89 | request "^2.79.0"
90 | retry-request "^3.0.0"
91 | split-array-stream "^1.0.0"
92 | stream-events "^1.0.1"
93 | string-format-obj "^1.1.0"
94 | through2 "^2.0.3"
95 |
96 | "@google-cloud/common@^0.15.1":
97 | version "0.15.1"
98 | resolved "https://registry.yarnpkg.com/@google-cloud/common/-/common-0.15.1.tgz#a6f79535de626cc0e05b0ccda9db0c36099e47a3"
99 | dependencies:
100 | array-uniq "^1.0.3"
101 | arrify "^1.0.1"
102 | concat-stream "^1.6.0"
103 | create-error-class "^3.0.2"
104 | duplexify "^3.5.0"
105 | ent "^2.2.0"
106 | extend "^3.0.1"
107 | google-auto-auth "^0.8.0"
108 | is "^3.2.0"
109 | log-driver "^1.2.5"
110 | methmeth "^1.1.0"
111 | modelo "^4.2.0"
112 | request "^2.79.0"
113 | retry-request "^3.0.0"
114 | split-array-stream "^1.0.0"
115 | stream-events "^1.0.1"
116 | string-format-obj "^1.1.0"
117 | through2 "^2.0.3"
118 |
119 | "@google-cloud/compute@^0.8.0":
120 | version "0.8.0"
121 | resolved "https://registry.yarnpkg.com/@google-cloud/compute/-/compute-0.8.0.tgz#0a213119c01b8dae79fee32075161f48466de488"
122 | dependencies:
123 | "@google-cloud/common" "^0.13.0"
124 | arrify "^1.0.0"
125 | async "^2.0.1"
126 | create-error-class "^3.0.2"
127 | extend "^3.0.0"
128 | gce-images "^0.3.0"
129 | is "^3.0.1"
130 | string-format-obj "^1.0.0"
131 |
132 | "@google-cloud/datastore@^1.0.0":
133 | version "1.3.3"
134 | resolved "https://registry.yarnpkg.com/@google-cloud/datastore/-/datastore-1.3.3.tgz#19faf363d5677b0338b779e099e27a6abfa94cbc"
135 | dependencies:
136 | "@google-cloud/common" "^0.14.0"
137 | arrify "^1.0.0"
138 | concat-stream "^1.5.0"
139 | create-error-class "^3.0.2"
140 | extend "^3.0.1"
141 | google-auto-auth "^0.9.0"
142 | google-gax "^0.14.2"
143 | google-proto-files "^0.13.1"
144 | is "^3.0.1"
145 | lodash.flatten "^4.2.0"
146 | lodash.merge "^4.6.0"
147 | prop-assign "^1.0.0"
148 | propprop "^0.3.0"
149 | safe-buffer "^5.1.1"
150 | split-array-stream "^1.0.0"
151 | stream-events "^1.0.2"
152 | through2 "^2.0.3"
153 |
154 | "@google-cloud/dlp@^0.1.0":
155 | version "0.1.3"
156 | resolved "https://registry.yarnpkg.com/@google-cloud/dlp/-/dlp-0.1.3.tgz#c706ce2ba063efac72029a51b1f4a175f927ac62"
157 | dependencies:
158 | extend "^3.0"
159 | google-gax "^0.13.2"
160 | google-proto-files "^0.12.0"
161 |
162 | "@google-cloud/dns@^0.6.0":
163 | version "0.6.2"
164 | resolved "https://registry.yarnpkg.com/@google-cloud/dns/-/dns-0.6.2.tgz#086814e34ee5c3e0df1777dc10fdc8dcd268a1bf"
165 | dependencies:
166 | "@google-cloud/common" "^0.13.0"
167 | arrify "^1.0.0"
168 | dns-zonefile "0.1.18"
169 | extend "^3.0.0"
170 | is "^3.0.1"
171 | methmeth "^1.0.0"
172 | string-format-obj "^1.0.0"
173 |
174 | "@google-cloud/firestore@^0.8.0", "@google-cloud/firestore@~0.8.2":
175 | version "0.8.2"
176 | resolved "https://registry.yarnpkg.com/@google-cloud/firestore/-/firestore-0.8.2.tgz#e93a7068b723f0773c1af62f3494c0633ba2d346"
177 | dependencies:
178 | "@google-cloud/common" "^0.13.5"
179 | "@google-cloud/common-grpc" "^0.4.0"
180 | bun "^0.0.12"
181 | extend "^3.0.1"
182 | functional-red-black-tree "^1.0.1"
183 | google-gax "^0.14.1"
184 | grpc "^1.6.0"
185 | is "^3.2.0"
186 | through2 "^2.0.3"
187 |
188 | "@google-cloud/language@^0.12.1":
189 | version "0.12.1"
190 | resolved "https://registry.yarnpkg.com/@google-cloud/language/-/language-0.12.1.tgz#3f9ec441eba8bbe8030706b9a09e0114c170fee1"
191 | dependencies:
192 | extend "^3.0"
193 | google-gax "^0.13.5"
194 |
195 | "@google-cloud/logging@^1.0.0":
196 | version "1.1.1"
197 | resolved "https://registry.yarnpkg.com/@google-cloud/logging/-/logging-1.1.1.tgz#f8692c45ee7c8f4bb51f1b07afe941c1f841fe10"
198 | dependencies:
199 | "@google-cloud/common" "^0.13.0"
200 | "@google-cloud/common-grpc" "^0.4.0"
201 | arrify "^1.0.0"
202 | eventid "^0.1.0"
203 | extend "^3.0.1"
204 | gcp-metadata "^0.3.1"
205 | google-auto-auth "^0.7.1"
206 | google-gax "^0.14.2"
207 | google-proto-files "^0.13.1"
208 | is "^3.0.1"
209 | lodash.merge "^4.6.0"
210 | protobufjs "^6.8.0"
211 | pumpify "^1.3.5"
212 | snakecase-keys "^1.1.0"
213 | stream-events "^1.0.1"
214 | string-format-obj "^1.0.0"
215 | through2 "^2.0.3"
216 |
217 | "@google-cloud/monitoring@^0.3.0":
218 | version "0.3.0"
219 | resolved "https://registry.yarnpkg.com/@google-cloud/monitoring/-/monitoring-0.3.0.tgz#b6b25a8ca781053d9be7982b2e9af2da1efed91f"
220 | dependencies:
221 | extend "^3.0"
222 | google-gax "^0.13.2"
223 | google-proto-files "^0.12.0"
224 |
225 | "@google-cloud/prediction@^0.6.0":
226 | version "0.6.2"
227 | resolved "https://registry.yarnpkg.com/@google-cloud/prediction/-/prediction-0.6.2.tgz#006253bf1c443530e12c7d40e3428ffe0c4765c2"
228 | dependencies:
229 | "@google-cloud/common" "^0.13.0"
230 | JSONStream "^1.0.7"
231 | arrify "^1.0.0"
232 | extend "^3.0.0"
233 | is "^3.0.1"
234 | pumpify "^1.3.3"
235 | stream-events "^1.0.1"
236 | string-format-obj "^1.0.0"
237 | through2 "^2.0.0"
238 |
239 | "@google-cloud/pubsub@^0.14.3":
240 | version "0.14.8"
241 | resolved "https://registry.yarnpkg.com/@google-cloud/pubsub/-/pubsub-0.14.8.tgz#f490a722cd2e9498cc8d72cd7dc7a46ba0061563"
242 | dependencies:
243 | "@google-cloud/common" "^0.13.0"
244 | "@google-cloud/common-grpc" "^0.4.2"
245 | arrify "^1.0.0"
246 | async-each "^1.0.1"
247 | extend "^3.0.0"
248 | google-auto-auth "^0.7.1"
249 | google-gax "^0.13.0"
250 | google-proto-files "^0.13.1"
251 | is "^3.0.1"
252 | lodash.snakecase "^4.1.1"
253 | uuid "^3.0.1"
254 |
255 | "@google-cloud/resource@^0.7.0":
256 | version "0.7.3"
257 | resolved "https://registry.yarnpkg.com/@google-cloud/resource/-/resource-0.7.3.tgz#b18a2f389df45ed4869ce40db55428a78416faad"
258 | dependencies:
259 | "@google-cloud/common" "^0.13.0"
260 | extend "^3.0.0"
261 | is "^3.0.1"
262 |
263 | "@google-cloud/spanner@^0.7.1":
264 | version "0.7.1"
265 | resolved "https://registry.yarnpkg.com/@google-cloud/spanner/-/spanner-0.7.1.tgz#c859a072ec099d95e6c6dc876fbb4e19cabca3d9"
266 | dependencies:
267 | "@google-cloud/common" "^0.13.0"
268 | "@google-cloud/common-grpc" "^0.4.0"
269 | array-uniq "^1.0.3"
270 | arrify "^1.0.1"
271 | checkpoint-stream "^0.1.0"
272 | events-intercept "^2.0.0"
273 | extend "^3.0.0"
274 | generic-pool "^3.1.4"
275 | google-gax "^0.13.0"
276 | google-proto-files "^0.12.0"
277 | is "^3.1.0"
278 | lodash.chunk "^4.2.0"
279 | lodash.flatten "^4.4.0"
280 | lodash.snakecase "^4.1.1"
281 | merge-stream "^1.0.1"
282 | methmeth "^1.1.0"
283 | split-array-stream "^1.0.0"
284 | stream-events "^1.0.1"
285 | string-format-obj "^1.1.0"
286 | through2 "^2.0.3"
287 |
288 | "@google-cloud/speech@^0.10.3":
289 | version "0.10.3"
290 | resolved "https://registry.yarnpkg.com/@google-cloud/speech/-/speech-0.10.3.tgz#a2f3268929025b60b5c8bd3246434f8a6187807b"
291 | dependencies:
292 | extend "^3.0.0"
293 | google-gax "^0.13.2"
294 | google-proto-files "^0.13.0"
295 | pumpify "^1.3.5"
296 | stream-events "^1.0.1"
297 | through2 "^2.0.3"
298 |
299 | "@google-cloud/storage@^1.0.0", "@google-cloud/storage@^1.2.1":
300 | version "1.5.1"
301 | resolved "https://registry.yarnpkg.com/@google-cloud/storage/-/storage-1.5.1.tgz#6c790260b87e7a1bcc637ec3747151db75bcf34f"
302 | dependencies:
303 | "@google-cloud/common" "^0.15.1"
304 | arrify "^1.0.0"
305 | async "^2.0.1"
306 | concat-stream "^1.5.0"
307 | create-error-class "^3.0.2"
308 | duplexify "^3.5.0"
309 | extend "^3.0.0"
310 | gcs-resumable-upload "^0.8.2"
311 | hash-stream-validation "^0.2.1"
312 | is "^3.0.1"
313 | mime-types "^2.0.8"
314 | once "^1.3.1"
315 | pumpify "^1.3.3"
316 | request "^2.83.0"
317 | safe-buffer "^5.1.1"
318 | snakeize "^0.1.0"
319 | stream-events "^1.0.1"
320 | string-format-obj "^1.0.0"
321 | through2 "^2.0.0"
322 |
323 | "@google-cloud/translate@^1.0.0":
324 | version "1.1.0"
325 | resolved "https://registry.yarnpkg.com/@google-cloud/translate/-/translate-1.1.0.tgz#fc9997a2724575effa7beb6e2d02042d456b627a"
326 | dependencies:
327 | "@google-cloud/common" "^0.13.0"
328 | arrify "^1.0.0"
329 | extend "^3.0.1"
330 | is "^3.0.1"
331 | is-html "^1.0.0"
332 | propprop "^0.3.0"
333 |
334 | "@google-cloud/video-intelligence@^0.3.2":
335 | version "0.3.2"
336 | resolved "https://registry.yarnpkg.com/@google-cloud/video-intelligence/-/video-intelligence-0.3.2.tgz#e3a43b08dec2744e96557fa5aadda5eea16cf8a6"
337 | dependencies:
338 | extend "^3.0"
339 | google-gax "^0.14.0"
340 | protobufjs "^6.8.0"
341 |
342 | "@google-cloud/vision@^0.12.0":
343 | version "0.12.0"
344 | resolved "https://registry.yarnpkg.com/@google-cloud/vision/-/vision-0.12.0.tgz#ffab0a18e0e6ea841e6c4e81273cd46809fdf03e"
345 | dependencies:
346 | "@google-cloud/common" "^0.13.0"
347 | async "^2.0.1"
348 | extend "^3.0.0"
349 | google-gax "^0.13.2"
350 | google-proto-files "^0.12.0"
351 | is "^3.0.1"
352 |
353 | "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2":
354 | version "1.1.2"
355 | resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf"
356 |
357 | "@protobufjs/base64@^1.1.2":
358 | version "1.1.2"
359 | resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735"
360 |
361 | "@protobufjs/codegen@^2.0.4":
362 | version "2.0.4"
363 | resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb"
364 |
365 | "@protobufjs/eventemitter@^1.1.0":
366 | version "1.1.0"
367 | resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70"
368 |
369 | "@protobufjs/fetch@^1.1.0":
370 | version "1.1.0"
371 | resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45"
372 | dependencies:
373 | "@protobufjs/aspromise" "^1.1.1"
374 | "@protobufjs/inquire" "^1.1.0"
375 |
376 | "@protobufjs/float@^1.0.2":
377 | version "1.0.2"
378 | resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1"
379 |
380 | "@protobufjs/inquire@^1.1.0":
381 | version "1.1.0"
382 | resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089"
383 |
384 | "@protobufjs/path@^1.1.2":
385 | version "1.1.2"
386 | resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d"
387 |
388 | "@protobufjs/pool@^1.1.0":
389 | version "1.1.0"
390 | resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54"
391 |
392 | "@protobufjs/utf8@^1.1.0":
393 | version "1.1.0"
394 | resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
395 |
396 | "@types/body-parser@*":
397 | version "1.16.8"
398 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.16.8.tgz#687ec34140624a3bec2b1a8ea9268478ae8f3be3"
399 | dependencies:
400 | "@types/express" "*"
401 | "@types/node" "*"
402 |
403 | "@types/express-serve-static-core@*":
404 | version "4.0.57"
405 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.0.57.tgz#3cd8ab4b11d5ecd70393bada7fc1c480491537dd"
406 | dependencies:
407 | "@types/node" "*"
408 |
409 | "@types/express@*", "@types/express@^4.0.33":
410 | version "4.0.39"
411 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.0.39.tgz#1441f21d52b33be8d4fa8a865c15a6a91cd0fa09"
412 | dependencies:
413 | "@types/body-parser" "*"
414 | "@types/express-serve-static-core" "*"
415 | "@types/serve-static" "*"
416 |
417 | "@types/google-cloud__storage@^1.1.1":
418 | version "1.1.7"
419 | resolved "https://registry.yarnpkg.com/@types/google-cloud__storage/-/google-cloud__storage-1.1.7.tgz#f4b568b163cce16314f32f954f5b7d5c9001fa86"
420 | dependencies:
421 | "@types/node" "*"
422 |
423 | "@types/jsonwebtoken@^7.1.32", "@types/jsonwebtoken@^7.1.33":
424 | version "7.2.5"
425 | resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-7.2.5.tgz#413159d570ec45fc3e7da7ea3f7bca6fb9300e72"
426 | dependencies:
427 | "@types/node" "*"
428 |
429 | "@types/lodash@^4.14.34":
430 | version "4.14.91"
431 | resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.91.tgz#794611b28056d16b5436059c6d800b39d573cd3a"
432 |
433 | "@types/long@^3.0.32":
434 | version "3.0.32"
435 | resolved "https://registry.yarnpkg.com/@types/long/-/long-3.0.32.tgz#f4e5af31e9e9b196d8e5fca8a5e2e20aa3d60b69"
436 |
437 | "@types/mime@*":
438 | version "2.0.0"
439 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.0.tgz#5a7306e367c539b9f6543499de8dd519fac37a8b"
440 |
441 | "@types/node@*", "@types/node@^8.0.32", "@types/node@^8.0.53":
442 | version "8.5.1"
443 | resolved "https://registry.yarnpkg.com/@types/node/-/node-8.5.1.tgz#4ec3020bcdfe2abffeef9ba3fbf26fca097514b5"
444 |
445 | "@types/serve-static@*":
446 | version "1.13.1"
447 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.1.tgz#1d2801fa635d274cd97d4ec07e26b21b44127492"
448 | dependencies:
449 | "@types/express-serve-static-core" "*"
450 | "@types/mime" "*"
451 |
452 | "@types/sha1@^1.1.0":
453 | version "1.1.1"
454 | resolved "https://registry.yarnpkg.com/@types/sha1/-/sha1-1.1.1.tgz#ab34efa782ff948d402d896afc9f10f41e94dd44"
455 | dependencies:
456 | "@types/node" "*"
457 |
458 | JSONStream@^1.0.7:
459 | version "1.3.2"
460 | resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea"
461 | dependencies:
462 | jsonparse "^1.2.0"
463 | through ">=2.2.7 <3"
464 |
465 | abbrev@1:
466 | version "1.1.1"
467 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
468 |
469 | accepts@~1.3.4:
470 | version "1.3.4"
471 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f"
472 | dependencies:
473 | mime-types "~2.1.16"
474 | negotiator "0.6.1"
475 |
476 | ajv@^4.9.1:
477 | version "4.11.8"
478 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
479 | dependencies:
480 | co "^4.6.0"
481 | json-stable-stringify "^1.0.1"
482 |
483 | ajv@^5.1.0:
484 | version "5.5.2"
485 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
486 | dependencies:
487 | co "^4.6.0"
488 | fast-deep-equal "^1.0.0"
489 | fast-json-stable-stringify "^2.0.0"
490 | json-schema-traverse "^0.3.0"
491 |
492 | ansi-regex@^2.0.0:
493 | version "2.1.1"
494 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
495 |
496 | aproba@^1.0.3:
497 | version "1.2.0"
498 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
499 |
500 | are-we-there-yet@~1.1.2:
501 | version "1.1.4"
502 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d"
503 | dependencies:
504 | delegates "^1.0.0"
505 | readable-stream "^2.0.6"
506 |
507 | arguejs@^0.2.3:
508 | version "0.2.3"
509 | resolved "https://registry.yarnpkg.com/arguejs/-/arguejs-0.2.3.tgz#b6f939f5fe0e3cd1f3f93e2aa9262424bf312af7"
510 |
511 | array-flatten@1.1.1:
512 | version "1.1.1"
513 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
514 |
515 | array-union@^1.0.1:
516 | version "1.0.2"
517 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
518 | dependencies:
519 | array-uniq "^1.0.1"
520 |
521 | array-uniq@^1.0.1, array-uniq@^1.0.3:
522 | version "1.0.3"
523 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
524 |
525 | arrify@^1.0.0, arrify@^1.0.1:
526 | version "1.0.1"
527 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
528 |
529 | ascli@~1:
530 | version "1.0.1"
531 | resolved "https://registry.yarnpkg.com/ascli/-/ascli-1.0.1.tgz#bcfa5974a62f18e81cabaeb49732ab4a88f906bc"
532 | dependencies:
533 | colour "~0.7.1"
534 | optjs "~3.2.2"
535 |
536 | asn1@~0.2.3:
537 | version "0.2.3"
538 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
539 |
540 | assert-plus@1.0.0, assert-plus@^1.0.0:
541 | version "1.0.0"
542 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
543 |
544 | assert-plus@^0.2.0:
545 | version "0.2.0"
546 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
547 |
548 | async-each@^1.0.1:
549 | version "1.0.1"
550 | resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
551 |
552 | async@2.6.0, async@^2.0.1, async@^2.1.2, async@^2.3.0, async@^2.4.0:
553 | version "2.6.0"
554 | resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4"
555 | dependencies:
556 | lodash "^4.14.0"
557 |
558 | async@^1.5.2:
559 | version "1.5.2"
560 | resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
561 |
562 | asynckit@^0.4.0:
563 | version "0.4.0"
564 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
565 |
566 | aws-sign2@~0.6.0:
567 | version "0.6.0"
568 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
569 |
570 | aws-sign2@~0.7.0:
571 | version "0.7.0"
572 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
573 |
574 | aws4@^1.2.1, aws4@^1.6.0:
575 | version "1.6.0"
576 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
577 |
578 | balanced-match@^1.0.0:
579 | version "1.0.0"
580 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
581 |
582 | base64url@2.0.0, base64url@^2.0.0:
583 | version "2.0.0"
584 | resolved "https://registry.yarnpkg.com/base64url/-/base64url-2.0.0.tgz#eac16e03ea1438eff9423d69baa36262ed1f70bb"
585 |
586 | bcrypt-pbkdf@^1.0.0:
587 | version "1.0.1"
588 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
589 | dependencies:
590 | tweetnacl "^0.14.3"
591 |
592 | block-stream@*:
593 | version "0.0.9"
594 | resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
595 | dependencies:
596 | inherits "~2.0.0"
597 |
598 | body-parser@1.18.2:
599 | version "1.18.2"
600 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454"
601 | dependencies:
602 | bytes "3.0.0"
603 | content-type "~1.0.4"
604 | debug "2.6.9"
605 | depd "~1.1.1"
606 | http-errors "~1.6.2"
607 | iconv-lite "0.4.19"
608 | on-finished "~2.3.0"
609 | qs "6.5.1"
610 | raw-body "2.3.2"
611 | type-is "~1.6.15"
612 |
613 | boom@2.x.x:
614 | version "2.10.1"
615 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
616 | dependencies:
617 | hoek "2.x.x"
618 |
619 | boom@4.x.x:
620 | version "4.3.1"
621 | resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31"
622 | dependencies:
623 | hoek "4.x.x"
624 |
625 | boom@5.x.x:
626 | version "5.2.0"
627 | resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02"
628 | dependencies:
629 | hoek "4.x.x"
630 |
631 | brace-expansion@^1.1.7:
632 | version "1.1.8"
633 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292"
634 | dependencies:
635 | balanced-match "^1.0.0"
636 | concat-map "0.0.1"
637 |
638 | buffer-equal-constant-time@1.0.1:
639 | version "1.0.1"
640 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
641 |
642 | buffer-equal@^1.0.0:
643 | version "1.0.0"
644 | resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe"
645 |
646 | bun@^0.0.12:
647 | version "0.0.12"
648 | resolved "https://registry.yarnpkg.com/bun/-/bun-0.0.12.tgz#d54fae69f895557f275423bc14b404030b20a5fc"
649 | dependencies:
650 | readable-stream "~1.0.32"
651 |
652 | bytebuffer@~5:
653 | version "5.0.1"
654 | resolved "https://registry.yarnpkg.com/bytebuffer/-/bytebuffer-5.0.1.tgz#582eea4b1a873b6d020a48d58df85f0bba6cfddd"
655 | dependencies:
656 | long "~3"
657 |
658 | bytes@3.0.0:
659 | version "3.0.0"
660 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
661 |
662 | camelcase@^2.0.1:
663 | version "2.1.1"
664 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
665 |
666 | capture-stack-trace@^1.0.0:
667 | version "1.0.0"
668 | resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d"
669 |
670 | caseless@~0.12.0:
671 | version "0.12.0"
672 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
673 |
674 | "charenc@>= 0.0.1":
675 | version "0.0.2"
676 | resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667"
677 |
678 | checkpoint-stream@^0.1.0:
679 | version "0.1.1"
680 | resolved "https://registry.yarnpkg.com/checkpoint-stream/-/checkpoint-stream-0.1.1.tgz#59088511fbe23b6d2c1e82eaf02f28459667f637"
681 | dependencies:
682 | events-intercept "^2.0.0"
683 | pumpify "^1.3.5"
684 | split-array-stream "^1.0.0"
685 | through2 "^2.0.3"
686 |
687 | cliui@^3.0.3:
688 | version "3.2.0"
689 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
690 | dependencies:
691 | string-width "^1.0.1"
692 | strip-ansi "^3.0.1"
693 | wrap-ansi "^2.0.0"
694 |
695 | co@^4.6.0:
696 | version "4.6.0"
697 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
698 |
699 | code-point-at@^1.0.0:
700 | version "1.1.0"
701 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
702 |
703 | colour@~0.7.1:
704 | version "0.7.1"
705 | resolved "https://registry.yarnpkg.com/colour/-/colour-0.7.1.tgz#9cb169917ec5d12c0736d3e8685746df1cadf778"
706 |
707 | combined-stream@^1.0.5, combined-stream@~1.0.5:
708 | version "1.0.5"
709 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
710 | dependencies:
711 | delayed-stream "~1.0.0"
712 |
713 | concat-map@0.0.1:
714 | version "0.0.1"
715 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
716 |
717 | concat-stream@^1.5.0, concat-stream@^1.6.0:
718 | version "1.6.0"
719 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7"
720 | dependencies:
721 | inherits "^2.0.3"
722 | readable-stream "^2.2.2"
723 | typedarray "^0.0.6"
724 |
725 | configstore@^3.0.0:
726 | version "3.1.1"
727 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90"
728 | dependencies:
729 | dot-prop "^4.1.0"
730 | graceful-fs "^4.1.2"
731 | make-dir "^1.0.0"
732 | unique-string "^1.0.0"
733 | write-file-atomic "^2.0.0"
734 | xdg-basedir "^3.0.0"
735 |
736 | console-control-strings@^1.0.0, console-control-strings@~1.1.0:
737 | version "1.1.0"
738 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
739 |
740 | content-disposition@0.5.2:
741 | version "0.5.2"
742 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
743 |
744 | content-type@~1.0.4:
745 | version "1.0.4"
746 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
747 |
748 | cookie-signature@1.0.6:
749 | version "1.0.6"
750 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
751 |
752 | cookie@0.3.1:
753 | version "0.3.1"
754 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
755 |
756 | core-util-is@1.0.2, core-util-is@~1.0.0:
757 | version "1.0.2"
758 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
759 |
760 | create-error-class@^2.0.0:
761 | version "2.0.1"
762 | resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-2.0.1.tgz#a8759ed5c8d214a461e81d18e70aacb33dd63c9c"
763 | dependencies:
764 | capture-stack-trace "^1.0.0"
765 | inherits "^2.0.1"
766 |
767 | create-error-class@^3.0.2:
768 | version "3.0.2"
769 | resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
770 | dependencies:
771 | capture-stack-trace "^1.0.0"
772 |
773 | "crypt@>= 0.0.1":
774 | version "0.0.2"
775 | resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b"
776 |
777 | cryptiles@2.x.x:
778 | version "2.0.5"
779 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
780 | dependencies:
781 | boom "2.x.x"
782 |
783 | cryptiles@3.x.x:
784 | version "3.1.2"
785 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe"
786 | dependencies:
787 | boom "5.x.x"
788 |
789 | crypto-random-string@^1.0.0:
790 | version "1.0.0"
791 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
792 |
793 | d64@^1.0.0:
794 | version "1.0.0"
795 | resolved "https://registry.yarnpkg.com/d64/-/d64-1.0.0.tgz#4002a87e850cbfc9f9d9706b60fca613a3336e90"
796 |
797 | dashdash@^1.12.0:
798 | version "1.14.1"
799 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
800 | dependencies:
801 | assert-plus "^1.0.0"
802 |
803 | debug@2.6.9, debug@^2.2.0:
804 | version "2.6.9"
805 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
806 | dependencies:
807 | ms "2.0.0"
808 |
809 | decamelize@^1.1.1:
810 | version "1.2.0"
811 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
812 |
813 | deep-extend@~0.4.0:
814 | version "0.4.2"
815 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
816 |
817 | delayed-stream@~1.0.0:
818 | version "1.0.0"
819 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
820 |
821 | delegates@^1.0.0:
822 | version "1.0.0"
823 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
824 |
825 | depd@1.1.1, depd@~1.1.1:
826 | version "1.1.1"
827 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
828 |
829 | destroy@~1.0.4:
830 | version "1.0.4"
831 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
832 |
833 | detect-libc@^1.0.2:
834 | version "1.0.3"
835 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
836 |
837 | dns-zonefile@0.1.18:
838 | version "0.1.18"
839 | resolved "https://registry.yarnpkg.com/dns-zonefile/-/dns-zonefile-0.1.18.tgz#7569c7371dbdfd50bf8e53e2da0740679292299e"
840 |
841 | dot-prop@^2.4.0:
842 | version "2.4.0"
843 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-2.4.0.tgz#848e28f7f1d50740c6747ab3cb07670462b6f89c"
844 | dependencies:
845 | is-obj "^1.0.0"
846 |
847 | dot-prop@^3.0.0:
848 | version "3.0.0"
849 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177"
850 | dependencies:
851 | is-obj "^1.0.0"
852 |
853 | dot-prop@^4.1.0:
854 | version "4.2.0"
855 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
856 | dependencies:
857 | is-obj "^1.0.0"
858 |
859 | duplexify@^3.1.2, duplexify@^3.2.0, duplexify@^3.5.0, duplexify@^3.5.1:
860 | version "3.5.1"
861 | resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.1.tgz#4e1516be68838bc90a49994f0b39a6e5960befcd"
862 | dependencies:
863 | end-of-stream "^1.0.0"
864 | inherits "^2.0.1"
865 | readable-stream "^2.0.0"
866 | stream-shift "^1.0.0"
867 |
868 | ecc-jsbn@~0.1.1:
869 | version "0.1.1"
870 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
871 | dependencies:
872 | jsbn "~0.1.0"
873 |
874 | ecdsa-sig-formatter@1.0.9:
875 | version "1.0.9"
876 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz#4bc926274ec3b5abb5016e7e1d60921ac262b2a1"
877 | dependencies:
878 | base64url "^2.0.0"
879 | safe-buffer "^5.0.1"
880 |
881 | ee-first@1.1.1:
882 | version "1.1.1"
883 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
884 |
885 | encodeurl@~1.0.1:
886 | version "1.0.1"
887 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20"
888 |
889 | end-of-stream@^1.0.0, end-of-stream@^1.1.0:
890 | version "1.4.0"
891 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206"
892 | dependencies:
893 | once "^1.4.0"
894 |
895 | ent@^2.2.0:
896 | version "2.2.0"
897 | resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d"
898 |
899 | error-ex@^1.2.0:
900 | version "1.3.1"
901 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
902 | dependencies:
903 | is-arrayish "^0.2.1"
904 |
905 | escape-html@~1.0.3:
906 | version "1.0.3"
907 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
908 |
909 | etag@~1.8.1:
910 | version "1.8.1"
911 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
912 |
913 | eventid@^0.1.0:
914 | version "0.1.2"
915 | resolved "https://registry.yarnpkg.com/eventid/-/eventid-0.1.2.tgz#0b232d3e244ea5b1d528984140ea69ac7ec89215"
916 | dependencies:
917 | d64 "^1.0.0"
918 | uuid "^3.0.1"
919 |
920 | events-intercept@^2.0.0:
921 | version "2.0.0"
922 | resolved "https://registry.yarnpkg.com/events-intercept/-/events-intercept-2.0.0.tgz#adbf38681c5a4b2011c41ee41f61a34cba448897"
923 |
924 | express@^4.0.33:
925 | version "4.16.2"
926 | resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c"
927 | dependencies:
928 | accepts "~1.3.4"
929 | array-flatten "1.1.1"
930 | body-parser "1.18.2"
931 | content-disposition "0.5.2"
932 | content-type "~1.0.4"
933 | cookie "0.3.1"
934 | cookie-signature "1.0.6"
935 | debug "2.6.9"
936 | depd "~1.1.1"
937 | encodeurl "~1.0.1"
938 | escape-html "~1.0.3"
939 | etag "~1.8.1"
940 | finalhandler "1.1.0"
941 | fresh "0.5.2"
942 | merge-descriptors "1.0.1"
943 | methods "~1.1.2"
944 | on-finished "~2.3.0"
945 | parseurl "~1.3.2"
946 | path-to-regexp "0.1.7"
947 | proxy-addr "~2.0.2"
948 | qs "6.5.1"
949 | range-parser "~1.2.0"
950 | safe-buffer "5.1.1"
951 | send "0.16.1"
952 | serve-static "1.13.1"
953 | setprototypeof "1.1.0"
954 | statuses "~1.3.1"
955 | type-is "~1.6.15"
956 | utils-merge "1.0.1"
957 | vary "~1.1.2"
958 |
959 | extend@^3.0, extend@^3.0.0, extend@^3.0.1, extend@~3.0.0, extend@~3.0.1:
960 | version "3.0.1"
961 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
962 |
963 | extsprintf@1.3.0:
964 | version "1.3.0"
965 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
966 |
967 | extsprintf@^1.2.0:
968 | version "1.4.0"
969 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
970 |
971 | fast-deep-equal@^1.0.0:
972 | version "1.0.0"
973 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff"
974 |
975 | fast-json-stable-stringify@^2.0.0:
976 | version "2.0.0"
977 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
978 |
979 | faye-websocket@0.9.3:
980 | version "0.9.3"
981 | resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.9.3.tgz#482a505b0df0ae626b969866d3bd740cdb962e83"
982 | dependencies:
983 | websocket-driver ">=0.5.1"
984 |
985 | finalhandler@1.1.0:
986 | version "1.1.0"
987 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5"
988 | dependencies:
989 | debug "2.6.9"
990 | encodeurl "~1.0.1"
991 | escape-html "~1.0.3"
992 | on-finished "~2.3.0"
993 | parseurl "~1.3.2"
994 | statuses "~1.3.1"
995 | unpipe "~1.0.0"
996 |
997 | firebase-admin@~5.4.2:
998 | version "5.4.3"
999 | resolved "https://registry.yarnpkg.com/firebase-admin/-/firebase-admin-5.4.3.tgz#784114c62a6dd5a1bfc67b54fa0cfdd02147871a"
1000 | dependencies:
1001 | "@google-cloud/firestore" "~0.8.2"
1002 | "@google-cloud/storage" "^1.2.1"
1003 | "@types/google-cloud__storage" "^1.1.1"
1004 | "@types/jsonwebtoken" "^7.1.33"
1005 | "@types/node" "^8.0.32"
1006 | faye-websocket "0.9.3"
1007 | google-auth-library "^0.10.0"
1008 | jsonwebtoken "7.4.3"
1009 | node-forge "0.7.1"
1010 |
1011 | firebase-functions@^0.7.1:
1012 | version "0.7.3"
1013 | resolved "https://registry.yarnpkg.com/firebase-functions/-/firebase-functions-0.7.3.tgz#11433990c69df3af784a927c6f2b3d6cd7eaf498"
1014 | dependencies:
1015 | "@types/express" "^4.0.33"
1016 | "@types/jsonwebtoken" "^7.1.32"
1017 | "@types/lodash" "^4.14.34"
1018 | "@types/sha1" "^1.1.0"
1019 | express "^4.0.33"
1020 | jsonwebtoken "^7.1.9"
1021 | lodash "^4.6.1"
1022 | sha1 "^1.1.1"
1023 |
1024 | forever-agent@~0.6.1:
1025 | version "0.6.1"
1026 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
1027 |
1028 | form-data@~2.1.1:
1029 | version "2.1.4"
1030 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
1031 | dependencies:
1032 | asynckit "^0.4.0"
1033 | combined-stream "^1.0.5"
1034 | mime-types "^2.1.12"
1035 |
1036 | form-data@~2.3.1:
1037 | version "2.3.1"
1038 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf"
1039 | dependencies:
1040 | asynckit "^0.4.0"
1041 | combined-stream "^1.0.5"
1042 | mime-types "^2.1.12"
1043 |
1044 | forwarded@~0.1.2:
1045 | version "0.1.2"
1046 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
1047 |
1048 | fresh@0.5.2:
1049 | version "0.5.2"
1050 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
1051 |
1052 | fs.realpath@^1.0.0:
1053 | version "1.0.0"
1054 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
1055 |
1056 | fstream-ignore@^1.0.5:
1057 | version "1.0.5"
1058 | resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105"
1059 | dependencies:
1060 | fstream "^1.0.0"
1061 | inherits "2"
1062 | minimatch "^3.0.0"
1063 |
1064 | fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2:
1065 | version "1.0.11"
1066 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
1067 | dependencies:
1068 | graceful-fs "^4.1.2"
1069 | inherits "~2.0.0"
1070 | mkdirp ">=0.5 0"
1071 | rimraf "2"
1072 |
1073 | functional-red-black-tree@^1.0.1:
1074 | version "1.0.1"
1075 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
1076 |
1077 | gauge@~2.7.3:
1078 | version "2.7.4"
1079 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
1080 | dependencies:
1081 | aproba "^1.0.3"
1082 | console-control-strings "^1.0.0"
1083 | has-unicode "^2.0.0"
1084 | object-assign "^4.1.0"
1085 | signal-exit "^3.0.0"
1086 | string-width "^1.0.1"
1087 | strip-ansi "^3.0.1"
1088 | wide-align "^1.1.0"
1089 |
1090 | gce-images@^0.3.0:
1091 | version "0.3.3"
1092 | resolved "https://registry.yarnpkg.com/gce-images/-/gce-images-0.3.3.tgz#144e74c83c01fa9009e18a36d1cb6c71f83a58d2"
1093 | dependencies:
1094 | arrify "^1.0.0"
1095 | async "^1.5.2"
1096 | google-auto-auth "^0.7.1"
1097 | got "^4.1.1"
1098 | object-assign "^3.0.0"
1099 |
1100 | gcp-metadata@^0.3.0, gcp-metadata@^0.3.1:
1101 | version "0.3.1"
1102 | resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-0.3.1.tgz#313814456e7c3d0eeb8f8b084b33579e886f829a"
1103 | dependencies:
1104 | extend "^3.0.0"
1105 | retry-request "^3.0.0"
1106 |
1107 | gcs-resumable-upload@^0.8.2:
1108 | version "0.8.2"
1109 | resolved "https://registry.yarnpkg.com/gcs-resumable-upload/-/gcs-resumable-upload-0.8.2.tgz#37df02470430395a789a637e72cabc80677ae964"
1110 | dependencies:
1111 | buffer-equal "^1.0.0"
1112 | configstore "^3.0.0"
1113 | google-auto-auth "^0.7.1"
1114 | pumpify "^1.3.3"
1115 | request "^2.81.0"
1116 | stream-events "^1.0.1"
1117 | through2 "^2.0.0"
1118 |
1119 | generic-pool@^3.1.4:
1120 | version "3.2.0"
1121 | resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.2.0.tgz#c1d485ecbd6f18c0513d4741d098a6715eaeeca8"
1122 |
1123 | geopoint@^1.0.1:
1124 | version "1.0.1"
1125 | resolved "https://registry.yarnpkg.com/geopoint/-/geopoint-1.0.1.tgz#08db0048b4cb935badd5f9a2c0b2e207ca4b7f24"
1126 |
1127 | getpass@^0.1.1:
1128 | version "0.1.7"
1129 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
1130 | dependencies:
1131 | assert-plus "^1.0.0"
1132 |
1133 | glob@^7.0.3, glob@^7.0.5:
1134 | version "7.1.2"
1135 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
1136 | dependencies:
1137 | fs.realpath "^1.0.0"
1138 | inflight "^1.0.4"
1139 | inherits "2"
1140 | minimatch "^3.0.4"
1141 | once "^1.3.0"
1142 | path-is-absolute "^1.0.0"
1143 |
1144 | globby@^6.1.0:
1145 | version "6.1.0"
1146 | resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
1147 | dependencies:
1148 | array-union "^1.0.1"
1149 | glob "^7.0.3"
1150 | object-assign "^4.0.1"
1151 | pify "^2.0.0"
1152 | pinkie-promise "^2.0.0"
1153 |
1154 | google-auth-library@0.12.0, google-auth-library@^0.12.0:
1155 | version "0.12.0"
1156 | resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-0.12.0.tgz#a3fc6c296d00bb54e4d877ef581a05947330d07f"
1157 | dependencies:
1158 | gtoken "^1.2.3"
1159 | jws "^3.1.4"
1160 | lodash.isstring "^4.0.1"
1161 | lodash.merge "^4.6.0"
1162 | request "^2.81.0"
1163 |
1164 | google-auth-library@^0.10.0:
1165 | version "0.10.0"
1166 | resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-0.10.0.tgz#6e15babee85fd1dd14d8d128a295b6838d52136e"
1167 | dependencies:
1168 | gtoken "^1.2.1"
1169 | jws "^3.1.4"
1170 | lodash.noop "^3.0.1"
1171 | request "^2.74.0"
1172 |
1173 | google-auto-auth@^0.5.2:
1174 | version "0.5.4"
1175 | resolved "https://registry.yarnpkg.com/google-auto-auth/-/google-auto-auth-0.5.4.tgz#1d86c7928d633e75a9c1ab034a527efcce4a40b1"
1176 | dependencies:
1177 | async "^2.1.2"
1178 | google-auth-library "^0.10.0"
1179 | object-assign "^3.0.0"
1180 | request "^2.79.0"
1181 |
1182 | google-auto-auth@^0.7.1, google-auto-auth@^0.7.2:
1183 | version "0.7.2"
1184 | resolved "https://registry.yarnpkg.com/google-auto-auth/-/google-auto-auth-0.7.2.tgz#bf9352d5c4a0897bf31fd9c491028b765fbea71e"
1185 | dependencies:
1186 | async "^2.3.0"
1187 | gcp-metadata "^0.3.0"
1188 | google-auth-library "^0.10.0"
1189 | request "^2.79.0"
1190 |
1191 | google-auto-auth@^0.8.0:
1192 | version "0.8.1"
1193 | resolved "https://registry.yarnpkg.com/google-auto-auth/-/google-auto-auth-0.8.1.tgz#9658451040db4f8ae7d09a213a36184aac9197ca"
1194 | dependencies:
1195 | async "^2.3.0"
1196 | gcp-metadata "^0.3.0"
1197 | google-auth-library "^0.12.0"
1198 | request "^2.79.0"
1199 |
1200 | google-auto-auth@^0.9.0:
1201 | version "0.9.0"
1202 | resolved "https://registry.yarnpkg.com/google-auto-auth/-/google-auto-auth-0.9.0.tgz#83ca1236c39e1d4f8e497a1157d3acc5dfcf4e9a"
1203 | dependencies:
1204 | async "^2.3.0"
1205 | gcp-metadata "^0.3.0"
1206 | google-auth-library "^0.12.0"
1207 | request "^2.79.0"
1208 |
1209 | google-cloud@^0.57.0:
1210 | version "0.57.0"
1211 | resolved "https://registry.yarnpkg.com/google-cloud/-/google-cloud-0.57.0.tgz#afec0aa18ecae539c1a2d25556d70cd79d87dfe5"
1212 | dependencies:
1213 | "@google-cloud/bigquery" "^0.9.0"
1214 | "@google-cloud/bigtable" "^0.10.0"
1215 | "@google-cloud/compute" "^0.8.0"
1216 | "@google-cloud/datastore" "^1.0.0"
1217 | "@google-cloud/dlp" "^0.1.0"
1218 | "@google-cloud/dns" "^0.6.0"
1219 | "@google-cloud/firestore" "^0.8.0"
1220 | "@google-cloud/language" "^0.12.1"
1221 | "@google-cloud/logging" "^1.0.0"
1222 | "@google-cloud/monitoring" "^0.3.0"
1223 | "@google-cloud/prediction" "^0.6.0"
1224 | "@google-cloud/pubsub" "^0.14.3"
1225 | "@google-cloud/resource" "^0.7.0"
1226 | "@google-cloud/spanner" "^0.7.1"
1227 | "@google-cloud/speech" "^0.10.3"
1228 | "@google-cloud/storage" "^1.0.0"
1229 | "@google-cloud/translate" "^1.0.0"
1230 | "@google-cloud/video-intelligence" "^0.3.2"
1231 | "@google-cloud/vision" "^0.12.0"
1232 | extend "^3.0.0"
1233 |
1234 | google-gax@^0.13.0, google-gax@^0.13.2, google-gax@^0.13.5:
1235 | version "0.13.5"
1236 | resolved "https://registry.yarnpkg.com/google-gax/-/google-gax-0.13.5.tgz#3a48cc52b7e164f731938f37eadd2b73f7c493d7"
1237 | dependencies:
1238 | extend "^3.0.0"
1239 | globby "^6.1.0"
1240 | google-auto-auth "^0.5.2"
1241 | google-proto-files "^0.13.1"
1242 | grpc "^1.2"
1243 | is-stream-ended "^0.1.0"
1244 | lodash "^4.17.2"
1245 | process-nextick-args "^1.0.7"
1246 | protobufjs "^6.8.0"
1247 | readable-stream "^2.2.2"
1248 | through2 "^2.0.3"
1249 |
1250 | google-gax@^0.14.0, google-gax@^0.14.1, google-gax@^0.14.2:
1251 | version "0.14.2"
1252 | resolved "https://registry.yarnpkg.com/google-gax/-/google-gax-0.14.2.tgz#2b1f2b86e8be98a620041cee710e4f4ce61b6e2b"
1253 | dependencies:
1254 | extend "^3.0.0"
1255 | globby "^6.1.0"
1256 | google-auto-auth "^0.7.2"
1257 | google-proto-files "^0.13.1"
1258 | grpc "^1.2"
1259 | is-stream-ended "^0.1.0"
1260 | lodash "^4.17.2"
1261 | process-nextick-args "^1.0.7"
1262 | protobufjs "^6.8.0"
1263 | readable-stream "^2.2.2"
1264 | through2 "^2.0.3"
1265 |
1266 | google-p12-pem@^0.1.0:
1267 | version "0.1.2"
1268 | resolved "https://registry.yarnpkg.com/google-p12-pem/-/google-p12-pem-0.1.2.tgz#33c46ab021aa734fa0332b3960a9a3ffcb2f3177"
1269 | dependencies:
1270 | node-forge "^0.7.1"
1271 |
1272 | google-proto-files@^0.12.0:
1273 | version "0.12.1"
1274 | resolved "https://registry.yarnpkg.com/google-proto-files/-/google-proto-files-0.12.1.tgz#6434dc7e025a0d0c82e5f04e615c737d6a4c4387"
1275 |
1276 | google-proto-files@^0.13.0, google-proto-files@^0.13.1:
1277 | version "0.13.1"
1278 | resolved "https://registry.yarnpkg.com/google-proto-files/-/google-proto-files-0.13.1.tgz#fcf123637d1811612d6a4cb030fd14516b5aec4b"
1279 |
1280 | googleapis@^23.0.0:
1281 | version "23.0.0"
1282 | resolved "https://registry.yarnpkg.com/googleapis/-/googleapis-23.0.0.tgz#02cbe8c56d346e2e8fb0ef8aec52e722322c6fe7"
1283 | dependencies:
1284 | async "2.6.0"
1285 | google-auth-library "0.12.0"
1286 | string-template "1.0.0"
1287 |
1288 | got@^4.1.1:
1289 | version "4.2.0"
1290 | resolved "https://registry.yarnpkg.com/got/-/got-4.2.0.tgz#af59f461834bfafd722cba01acf4c14a9dd5da06"
1291 | dependencies:
1292 | create-error-class "^2.0.0"
1293 | duplexify "^3.2.0"
1294 | is-plain-obj "^1.0.0"
1295 | is-redirect "^1.0.0"
1296 | is-stream "^1.0.0"
1297 | lowercase-keys "^1.0.0"
1298 | node-status-codes "^1.0.0"
1299 | object-assign "^3.0.0"
1300 | parse-json "^2.1.0"
1301 | pinkie-promise "^1.0.0"
1302 | prepend-http "^1.0.0"
1303 | read-all-stream "^3.0.0"
1304 | timed-out "^2.0.0"
1305 | unzip-response "^1.0.0"
1306 |
1307 | graceful-fs@^4.1.11, graceful-fs@^4.1.2:
1308 | version "4.1.11"
1309 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
1310 |
1311 | grpc@^1.2, grpc@^1.6.0, grpc@^1.7.1:
1312 | version "1.8.0"
1313 | resolved "https://registry.yarnpkg.com/grpc/-/grpc-1.8.0.tgz#9d49f1b05c19c4a35c480bd14c632386de6bf664"
1314 | dependencies:
1315 | arguejs "^0.2.3"
1316 | lodash "^4.17.4"
1317 | nan "^2.8.0"
1318 | node-pre-gyp "^0.6.39"
1319 | protobufjs "^5.0.2"
1320 |
1321 | gtoken@^1.2.1, gtoken@^1.2.3:
1322 | version "1.2.3"
1323 | resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-1.2.3.tgz#5509571b8afd4322e124cf66cf68115284c476d8"
1324 | dependencies:
1325 | google-p12-pem "^0.1.0"
1326 | jws "^3.0.0"
1327 | mime "^1.4.1"
1328 | request "^2.72.0"
1329 |
1330 | har-schema@^1.0.5:
1331 | version "1.0.5"
1332 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
1333 |
1334 | har-schema@^2.0.0:
1335 | version "2.0.0"
1336 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
1337 |
1338 | har-validator@~4.2.1:
1339 | version "4.2.1"
1340 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
1341 | dependencies:
1342 | ajv "^4.9.1"
1343 | har-schema "^1.0.5"
1344 |
1345 | har-validator@~5.0.3:
1346 | version "5.0.3"
1347 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd"
1348 | dependencies:
1349 | ajv "^5.1.0"
1350 | har-schema "^2.0.0"
1351 |
1352 | has-unicode@^2.0.0:
1353 | version "2.0.1"
1354 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
1355 |
1356 | hash-stream-validation@^0.2.1:
1357 | version "0.2.1"
1358 | resolved "https://registry.yarnpkg.com/hash-stream-validation/-/hash-stream-validation-0.2.1.tgz#ecc9b997b218be5bb31298628bb807869b73dcd1"
1359 | dependencies:
1360 | through2 "^2.0.0"
1361 |
1362 | hawk@3.1.3, hawk@~3.1.3:
1363 | version "3.1.3"
1364 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
1365 | dependencies:
1366 | boom "2.x.x"
1367 | cryptiles "2.x.x"
1368 | hoek "2.x.x"
1369 | sntp "1.x.x"
1370 |
1371 | hawk@~6.0.2:
1372 | version "6.0.2"
1373 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038"
1374 | dependencies:
1375 | boom "4.x.x"
1376 | cryptiles "3.x.x"
1377 | hoek "4.x.x"
1378 | sntp "2.x.x"
1379 |
1380 | hoek@2.x.x:
1381 | version "2.16.3"
1382 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
1383 |
1384 | hoek@4.x.x:
1385 | version "4.2.0"
1386 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d"
1387 |
1388 | html-tags@^1.0.0:
1389 | version "1.2.0"
1390 | resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-1.2.0.tgz#c78de65b5663aa597989dd2b7ab49200d7e4db98"
1391 |
1392 | http-errors@1.6.2, http-errors@~1.6.2:
1393 | version "1.6.2"
1394 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
1395 | dependencies:
1396 | depd "1.1.1"
1397 | inherits "2.0.3"
1398 | setprototypeof "1.0.3"
1399 | statuses ">= 1.3.1 < 2"
1400 |
1401 | http-parser-js@>=0.4.0:
1402 | version "0.4.9"
1403 | resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.9.tgz#ea1a04fb64adff0242e9974f297dd4c3cad271e1"
1404 |
1405 | http-signature@~1.1.0:
1406 | version "1.1.1"
1407 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
1408 | dependencies:
1409 | assert-plus "^0.2.0"
1410 | jsprim "^1.2.2"
1411 | sshpk "^1.7.0"
1412 |
1413 | http-signature@~1.2.0:
1414 | version "1.2.0"
1415 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
1416 | dependencies:
1417 | assert-plus "^1.0.0"
1418 | jsprim "^1.2.2"
1419 | sshpk "^1.7.0"
1420 |
1421 | iconv-lite@0.4.19:
1422 | version "0.4.19"
1423 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
1424 |
1425 | imurmurhash@^0.1.4:
1426 | version "0.1.4"
1427 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
1428 |
1429 | inflight@^1.0.4:
1430 | version "1.0.6"
1431 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
1432 | dependencies:
1433 | once "^1.3.0"
1434 | wrappy "1"
1435 |
1436 | inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
1437 | version "2.0.3"
1438 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
1439 |
1440 | ini@~1.3.0:
1441 | version "1.3.5"
1442 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
1443 |
1444 | invert-kv@^1.0.0:
1445 | version "1.0.0"
1446 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
1447 |
1448 | ipaddr.js@1.5.2:
1449 | version "1.5.2"
1450 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0"
1451 |
1452 | is-arrayish@^0.2.1:
1453 | version "0.2.1"
1454 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
1455 |
1456 | is-fullwidth-code-point@^1.0.0:
1457 | version "1.0.0"
1458 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
1459 | dependencies:
1460 | number-is-nan "^1.0.0"
1461 |
1462 | is-html@^1.0.0:
1463 | version "1.1.0"
1464 | resolved "https://registry.yarnpkg.com/is-html/-/is-html-1.1.0.tgz#e04f1c18d39485111396f9a0273eab51af218464"
1465 | dependencies:
1466 | html-tags "^1.0.0"
1467 |
1468 | is-obj@^1.0.0:
1469 | version "1.0.1"
1470 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
1471 |
1472 | is-plain-obj@^1.0.0:
1473 | version "1.1.0"
1474 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
1475 |
1476 | is-redirect@^1.0.0:
1477 | version "1.0.0"
1478 | resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
1479 |
1480 | is-stream-ended@^0.1.0:
1481 | version "0.1.3"
1482 | resolved "https://registry.yarnpkg.com/is-stream-ended/-/is-stream-ended-0.1.3.tgz#a0473b267c756635486beedc7e3344e549d152ac"
1483 |
1484 | is-stream@^1.0.0:
1485 | version "1.1.0"
1486 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
1487 |
1488 | is-typedarray@~1.0.0:
1489 | version "1.0.0"
1490 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
1491 |
1492 | is@^3.0.1, is@^3.1.0, is@^3.2.0:
1493 | version "3.2.1"
1494 | resolved "https://registry.yarnpkg.com/is/-/is-3.2.1.tgz#d0ac2ad55eb7b0bec926a5266f6c662aaa83dca5"
1495 |
1496 | isarray@0.0.1:
1497 | version "0.0.1"
1498 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
1499 |
1500 | isarray@~1.0.0:
1501 | version "1.0.0"
1502 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
1503 |
1504 | isemail@1.x.x:
1505 | version "1.2.0"
1506 | resolved "https://registry.yarnpkg.com/isemail/-/isemail-1.2.0.tgz#be03df8cc3e29de4d2c5df6501263f1fa4595e9a"
1507 |
1508 | isstream@~0.1.2:
1509 | version "0.1.2"
1510 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
1511 |
1512 | joi@^6.10.1:
1513 | version "6.10.1"
1514 | resolved "https://registry.yarnpkg.com/joi/-/joi-6.10.1.tgz#4d50c318079122000fe5f16af1ff8e1917b77e06"
1515 | dependencies:
1516 | hoek "2.x.x"
1517 | isemail "1.x.x"
1518 | moment "2.x.x"
1519 | topo "1.x.x"
1520 |
1521 | jsbn@~0.1.0:
1522 | version "0.1.1"
1523 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
1524 |
1525 | json-schema-traverse@^0.3.0:
1526 | version "0.3.1"
1527 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
1528 |
1529 | json-schema@0.2.3:
1530 | version "0.2.3"
1531 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
1532 |
1533 | json-stable-stringify@^1.0.1:
1534 | version "1.0.1"
1535 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
1536 | dependencies:
1537 | jsonify "~0.0.0"
1538 |
1539 | json-stringify-safe@~5.0.1:
1540 | version "5.0.1"
1541 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
1542 |
1543 | jsonify@~0.0.0:
1544 | version "0.0.0"
1545 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
1546 |
1547 | jsonparse@^1.2.0:
1548 | version "1.3.1"
1549 | resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
1550 |
1551 | jsonwebtoken@7.4.3, jsonwebtoken@^7.1.9:
1552 | version "7.4.3"
1553 | resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-7.4.3.tgz#77f5021de058b605a1783fa1283e99812e645638"
1554 | dependencies:
1555 | joi "^6.10.1"
1556 | jws "^3.1.4"
1557 | lodash.once "^4.0.0"
1558 | ms "^2.0.0"
1559 | xtend "^4.0.1"
1560 |
1561 | jsprim@^1.2.2:
1562 | version "1.4.1"
1563 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
1564 | dependencies:
1565 | assert-plus "1.0.0"
1566 | extsprintf "1.3.0"
1567 | json-schema "0.2.3"
1568 | verror "1.10.0"
1569 |
1570 | jwa@^1.1.4:
1571 | version "1.1.5"
1572 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.5.tgz#a0552ce0220742cd52e153774a32905c30e756e5"
1573 | dependencies:
1574 | base64url "2.0.0"
1575 | buffer-equal-constant-time "1.0.1"
1576 | ecdsa-sig-formatter "1.0.9"
1577 | safe-buffer "^5.0.1"
1578 |
1579 | jws@^3.0.0, jws@^3.1.4:
1580 | version "3.1.4"
1581 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.4.tgz#f9e8b9338e8a847277d6444b1464f61880e050a2"
1582 | dependencies:
1583 | base64url "^2.0.0"
1584 | jwa "^1.1.4"
1585 | safe-buffer "^5.0.1"
1586 |
1587 | lcid@^1.0.0:
1588 | version "1.0.0"
1589 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
1590 | dependencies:
1591 | invert-kv "^1.0.0"
1592 |
1593 | lodash.chunk@^4.2.0:
1594 | version "4.2.0"
1595 | resolved "https://registry.yarnpkg.com/lodash.chunk/-/lodash.chunk-4.2.0.tgz#66e5ce1f76ed27b4303d8c6512e8d1216e8106bc"
1596 |
1597 | lodash.flatten@^4.2.0, lodash.flatten@^4.4.0:
1598 | version "4.4.0"
1599 | resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
1600 |
1601 | lodash.isstring@^4.0.1:
1602 | version "4.0.1"
1603 | resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
1604 |
1605 | lodash.merge@^4.6.0:
1606 | version "4.6.0"
1607 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5"
1608 |
1609 | lodash.noop@^3.0.1:
1610 | version "3.0.1"
1611 | resolved "https://registry.yarnpkg.com/lodash.noop/-/lodash.noop-3.0.1.tgz#38188f4d650a3a474258439b96ec45b32617133c"
1612 |
1613 | lodash.once@^4.0.0:
1614 | version "4.1.1"
1615 | resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac"
1616 |
1617 | lodash.snakecase@^4.1.1:
1618 | version "4.1.1"
1619 | resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d"
1620 |
1621 | lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.6.1:
1622 | version "4.17.4"
1623 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
1624 |
1625 | log-driver@^1.2.5:
1626 | version "1.2.5"
1627 | resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.5.tgz#7ae4ec257302fd790d557cb10c97100d857b0056"
1628 |
1629 | long@^3.2.0, long@~3:
1630 | version "3.2.0"
1631 | resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b"
1632 |
1633 | lowercase-keys@^1.0.0:
1634 | version "1.0.0"
1635 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306"
1636 |
1637 | make-dir@^1.0.0:
1638 | version "1.1.0"
1639 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51"
1640 | dependencies:
1641 | pify "^3.0.0"
1642 |
1643 | map-obj@~2.0.0:
1644 | version "2.0.0"
1645 | resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9"
1646 |
1647 | media-typer@0.3.0:
1648 | version "0.3.0"
1649 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
1650 |
1651 | merge-descriptors@1.0.1:
1652 | version "1.0.1"
1653 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
1654 |
1655 | merge-stream@^1.0.1:
1656 | version "1.0.1"
1657 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1"
1658 | dependencies:
1659 | readable-stream "^2.0.1"
1660 |
1661 | methmeth@^1.0.0, methmeth@^1.1.0:
1662 | version "1.1.0"
1663 | resolved "https://registry.yarnpkg.com/methmeth/-/methmeth-1.1.0.tgz#e80a26618e52f5c4222861bb748510bd10e29089"
1664 |
1665 | methods@~1.1.2:
1666 | version "1.1.2"
1667 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
1668 |
1669 | mime-db@~1.30.0:
1670 | version "1.30.0"
1671 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01"
1672 |
1673 | mime-types@^2.0.8, mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7:
1674 | version "2.1.17"
1675 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a"
1676 | dependencies:
1677 | mime-db "~1.30.0"
1678 |
1679 | mime@1.4.1:
1680 | version "1.4.1"
1681 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
1682 |
1683 | mime@^1.4.1:
1684 | version "1.6.0"
1685 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
1686 |
1687 | minimatch@^3.0.0, minimatch@^3.0.4:
1688 | version "3.0.4"
1689 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
1690 | dependencies:
1691 | brace-expansion "^1.1.7"
1692 |
1693 | minimist@0.0.8:
1694 | version "0.0.8"
1695 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
1696 |
1697 | minimist@^1.2.0:
1698 | version "1.2.0"
1699 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
1700 |
1701 | "mkdirp@>=0.5 0", mkdirp@^0.5.1:
1702 | version "0.5.1"
1703 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
1704 | dependencies:
1705 | minimist "0.0.8"
1706 |
1707 | modelo@^4.2.0:
1708 | version "4.2.0"
1709 | resolved "https://registry.yarnpkg.com/modelo/-/modelo-4.2.0.tgz#3b4b420023a66ca7e32bdba16e710937e14d1b0b"
1710 |
1711 | moment@2.x.x:
1712 | version "2.19.4"
1713 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.19.4.tgz#17e5e2c6ead8819c8ecfad83a0acccb312e94682"
1714 |
1715 | ms@2.0.0:
1716 | version "2.0.0"
1717 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
1718 |
1719 | ms@^2.0.0:
1720 | version "2.1.1"
1721 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
1722 |
1723 | nan@^2.8.0:
1724 | version "2.8.0"
1725 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a"
1726 |
1727 | negotiator@0.6.1:
1728 | version "0.6.1"
1729 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
1730 |
1731 | node-forge@0.7.1, node-forge@^0.7.1:
1732 | version "0.7.1"
1733 | resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.1.tgz#9da611ea08982f4b94206b3beb4cc9665f20c300"
1734 |
1735 | node-int64@^0.4.0:
1736 | version "0.4.0"
1737 | resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
1738 |
1739 | node-pre-gyp@^0.6.39:
1740 | version "0.6.39"
1741 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649"
1742 | dependencies:
1743 | detect-libc "^1.0.2"
1744 | hawk "3.1.3"
1745 | mkdirp "^0.5.1"
1746 | nopt "^4.0.1"
1747 | npmlog "^4.0.2"
1748 | rc "^1.1.7"
1749 | request "2.81.0"
1750 | rimraf "^2.6.1"
1751 | semver "^5.3.0"
1752 | tar "^2.2.1"
1753 | tar-pack "^3.4.0"
1754 |
1755 | node-status-codes@^1.0.0:
1756 | version "1.0.0"
1757 | resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f"
1758 |
1759 | nopt@^4.0.1:
1760 | version "4.0.1"
1761 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
1762 | dependencies:
1763 | abbrev "1"
1764 | osenv "^0.1.4"
1765 |
1766 | npmlog@^4.0.2:
1767 | version "4.1.2"
1768 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
1769 | dependencies:
1770 | are-we-there-yet "~1.1.2"
1771 | console-control-strings "~1.1.0"
1772 | gauge "~2.7.3"
1773 | set-blocking "~2.0.0"
1774 |
1775 | number-is-nan@^1.0.0:
1776 | version "1.0.1"
1777 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
1778 |
1779 | oauth-sign@~0.8.1, oauth-sign@~0.8.2:
1780 | version "0.8.2"
1781 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
1782 |
1783 | object-assign@^3.0.0:
1784 | version "3.0.0"
1785 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
1786 |
1787 | object-assign@^4.0.1, object-assign@^4.1.0:
1788 | version "4.1.1"
1789 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
1790 |
1791 | on-finished@~2.3.0:
1792 | version "2.3.0"
1793 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
1794 | dependencies:
1795 | ee-first "1.1.1"
1796 |
1797 | once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0:
1798 | version "1.4.0"
1799 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
1800 | dependencies:
1801 | wrappy "1"
1802 |
1803 | optjs@~3.2.2:
1804 | version "3.2.2"
1805 | resolved "https://registry.yarnpkg.com/optjs/-/optjs-3.2.2.tgz#69a6ce89c442a44403141ad2f9b370bd5bb6f4ee"
1806 |
1807 | os-homedir@^1.0.0:
1808 | version "1.0.2"
1809 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
1810 |
1811 | os-locale@^1.4.0:
1812 | version "1.4.0"
1813 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
1814 | dependencies:
1815 | lcid "^1.0.0"
1816 |
1817 | os-tmpdir@^1.0.0:
1818 | version "1.0.2"
1819 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
1820 |
1821 | osenv@^0.1.4:
1822 | version "0.1.4"
1823 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644"
1824 | dependencies:
1825 | os-homedir "^1.0.0"
1826 | os-tmpdir "^1.0.0"
1827 |
1828 | parse-json@^2.1.0:
1829 | version "2.2.0"
1830 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
1831 | dependencies:
1832 | error-ex "^1.2.0"
1833 |
1834 | parseurl@~1.3.2:
1835 | version "1.3.2"
1836 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
1837 |
1838 | path-is-absolute@^1.0.0:
1839 | version "1.0.1"
1840 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
1841 |
1842 | path-to-regexp@0.1.7:
1843 | version "0.1.7"
1844 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
1845 |
1846 | performance-now@^0.2.0:
1847 | version "0.2.0"
1848 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
1849 |
1850 | performance-now@^2.1.0:
1851 | version "2.1.0"
1852 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
1853 |
1854 | pify@^2.0.0:
1855 | version "2.3.0"
1856 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
1857 |
1858 | pify@^3.0.0:
1859 | version "3.0.0"
1860 | resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
1861 |
1862 | pinkie-promise@^1.0.0:
1863 | version "1.0.0"
1864 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-1.0.0.tgz#d1da67f5482563bb7cf57f286ae2822ecfbf3670"
1865 | dependencies:
1866 | pinkie "^1.0.0"
1867 |
1868 | pinkie-promise@^2.0.0:
1869 | version "2.0.1"
1870 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
1871 | dependencies:
1872 | pinkie "^2.0.0"
1873 |
1874 | pinkie@^1.0.0:
1875 | version "1.0.0"
1876 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-1.0.0.tgz#5a47f28ba1015d0201bda7bf0f358e47bec8c7e4"
1877 |
1878 | pinkie@^2.0.0:
1879 | version "2.0.4"
1880 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
1881 |
1882 | prepend-http@^1.0.0:
1883 | version "1.0.4"
1884 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
1885 |
1886 | process-nextick-args@^1.0.7, process-nextick-args@~1.0.6:
1887 | version "1.0.7"
1888 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
1889 |
1890 | prop-assign@^1.0.0:
1891 | version "1.0.0"
1892 | resolved "https://registry.yarnpkg.com/prop-assign/-/prop-assign-1.0.0.tgz#9767a1fbfd7093908647a6e846d31b4feaa70459"
1893 |
1894 | propprop@^0.3.0:
1895 | version "0.3.1"
1896 | resolved "https://registry.yarnpkg.com/propprop/-/propprop-0.3.1.tgz#a049a3568b896440067d15d8ec9f33735e570178"
1897 |
1898 | protobufjs@^5.0.2:
1899 | version "5.0.2"
1900 | resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-5.0.2.tgz#59748d7dcf03d2db22c13da9feb024e16ab80c91"
1901 | dependencies:
1902 | ascli "~1"
1903 | bytebuffer "~5"
1904 | glob "^7.0.5"
1905 | yargs "^3.10.0"
1906 |
1907 | protobufjs@^6.8.0:
1908 | version "6.8.3"
1909 | resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.8.3.tgz#d3746fae45f6b2fe77e7e6761471e41080164b19"
1910 | dependencies:
1911 | "@protobufjs/aspromise" "^1.1.2"
1912 | "@protobufjs/base64" "^1.1.2"
1913 | "@protobufjs/codegen" "^2.0.4"
1914 | "@protobufjs/eventemitter" "^1.1.0"
1915 | "@protobufjs/fetch" "^1.1.0"
1916 | "@protobufjs/float" "^1.0.2"
1917 | "@protobufjs/inquire" "^1.1.0"
1918 | "@protobufjs/path" "^1.1.2"
1919 | "@protobufjs/pool" "^1.1.0"
1920 | "@protobufjs/utf8" "^1.1.0"
1921 | "@types/long" "^3.0.32"
1922 | "@types/node" "^8.0.53"
1923 | long "^3.2.0"
1924 |
1925 | proxy-addr@~2.0.2:
1926 | version "2.0.2"
1927 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec"
1928 | dependencies:
1929 | forwarded "~0.1.2"
1930 | ipaddr.js "1.5.2"
1931 |
1932 | pump@^1.0.0:
1933 | version "1.0.3"
1934 | resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954"
1935 | dependencies:
1936 | end-of-stream "^1.1.0"
1937 | once "^1.3.1"
1938 |
1939 | pumpify@^1.3.3, pumpify@^1.3.5:
1940 | version "1.3.5"
1941 | resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.3.5.tgz#1b671c619940abcaeac0ad0e3a3c164be760993b"
1942 | dependencies:
1943 | duplexify "^3.1.2"
1944 | inherits "^2.0.1"
1945 | pump "^1.0.0"
1946 |
1947 | punycode@^1.4.1:
1948 | version "1.4.1"
1949 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
1950 |
1951 | qs@6.5.1, qs@~6.5.1:
1952 | version "6.5.1"
1953 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
1954 |
1955 | qs@~6.4.0:
1956 | version "6.4.0"
1957 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
1958 |
1959 | range-parser@~1.2.0:
1960 | version "1.2.0"
1961 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
1962 |
1963 | raw-body@2.3.2:
1964 | version "2.3.2"
1965 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89"
1966 | dependencies:
1967 | bytes "3.0.0"
1968 | http-errors "1.6.2"
1969 | iconv-lite "0.4.19"
1970 | unpipe "1.0.0"
1971 |
1972 | rc@^1.1.7:
1973 | version "1.2.2"
1974 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.2.tgz#d8ce9cb57e8d64d9c7badd9876c7c34cbe3c7077"
1975 | dependencies:
1976 | deep-extend "~0.4.0"
1977 | ini "~1.3.0"
1978 | minimist "^1.2.0"
1979 | strip-json-comments "~2.0.1"
1980 |
1981 | read-all-stream@^3.0.0:
1982 | version "3.1.0"
1983 | resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa"
1984 | dependencies:
1985 | pinkie-promise "^2.0.0"
1986 | readable-stream "^2.0.0"
1987 |
1988 | readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2:
1989 | version "2.3.3"
1990 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c"
1991 | dependencies:
1992 | core-util-is "~1.0.0"
1993 | inherits "~2.0.3"
1994 | isarray "~1.0.0"
1995 | process-nextick-args "~1.0.6"
1996 | safe-buffer "~5.1.1"
1997 | string_decoder "~1.0.3"
1998 | util-deprecate "~1.0.1"
1999 |
2000 | readable-stream@~1.0.32:
2001 | version "1.0.34"
2002 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
2003 | dependencies:
2004 | core-util-is "~1.0.0"
2005 | inherits "~2.0.1"
2006 | isarray "0.0.1"
2007 | string_decoder "~0.10.x"
2008 |
2009 | request@2.81.0:
2010 | version "2.81.0"
2011 | resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
2012 | dependencies:
2013 | aws-sign2 "~0.6.0"
2014 | aws4 "^1.2.1"
2015 | caseless "~0.12.0"
2016 | combined-stream "~1.0.5"
2017 | extend "~3.0.0"
2018 | forever-agent "~0.6.1"
2019 | form-data "~2.1.1"
2020 | har-validator "~4.2.1"
2021 | hawk "~3.1.3"
2022 | http-signature "~1.1.0"
2023 | is-typedarray "~1.0.0"
2024 | isstream "~0.1.2"
2025 | json-stringify-safe "~5.0.1"
2026 | mime-types "~2.1.7"
2027 | oauth-sign "~0.8.1"
2028 | performance-now "^0.2.0"
2029 | qs "~6.4.0"
2030 | safe-buffer "^5.0.1"
2031 | stringstream "~0.0.4"
2032 | tough-cookie "~2.3.0"
2033 | tunnel-agent "^0.6.0"
2034 | uuid "^3.0.0"
2035 |
2036 | request@^2.72.0, request@^2.74.0, request@^2.79.0, request@^2.81.0, request@^2.83.0:
2037 | version "2.83.0"
2038 | resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356"
2039 | dependencies:
2040 | aws-sign2 "~0.7.0"
2041 | aws4 "^1.6.0"
2042 | caseless "~0.12.0"
2043 | combined-stream "~1.0.5"
2044 | extend "~3.0.1"
2045 | forever-agent "~0.6.1"
2046 | form-data "~2.3.1"
2047 | har-validator "~5.0.3"
2048 | hawk "~6.0.2"
2049 | http-signature "~1.2.0"
2050 | is-typedarray "~1.0.0"
2051 | isstream "~0.1.2"
2052 | json-stringify-safe "~5.0.1"
2053 | mime-types "~2.1.17"
2054 | oauth-sign "~0.8.2"
2055 | performance-now "^2.1.0"
2056 | qs "~6.5.1"
2057 | safe-buffer "^5.1.1"
2058 | stringstream "~0.0.5"
2059 | tough-cookie "~2.3.3"
2060 | tunnel-agent "^0.6.0"
2061 | uuid "^3.1.0"
2062 |
2063 | retry-request@^3.0.0:
2064 | version "3.3.1"
2065 | resolved "https://registry.yarnpkg.com/retry-request/-/retry-request-3.3.1.tgz#fb71276235a617e97551e9be737ab5b91591fb9e"
2066 | dependencies:
2067 | request "^2.81.0"
2068 | through2 "^2.0.0"
2069 |
2070 | rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1:
2071 | version "2.6.2"
2072 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
2073 | dependencies:
2074 | glob "^7.0.5"
2075 |
2076 | safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
2077 | version "5.1.1"
2078 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
2079 |
2080 | semver@^5.3.0:
2081 | version "5.4.1"
2082 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
2083 |
2084 | send@0.16.1:
2085 | version "0.16.1"
2086 | resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3"
2087 | dependencies:
2088 | debug "2.6.9"
2089 | depd "~1.1.1"
2090 | destroy "~1.0.4"
2091 | encodeurl "~1.0.1"
2092 | escape-html "~1.0.3"
2093 | etag "~1.8.1"
2094 | fresh "0.5.2"
2095 | http-errors "~1.6.2"
2096 | mime "1.4.1"
2097 | ms "2.0.0"
2098 | on-finished "~2.3.0"
2099 | range-parser "~1.2.0"
2100 | statuses "~1.3.1"
2101 |
2102 | serve-static@1.13.1:
2103 | version "1.13.1"
2104 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719"
2105 | dependencies:
2106 | encodeurl "~1.0.1"
2107 | escape-html "~1.0.3"
2108 | parseurl "~1.3.2"
2109 | send "0.16.1"
2110 |
2111 | set-blocking@~2.0.0:
2112 | version "2.0.0"
2113 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
2114 |
2115 | setprototypeof@1.0.3:
2116 | version "1.0.3"
2117 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
2118 |
2119 | setprototypeof@1.1.0:
2120 | version "1.1.0"
2121 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
2122 |
2123 | sha1@^1.1.1:
2124 | version "1.1.1"
2125 | resolved "https://registry.yarnpkg.com/sha1/-/sha1-1.1.1.tgz#addaa7a93168f393f19eb2b15091618e2700f848"
2126 | dependencies:
2127 | charenc ">= 0.0.1"
2128 | crypt ">= 0.0.1"
2129 |
2130 | signal-exit@^3.0.0, signal-exit@^3.0.2:
2131 | version "3.0.2"
2132 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
2133 |
2134 | snakecase-keys@^1.1.0:
2135 | version "1.1.0"
2136 | resolved "https://registry.yarnpkg.com/snakecase-keys/-/snakecase-keys-1.1.0.tgz#1adb17ddf7531c210cc293336f93d0ef1f8e73b8"
2137 | dependencies:
2138 | map-obj "~2.0.0"
2139 | to-snake-case "~0.1.2"
2140 |
2141 | snakeize@^0.1.0:
2142 | version "0.1.0"
2143 | resolved "https://registry.yarnpkg.com/snakeize/-/snakeize-0.1.0.tgz#10c088d8b58eb076b3229bb5a04e232ce126422d"
2144 |
2145 | sntp@1.x.x:
2146 | version "1.0.9"
2147 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
2148 | dependencies:
2149 | hoek "2.x.x"
2150 |
2151 | sntp@2.x.x:
2152 | version "2.1.0"
2153 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8"
2154 | dependencies:
2155 | hoek "4.x.x"
2156 |
2157 | split-array-stream@^1.0.0:
2158 | version "1.0.3"
2159 | resolved "https://registry.yarnpkg.com/split-array-stream/-/split-array-stream-1.0.3.tgz#d2b75a8e5e0d824d52fdec8b8225839dc2e35dfa"
2160 | dependencies:
2161 | async "^2.4.0"
2162 | is-stream-ended "^0.1.0"
2163 |
2164 | sshpk@^1.7.0:
2165 | version "1.13.1"
2166 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3"
2167 | dependencies:
2168 | asn1 "~0.2.3"
2169 | assert-plus "^1.0.0"
2170 | dashdash "^1.12.0"
2171 | getpass "^0.1.1"
2172 | optionalDependencies:
2173 | bcrypt-pbkdf "^1.0.0"
2174 | ecc-jsbn "~0.1.1"
2175 | jsbn "~0.1.0"
2176 | tweetnacl "~0.14.0"
2177 |
2178 | "statuses@>= 1.3.1 < 2":
2179 | version "1.4.0"
2180 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
2181 |
2182 | statuses@~1.3.1:
2183 | version "1.3.1"
2184 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
2185 |
2186 | stream-events@^1.0.1, stream-events@^1.0.2:
2187 | version "1.0.2"
2188 | resolved "https://registry.yarnpkg.com/stream-events/-/stream-events-1.0.2.tgz#abf39f66c0890a4eb795bc8d5e859b2615b590b2"
2189 | dependencies:
2190 | stubs "^3.0.0"
2191 |
2192 | stream-shift@^1.0.0:
2193 | version "1.0.0"
2194 | resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
2195 |
2196 | string-format-obj@^1.0.0, string-format-obj@^1.1.0:
2197 | version "1.1.0"
2198 | resolved "https://registry.yarnpkg.com/string-format-obj/-/string-format-obj-1.1.0.tgz#7635610b1ef397013e8478be98a170e04983d068"
2199 |
2200 | string-template@1.0.0:
2201 | version "1.0.0"
2202 | resolved "https://registry.yarnpkg.com/string-template/-/string-template-1.0.0.tgz#9e9f2233dc00f218718ec379a28a5673ecca8b96"
2203 |
2204 | string-width@^1.0.1, string-width@^1.0.2:
2205 | version "1.0.2"
2206 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
2207 | dependencies:
2208 | code-point-at "^1.0.0"
2209 | is-fullwidth-code-point "^1.0.0"
2210 | strip-ansi "^3.0.0"
2211 |
2212 | string_decoder@~0.10.x:
2213 | version "0.10.31"
2214 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
2215 |
2216 | string_decoder@~1.0.3:
2217 | version "1.0.3"
2218 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
2219 | dependencies:
2220 | safe-buffer "~5.1.0"
2221 |
2222 | stringstream@~0.0.4, stringstream@~0.0.5:
2223 | version "0.0.5"
2224 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
2225 |
2226 | strip-ansi@^3.0.0, strip-ansi@^3.0.1:
2227 | version "3.0.1"
2228 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
2229 | dependencies:
2230 | ansi-regex "^2.0.0"
2231 |
2232 | strip-json-comments@~2.0.1:
2233 | version "2.0.1"
2234 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
2235 |
2236 | stubs@^3.0.0:
2237 | version "3.0.0"
2238 | resolved "https://registry.yarnpkg.com/stubs/-/stubs-3.0.0.tgz#e8d2ba1fa9c90570303c030b6900f7d5f89abe5b"
2239 |
2240 | tar-pack@^3.4.0:
2241 | version "3.4.1"
2242 | resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f"
2243 | dependencies:
2244 | debug "^2.2.0"
2245 | fstream "^1.0.10"
2246 | fstream-ignore "^1.0.5"
2247 | once "^1.3.3"
2248 | readable-stream "^2.1.4"
2249 | rimraf "^2.5.1"
2250 | tar "^2.2.1"
2251 | uid-number "^0.0.6"
2252 |
2253 | tar@^2.2.1:
2254 | version "2.2.1"
2255 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
2256 | dependencies:
2257 | block-stream "*"
2258 | fstream "^1.0.2"
2259 | inherits "2"
2260 |
2261 | through2@^2.0.0, through2@^2.0.3:
2262 | version "2.0.3"
2263 | resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
2264 | dependencies:
2265 | readable-stream "^2.1.5"
2266 | xtend "~4.0.1"
2267 |
2268 | "through@>=2.2.7 <3":
2269 | version "2.3.8"
2270 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
2271 |
2272 | timed-out@^2.0.0:
2273 | version "2.0.0"
2274 | resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-2.0.0.tgz#f38b0ae81d3747d628001f41dafc652ace671c0a"
2275 |
2276 | to-no-case@0.1.1:
2277 | version "0.1.1"
2278 | resolved "https://registry.yarnpkg.com/to-no-case/-/to-no-case-0.1.1.tgz#cf33c70e0f28168d95e4159abf150e8c542ef9fe"
2279 |
2280 | to-snake-case@~0.1.2:
2281 | version "0.1.2"
2282 | resolved "https://registry.yarnpkg.com/to-snake-case/-/to-snake-case-0.1.2.tgz#d047b6dbf048dae1bdc260b3c296f54ca34eed7c"
2283 | dependencies:
2284 | to-space-case "0.1.2"
2285 |
2286 | to-space-case@0.1.2:
2287 | version "0.1.2"
2288 | resolved "https://registry.yarnpkg.com/to-space-case/-/to-space-case-0.1.2.tgz#9a66be3ebe53f2779f687f0262effd1fc5b6d15e"
2289 | dependencies:
2290 | to-no-case "0.1.1"
2291 |
2292 | topo@1.x.x:
2293 | version "1.1.0"
2294 | resolved "https://registry.yarnpkg.com/topo/-/topo-1.1.0.tgz#e9d751615d1bb87dc865db182fa1ca0a5ef536d5"
2295 | dependencies:
2296 | hoek "2.x.x"
2297 |
2298 | tough-cookie@~2.3.0, tough-cookie@~2.3.3:
2299 | version "2.3.3"
2300 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561"
2301 | dependencies:
2302 | punycode "^1.4.1"
2303 |
2304 | tunnel-agent@^0.6.0:
2305 | version "0.6.0"
2306 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
2307 | dependencies:
2308 | safe-buffer "^5.0.1"
2309 |
2310 | tweetnacl@^0.14.3, tweetnacl@~0.14.0:
2311 | version "0.14.5"
2312 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
2313 |
2314 | type-is@~1.6.15:
2315 | version "1.6.15"
2316 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410"
2317 | dependencies:
2318 | media-typer "0.3.0"
2319 | mime-types "~2.1.15"
2320 |
2321 | typedarray@^0.0.6:
2322 | version "0.0.6"
2323 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
2324 |
2325 | uid-number@^0.0.6:
2326 | version "0.0.6"
2327 | resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
2328 |
2329 | unique-string@^1.0.0:
2330 | version "1.0.0"
2331 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a"
2332 | dependencies:
2333 | crypto-random-string "^1.0.0"
2334 |
2335 | unpipe@1.0.0, unpipe@~1.0.0:
2336 | version "1.0.0"
2337 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
2338 |
2339 | unzip-response@^1.0.0:
2340 | version "1.0.2"
2341 | resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe"
2342 |
2343 | util-deprecate@~1.0.1:
2344 | version "1.0.2"
2345 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
2346 |
2347 | utils-merge@1.0.1:
2348 | version "1.0.1"
2349 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
2350 |
2351 | uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0:
2352 | version "3.1.0"
2353 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04"
2354 |
2355 | vary@~1.1.2:
2356 | version "1.1.2"
2357 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
2358 |
2359 | verror@1.10.0:
2360 | version "1.10.0"
2361 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
2362 | dependencies:
2363 | assert-plus "^1.0.0"
2364 | core-util-is "1.0.2"
2365 | extsprintf "^1.2.0"
2366 |
2367 | websocket-driver@>=0.5.1:
2368 | version "0.7.0"
2369 | resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb"
2370 | dependencies:
2371 | http-parser-js ">=0.4.0"
2372 | websocket-extensions ">=0.1.1"
2373 |
2374 | websocket-extensions@>=0.1.1:
2375 | version "0.1.3"
2376 | resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29"
2377 |
2378 | wide-align@^1.1.0:
2379 | version "1.1.2"
2380 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710"
2381 | dependencies:
2382 | string-width "^1.0.2"
2383 |
2384 | window-size@^0.1.4:
2385 | version "0.1.4"
2386 | resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876"
2387 |
2388 | wrap-ansi@^2.0.0:
2389 | version "2.1.0"
2390 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
2391 | dependencies:
2392 | string-width "^1.0.1"
2393 | strip-ansi "^3.0.1"
2394 |
2395 | wrappy@1:
2396 | version "1.0.2"
2397 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
2398 |
2399 | write-file-atomic@^2.0.0:
2400 | version "2.3.0"
2401 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab"
2402 | dependencies:
2403 | graceful-fs "^4.1.11"
2404 | imurmurhash "^0.1.4"
2405 | signal-exit "^3.0.2"
2406 |
2407 | xdg-basedir@^3.0.0:
2408 | version "3.0.0"
2409 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
2410 |
2411 | xtend@^4.0.1, xtend@~4.0.1:
2412 | version "4.0.1"
2413 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
2414 |
2415 | y18n@^3.2.0:
2416 | version "3.2.1"
2417 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
2418 |
2419 | yargs@^3.10.0:
2420 | version "3.32.0"
2421 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995"
2422 | dependencies:
2423 | camelcase "^2.0.1"
2424 | cliui "^3.0.3"
2425 | decamelize "^1.1.1"
2426 | os-locale "^1.4.0"
2427 | string-width "^1.0.1"
2428 | window-size "^0.1.4"
2429 | y18n "^3.2.0"
2430 |
--------------------------------------------------------------------------------
/jsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES6",
4 | "module": "commonjs",
5 | "allowSyntheticDefaultImports": true,
6 | "baseUrl": "./",
7 | "paths": {
8 | "@components/*": [
9 | "src/components/*"
10 | ],
11 | "@shared/*": [
12 | "src/shared/*"
13 | ],
14 | }
15 | }
16 | }
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "webapp",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "firebase": "^4.8.1",
7 | "google-maps": "^3.2.1",
8 | "leaflet": "^1.2.0",
9 | "leaflet-ant-path": "^0.6.4",
10 | "lodash": "^4.17.4",
11 | "lodash.throttle": "^4.1.1",
12 | "material-ui": "^1.0.0-beta.24",
13 | "material-ui-icons": "^1.0.0-beta.17",
14 | "moment": "^2.20.1",
15 | "react": "^16.2.0",
16 | "react-dom": "^16.2.0",
17 | "react-leaflet": "^1.7.8",
18 | "react-leaflet-ant-path": "^0.1.3",
19 | "react-leaflet-div-icon": "^1.1.0",
20 | "react-leaflet-google": "^3.2.1",
21 | "react-scripts": "1.0.17",
22 | "styled-components": "^2.4.0"
23 | },
24 | "scripts": {
25 | "start": "react-scripts start",
26 | "build": "react-scripts build",
27 | "test": "react-scripts test --env=jsdom",
28 | "eject": "react-scripts eject"
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alvarowolfx/asset-tracker-gcp-mongoose-os/c037d3ab58722e42270a35b37b262491aae252c2/public/favicon.ico
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
14 |
15 |
16 |
17 |
26 | Firefleet tracking
27 |
28 |
48 |
49 |
50 |
51 |
54 |
55 |
65 |
66 |
67 |
--------------------------------------------------------------------------------
/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "Asset Tracker",
3 | "name": "Asset Tracker with Cloud IoT Core",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | }
10 | ],
11 | "start_url": "./index.html",
12 | "display": "standalone",
13 | "theme_color": "#3748AC",
14 | "background_color": "#ffffff",
15 | "gcm_sender_id": "103953800507"
16 | }
17 |
--------------------------------------------------------------------------------
/schematic/AssetTracker.fzz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alvarowolfx/asset-tracker-gcp-mongoose-os/c037d3ab58722e42270a35b37b262491aae252c2/schematic/AssetTracker.fzz
--------------------------------------------------------------------------------
/schematic/AssetTracker.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alvarowolfx/asset-tracker-gcp-mongoose-os/c037d3ab58722e42270a35b37b262491aae252c2/schematic/AssetTracker.png
--------------------------------------------------------------------------------
/src/App.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 |
3 | import Button from 'material-ui/Button';
4 |
5 | import firebase from 'firebase/app';
6 | //import groupBy from 'lodash/groupBy';
7 |
8 | import Header from './components/Header';
9 | import ResizeContainer from './components/ResizeContainer';
10 | import DeviceCard from './components/DeviceCard';
11 | import FilterCard from './components/FilterCard';
12 | import DateFilterForm from './components/DateFilterForm';
13 |
14 | import DeviceSelectDialog from './DeviceSelectDialog';
15 | import DevicesMap from './DevicesMap';
16 |
17 | import { stringify } from 'querystring';
18 | import moment from 'moment';
19 |
20 | class App extends Component {
21 | state = {
22 | devices: [],
23 | selectedDeviceIndex: null,
24 | currentDeviceLogs: [],
25 | filterExpanded: false,
26 | dateFilter: null,
27 |
28 | deviceSelectDialogOpen: false
29 | };
30 |
31 | componentDidMount() {
32 | this.loadDevices();
33 | }
34 |
35 | /**
36 | * Listen to devices changes on Firestore
37 | * and update the current state
38 | */
39 | loadDevices() {
40 | const db = firebase.firestore();
41 | db.collection('devices').onSnapshot(snapshot => {
42 | const devices = snapshot.docs.map(doc => {
43 | return {
44 | id: doc.id,
45 | ...doc.data()
46 | };
47 | });
48 |
49 | let { selectedDeviceIndex } = this.state;
50 | if (selectedDeviceIndex == null) {
51 | selectedDeviceIndex = 0;
52 | }
53 |
54 | this.setState(
55 | {
56 | devices,
57 | selectedDeviceIndex
58 | },
59 | this.loadLocationLogs
60 | );
61 | });
62 | }
63 |
64 | onDeviceSelected = selectedDeviceIndex => {
65 | this.setState(
66 | { selectedDeviceIndex, dateFilter: null },
67 | this.loadLocationLogs
68 | );
69 | this.toggleDialog();
70 | };
71 |
72 | /**
73 | * Load subcollection location_logs for the current device
74 | * Filtered by the current selected date
75 | */
76 | loadLocationLogs = async () => {
77 | const { devices, selectedDeviceIndex } = this.state;
78 | const device = devices[selectedDeviceIndex];
79 |
80 | const db = firebase.firestore();
81 | const deviceRef = db.collection('devices').doc(device.id);
82 |
83 | let { dateFilter } = this.state;
84 |
85 | if (!dateFilter) {
86 | const dates = Object.keys(device.dateIndex);
87 | dateFilter = moment(dates[0], 'YYYY-MM-DD').toDate();
88 | }
89 |
90 | const nextDay = new Date(dateFilter);
91 | nextDay.setDate(nextDay.getDate() + 1);
92 |
93 | const query = deviceRef
94 | .collection('location_logs')
95 | .where('timestamp', '>=', dateFilter)
96 | .where('timestamp', '<', nextDay)
97 | .orderBy('timestamp', 'desc');
98 |
99 | const snapshot = await query.get();
100 | const logs = snapshot.docs.map(doc => doc.data());
101 | this.setState({
102 | dateFilter,
103 | currentDeviceLogs: logs
104 | });
105 |
106 | /* GENERATE DATE INDEX
107 | const groupedLogsByDay = logs.reduce((acc, log) => {
108 | const key = getFormattedDate(log.timestamp);
109 | const count = acc[key];
110 | if (!count) {
111 | acc[key] = 1;
112 | } else {
113 | acc[key] = count + 1;
114 | }
115 | return acc;
116 | }, {});
117 |
118 | device.dateIndex = groupedLogsByDay;
119 | deviceRef.update({
120 | dateIndex: groupedLogsByDay
121 | });
122 | END DATE INDEX */
123 | };
124 |
125 | handleExpandClick = () => {
126 | this.setState({
127 | filterExpanded: !this.state.filterExpanded
128 | });
129 | };
130 |
131 | toggleDialog = () => {
132 | this.setState({
133 | deviceSelectDialogOpen: !this.state.deviceSelectDialogOpen
134 | });
135 | };
136 |
137 | /**
138 | * Update device config using http endpoint
139 | * on Firebase Cloud Function
140 | */
141 | handleUpdateConfig = async config => {
142 | const { devices, selectedDeviceIndex } = this.state;
143 | const device = devices[selectedDeviceIndex];
144 | const deviceId = device.id;
145 |
146 | const queryParams = stringify({ ...config, deviceId });
147 |
148 | const BASE_URL = '';
149 | //const BASE_URL = 'https://asset-tracker-iot.firebaseapp.com';
150 | const url = BASE_URL + '/updateDeviceConfig?' + queryParams;
151 | //console.log(url);
152 | try {
153 | const res = await fetch(url);
154 | await res.json();
155 | alert('Device config updated.');
156 | } catch (e) {
157 | console.error(e);
158 | }
159 | };
160 |
161 | handleDateFilterChange = date => {
162 | this.setState(
163 | {
164 | dateFilter: date
165 | },
166 | this.loadLocationLogs
167 | );
168 | };
169 |
170 | renderFilter() {
171 | const { devices, selectedDeviceIndex } = this.state;
172 | const device = devices[selectedDeviceIndex];
173 | if (!device) {
174 | return null;
175 | }
176 | return (
177 |
178 |
183 |
191 |
192 | );
193 | }
194 |
195 | render() {
196 | let {
197 | devices,
198 | selectedDeviceIndex,
199 | currentDeviceLogs,
200 | deviceSelectDialogOpen
201 | } = this.state;
202 | const selectedDevice = devices[selectedDeviceIndex];
203 | return (
204 |
205 |
206 |
207 |
212 |
213 |
219 |
220 |
228 |
232 | {this.renderFilter()}
233 |
234 |
235 | {selectedDevice &&
236 | !this.state.filterExpanded && (
237 |
242 | )}
243 |
244 |
245 | );
246 | }
247 | }
248 |
249 | const styles = {
250 | bottomContainer: {
251 | position: 'absolute',
252 | left: 8,
253 | bottom: 40,
254 | margin: '0 auto',
255 | zIndex: 999
256 | }
257 | };
258 |
259 | export default App;
260 |
--------------------------------------------------------------------------------
/src/DeviceSelectDialog.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | import Button from 'material-ui/Button';
4 | import Dialog, {
5 | DialogActions,
6 | DialogContent,
7 | DialogContentText,
8 | DialogTitle,
9 | withMobileDialog
10 | } from 'material-ui/Dialog';
11 |
12 | import DevicesList from './DevicesList';
13 |
14 | const DeviceSelectDialog = ({
15 | fullScreen,
16 | devices,
17 | open,
18 | onDeviceSelected,
19 | onClose
20 | }) => {
21 | return (
22 |
44 | );
45 | };
46 |
47 | export default withMobileDialog()(DeviceSelectDialog);
48 |
--------------------------------------------------------------------------------
/src/DevicesList.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 |
3 | import Grid from 'material-ui/Grid';
4 |
5 | import DeviceCard from './components/DeviceCard';
6 |
7 | class DevicesList extends Component {
8 | render() {
9 | const { devices, onDeviceSelected } = this.props;
10 | return (
11 |
12 | {devices.map((device, index) => {
13 | return (
14 | {
23 | onDeviceSelected(index);
24 | }
25 | : undefined
26 | }
27 | >
28 |
29 |
30 | );
31 | })}
32 |
33 | );
34 | }
35 | }
36 |
37 | export default DevicesList;
38 |
--------------------------------------------------------------------------------
/src/DevicesMap.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | import { Map, Popup } from 'react-leaflet';
4 | import { GoogleLayer } from 'react-leaflet-google';
5 | import AntPath from 'react-leaflet-ant-path';
6 | import DivIcon from 'react-leaflet-div-icon';
7 | import PinDrop from 'material-ui-icons/PinDrop';
8 | import DirectionsCar from 'material-ui-icons/DirectionsCar';
9 |
10 | import groupBy from 'lodash/groupBy';
11 |
12 | import { randomColorFromString } from './shared/Colors';
13 |
14 | const DevicePoint = ({ log, device }) => {
15 | const color = randomColorFromString(device.id);
16 | return (
17 |
18 |
19 |
20 |
21 | Timestamp: {log.timestamp.toLocaleString()}
22 | Speed: {log.speed}
23 |
24 |
25 |
26 | );
27 | };
28 |
29 | const DeviceCurrentPoint = ({ device }) => {
30 | const color = randomColorFromString(device.id);
31 | return (
32 |
33 |
34 |
35 |
36 |
37 | Device: {device.id}
38 |
39 | State: {device.state}
40 |
41 | Last Updated: {device.lastTimestamp.toLocaleString()}
42 |
43 |
44 |
45 |
46 |
47 | );
48 | };
49 |
50 | const DevicesMap = ({ logs, devices, selectedDeviceIndex }) => {
51 | const device = devices[selectedDeviceIndex];
52 | let position = [51.505, -0.09];
53 | let allLogs = [...logs];
54 | if (selectedDeviceIndex !== null) {
55 | position = [device.location.latitude, device.location.longitude];
56 | allLogs.push({
57 | timestamp: device.lastTimestamp,
58 | speed: device.speed,
59 | location: device.location
60 | });
61 | }
62 |
63 | const groupedLogsByDay = groupBy(allLogs, log =>
64 | log.timestamp.toJSON().substring(0, 10)
65 | );
66 |
67 | return (
68 |
94 | );
95 | };
96 |
97 | const styles = {
98 | pin: {
99 | width: 44,
100 | height: 44,
101 | position: 'relative',
102 | top: '-32px',
103 | left: '-16px'
104 | }
105 | };
106 |
107 | export default DevicesMap;
108 |
--------------------------------------------------------------------------------
/src/components/DateFilterForm.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 |
3 | import groupBy from 'lodash/groupBy';
4 | import moment from 'moment';
5 |
6 | import Typography from 'material-ui/Typography';
7 |
8 | import Chip from 'material-ui/Chip';
9 | import Avatar from 'material-ui/Avatar';
10 | import { FormControl } from 'material-ui/Form';
11 |
12 | const SelectableChip = ({ selected, label, onClick }) => {
13 | return (
14 | S
19 | ) : null
20 | }
21 | onClick={onClick}
22 | />
23 | );
24 | };
25 |
26 | class DataFilterForm extends Component {
27 | state = {
28 | selectedYear: null,
29 | selectedMonth: null,
30 | selectedDay: null,
31 | groupedByDays: null,
32 | groupedByMonths: null,
33 | groupedByYears: null
34 | };
35 |
36 | componentWillMount() {
37 | this.loadVariablesFromProps(this.props);
38 | }
39 |
40 | loadVariables(selectedYear, selectedMonth, selectedDay) {
41 | const groupedByYears = groupBy(this.props.validDates, date =>
42 | date.substring(0, 4)
43 | );
44 | const year = groupedByYears[selectedYear];
45 | if (!year) {
46 | selectedYear = Object.keys(groupedByYears)[0];
47 | }
48 |
49 | const groupedByMonths = groupBy(groupedByYears[selectedYear], date =>
50 | date.substring(5, 7)
51 | );
52 | const month = groupedByMonths[selectedMonth];
53 | if (!month) {
54 | selectedMonth = Object.keys(groupedByMonths)[0];
55 | }
56 |
57 | const groupedByDays = groupBy(groupedByMonths[selectedMonth], date =>
58 | date.substring(8, 10)
59 | );
60 |
61 | const day = groupedByDays[selectedDay];
62 | if (!day) {
63 | selectedDay = Object.keys(groupedByDays)[0];
64 | }
65 |
66 | const {
67 | selectedYear: oldYear,
68 | selectedMonth: oldMonth,
69 | selectedDay: oldDay
70 | } = this.state;
71 |
72 | let newState = {
73 | selectedYear,
74 | selectedMonth,
75 | selectedDay,
76 | groupedByDays,
77 | groupedByMonths,
78 | groupedByYears
79 | };
80 |
81 | if (
82 | oldYear !== selectedYear ||
83 | oldMonth !== selectedMonth ||
84 | oldDay !== selectedDay
85 | ) {
86 | this.setState(newState, this.triggerDateChange);
87 | }
88 | }
89 |
90 | loadVariablesFromProps(props) {
91 | let currentValue = props.value || new Date();
92 | let selectedYear = currentValue.getFullYear();
93 | let selectedMonth = currentValue.getMonth() + 1;
94 | let selectedDay = currentValue.getDate();
95 | this.loadVariables(selectedYear, selectedMonth, selectedDay);
96 | }
97 |
98 | componentWillReceiveProps(nextProps) {
99 | this.loadVariablesFromProps(nextProps);
100 | }
101 |
102 | onYearSelected = year => {
103 | const { selectedMonth, selectedDay } = this.state;
104 | this.loadVariables(year, selectedMonth, selectedDay);
105 | };
106 |
107 | onMonthSelected = month => {
108 | const { selectedYear, selectedDay } = this.state;
109 | this.loadVariables(selectedYear, month, selectedDay);
110 | };
111 |
112 | onDaySelected = day => {
113 | const { selectedYear, selectedMonth } = this.state;
114 | this.loadVariables(selectedYear, selectedMonth, day);
115 | };
116 |
117 | triggerDateChange = () => {
118 | const { selectedYear, selectedMonth, selectedDay } = this.state;
119 | const dateStr = `${selectedYear}${selectedMonth}${selectedDay}`;
120 | const date = moment(dateStr, 'YYYYMMDD').toDate();
121 | this.props.onChange && this.props.onChange(date);
122 | };
123 |
124 | render() {
125 | const {
126 | selectedYear,
127 | selectedMonth,
128 | selectedDay,
129 | groupedByDays,
130 | groupedByMonths,
131 | groupedByYears
132 | } = this.state;
133 |
134 | return (
135 |
136 |
137 |
138 | Year
139 |
140 |
141 | {Object.keys(groupedByYears).map(year => (
142 |
148 | ))}
149 |
150 |
151 |
152 |
153 |
154 | Month
155 |
156 |
157 | {Object.keys(groupedByMonths).map(month => (
158 |
164 | ))}
165 |
166 |
167 |
168 |
169 |
170 | Day
171 |
172 |
173 | {Object.keys(groupedByDays).map(day => (
174 |
180 | ))}
181 |
182 |
183 |
184 | );
185 | }
186 | }
187 |
188 | const styles = {
189 | chipsContainer: {
190 | display: 'flex',
191 | flexWrap: 'wrap',
192 | flexDirection: 'row',
193 | alignItems: 'center'
194 | }
195 | };
196 |
197 | export default DataFilterForm;
198 |
--------------------------------------------------------------------------------
/src/components/DeviceCard.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 |
3 | import Typography from 'material-ui/Typography';
4 | import Collapse from 'material-ui/transitions/Collapse';
5 |
6 | import Avatar from 'material-ui/Avatar';
7 | import Button from 'material-ui/Button';
8 | import ExpandMoreIcon from 'material-ui-icons/ExpandMore';
9 | import IconButton from 'material-ui/IconButton';
10 | import { FormControl } from 'material-ui/Form';
11 | import Select from 'material-ui/Select';
12 | import { MenuItem } from 'material-ui/Menu';
13 |
14 | import Card, { CardHeader } from 'material-ui/Card';
15 |
16 | import { randomColorFromString } from '../shared/Colors';
17 |
18 | class DeviceCard extends Component {
19 | constructor(props) {
20 | super(props);
21 |
22 | this.state = {
23 | expanded: false,
24 | updateInterval: props.device.updateInterval || 30
25 | };
26 | }
27 |
28 | componentWillReceiveProps(nextProps) {
29 | if (this.props.device.updateInterval !== nextProps.device.updateInterval) {
30 | this.setState({
31 | updateInterval: nextProps.device.updateInterval
32 | });
33 | }
34 | }
35 |
36 | handleExpandClick = () => {
37 | if (this.state.expanded) {
38 | this.setState({
39 | updateInterval: this.props.device.updateInterval
40 | });
41 | }
42 | this.setState({
43 | expanded: !this.state.expanded
44 | });
45 | };
46 |
47 | handleChange = name => event => {
48 | const { value } = event.target;
49 | this.setState({
50 | [name]: value
51 | });
52 | };
53 |
54 | handleUpdateConfig = () => {
55 | this.handleExpandClick();
56 |
57 | if (this.state.updateInterval !== this.props.device.updateInterval) {
58 | this.props.handleUpdateConfig &&
59 | this.props.handleUpdateConfig({
60 | updateInterval: this.state.updateInterval
61 | });
62 | }
63 | };
64 |
65 | render() {
66 | const { device } = this.props;
67 | const { expanded, updateInterval } = this.state;
68 | return (
69 |
70 |
77 | {device.state[0]}
78 |
79 | }
80 | action={
81 | this.props.configurable && (
82 |
87 |
88 |
89 | )
90 | }
91 | title={device.id}
92 | subheader={`Last updated: ${device.lastTimestamp.toLocaleString()}`}
93 | />
94 |
100 |
101 |
102 | Update Interval
103 |
104 |
114 |
115 |
123 |
124 |
125 | );
126 | }
127 | }
128 |
129 | DeviceCard.defaultProps = {
130 | configurable: false,
131 | expanded: false,
132 | handleExpandClick: () => {}
133 | };
134 |
135 | export default DeviceCard;
136 |
--------------------------------------------------------------------------------
/src/components/FilterCard.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 |
3 | import Collapse from 'material-ui/transitions/Collapse';
4 |
5 | import ExpandMoreIcon from 'material-ui-icons/ExpandMore';
6 |
7 | import Search from 'material-ui-icons/Search';
8 | import IconButton from 'material-ui/IconButton';
9 |
10 | import Card, { CardHeader } from 'material-ui/Card';
11 |
12 | class FilterCard extends Component {
13 | render() {
14 | return (
15 |
16 | }
19 | action={
20 |
25 |
26 |
27 | }
28 | title="Filters"
29 | subheader="Expand to see the filters"
30 | />
31 |
37 | {this.props.children}
38 |
39 |
40 | );
41 | }
42 | }
43 |
44 | FilterCard.defaultProps = {
45 | expanded: false,
46 | handleExpandClick: () => {}
47 | };
48 |
49 | export default FilterCard;
50 |
--------------------------------------------------------------------------------
/src/components/Header.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import AppBar from 'material-ui/AppBar';
3 | import Toolbar from 'material-ui/Toolbar';
4 | import Typography from 'material-ui/Typography';
5 |
6 | const Header = () => {
7 | return (
8 |
9 |
10 |
11 | Asset Tracker - Cloud IoT Core
12 |
13 |
14 |
15 | );
16 | };
17 |
18 | export default Header;
19 |
--------------------------------------------------------------------------------
/src/components/ResizeContainer.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 |
3 | import throttle from 'lodash.throttle';
4 |
5 | export default class ResizeContainer extends Component {
6 | constructor(props) {
7 | super(props);
8 |
9 | this.state = {
10 | style: {
11 | width: '100%',
12 | height: window.innerHeight - 64
13 | }
14 | };
15 | }
16 |
17 | componentDidMount() {
18 | window.addEventListener('resize', this.onResize);
19 | }
20 | componentWillUnmount() {
21 | window.removeEventListener('resize', this.onResize);
22 | }
23 |
24 | onResize = throttle(() => {
25 | this.setState({
26 | style: {
27 | width: '100%',
28 | height: window.innerHeight - 64
29 | }
30 | });
31 | }, 300);
32 |
33 | render() {
34 | return {this.props.children}
;
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/src/components/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@components"
3 | }
4 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 |
4 | import firebase from 'firebase/app';
5 | import 'firebase/firestore';
6 |
7 | import registerServiceWorker from './shared/registerServiceWorker';
8 |
9 | import App from './App';
10 |
11 | const config = {
12 | apiKey: 'AIzaSyDtNB2TmdY5cw6pZ1cJXTby-3GJgSoJPTU',
13 | authDomain: 'asset-tracker-iot.firebaseapp.com',
14 | databaseURL: 'https://asset-tracker-iot.firebaseio.com',
15 | projectId: 'asset-tracker-iot',
16 | storageBucket: 'asset-tracker-iot.appspot.com',
17 | messagingSenderId: '36412393718'
18 | };
19 | firebase.initializeApp(config);
20 |
21 | const rootDiv = document.getElementById('root');
22 |
23 | ReactDOM.render(, rootDiv);
24 | registerServiceWorker();
25 |
--------------------------------------------------------------------------------
/src/shared/Colors.js:
--------------------------------------------------------------------------------
1 | function hashCode(str) {
2 | var hash = 0;
3 | for (var i = 0; i < str.length; i++) {
4 | hash = str.charCodeAt(i) + ((hash << 5) - hash);
5 | }
6 | return hash;
7 | }
8 |
9 | export function randomColorFromString(str) {
10 | let code = hashCode(str);
11 | let hash = (code & 0x00ffffff).toString(16).toUpperCase();
12 | let colorCode = '00000'.substring(0, 6 - hash.length) + hash;
13 | return '#' + colorCode;
14 | }
15 |
--------------------------------------------------------------------------------
/src/shared/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@shared"
3 | }
4 |
--------------------------------------------------------------------------------
/src/shared/registerServiceWorker.js:
--------------------------------------------------------------------------------
1 | // In production, we register a service worker to serve assets from local cache.
2 |
3 | // This lets the app load faster on subsequent visits in production, and gives
4 | // it offline capabilities. However, it also means that developers (and users)
5 | // will only see deployed updates on the "N+1" visit to a page, since previously
6 | // cached resources are updated in the background.
7 |
8 | // To learn more about the benefits of this model, read https://goo.gl/KwvDNy.
9 | // This link also includes instructions on opting out of this behavior.
10 |
11 | const isLocalhost = Boolean(
12 | window.location.hostname === 'localhost' ||
13 | // [::1] is the IPv6 localhost address.
14 | window.location.hostname === '[::1]' ||
15 | // 127.0.0.1/8 is considered localhost for IPv4.
16 | window.location.hostname.match(
17 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
18 | )
19 | );
20 |
21 | export default function register() {
22 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
23 | // The URL constructor is available in all browsers that support SW.
24 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location);
25 | if (publicUrl.origin !== window.location.origin) {
26 | // Our service worker won't work if PUBLIC_URL is on a different origin
27 | // from what our page is served on. This might happen if a CDN is used to
28 | // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374
29 | return;
30 | }
31 |
32 | window.addEventListener('load', () => {
33 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
34 |
35 | if (isLocalhost) {
36 | // This is running on localhost. Lets check if a service worker still exists or not.
37 | checkValidServiceWorker(swUrl);
38 | } else {
39 | // Is not local host. Just register service worker
40 | registerValidSW(swUrl);
41 | }
42 | });
43 | }
44 | }
45 |
46 | function registerValidSW(swUrl) {
47 | navigator.serviceWorker
48 | .register(swUrl)
49 | .then(registration => {
50 | registration.onupdatefound = () => {
51 | const installingWorker = registration.installing;
52 | installingWorker.onstatechange = () => {
53 | if (installingWorker.state === 'installed') {
54 | if (navigator.serviceWorker.controller) {
55 | // At this point, the old content will have been purged and
56 | // the fresh content will have been added to the cache.
57 | // It's the perfect time to display a "New content is
58 | // available; please refresh." message in your web app.
59 | console.log('New content is available; please refresh.');
60 | } else {
61 | // At this point, everything has been precached.
62 | // It's the perfect time to display a
63 | // "Content is cached for offline use." message.
64 | console.log('Content is cached for offline use.');
65 | }
66 | }
67 | };
68 | };
69 | })
70 | .catch(error => {
71 | console.error('Error during service worker registration:', error);
72 | });
73 | }
74 |
75 | function checkValidServiceWorker(swUrl) {
76 | // Check if the service worker can be found. If it can't reload the page.
77 | fetch(swUrl)
78 | .then(response => {
79 | // Ensure service worker exists, and that we really are getting a JS file.
80 | if (
81 | response.status === 404 ||
82 | response.headers.get('content-type').indexOf('javascript') === -1
83 | ) {
84 | // No service worker found. Probably a different app. Reload the page.
85 | navigator.serviceWorker.ready.then(registration => {
86 | registration.unregister().then(() => {
87 | window.location.reload();
88 | });
89 | });
90 | } else {
91 | // Service worker found. Proceed as normal.
92 | registerValidSW(swUrl);
93 | }
94 | })
95 | .catch(() => {
96 | console.log(
97 | 'No internet connection found. App is running in offline mode.'
98 | );
99 | });
100 | }
101 |
102 | export function unregister() {
103 | if ('serviceWorker' in navigator) {
104 | navigator.serviceWorker.ready.then(registration => {
105 | registration.unregister();
106 | });
107 | }
108 | }
109 |
--------------------------------------------------------------------------------