├── .gitignore ├── Cargo.toml ├── LICENSE ├── Makefile ├── README.md ├── examples └── helloworld │ ├── Cargo.toml │ ├── build.rs │ ├── js │ ├── client.js │ ├── helloworld_grpc_web_pb.js │ ├── helloworld_pb.js │ ├── index.html │ ├── package.json │ ├── server.js │ └── yarn.lock │ ├── proto │ └── helloworld.proto │ └── src │ ├── client.rs │ └── server.rs ├── grpc-web-proxy ├── Cargo.toml └── src │ ├── main.rs │ └── proxy.rs └── grpc-web ├── Cargo.toml ├── build.rs ├── proto └── reflection.proto └── src ├── codec.rs ├── error.rs ├── lib.rs ├── metadata.rs ├── request.rs └── response.rs /.gitignore: -------------------------------------------------------------------------------- 1 | target 2 | Cargo.lock 3 | node_modules 4 | dist -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | members = [ 3 | "grpc-web", 4 | "grpc-web-proxy", 5 | 6 | "examples/helloworld", 7 | ] -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Greg Hill 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | OS := $(shell uname) 2 | ROOT_DIR := $(shell pwd) 3 | PROTO_INC := $(ROOT_DIR)/examples/helloworld/proto 4 | PROTO_SRC := helloworld.proto 5 | GRPC_OUT := $(ROOT_DIR)/examples/helloworld/js 6 | 7 | helloworld: 8 | protoc -I=${PROTO_INC} ${PROTO_SRC} --js_out=import_style=commonjs:${GRPC_OUT} 9 | protoc -I=${PROTO_INC} ${PROTO_SRC} --grpc-web_out=import_style=commonjs,mode=grpcwebtext:${GRPC_OUT} 10 | cd ${GRPC_OUT} && npx webpack client.js 11 | 12 | proxy: 13 | cargo build --bin grpc-web-proxy -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Rust gRPC Web 2 | 3 | Standalone proxy service for gRPC-Web, written in Rust. 4 | 5 | **[Specification](https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-WEB.md)** 6 | 7 | > Note: client-side & bi-directional streaming is not currently supported in the specification. 8 | 9 | For efforts related to Tonic integration, see [this PR](https://github.com/hyperium/tonic/pull/455). 10 | 11 | ## Structure 12 | 13 | - **grpc-web**: logic & types 14 | - **grpc-web-proxy**: hyper server 15 | 16 | ## Tutorial 17 | 18 | Generate the JS helloworld client. 19 | 20 | ```shell 21 | make helloworld 22 | ``` 23 | 24 | Run the helloworld gRPC server (built on Tonic). 25 | 26 | ```shell 27 | cargo run --bin helloworld-server 28 | ``` 29 | 30 | Run the gRPC-Web proxy server. 31 | 32 | ```shell 33 | cargo run --bin grpc-web-proxy 34 | ``` 35 | 36 | Open [index.html](./examples/helloworld/js/index.html) in a browser. -------------------------------------------------------------------------------- /examples/helloworld/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "helloworld" 3 | version = "0.1.0" 4 | authors = ["Gregory Hill "] 5 | edition = "2018" 6 | 7 | [[bin]] 8 | name = "helloworld-server" 9 | path = "src/server.rs" 10 | 11 | [[bin]] 12 | name = "helloworld-client" 13 | path = "src/client.rs" 14 | 15 | [dependencies] 16 | tonic = { git = "https://github.com/hyperium/tonic", rev = "61555ff" } 17 | prost = "0.7" 18 | tokio = { version = "1.0", features = ["rt-multi-thread", "time", "fs", "macros", "net"] } 19 | tokio-stream = { version = "0.1", features = ["net"] } 20 | tonic-reflection = { git = "https://github.com/hyperium/tonic", rev = "61555ff" } 21 | futures = { version = "0.3", default-features = false, features = ["alloc"] } 22 | 23 | [build-dependencies] 24 | tonic-build = { git = "https://github.com/hyperium/tonic", rev = "61555ff" } 25 | -------------------------------------------------------------------------------- /examples/helloworld/build.rs: -------------------------------------------------------------------------------- 1 | use std::env; 2 | use std::path::PathBuf; 3 | 4 | fn main() { 5 | let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap()); 6 | tonic_build::configure() 7 | .file_descriptor_set_path(out_dir.join("helloworld_descriptor.bin")) 8 | .compile(&["proto/helloworld.proto"], &["proto"]) 9 | .unwrap(); 10 | } 11 | -------------------------------------------------------------------------------- /examples/helloworld/js/client.js: -------------------------------------------------------------------------------- 1 | const { HelloRequest, RepeatHelloRequest, HelloReply } = require('./helloworld_pb.js'); 2 | const { GreeterClient } = require('./helloworld_grpc_web_pb.js'); 3 | 4 | var client = new GreeterClient('http://localhost:8080', null, null); 5 | 6 | // simple unary call 7 | var request = new HelloRequest(); 8 | request.setName('Tonic'); 9 | 10 | client.sayHello(request, {}, (err, response) => { 11 | if (err) { 12 | console.log(`Unexpected error for sayHello: code = ${err.code}` + `, message = "${err.message}"`); 13 | } else { 14 | console.log(response.getMessage()); 15 | } 16 | }); 17 | 18 | 19 | // server streaming call 20 | var streamRequest = new RepeatHelloRequest(); 21 | streamRequest.setName('World'); 22 | streamRequest.setCount(5); 23 | 24 | var stream = client.sayRepeatHello(streamRequest, {}); 25 | stream.on('data', (response) => { 26 | console.log(response.getMessage()); 27 | }); 28 | stream.on('error', (err) => { 29 | console.log(`Unexpected stream error: code = ${err.code}` + `, message = "${err.message}"`); 30 | }); -------------------------------------------------------------------------------- /examples/helloworld/js/helloworld_grpc_web_pb.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @fileoverview gRPC-Web generated client stub for helloworld 3 | * @enhanceable 4 | * @public 5 | */ 6 | 7 | // GENERATED CODE -- DO NOT EDIT! 8 | 9 | 10 | /* eslint-disable */ 11 | // @ts-nocheck 12 | 13 | 14 | 15 | const grpc = {}; 16 | grpc.web = require('grpc-web'); 17 | 18 | const proto = {}; 19 | proto.helloworld = require('./helloworld_pb.js'); 20 | 21 | /** 22 | * @param {string} hostname 23 | * @param {?Object} credentials 24 | * @param {?Object} options 25 | * @constructor 26 | * @struct 27 | * @final 28 | */ 29 | proto.helloworld.GreeterClient = 30 | function(hostname, credentials, options) { 31 | if (!options) options = {}; 32 | options['format'] = 'text'; 33 | 34 | /** 35 | * @private @const {!grpc.web.GrpcWebClientBase} The client 36 | */ 37 | this.client_ = new grpc.web.GrpcWebClientBase(options); 38 | 39 | /** 40 | * @private @const {string} The hostname 41 | */ 42 | this.hostname_ = hostname; 43 | 44 | }; 45 | 46 | 47 | /** 48 | * @param {string} hostname 49 | * @param {?Object} credentials 50 | * @param {?Object} options 51 | * @constructor 52 | * @struct 53 | * @final 54 | */ 55 | proto.helloworld.GreeterPromiseClient = 56 | function(hostname, credentials, options) { 57 | if (!options) options = {}; 58 | options['format'] = 'text'; 59 | 60 | /** 61 | * @private @const {!grpc.web.GrpcWebClientBase} The client 62 | */ 63 | this.client_ = new grpc.web.GrpcWebClientBase(options); 64 | 65 | /** 66 | * @private @const {string} The hostname 67 | */ 68 | this.hostname_ = hostname; 69 | 70 | }; 71 | 72 | 73 | /** 74 | * @const 75 | * @type {!grpc.web.MethodDescriptor< 76 | * !proto.helloworld.HelloRequest, 77 | * !proto.helloworld.HelloReply>} 78 | */ 79 | const methodDescriptor_Greeter_SayHello = new grpc.web.MethodDescriptor( 80 | '/helloworld.Greeter/SayHello', 81 | grpc.web.MethodType.UNARY, 82 | proto.helloworld.HelloRequest, 83 | proto.helloworld.HelloReply, 84 | /** 85 | * @param {!proto.helloworld.HelloRequest} request 86 | * @return {!Uint8Array} 87 | */ 88 | function(request) { 89 | return request.serializeBinary(); 90 | }, 91 | proto.helloworld.HelloReply.deserializeBinary 92 | ); 93 | 94 | 95 | /** 96 | * @const 97 | * @type {!grpc.web.AbstractClientBase.MethodInfo< 98 | * !proto.helloworld.HelloRequest, 99 | * !proto.helloworld.HelloReply>} 100 | */ 101 | const methodInfo_Greeter_SayHello = new grpc.web.AbstractClientBase.MethodInfo( 102 | proto.helloworld.HelloReply, 103 | /** 104 | * @param {!proto.helloworld.HelloRequest} request 105 | * @return {!Uint8Array} 106 | */ 107 | function(request) { 108 | return request.serializeBinary(); 109 | }, 110 | proto.helloworld.HelloReply.deserializeBinary 111 | ); 112 | 113 | 114 | /** 115 | * @param {!proto.helloworld.HelloRequest} request The 116 | * request proto 117 | * @param {?Object} metadata User defined 118 | * call metadata 119 | * @param {function(?grpc.web.Error, ?proto.helloworld.HelloReply)} 120 | * callback The callback function(error, response) 121 | * @return {!grpc.web.ClientReadableStream|undefined} 122 | * The XHR Node Readable Stream 123 | */ 124 | proto.helloworld.GreeterClient.prototype.sayHello = 125 | function(request, metadata, callback) { 126 | return this.client_.rpcCall(this.hostname_ + 127 | '/helloworld.Greeter/SayHello', 128 | request, 129 | metadata || {}, 130 | methodDescriptor_Greeter_SayHello, 131 | callback); 132 | }; 133 | 134 | 135 | /** 136 | * @param {!proto.helloworld.HelloRequest} request The 137 | * request proto 138 | * @param {?Object} metadata User defined 139 | * call metadata 140 | * @return {!Promise} 141 | * Promise that resolves to the response 142 | */ 143 | proto.helloworld.GreeterPromiseClient.prototype.sayHello = 144 | function(request, metadata) { 145 | return this.client_.unaryCall(this.hostname_ + 146 | '/helloworld.Greeter/SayHello', 147 | request, 148 | metadata || {}, 149 | methodDescriptor_Greeter_SayHello); 150 | }; 151 | 152 | 153 | /** 154 | * @const 155 | * @type {!grpc.web.MethodDescriptor< 156 | * !proto.helloworld.RepeatHelloRequest, 157 | * !proto.helloworld.HelloReply>} 158 | */ 159 | const methodDescriptor_Greeter_SayRepeatHello = new grpc.web.MethodDescriptor( 160 | '/helloworld.Greeter/SayRepeatHello', 161 | grpc.web.MethodType.SERVER_STREAMING, 162 | proto.helloworld.RepeatHelloRequest, 163 | proto.helloworld.HelloReply, 164 | /** 165 | * @param {!proto.helloworld.RepeatHelloRequest} request 166 | * @return {!Uint8Array} 167 | */ 168 | function(request) { 169 | return request.serializeBinary(); 170 | }, 171 | proto.helloworld.HelloReply.deserializeBinary 172 | ); 173 | 174 | 175 | /** 176 | * @const 177 | * @type {!grpc.web.AbstractClientBase.MethodInfo< 178 | * !proto.helloworld.RepeatHelloRequest, 179 | * !proto.helloworld.HelloReply>} 180 | */ 181 | const methodInfo_Greeter_SayRepeatHello = new grpc.web.AbstractClientBase.MethodInfo( 182 | proto.helloworld.HelloReply, 183 | /** 184 | * @param {!proto.helloworld.RepeatHelloRequest} request 185 | * @return {!Uint8Array} 186 | */ 187 | function(request) { 188 | return request.serializeBinary(); 189 | }, 190 | proto.helloworld.HelloReply.deserializeBinary 191 | ); 192 | 193 | 194 | /** 195 | * @param {!proto.helloworld.RepeatHelloRequest} request The request proto 196 | * @param {?Object} metadata User defined 197 | * call metadata 198 | * @return {!grpc.web.ClientReadableStream} 199 | * The XHR Node Readable Stream 200 | */ 201 | proto.helloworld.GreeterClient.prototype.sayRepeatHello = 202 | function(request, metadata) { 203 | return this.client_.serverStreaming(this.hostname_ + 204 | '/helloworld.Greeter/SayRepeatHello', 205 | request, 206 | metadata || {}, 207 | methodDescriptor_Greeter_SayRepeatHello); 208 | }; 209 | 210 | 211 | /** 212 | * @param {!proto.helloworld.RepeatHelloRequest} request The request proto 213 | * @param {?Object} metadata User defined 214 | * call metadata 215 | * @return {!grpc.web.ClientReadableStream} 216 | * The XHR Node Readable Stream 217 | */ 218 | proto.helloworld.GreeterPromiseClient.prototype.sayRepeatHello = 219 | function(request, metadata) { 220 | return this.client_.serverStreaming(this.hostname_ + 221 | '/helloworld.Greeter/SayRepeatHello', 222 | request, 223 | metadata || {}, 224 | methodDescriptor_Greeter_SayRepeatHello); 225 | }; 226 | 227 | 228 | module.exports = proto.helloworld; 229 | 230 | -------------------------------------------------------------------------------- /examples/helloworld/js/helloworld_pb.js: -------------------------------------------------------------------------------- 1 | // source: helloworld.proto 2 | /** 3 | * @fileoverview 4 | * @enhanceable 5 | * @suppress {messageConventions} JS Compiler reports an error if a variable or 6 | * field starts with 'MSG_' and isn't a translatable message. 7 | * @public 8 | */ 9 | // GENERATED CODE -- DO NOT EDIT! 10 | 11 | var jspb = require('google-protobuf'); 12 | var goog = jspb; 13 | var global = Function('return this')(); 14 | 15 | goog.exportSymbol('proto.helloworld.HelloReply', null, global); 16 | goog.exportSymbol('proto.helloworld.HelloRequest', null, global); 17 | goog.exportSymbol('proto.helloworld.RepeatHelloRequest', null, global); 18 | /** 19 | * Generated by JsPbCodeGenerator. 20 | * @param {Array=} opt_data Optional initial data array, typically from a 21 | * server response, or constructed directly in Javascript. The array is used 22 | * in place and becomes part of the constructed object. It is not cloned. 23 | * If no data is provided, the constructed object will be empty, but still 24 | * valid. 25 | * @extends {jspb.Message} 26 | * @constructor 27 | */ 28 | proto.helloworld.HelloRequest = function(opt_data) { 29 | jspb.Message.initialize(this, opt_data, 0, -1, null, null); 30 | }; 31 | goog.inherits(proto.helloworld.HelloRequest, jspb.Message); 32 | if (goog.DEBUG && !COMPILED) { 33 | /** 34 | * @public 35 | * @override 36 | */ 37 | proto.helloworld.HelloRequest.displayName = 'proto.helloworld.HelloRequest'; 38 | } 39 | /** 40 | * Generated by JsPbCodeGenerator. 41 | * @param {Array=} opt_data Optional initial data array, typically from a 42 | * server response, or constructed directly in Javascript. The array is used 43 | * in place and becomes part of the constructed object. It is not cloned. 44 | * If no data is provided, the constructed object will be empty, but still 45 | * valid. 46 | * @extends {jspb.Message} 47 | * @constructor 48 | */ 49 | proto.helloworld.RepeatHelloRequest = function(opt_data) { 50 | jspb.Message.initialize(this, opt_data, 0, -1, null, null); 51 | }; 52 | goog.inherits(proto.helloworld.RepeatHelloRequest, jspb.Message); 53 | if (goog.DEBUG && !COMPILED) { 54 | /** 55 | * @public 56 | * @override 57 | */ 58 | proto.helloworld.RepeatHelloRequest.displayName = 'proto.helloworld.RepeatHelloRequest'; 59 | } 60 | /** 61 | * Generated by JsPbCodeGenerator. 62 | * @param {Array=} opt_data Optional initial data array, typically from a 63 | * server response, or constructed directly in Javascript. The array is used 64 | * in place and becomes part of the constructed object. It is not cloned. 65 | * If no data is provided, the constructed object will be empty, but still 66 | * valid. 67 | * @extends {jspb.Message} 68 | * @constructor 69 | */ 70 | proto.helloworld.HelloReply = function(opt_data) { 71 | jspb.Message.initialize(this, opt_data, 0, -1, null, null); 72 | }; 73 | goog.inherits(proto.helloworld.HelloReply, jspb.Message); 74 | if (goog.DEBUG && !COMPILED) { 75 | /** 76 | * @public 77 | * @override 78 | */ 79 | proto.helloworld.HelloReply.displayName = 'proto.helloworld.HelloReply'; 80 | } 81 | 82 | 83 | 84 | if (jspb.Message.GENERATE_TO_OBJECT) { 85 | /** 86 | * Creates an object representation of this proto. 87 | * Field names that are reserved in JavaScript and will be renamed to pb_name. 88 | * Optional fields that are not set will be set to undefined. 89 | * To access a reserved field use, foo.pb_, eg, foo.pb_default. 90 | * For the list of reserved names please see: 91 | * net/proto2/compiler/js/internal/generator.cc#kKeyword. 92 | * @param {boolean=} opt_includeInstance Deprecated. whether to include the 93 | * JSPB instance for transitional soy proto support: 94 | * http://goto/soy-param-migration 95 | * @return {!Object} 96 | */ 97 | proto.helloworld.HelloRequest.prototype.toObject = function(opt_includeInstance) { 98 | return proto.helloworld.HelloRequest.toObject(opt_includeInstance, this); 99 | }; 100 | 101 | 102 | /** 103 | * Static version of the {@see toObject} method. 104 | * @param {boolean|undefined} includeInstance Deprecated. Whether to include 105 | * the JSPB instance for transitional soy proto support: 106 | * http://goto/soy-param-migration 107 | * @param {!proto.helloworld.HelloRequest} msg The msg instance to transform. 108 | * @return {!Object} 109 | * @suppress {unusedLocalVariables} f is only used for nested messages 110 | */ 111 | proto.helloworld.HelloRequest.toObject = function(includeInstance, msg) { 112 | var f, obj = { 113 | name: jspb.Message.getFieldWithDefault(msg, 1, "") 114 | }; 115 | 116 | if (includeInstance) { 117 | obj.$jspbMessageInstance = msg; 118 | } 119 | return obj; 120 | }; 121 | } 122 | 123 | 124 | /** 125 | * Deserializes binary data (in protobuf wire format). 126 | * @param {jspb.ByteSource} bytes The bytes to deserialize. 127 | * @return {!proto.helloworld.HelloRequest} 128 | */ 129 | proto.helloworld.HelloRequest.deserializeBinary = function(bytes) { 130 | var reader = new jspb.BinaryReader(bytes); 131 | var msg = new proto.helloworld.HelloRequest; 132 | return proto.helloworld.HelloRequest.deserializeBinaryFromReader(msg, reader); 133 | }; 134 | 135 | 136 | /** 137 | * Deserializes binary data (in protobuf wire format) from the 138 | * given reader into the given message object. 139 | * @param {!proto.helloworld.HelloRequest} msg The message object to deserialize into. 140 | * @param {!jspb.BinaryReader} reader The BinaryReader to use. 141 | * @return {!proto.helloworld.HelloRequest} 142 | */ 143 | proto.helloworld.HelloRequest.deserializeBinaryFromReader = function(msg, reader) { 144 | while (reader.nextField()) { 145 | if (reader.isEndGroup()) { 146 | break; 147 | } 148 | var field = reader.getFieldNumber(); 149 | switch (field) { 150 | case 1: 151 | var value = /** @type {string} */ (reader.readString()); 152 | msg.setName(value); 153 | break; 154 | default: 155 | reader.skipField(); 156 | break; 157 | } 158 | } 159 | return msg; 160 | }; 161 | 162 | 163 | /** 164 | * Serializes the message to binary data (in protobuf wire format). 165 | * @return {!Uint8Array} 166 | */ 167 | proto.helloworld.HelloRequest.prototype.serializeBinary = function() { 168 | var writer = new jspb.BinaryWriter(); 169 | proto.helloworld.HelloRequest.serializeBinaryToWriter(this, writer); 170 | return writer.getResultBuffer(); 171 | }; 172 | 173 | 174 | /** 175 | * Serializes the given message to binary data (in protobuf wire 176 | * format), writing to the given BinaryWriter. 177 | * @param {!proto.helloworld.HelloRequest} message 178 | * @param {!jspb.BinaryWriter} writer 179 | * @suppress {unusedLocalVariables} f is only used for nested messages 180 | */ 181 | proto.helloworld.HelloRequest.serializeBinaryToWriter = function(message, writer) { 182 | var f = undefined; 183 | f = message.getName(); 184 | if (f.length > 0) { 185 | writer.writeString( 186 | 1, 187 | f 188 | ); 189 | } 190 | }; 191 | 192 | 193 | /** 194 | * optional string name = 1; 195 | * @return {string} 196 | */ 197 | proto.helloworld.HelloRequest.prototype.getName = function() { 198 | return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); 199 | }; 200 | 201 | 202 | /** 203 | * @param {string} value 204 | * @return {!proto.helloworld.HelloRequest} returns this 205 | */ 206 | proto.helloworld.HelloRequest.prototype.setName = function(value) { 207 | return jspb.Message.setProto3StringField(this, 1, value); 208 | }; 209 | 210 | 211 | 212 | 213 | 214 | if (jspb.Message.GENERATE_TO_OBJECT) { 215 | /** 216 | * Creates an object representation of this proto. 217 | * Field names that are reserved in JavaScript and will be renamed to pb_name. 218 | * Optional fields that are not set will be set to undefined. 219 | * To access a reserved field use, foo.pb_, eg, foo.pb_default. 220 | * For the list of reserved names please see: 221 | * net/proto2/compiler/js/internal/generator.cc#kKeyword. 222 | * @param {boolean=} opt_includeInstance Deprecated. whether to include the 223 | * JSPB instance for transitional soy proto support: 224 | * http://goto/soy-param-migration 225 | * @return {!Object} 226 | */ 227 | proto.helloworld.RepeatHelloRequest.prototype.toObject = function(opt_includeInstance) { 228 | return proto.helloworld.RepeatHelloRequest.toObject(opt_includeInstance, this); 229 | }; 230 | 231 | 232 | /** 233 | * Static version of the {@see toObject} method. 234 | * @param {boolean|undefined} includeInstance Deprecated. Whether to include 235 | * the JSPB instance for transitional soy proto support: 236 | * http://goto/soy-param-migration 237 | * @param {!proto.helloworld.RepeatHelloRequest} msg The msg instance to transform. 238 | * @return {!Object} 239 | * @suppress {unusedLocalVariables} f is only used for nested messages 240 | */ 241 | proto.helloworld.RepeatHelloRequest.toObject = function(includeInstance, msg) { 242 | var f, obj = { 243 | name: jspb.Message.getFieldWithDefault(msg, 1, ""), 244 | count: jspb.Message.getFieldWithDefault(msg, 2, 0) 245 | }; 246 | 247 | if (includeInstance) { 248 | obj.$jspbMessageInstance = msg; 249 | } 250 | return obj; 251 | }; 252 | } 253 | 254 | 255 | /** 256 | * Deserializes binary data (in protobuf wire format). 257 | * @param {jspb.ByteSource} bytes The bytes to deserialize. 258 | * @return {!proto.helloworld.RepeatHelloRequest} 259 | */ 260 | proto.helloworld.RepeatHelloRequest.deserializeBinary = function(bytes) { 261 | var reader = new jspb.BinaryReader(bytes); 262 | var msg = new proto.helloworld.RepeatHelloRequest; 263 | return proto.helloworld.RepeatHelloRequest.deserializeBinaryFromReader(msg, reader); 264 | }; 265 | 266 | 267 | /** 268 | * Deserializes binary data (in protobuf wire format) from the 269 | * given reader into the given message object. 270 | * @param {!proto.helloworld.RepeatHelloRequest} msg The message object to deserialize into. 271 | * @param {!jspb.BinaryReader} reader The BinaryReader to use. 272 | * @return {!proto.helloworld.RepeatHelloRequest} 273 | */ 274 | proto.helloworld.RepeatHelloRequest.deserializeBinaryFromReader = function(msg, reader) { 275 | while (reader.nextField()) { 276 | if (reader.isEndGroup()) { 277 | break; 278 | } 279 | var field = reader.getFieldNumber(); 280 | switch (field) { 281 | case 1: 282 | var value = /** @type {string} */ (reader.readString()); 283 | msg.setName(value); 284 | break; 285 | case 2: 286 | var value = /** @type {number} */ (reader.readInt32()); 287 | msg.setCount(value); 288 | break; 289 | default: 290 | reader.skipField(); 291 | break; 292 | } 293 | } 294 | return msg; 295 | }; 296 | 297 | 298 | /** 299 | * Serializes the message to binary data (in protobuf wire format). 300 | * @return {!Uint8Array} 301 | */ 302 | proto.helloworld.RepeatHelloRequest.prototype.serializeBinary = function() { 303 | var writer = new jspb.BinaryWriter(); 304 | proto.helloworld.RepeatHelloRequest.serializeBinaryToWriter(this, writer); 305 | return writer.getResultBuffer(); 306 | }; 307 | 308 | 309 | /** 310 | * Serializes the given message to binary data (in protobuf wire 311 | * format), writing to the given BinaryWriter. 312 | * @param {!proto.helloworld.RepeatHelloRequest} message 313 | * @param {!jspb.BinaryWriter} writer 314 | * @suppress {unusedLocalVariables} f is only used for nested messages 315 | */ 316 | proto.helloworld.RepeatHelloRequest.serializeBinaryToWriter = function(message, writer) { 317 | var f = undefined; 318 | f = message.getName(); 319 | if (f.length > 0) { 320 | writer.writeString( 321 | 1, 322 | f 323 | ); 324 | } 325 | f = message.getCount(); 326 | if (f !== 0) { 327 | writer.writeInt32( 328 | 2, 329 | f 330 | ); 331 | } 332 | }; 333 | 334 | 335 | /** 336 | * optional string name = 1; 337 | * @return {string} 338 | */ 339 | proto.helloworld.RepeatHelloRequest.prototype.getName = function() { 340 | return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); 341 | }; 342 | 343 | 344 | /** 345 | * @param {string} value 346 | * @return {!proto.helloworld.RepeatHelloRequest} returns this 347 | */ 348 | proto.helloworld.RepeatHelloRequest.prototype.setName = function(value) { 349 | return jspb.Message.setProto3StringField(this, 1, value); 350 | }; 351 | 352 | 353 | /** 354 | * optional int32 count = 2; 355 | * @return {number} 356 | */ 357 | proto.helloworld.RepeatHelloRequest.prototype.getCount = function() { 358 | return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); 359 | }; 360 | 361 | 362 | /** 363 | * @param {number} value 364 | * @return {!proto.helloworld.RepeatHelloRequest} returns this 365 | */ 366 | proto.helloworld.RepeatHelloRequest.prototype.setCount = function(value) { 367 | return jspb.Message.setProto3IntField(this, 2, value); 368 | }; 369 | 370 | 371 | 372 | 373 | 374 | if (jspb.Message.GENERATE_TO_OBJECT) { 375 | /** 376 | * Creates an object representation of this proto. 377 | * Field names that are reserved in JavaScript and will be renamed to pb_name. 378 | * Optional fields that are not set will be set to undefined. 379 | * To access a reserved field use, foo.pb_, eg, foo.pb_default. 380 | * For the list of reserved names please see: 381 | * net/proto2/compiler/js/internal/generator.cc#kKeyword. 382 | * @param {boolean=} opt_includeInstance Deprecated. whether to include the 383 | * JSPB instance for transitional soy proto support: 384 | * http://goto/soy-param-migration 385 | * @return {!Object} 386 | */ 387 | proto.helloworld.HelloReply.prototype.toObject = function(opt_includeInstance) { 388 | return proto.helloworld.HelloReply.toObject(opt_includeInstance, this); 389 | }; 390 | 391 | 392 | /** 393 | * Static version of the {@see toObject} method. 394 | * @param {boolean|undefined} includeInstance Deprecated. Whether to include 395 | * the JSPB instance for transitional soy proto support: 396 | * http://goto/soy-param-migration 397 | * @param {!proto.helloworld.HelloReply} msg The msg instance to transform. 398 | * @return {!Object} 399 | * @suppress {unusedLocalVariables} f is only used for nested messages 400 | */ 401 | proto.helloworld.HelloReply.toObject = function(includeInstance, msg) { 402 | var f, obj = { 403 | message: jspb.Message.getFieldWithDefault(msg, 1, "") 404 | }; 405 | 406 | if (includeInstance) { 407 | obj.$jspbMessageInstance = msg; 408 | } 409 | return obj; 410 | }; 411 | } 412 | 413 | 414 | /** 415 | * Deserializes binary data (in protobuf wire format). 416 | * @param {jspb.ByteSource} bytes The bytes to deserialize. 417 | * @return {!proto.helloworld.HelloReply} 418 | */ 419 | proto.helloworld.HelloReply.deserializeBinary = function(bytes) { 420 | var reader = new jspb.BinaryReader(bytes); 421 | var msg = new proto.helloworld.HelloReply; 422 | return proto.helloworld.HelloReply.deserializeBinaryFromReader(msg, reader); 423 | }; 424 | 425 | 426 | /** 427 | * Deserializes binary data (in protobuf wire format) from the 428 | * given reader into the given message object. 429 | * @param {!proto.helloworld.HelloReply} msg The message object to deserialize into. 430 | * @param {!jspb.BinaryReader} reader The BinaryReader to use. 431 | * @return {!proto.helloworld.HelloReply} 432 | */ 433 | proto.helloworld.HelloReply.deserializeBinaryFromReader = function(msg, reader) { 434 | while (reader.nextField()) { 435 | if (reader.isEndGroup()) { 436 | break; 437 | } 438 | var field = reader.getFieldNumber(); 439 | switch (field) { 440 | case 1: 441 | var value = /** @type {string} */ (reader.readString()); 442 | msg.setMessage(value); 443 | break; 444 | default: 445 | reader.skipField(); 446 | break; 447 | } 448 | } 449 | return msg; 450 | }; 451 | 452 | 453 | /** 454 | * Serializes the message to binary data (in protobuf wire format). 455 | * @return {!Uint8Array} 456 | */ 457 | proto.helloworld.HelloReply.prototype.serializeBinary = function() { 458 | var writer = new jspb.BinaryWriter(); 459 | proto.helloworld.HelloReply.serializeBinaryToWriter(this, writer); 460 | return writer.getResultBuffer(); 461 | }; 462 | 463 | 464 | /** 465 | * Serializes the given message to binary data (in protobuf wire 466 | * format), writing to the given BinaryWriter. 467 | * @param {!proto.helloworld.HelloReply} message 468 | * @param {!jspb.BinaryWriter} writer 469 | * @suppress {unusedLocalVariables} f is only used for nested messages 470 | */ 471 | proto.helloworld.HelloReply.serializeBinaryToWriter = function(message, writer) { 472 | var f = undefined; 473 | f = message.getMessage(); 474 | if (f.length > 0) { 475 | writer.writeString( 476 | 1, 477 | f 478 | ); 479 | } 480 | }; 481 | 482 | 483 | /** 484 | * optional string message = 1; 485 | * @return {string} 486 | */ 487 | proto.helloworld.HelloReply.prototype.getMessage = function() { 488 | return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); 489 | }; 490 | 491 | 492 | /** 493 | * @param {string} value 494 | * @return {!proto.helloworld.HelloReply} returns this 495 | */ 496 | proto.helloworld.HelloReply.prototype.setMessage = function(value) { 497 | return jspb.Message.setProto3StringField(this, 1, value); 498 | }; 499 | 500 | 501 | goog.object.extend(exports, proto.helloworld); 502 | -------------------------------------------------------------------------------- /examples/helloworld/js/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | gRPC-Web Hello World 7 | 8 | 9 | 10 | 11 |

Open up the developer console and see the logs for the output.

12 | 13 | 14 | -------------------------------------------------------------------------------- /examples/helloworld/js/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "js-grpc-web-hello-world", 3 | "version": "0.1.0", 4 | "description": "gRPC-Web Hello World Example", 5 | "main": "server.js", 6 | "devDependencies": { 7 | "@grpc/grpc-js": "~1.0.5", 8 | "@grpc/proto-loader": "~0.5.4", 9 | "async": "~1.5.2", 10 | "google-protobuf": "~3.12.0", 11 | "grpc-web": "~1.2.1", 12 | "lodash": "~4.17.0", 13 | "webpack": "~4.43.0", 14 | "webpack-cli": "~3.3.11" 15 | } 16 | } -------------------------------------------------------------------------------- /examples/helloworld/js/server.js: -------------------------------------------------------------------------------- 1 | var PROTO_PATH = __dirname + '/helloworld.proto'; 2 | 3 | var assert = require('assert'); 4 | var async = require('async'); 5 | var _ = require('lodash'); 6 | var grpc = require('@grpc/grpc-js'); 7 | var protoLoader = require('@grpc/proto-loader'); 8 | var packageDefinition = protoLoader.loadSync( 9 | PROTO_PATH, 10 | {keepCase: true, 11 | longs: String, 12 | enums: String, 13 | defaults: true, 14 | oneofs: true 15 | }); 16 | var protoDescriptor = grpc.loadPackageDefinition(packageDefinition); 17 | var helloworld = protoDescriptor.helloworld; 18 | 19 | /** 20 | * @param {!Object} call 21 | * @param {function():?} callback 22 | */ 23 | function doSayHello(call, callback) { 24 | callback(null, {message: `Hello ${call.request.name}!`}); 25 | } 26 | 27 | /** 28 | * @param {!Object} call 29 | */ 30 | function doSayRepeatHello(call) { 31 | var senders = []; 32 | function sender(name) { 33 | return (callback) => { 34 | call.write({ 35 | message: 'Hey! ' + name 36 | }); 37 | _.delay(callback, 500); // in ms 38 | }; 39 | } 40 | for (var i = 0; i < call.request.count; i++) { 41 | senders[i] = sender(call.request.name + i); 42 | } 43 | async.series(senders, () => { 44 | call.end(); 45 | }); 46 | } 47 | 48 | /** 49 | * @return {!Object} gRPC server 50 | */ 51 | function getServer() { 52 | var server = new grpc.Server(); 53 | server.addService(helloworld.Greeter.service, { 54 | sayHello: doSayHello, 55 | sayRepeatHello: doSayRepeatHello, 56 | }); 57 | return server; 58 | } 59 | 60 | if (require.main === module) { 61 | var server = getServer(); 62 | server.bindAsync( 63 | '0.0.0.0:9090', grpc.ServerCredentials.createInsecure(), (err, port) => { 64 | assert.ifError(err); 65 | server.start(); 66 | }); 67 | } 68 | 69 | exports.getServer = getServer; -------------------------------------------------------------------------------- /examples/helloworld/js/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@grpc/grpc-js@~1.0.5": 6 | version "1.0.5" 7 | resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.0.5.tgz#09948c0810e62828fdd61455b2eb13d7879888b0" 8 | integrity sha512-Hm+xOiqAhcpT9RYM8lc15dbQD7aQurM7ZU8ulmulepiPlN7iwBXXwP3vSBUimoFoApRqz7pSIisXU8pZaCB4og== 9 | dependencies: 10 | semver "^6.2.0" 11 | 12 | "@grpc/proto-loader@~0.5.4": 13 | version "0.5.5" 14 | resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.5.5.tgz#6725e7a1827bdf8e92e29fbf4e9ef0203c0906a9" 15 | integrity sha512-WwN9jVNdHRQoOBo9FDH7qU+mgfjPc8GygPYms3M+y3fbQLfnCe/Kv/E01t7JRgnrsOHH8euvSbed3mIalXhwqQ== 16 | dependencies: 17 | lodash.camelcase "^4.3.0" 18 | protobufjs "^6.8.6" 19 | 20 | "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": 21 | version "1.1.2" 22 | resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" 23 | integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= 24 | 25 | "@protobufjs/base64@^1.1.2": 26 | version "1.1.2" 27 | resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" 28 | integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== 29 | 30 | "@protobufjs/codegen@^2.0.4": 31 | version "2.0.4" 32 | resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" 33 | integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== 34 | 35 | "@protobufjs/eventemitter@^1.1.0": 36 | version "1.1.0" 37 | resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" 38 | integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= 39 | 40 | "@protobufjs/fetch@^1.1.0": 41 | version "1.1.0" 42 | resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" 43 | integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= 44 | dependencies: 45 | "@protobufjs/aspromise" "^1.1.1" 46 | "@protobufjs/inquire" "^1.1.0" 47 | 48 | "@protobufjs/float@^1.0.2": 49 | version "1.0.2" 50 | resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" 51 | integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= 52 | 53 | "@protobufjs/inquire@^1.1.0": 54 | version "1.1.0" 55 | resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" 56 | integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= 57 | 58 | "@protobufjs/path@^1.1.2": 59 | version "1.1.2" 60 | resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" 61 | integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= 62 | 63 | "@protobufjs/pool@^1.1.0": 64 | version "1.1.0" 65 | resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" 66 | integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= 67 | 68 | "@protobufjs/utf8@^1.1.0": 69 | version "1.1.0" 70 | resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" 71 | integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= 72 | 73 | "@types/long@^4.0.1": 74 | version "4.0.1" 75 | resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" 76 | integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== 77 | 78 | "@types/node@^13.7.0": 79 | version "13.13.25" 80 | resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.25.tgz#768d6712b15099a744812a92b84ffde8f4e13cf1" 81 | integrity sha512-6ZMK4xRcF2XrPdKmPYQxZkdHKV18xKgUFVvhIgw2iwaaO6weleLPHLBGPZmLhjo+m1N+MZXRAoBEBCCVqgO2zQ== 82 | 83 | "@webassemblyjs/ast@1.9.0": 84 | version "1.9.0" 85 | resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" 86 | integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== 87 | dependencies: 88 | "@webassemblyjs/helper-module-context" "1.9.0" 89 | "@webassemblyjs/helper-wasm-bytecode" "1.9.0" 90 | "@webassemblyjs/wast-parser" "1.9.0" 91 | 92 | "@webassemblyjs/floating-point-hex-parser@1.9.0": 93 | version "1.9.0" 94 | resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" 95 | integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== 96 | 97 | "@webassemblyjs/helper-api-error@1.9.0": 98 | version "1.9.0" 99 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" 100 | integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== 101 | 102 | "@webassemblyjs/helper-buffer@1.9.0": 103 | version "1.9.0" 104 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" 105 | integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== 106 | 107 | "@webassemblyjs/helper-code-frame@1.9.0": 108 | version "1.9.0" 109 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" 110 | integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== 111 | dependencies: 112 | "@webassemblyjs/wast-printer" "1.9.0" 113 | 114 | "@webassemblyjs/helper-fsm@1.9.0": 115 | version "1.9.0" 116 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" 117 | integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== 118 | 119 | "@webassemblyjs/helper-module-context@1.9.0": 120 | version "1.9.0" 121 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" 122 | integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== 123 | dependencies: 124 | "@webassemblyjs/ast" "1.9.0" 125 | 126 | "@webassemblyjs/helper-wasm-bytecode@1.9.0": 127 | version "1.9.0" 128 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" 129 | integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== 130 | 131 | "@webassemblyjs/helper-wasm-section@1.9.0": 132 | version "1.9.0" 133 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" 134 | integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== 135 | dependencies: 136 | "@webassemblyjs/ast" "1.9.0" 137 | "@webassemblyjs/helper-buffer" "1.9.0" 138 | "@webassemblyjs/helper-wasm-bytecode" "1.9.0" 139 | "@webassemblyjs/wasm-gen" "1.9.0" 140 | 141 | "@webassemblyjs/ieee754@1.9.0": 142 | version "1.9.0" 143 | resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" 144 | integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== 145 | dependencies: 146 | "@xtuc/ieee754" "^1.2.0" 147 | 148 | "@webassemblyjs/leb128@1.9.0": 149 | version "1.9.0" 150 | resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" 151 | integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== 152 | dependencies: 153 | "@xtuc/long" "4.2.2" 154 | 155 | "@webassemblyjs/utf8@1.9.0": 156 | version "1.9.0" 157 | resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" 158 | integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== 159 | 160 | "@webassemblyjs/wasm-edit@1.9.0": 161 | version "1.9.0" 162 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" 163 | integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== 164 | dependencies: 165 | "@webassemblyjs/ast" "1.9.0" 166 | "@webassemblyjs/helper-buffer" "1.9.0" 167 | "@webassemblyjs/helper-wasm-bytecode" "1.9.0" 168 | "@webassemblyjs/helper-wasm-section" "1.9.0" 169 | "@webassemblyjs/wasm-gen" "1.9.0" 170 | "@webassemblyjs/wasm-opt" "1.9.0" 171 | "@webassemblyjs/wasm-parser" "1.9.0" 172 | "@webassemblyjs/wast-printer" "1.9.0" 173 | 174 | "@webassemblyjs/wasm-gen@1.9.0": 175 | version "1.9.0" 176 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" 177 | integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== 178 | dependencies: 179 | "@webassemblyjs/ast" "1.9.0" 180 | "@webassemblyjs/helper-wasm-bytecode" "1.9.0" 181 | "@webassemblyjs/ieee754" "1.9.0" 182 | "@webassemblyjs/leb128" "1.9.0" 183 | "@webassemblyjs/utf8" "1.9.0" 184 | 185 | "@webassemblyjs/wasm-opt@1.9.0": 186 | version "1.9.0" 187 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" 188 | integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== 189 | dependencies: 190 | "@webassemblyjs/ast" "1.9.0" 191 | "@webassemblyjs/helper-buffer" "1.9.0" 192 | "@webassemblyjs/wasm-gen" "1.9.0" 193 | "@webassemblyjs/wasm-parser" "1.9.0" 194 | 195 | "@webassemblyjs/wasm-parser@1.9.0": 196 | version "1.9.0" 197 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" 198 | integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== 199 | dependencies: 200 | "@webassemblyjs/ast" "1.9.0" 201 | "@webassemblyjs/helper-api-error" "1.9.0" 202 | "@webassemblyjs/helper-wasm-bytecode" "1.9.0" 203 | "@webassemblyjs/ieee754" "1.9.0" 204 | "@webassemblyjs/leb128" "1.9.0" 205 | "@webassemblyjs/utf8" "1.9.0" 206 | 207 | "@webassemblyjs/wast-parser@1.9.0": 208 | version "1.9.0" 209 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" 210 | integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== 211 | dependencies: 212 | "@webassemblyjs/ast" "1.9.0" 213 | "@webassemblyjs/floating-point-hex-parser" "1.9.0" 214 | "@webassemblyjs/helper-api-error" "1.9.0" 215 | "@webassemblyjs/helper-code-frame" "1.9.0" 216 | "@webassemblyjs/helper-fsm" "1.9.0" 217 | "@xtuc/long" "4.2.2" 218 | 219 | "@webassemblyjs/wast-printer@1.9.0": 220 | version "1.9.0" 221 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" 222 | integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== 223 | dependencies: 224 | "@webassemblyjs/ast" "1.9.0" 225 | "@webassemblyjs/wast-parser" "1.9.0" 226 | "@xtuc/long" "4.2.2" 227 | 228 | "@xtuc/ieee754@^1.2.0": 229 | version "1.2.0" 230 | resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" 231 | integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== 232 | 233 | "@xtuc/long@4.2.2": 234 | version "4.2.2" 235 | resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" 236 | integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== 237 | 238 | acorn@^6.4.1: 239 | version "6.4.2" 240 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" 241 | integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== 242 | 243 | ajv-errors@^1.0.0: 244 | version "1.0.1" 245 | resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" 246 | integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== 247 | 248 | ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: 249 | version "3.5.2" 250 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" 251 | integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== 252 | 253 | ajv@^6.1.0, ajv@^6.10.2: 254 | version "6.12.6" 255 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 256 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 257 | dependencies: 258 | fast-deep-equal "^3.1.1" 259 | fast-json-stable-stringify "^2.0.0" 260 | json-schema-traverse "^0.4.1" 261 | uri-js "^4.2.2" 262 | 263 | ansi-regex@^4.1.0: 264 | version "4.1.0" 265 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 266 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 267 | 268 | ansi-styles@^3.2.0, ansi-styles@^3.2.1: 269 | version "3.2.1" 270 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 271 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 272 | dependencies: 273 | color-convert "^1.9.0" 274 | 275 | anymatch@^2.0.0: 276 | version "2.0.0" 277 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" 278 | integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== 279 | dependencies: 280 | micromatch "^3.1.4" 281 | normalize-path "^2.1.1" 282 | 283 | anymatch@~3.1.1: 284 | version "3.1.1" 285 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" 286 | integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== 287 | dependencies: 288 | normalize-path "^3.0.0" 289 | picomatch "^2.0.4" 290 | 291 | aproba@^1.1.1: 292 | version "1.2.0" 293 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 294 | integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== 295 | 296 | arr-diff@^4.0.0: 297 | version "4.0.0" 298 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" 299 | integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= 300 | 301 | arr-flatten@^1.1.0: 302 | version "1.1.0" 303 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" 304 | integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== 305 | 306 | arr-union@^3.1.0: 307 | version "3.1.0" 308 | resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" 309 | integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= 310 | 311 | array-unique@^0.3.2: 312 | version "0.3.2" 313 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" 314 | integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= 315 | 316 | asn1.js@^5.2.0: 317 | version "5.4.1" 318 | resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" 319 | integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== 320 | dependencies: 321 | bn.js "^4.0.0" 322 | inherits "^2.0.1" 323 | minimalistic-assert "^1.0.0" 324 | safer-buffer "^2.1.0" 325 | 326 | assert@^1.1.1: 327 | version "1.5.0" 328 | resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" 329 | integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== 330 | dependencies: 331 | object-assign "^4.1.1" 332 | util "0.10.3" 333 | 334 | assign-symbols@^1.0.0: 335 | version "1.0.0" 336 | resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" 337 | integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= 338 | 339 | async-each@^1.0.1: 340 | version "1.0.3" 341 | resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" 342 | integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== 343 | 344 | async@~1.5.2: 345 | version "1.5.2" 346 | resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" 347 | integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= 348 | 349 | atob@^2.1.2: 350 | version "2.1.2" 351 | resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" 352 | integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== 353 | 354 | balanced-match@^1.0.0: 355 | version "1.0.0" 356 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 357 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 358 | 359 | base64-js@^1.0.2: 360 | version "1.3.1" 361 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" 362 | integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== 363 | 364 | base@^0.11.1: 365 | version "0.11.2" 366 | resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" 367 | integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== 368 | dependencies: 369 | cache-base "^1.0.1" 370 | class-utils "^0.3.5" 371 | component-emitter "^1.2.1" 372 | define-property "^1.0.0" 373 | isobject "^3.0.1" 374 | mixin-deep "^1.2.0" 375 | pascalcase "^0.1.1" 376 | 377 | big.js@^5.2.2: 378 | version "5.2.2" 379 | resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" 380 | integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== 381 | 382 | binary-extensions@^1.0.0: 383 | version "1.13.1" 384 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" 385 | integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== 386 | 387 | binary-extensions@^2.0.0: 388 | version "2.1.0" 389 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" 390 | integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== 391 | 392 | bindings@^1.5.0: 393 | version "1.5.0" 394 | resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" 395 | integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== 396 | dependencies: 397 | file-uri-to-path "1.0.0" 398 | 399 | bluebird@^3.5.5: 400 | version "3.7.2" 401 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" 402 | integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== 403 | 404 | bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: 405 | version "4.11.9" 406 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" 407 | integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== 408 | 409 | bn.js@^5.1.1: 410 | version "5.1.3" 411 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" 412 | integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== 413 | 414 | brace-expansion@^1.1.7: 415 | version "1.1.11" 416 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 417 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 418 | dependencies: 419 | balanced-match "^1.0.0" 420 | concat-map "0.0.1" 421 | 422 | braces@^2.3.1, braces@^2.3.2: 423 | version "2.3.2" 424 | resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" 425 | integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== 426 | dependencies: 427 | arr-flatten "^1.1.0" 428 | array-unique "^0.3.2" 429 | extend-shallow "^2.0.1" 430 | fill-range "^4.0.0" 431 | isobject "^3.0.1" 432 | repeat-element "^1.1.2" 433 | snapdragon "^0.8.1" 434 | snapdragon-node "^2.0.1" 435 | split-string "^3.0.2" 436 | to-regex "^3.0.1" 437 | 438 | braces@~3.0.2: 439 | version "3.0.2" 440 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 441 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 442 | dependencies: 443 | fill-range "^7.0.1" 444 | 445 | brorand@^1.0.1: 446 | version "1.1.0" 447 | resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" 448 | integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= 449 | 450 | browserify-aes@^1.0.0, browserify-aes@^1.0.4: 451 | version "1.2.0" 452 | resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" 453 | integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== 454 | dependencies: 455 | buffer-xor "^1.0.3" 456 | cipher-base "^1.0.0" 457 | create-hash "^1.1.0" 458 | evp_bytestokey "^1.0.3" 459 | inherits "^2.0.1" 460 | safe-buffer "^5.0.1" 461 | 462 | browserify-cipher@^1.0.0: 463 | version "1.0.1" 464 | resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" 465 | integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== 466 | dependencies: 467 | browserify-aes "^1.0.4" 468 | browserify-des "^1.0.0" 469 | evp_bytestokey "^1.0.0" 470 | 471 | browserify-des@^1.0.0: 472 | version "1.0.2" 473 | resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" 474 | integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== 475 | dependencies: 476 | cipher-base "^1.0.1" 477 | des.js "^1.0.0" 478 | inherits "^2.0.1" 479 | safe-buffer "^5.1.2" 480 | 481 | browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: 482 | version "4.0.1" 483 | resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" 484 | integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= 485 | dependencies: 486 | bn.js "^4.1.0" 487 | randombytes "^2.0.1" 488 | 489 | browserify-sign@^4.0.0: 490 | version "4.2.1" 491 | resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" 492 | integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== 493 | dependencies: 494 | bn.js "^5.1.1" 495 | browserify-rsa "^4.0.1" 496 | create-hash "^1.2.0" 497 | create-hmac "^1.1.7" 498 | elliptic "^6.5.3" 499 | inherits "^2.0.4" 500 | parse-asn1 "^5.1.5" 501 | readable-stream "^3.6.0" 502 | safe-buffer "^5.2.0" 503 | 504 | browserify-zlib@^0.2.0: 505 | version "0.2.0" 506 | resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" 507 | integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== 508 | dependencies: 509 | pako "~1.0.5" 510 | 511 | buffer-from@^1.0.0: 512 | version "1.1.1" 513 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 514 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 515 | 516 | buffer-xor@^1.0.3: 517 | version "1.0.3" 518 | resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" 519 | integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= 520 | 521 | buffer@^4.3.0: 522 | version "4.9.2" 523 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" 524 | integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== 525 | dependencies: 526 | base64-js "^1.0.2" 527 | ieee754 "^1.1.4" 528 | isarray "^1.0.0" 529 | 530 | builtin-status-codes@^3.0.0: 531 | version "3.0.0" 532 | resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" 533 | integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= 534 | 535 | cacache@^12.0.2: 536 | version "12.0.4" 537 | resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" 538 | integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== 539 | dependencies: 540 | bluebird "^3.5.5" 541 | chownr "^1.1.1" 542 | figgy-pudding "^3.5.1" 543 | glob "^7.1.4" 544 | graceful-fs "^4.1.15" 545 | infer-owner "^1.0.3" 546 | lru-cache "^5.1.1" 547 | mississippi "^3.0.0" 548 | mkdirp "^0.5.1" 549 | move-concurrently "^1.0.1" 550 | promise-inflight "^1.0.1" 551 | rimraf "^2.6.3" 552 | ssri "^6.0.1" 553 | unique-filename "^1.1.1" 554 | y18n "^4.0.0" 555 | 556 | cache-base@^1.0.1: 557 | version "1.0.1" 558 | resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" 559 | integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== 560 | dependencies: 561 | collection-visit "^1.0.0" 562 | component-emitter "^1.2.1" 563 | get-value "^2.0.6" 564 | has-value "^1.0.0" 565 | isobject "^3.0.1" 566 | set-value "^2.0.0" 567 | to-object-path "^0.3.0" 568 | union-value "^1.0.0" 569 | unset-value "^1.0.0" 570 | 571 | camelcase@^5.0.0: 572 | version "5.3.1" 573 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 574 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 575 | 576 | chalk@^2.4.2: 577 | version "2.4.2" 578 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 579 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 580 | dependencies: 581 | ansi-styles "^3.2.1" 582 | escape-string-regexp "^1.0.5" 583 | supports-color "^5.3.0" 584 | 585 | chokidar@^2.1.8: 586 | version "2.1.8" 587 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" 588 | integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== 589 | dependencies: 590 | anymatch "^2.0.0" 591 | async-each "^1.0.1" 592 | braces "^2.3.2" 593 | glob-parent "^3.1.0" 594 | inherits "^2.0.3" 595 | is-binary-path "^1.0.0" 596 | is-glob "^4.0.0" 597 | normalize-path "^3.0.0" 598 | path-is-absolute "^1.0.0" 599 | readdirp "^2.2.1" 600 | upath "^1.1.1" 601 | optionalDependencies: 602 | fsevents "^1.2.7" 603 | 604 | chokidar@^3.4.1: 605 | version "3.4.2" 606 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d" 607 | integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A== 608 | dependencies: 609 | anymatch "~3.1.1" 610 | braces "~3.0.2" 611 | glob-parent "~5.1.0" 612 | is-binary-path "~2.1.0" 613 | is-glob "~4.0.1" 614 | normalize-path "~3.0.0" 615 | readdirp "~3.4.0" 616 | optionalDependencies: 617 | fsevents "~2.1.2" 618 | 619 | chownr@^1.1.1: 620 | version "1.1.4" 621 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" 622 | integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== 623 | 624 | chrome-trace-event@^1.0.2: 625 | version "1.0.2" 626 | resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" 627 | integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== 628 | dependencies: 629 | tslib "^1.9.0" 630 | 631 | cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: 632 | version "1.0.4" 633 | resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" 634 | integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== 635 | dependencies: 636 | inherits "^2.0.1" 637 | safe-buffer "^5.0.1" 638 | 639 | class-utils@^0.3.5: 640 | version "0.3.6" 641 | resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" 642 | integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== 643 | dependencies: 644 | arr-union "^3.1.0" 645 | define-property "^0.2.5" 646 | isobject "^3.0.0" 647 | static-extend "^0.1.1" 648 | 649 | cliui@^5.0.0: 650 | version "5.0.0" 651 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" 652 | integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== 653 | dependencies: 654 | string-width "^3.1.0" 655 | strip-ansi "^5.2.0" 656 | wrap-ansi "^5.1.0" 657 | 658 | collection-visit@^1.0.0: 659 | version "1.0.0" 660 | resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" 661 | integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= 662 | dependencies: 663 | map-visit "^1.0.0" 664 | object-visit "^1.0.0" 665 | 666 | color-convert@^1.9.0: 667 | version "1.9.3" 668 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 669 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 670 | dependencies: 671 | color-name "1.1.3" 672 | 673 | color-name@1.1.3: 674 | version "1.1.3" 675 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 676 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 677 | 678 | commander@^2.20.0: 679 | version "2.20.3" 680 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 681 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 682 | 683 | commondir@^1.0.1: 684 | version "1.0.1" 685 | resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" 686 | integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= 687 | 688 | component-emitter@^1.2.1: 689 | version "1.3.0" 690 | resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" 691 | integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== 692 | 693 | concat-map@0.0.1: 694 | version "0.0.1" 695 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 696 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 697 | 698 | concat-stream@^1.5.0: 699 | version "1.6.2" 700 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" 701 | integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== 702 | dependencies: 703 | buffer-from "^1.0.0" 704 | inherits "^2.0.3" 705 | readable-stream "^2.2.2" 706 | typedarray "^0.0.6" 707 | 708 | console-browserify@^1.1.0: 709 | version "1.2.0" 710 | resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" 711 | integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== 712 | 713 | constants-browserify@^1.0.0: 714 | version "1.0.0" 715 | resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" 716 | integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= 717 | 718 | copy-concurrently@^1.0.0: 719 | version "1.0.5" 720 | resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" 721 | integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== 722 | dependencies: 723 | aproba "^1.1.1" 724 | fs-write-stream-atomic "^1.0.8" 725 | iferr "^0.1.5" 726 | mkdirp "^0.5.1" 727 | rimraf "^2.5.4" 728 | run-queue "^1.0.0" 729 | 730 | copy-descriptor@^0.1.0: 731 | version "0.1.1" 732 | resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" 733 | integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= 734 | 735 | core-util-is@~1.0.0: 736 | version "1.0.2" 737 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 738 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 739 | 740 | create-ecdh@^4.0.0: 741 | version "4.0.4" 742 | resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" 743 | integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== 744 | dependencies: 745 | bn.js "^4.1.0" 746 | elliptic "^6.5.3" 747 | 748 | create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: 749 | version "1.2.0" 750 | resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" 751 | integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== 752 | dependencies: 753 | cipher-base "^1.0.1" 754 | inherits "^2.0.1" 755 | md5.js "^1.3.4" 756 | ripemd160 "^2.0.1" 757 | sha.js "^2.4.0" 758 | 759 | create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: 760 | version "1.1.7" 761 | resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" 762 | integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== 763 | dependencies: 764 | cipher-base "^1.0.3" 765 | create-hash "^1.1.0" 766 | inherits "^2.0.1" 767 | ripemd160 "^2.0.0" 768 | safe-buffer "^5.0.1" 769 | sha.js "^2.4.8" 770 | 771 | cross-spawn@^6.0.5: 772 | version "6.0.5" 773 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 774 | integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== 775 | dependencies: 776 | nice-try "^1.0.4" 777 | path-key "^2.0.1" 778 | semver "^5.5.0" 779 | shebang-command "^1.2.0" 780 | which "^1.2.9" 781 | 782 | crypto-browserify@^3.11.0: 783 | version "3.12.0" 784 | resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" 785 | integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== 786 | dependencies: 787 | browserify-cipher "^1.0.0" 788 | browserify-sign "^4.0.0" 789 | create-ecdh "^4.0.0" 790 | create-hash "^1.1.0" 791 | create-hmac "^1.1.0" 792 | diffie-hellman "^5.0.0" 793 | inherits "^2.0.1" 794 | pbkdf2 "^3.0.3" 795 | public-encrypt "^4.0.0" 796 | randombytes "^2.0.0" 797 | randomfill "^1.0.3" 798 | 799 | cyclist@^1.0.1: 800 | version "1.0.1" 801 | resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" 802 | integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= 803 | 804 | debug@^2.2.0, debug@^2.3.3: 805 | version "2.6.9" 806 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 807 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 808 | dependencies: 809 | ms "2.0.0" 810 | 811 | decamelize@^1.2.0: 812 | version "1.2.0" 813 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 814 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 815 | 816 | decode-uri-component@^0.2.0: 817 | version "0.2.0" 818 | resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" 819 | integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= 820 | 821 | define-property@^0.2.5: 822 | version "0.2.5" 823 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" 824 | integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= 825 | dependencies: 826 | is-descriptor "^0.1.0" 827 | 828 | define-property@^1.0.0: 829 | version "1.0.0" 830 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" 831 | integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= 832 | dependencies: 833 | is-descriptor "^1.0.0" 834 | 835 | define-property@^2.0.2: 836 | version "2.0.2" 837 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" 838 | integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== 839 | dependencies: 840 | is-descriptor "^1.0.2" 841 | isobject "^3.0.1" 842 | 843 | des.js@^1.0.0: 844 | version "1.0.1" 845 | resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" 846 | integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== 847 | dependencies: 848 | inherits "^2.0.1" 849 | minimalistic-assert "^1.0.0" 850 | 851 | detect-file@^1.0.0: 852 | version "1.0.0" 853 | resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" 854 | integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= 855 | 856 | diffie-hellman@^5.0.0: 857 | version "5.0.3" 858 | resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" 859 | integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== 860 | dependencies: 861 | bn.js "^4.1.0" 862 | miller-rabin "^4.0.0" 863 | randombytes "^2.0.0" 864 | 865 | domain-browser@^1.1.1: 866 | version "1.2.0" 867 | resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" 868 | integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== 869 | 870 | duplexify@^3.4.2, duplexify@^3.6.0: 871 | version "3.7.1" 872 | resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" 873 | integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== 874 | dependencies: 875 | end-of-stream "^1.0.0" 876 | inherits "^2.0.1" 877 | readable-stream "^2.0.0" 878 | stream-shift "^1.0.0" 879 | 880 | elliptic@^6.5.3: 881 | version "6.5.3" 882 | resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" 883 | integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== 884 | dependencies: 885 | bn.js "^4.4.0" 886 | brorand "^1.0.1" 887 | hash.js "^1.0.0" 888 | hmac-drbg "^1.0.0" 889 | inherits "^2.0.1" 890 | minimalistic-assert "^1.0.0" 891 | minimalistic-crypto-utils "^1.0.0" 892 | 893 | emoji-regex@^7.0.1: 894 | version "7.0.3" 895 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 896 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 897 | 898 | emojis-list@^3.0.0: 899 | version "3.0.0" 900 | resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" 901 | integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== 902 | 903 | end-of-stream@^1.0.0, end-of-stream@^1.1.0: 904 | version "1.4.4" 905 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 906 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 907 | dependencies: 908 | once "^1.4.0" 909 | 910 | enhanced-resolve@^4.1.0, enhanced-resolve@^4.1.1: 911 | version "4.3.0" 912 | resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126" 913 | integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ== 914 | dependencies: 915 | graceful-fs "^4.1.2" 916 | memory-fs "^0.5.0" 917 | tapable "^1.0.0" 918 | 919 | errno@^0.1.3, errno@~0.1.7: 920 | version "0.1.7" 921 | resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" 922 | integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== 923 | dependencies: 924 | prr "~1.0.1" 925 | 926 | escape-string-regexp@^1.0.5: 927 | version "1.0.5" 928 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 929 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 930 | 931 | eslint-scope@^4.0.3: 932 | version "4.0.3" 933 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" 934 | integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== 935 | dependencies: 936 | esrecurse "^4.1.0" 937 | estraverse "^4.1.1" 938 | 939 | esrecurse@^4.1.0: 940 | version "4.3.0" 941 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 942 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 943 | dependencies: 944 | estraverse "^5.2.0" 945 | 946 | estraverse@^4.1.1: 947 | version "4.3.0" 948 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 949 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 950 | 951 | estraverse@^5.2.0: 952 | version "5.2.0" 953 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" 954 | integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== 955 | 956 | events@^3.0.0: 957 | version "3.2.0" 958 | resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" 959 | integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== 960 | 961 | evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: 962 | version "1.0.3" 963 | resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" 964 | integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== 965 | dependencies: 966 | md5.js "^1.3.4" 967 | safe-buffer "^5.1.1" 968 | 969 | expand-brackets@^2.1.4: 970 | version "2.1.4" 971 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" 972 | integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= 973 | dependencies: 974 | debug "^2.3.3" 975 | define-property "^0.2.5" 976 | extend-shallow "^2.0.1" 977 | posix-character-classes "^0.1.0" 978 | regex-not "^1.0.0" 979 | snapdragon "^0.8.1" 980 | to-regex "^3.0.1" 981 | 982 | expand-tilde@^2.0.0, expand-tilde@^2.0.2: 983 | version "2.0.2" 984 | resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" 985 | integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= 986 | dependencies: 987 | homedir-polyfill "^1.0.1" 988 | 989 | extend-shallow@^2.0.1: 990 | version "2.0.1" 991 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" 992 | integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= 993 | dependencies: 994 | is-extendable "^0.1.0" 995 | 996 | extend-shallow@^3.0.0, extend-shallow@^3.0.2: 997 | version "3.0.2" 998 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" 999 | integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= 1000 | dependencies: 1001 | assign-symbols "^1.0.0" 1002 | is-extendable "^1.0.1" 1003 | 1004 | extglob@^2.0.4: 1005 | version "2.0.4" 1006 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" 1007 | integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== 1008 | dependencies: 1009 | array-unique "^0.3.2" 1010 | define-property "^1.0.0" 1011 | expand-brackets "^2.1.4" 1012 | extend-shallow "^2.0.1" 1013 | fragment-cache "^0.2.1" 1014 | regex-not "^1.0.0" 1015 | snapdragon "^0.8.1" 1016 | to-regex "^3.0.1" 1017 | 1018 | fast-deep-equal@^3.1.1: 1019 | version "3.1.3" 1020 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 1021 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 1022 | 1023 | fast-json-stable-stringify@^2.0.0: 1024 | version "2.1.0" 1025 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 1026 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 1027 | 1028 | figgy-pudding@^3.5.1: 1029 | version "3.5.2" 1030 | resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" 1031 | integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== 1032 | 1033 | file-uri-to-path@1.0.0: 1034 | version "1.0.0" 1035 | resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" 1036 | integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== 1037 | 1038 | fill-range@^4.0.0: 1039 | version "4.0.0" 1040 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" 1041 | integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= 1042 | dependencies: 1043 | extend-shallow "^2.0.1" 1044 | is-number "^3.0.0" 1045 | repeat-string "^1.6.1" 1046 | to-regex-range "^2.1.0" 1047 | 1048 | fill-range@^7.0.1: 1049 | version "7.0.1" 1050 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 1051 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 1052 | dependencies: 1053 | to-regex-range "^5.0.1" 1054 | 1055 | find-cache-dir@^2.1.0: 1056 | version "2.1.0" 1057 | resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" 1058 | integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== 1059 | dependencies: 1060 | commondir "^1.0.1" 1061 | make-dir "^2.0.0" 1062 | pkg-dir "^3.0.0" 1063 | 1064 | find-up@^3.0.0: 1065 | version "3.0.0" 1066 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 1067 | integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== 1068 | dependencies: 1069 | locate-path "^3.0.0" 1070 | 1071 | findup-sync@^3.0.0: 1072 | version "3.0.0" 1073 | resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" 1074 | integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== 1075 | dependencies: 1076 | detect-file "^1.0.0" 1077 | is-glob "^4.0.0" 1078 | micromatch "^3.0.4" 1079 | resolve-dir "^1.0.1" 1080 | 1081 | flush-write-stream@^1.0.0: 1082 | version "1.1.1" 1083 | resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" 1084 | integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== 1085 | dependencies: 1086 | inherits "^2.0.3" 1087 | readable-stream "^2.3.6" 1088 | 1089 | for-in@^1.0.2: 1090 | version "1.0.2" 1091 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 1092 | integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= 1093 | 1094 | fragment-cache@^0.2.1: 1095 | version "0.2.1" 1096 | resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" 1097 | integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= 1098 | dependencies: 1099 | map-cache "^0.2.2" 1100 | 1101 | from2@^2.1.0: 1102 | version "2.3.0" 1103 | resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" 1104 | integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= 1105 | dependencies: 1106 | inherits "^2.0.1" 1107 | readable-stream "^2.0.0" 1108 | 1109 | fs-write-stream-atomic@^1.0.8: 1110 | version "1.0.10" 1111 | resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" 1112 | integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= 1113 | dependencies: 1114 | graceful-fs "^4.1.2" 1115 | iferr "^0.1.5" 1116 | imurmurhash "^0.1.4" 1117 | readable-stream "1 || 2" 1118 | 1119 | fs.realpath@^1.0.0: 1120 | version "1.0.0" 1121 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1122 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 1123 | 1124 | fsevents@^1.2.7: 1125 | version "1.2.13" 1126 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" 1127 | integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== 1128 | dependencies: 1129 | bindings "^1.5.0" 1130 | nan "^2.12.1" 1131 | 1132 | fsevents@~2.1.2: 1133 | version "2.1.3" 1134 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" 1135 | integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== 1136 | 1137 | get-caller-file@^2.0.1: 1138 | version "2.0.5" 1139 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 1140 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 1141 | 1142 | get-value@^2.0.3, get-value@^2.0.6: 1143 | version "2.0.6" 1144 | resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" 1145 | integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= 1146 | 1147 | glob-parent@^3.1.0: 1148 | version "3.1.0" 1149 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" 1150 | integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= 1151 | dependencies: 1152 | is-glob "^3.1.0" 1153 | path-dirname "^1.0.0" 1154 | 1155 | glob-parent@~5.1.0: 1156 | version "5.1.1" 1157 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" 1158 | integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== 1159 | dependencies: 1160 | is-glob "^4.0.1" 1161 | 1162 | glob@^7.1.3, glob@^7.1.4: 1163 | version "7.1.6" 1164 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 1165 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 1166 | dependencies: 1167 | fs.realpath "^1.0.0" 1168 | inflight "^1.0.4" 1169 | inherits "2" 1170 | minimatch "^3.0.4" 1171 | once "^1.3.0" 1172 | path-is-absolute "^1.0.0" 1173 | 1174 | global-modules@^1.0.0: 1175 | version "1.0.0" 1176 | resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" 1177 | integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== 1178 | dependencies: 1179 | global-prefix "^1.0.1" 1180 | is-windows "^1.0.1" 1181 | resolve-dir "^1.0.0" 1182 | 1183 | global-modules@^2.0.0: 1184 | version "2.0.0" 1185 | resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" 1186 | integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== 1187 | dependencies: 1188 | global-prefix "^3.0.0" 1189 | 1190 | global-prefix@^1.0.1: 1191 | version "1.0.2" 1192 | resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" 1193 | integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= 1194 | dependencies: 1195 | expand-tilde "^2.0.2" 1196 | homedir-polyfill "^1.0.1" 1197 | ini "^1.3.4" 1198 | is-windows "^1.0.1" 1199 | which "^1.2.14" 1200 | 1201 | global-prefix@^3.0.0: 1202 | version "3.0.0" 1203 | resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" 1204 | integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== 1205 | dependencies: 1206 | ini "^1.3.5" 1207 | kind-of "^6.0.2" 1208 | which "^1.3.1" 1209 | 1210 | google-protobuf@~3.12.0: 1211 | version "3.12.4" 1212 | resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.12.4.tgz#fd89b7e5052cdb35a80f9b455612851d542a5c9f" 1213 | integrity sha512-ItTn8YepDQMHEMHloUPH+FDaTPiHTnbsMvP50aXfbI65IK3AA5+wXlHSygJH8xz+h1g4gu7V+CK5X1/SaGITsA== 1214 | 1215 | graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: 1216 | version "4.2.4" 1217 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" 1218 | integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== 1219 | 1220 | grpc-web@~1.2.1: 1221 | version "1.2.1" 1222 | resolved "https://registry.yarnpkg.com/grpc-web/-/grpc-web-1.2.1.tgz#860051d705bf5baa7b81fcbd14030060bf16b7b9" 1223 | integrity sha512-ibBaJPzfMVuLPgaST9w0kZl60s+SnkPBQp6QKdpEr85tpc1gXW2QDqSne9xiyiym0logDfdUSm4aX5h9YBA2mw== 1224 | 1225 | has-flag@^3.0.0: 1226 | version "3.0.0" 1227 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 1228 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 1229 | 1230 | has-value@^0.3.1: 1231 | version "0.3.1" 1232 | resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" 1233 | integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= 1234 | dependencies: 1235 | get-value "^2.0.3" 1236 | has-values "^0.1.4" 1237 | isobject "^2.0.0" 1238 | 1239 | has-value@^1.0.0: 1240 | version "1.0.0" 1241 | resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" 1242 | integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= 1243 | dependencies: 1244 | get-value "^2.0.6" 1245 | has-values "^1.0.0" 1246 | isobject "^3.0.0" 1247 | 1248 | has-values@^0.1.4: 1249 | version "0.1.4" 1250 | resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" 1251 | integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= 1252 | 1253 | has-values@^1.0.0: 1254 | version "1.0.0" 1255 | resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" 1256 | integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= 1257 | dependencies: 1258 | is-number "^3.0.0" 1259 | kind-of "^4.0.0" 1260 | 1261 | hash-base@^3.0.0: 1262 | version "3.1.0" 1263 | resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" 1264 | integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== 1265 | dependencies: 1266 | inherits "^2.0.4" 1267 | readable-stream "^3.6.0" 1268 | safe-buffer "^5.2.0" 1269 | 1270 | hash.js@^1.0.0, hash.js@^1.0.3: 1271 | version "1.1.7" 1272 | resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" 1273 | integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== 1274 | dependencies: 1275 | inherits "^2.0.3" 1276 | minimalistic-assert "^1.0.1" 1277 | 1278 | hmac-drbg@^1.0.0: 1279 | version "1.0.1" 1280 | resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" 1281 | integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= 1282 | dependencies: 1283 | hash.js "^1.0.3" 1284 | minimalistic-assert "^1.0.0" 1285 | minimalistic-crypto-utils "^1.0.1" 1286 | 1287 | homedir-polyfill@^1.0.1: 1288 | version "1.0.3" 1289 | resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" 1290 | integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== 1291 | dependencies: 1292 | parse-passwd "^1.0.0" 1293 | 1294 | https-browserify@^1.0.0: 1295 | version "1.0.0" 1296 | resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" 1297 | integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= 1298 | 1299 | ieee754@^1.1.4: 1300 | version "1.1.13" 1301 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" 1302 | integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== 1303 | 1304 | iferr@^0.1.5: 1305 | version "0.1.5" 1306 | resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" 1307 | integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= 1308 | 1309 | import-local@^2.0.0: 1310 | version "2.0.0" 1311 | resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" 1312 | integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== 1313 | dependencies: 1314 | pkg-dir "^3.0.0" 1315 | resolve-cwd "^2.0.0" 1316 | 1317 | imurmurhash@^0.1.4: 1318 | version "0.1.4" 1319 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1320 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 1321 | 1322 | infer-owner@^1.0.3: 1323 | version "1.0.4" 1324 | resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" 1325 | integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== 1326 | 1327 | inflight@^1.0.4: 1328 | version "1.0.6" 1329 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1330 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 1331 | dependencies: 1332 | once "^1.3.0" 1333 | wrappy "1" 1334 | 1335 | inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: 1336 | version "2.0.4" 1337 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1338 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1339 | 1340 | inherits@2.0.1: 1341 | version "2.0.1" 1342 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" 1343 | integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= 1344 | 1345 | inherits@2.0.3: 1346 | version "2.0.3" 1347 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1348 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 1349 | 1350 | ini@^1.3.4, ini@^1.3.5: 1351 | version "1.3.5" 1352 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 1353 | integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== 1354 | 1355 | interpret@^1.4.0: 1356 | version "1.4.0" 1357 | resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" 1358 | integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== 1359 | 1360 | is-accessor-descriptor@^0.1.6: 1361 | version "0.1.6" 1362 | resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" 1363 | integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= 1364 | dependencies: 1365 | kind-of "^3.0.2" 1366 | 1367 | is-accessor-descriptor@^1.0.0: 1368 | version "1.0.0" 1369 | resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" 1370 | integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== 1371 | dependencies: 1372 | kind-of "^6.0.0" 1373 | 1374 | is-binary-path@^1.0.0: 1375 | version "1.0.1" 1376 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" 1377 | integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= 1378 | dependencies: 1379 | binary-extensions "^1.0.0" 1380 | 1381 | is-binary-path@~2.1.0: 1382 | version "2.1.0" 1383 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 1384 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 1385 | dependencies: 1386 | binary-extensions "^2.0.0" 1387 | 1388 | is-buffer@^1.1.5: 1389 | version "1.1.6" 1390 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 1391 | integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== 1392 | 1393 | is-data-descriptor@^0.1.4: 1394 | version "0.1.4" 1395 | resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" 1396 | integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= 1397 | dependencies: 1398 | kind-of "^3.0.2" 1399 | 1400 | is-data-descriptor@^1.0.0: 1401 | version "1.0.0" 1402 | resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" 1403 | integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== 1404 | dependencies: 1405 | kind-of "^6.0.0" 1406 | 1407 | is-descriptor@^0.1.0: 1408 | version "0.1.6" 1409 | resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" 1410 | integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== 1411 | dependencies: 1412 | is-accessor-descriptor "^0.1.6" 1413 | is-data-descriptor "^0.1.4" 1414 | kind-of "^5.0.0" 1415 | 1416 | is-descriptor@^1.0.0, is-descriptor@^1.0.2: 1417 | version "1.0.2" 1418 | resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" 1419 | integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== 1420 | dependencies: 1421 | is-accessor-descriptor "^1.0.0" 1422 | is-data-descriptor "^1.0.0" 1423 | kind-of "^6.0.2" 1424 | 1425 | is-extendable@^0.1.0, is-extendable@^0.1.1: 1426 | version "0.1.1" 1427 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 1428 | integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= 1429 | 1430 | is-extendable@^1.0.1: 1431 | version "1.0.1" 1432 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" 1433 | integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== 1434 | dependencies: 1435 | is-plain-object "^2.0.4" 1436 | 1437 | is-extglob@^2.1.0, is-extglob@^2.1.1: 1438 | version "2.1.1" 1439 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1440 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 1441 | 1442 | is-fullwidth-code-point@^2.0.0: 1443 | version "2.0.0" 1444 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1445 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 1446 | 1447 | is-glob@^3.1.0: 1448 | version "3.1.0" 1449 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" 1450 | integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= 1451 | dependencies: 1452 | is-extglob "^2.1.0" 1453 | 1454 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: 1455 | version "4.0.1" 1456 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 1457 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 1458 | dependencies: 1459 | is-extglob "^2.1.1" 1460 | 1461 | is-number@^3.0.0: 1462 | version "3.0.0" 1463 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 1464 | integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= 1465 | dependencies: 1466 | kind-of "^3.0.2" 1467 | 1468 | is-number@^7.0.0: 1469 | version "7.0.0" 1470 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1471 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1472 | 1473 | is-plain-object@^2.0.3, is-plain-object@^2.0.4: 1474 | version "2.0.4" 1475 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 1476 | integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== 1477 | dependencies: 1478 | isobject "^3.0.1" 1479 | 1480 | is-windows@^1.0.1, is-windows@^1.0.2: 1481 | version "1.0.2" 1482 | resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" 1483 | integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== 1484 | 1485 | is-wsl@^1.1.0: 1486 | version "1.1.0" 1487 | resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" 1488 | integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= 1489 | 1490 | isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: 1491 | version "1.0.0" 1492 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1493 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 1494 | 1495 | isexe@^2.0.0: 1496 | version "2.0.0" 1497 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1498 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1499 | 1500 | isobject@^2.0.0: 1501 | version "2.1.0" 1502 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 1503 | integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= 1504 | dependencies: 1505 | isarray "1.0.0" 1506 | 1507 | isobject@^3.0.0, isobject@^3.0.1: 1508 | version "3.0.1" 1509 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 1510 | integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= 1511 | 1512 | json-parse-better-errors@^1.0.2: 1513 | version "1.0.2" 1514 | resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" 1515 | integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== 1516 | 1517 | json-schema-traverse@^0.4.1: 1518 | version "0.4.1" 1519 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1520 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1521 | 1522 | json5@^1.0.1: 1523 | version "1.0.1" 1524 | resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" 1525 | integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== 1526 | dependencies: 1527 | minimist "^1.2.0" 1528 | 1529 | kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: 1530 | version "3.2.2" 1531 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 1532 | integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= 1533 | dependencies: 1534 | is-buffer "^1.1.5" 1535 | 1536 | kind-of@^4.0.0: 1537 | version "4.0.0" 1538 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" 1539 | integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= 1540 | dependencies: 1541 | is-buffer "^1.1.5" 1542 | 1543 | kind-of@^5.0.0: 1544 | version "5.1.0" 1545 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" 1546 | integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== 1547 | 1548 | kind-of@^6.0.0, kind-of@^6.0.2: 1549 | version "6.0.3" 1550 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" 1551 | integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== 1552 | 1553 | loader-runner@^2.4.0: 1554 | version "2.4.0" 1555 | resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" 1556 | integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== 1557 | 1558 | loader-utils@^1.2.3, loader-utils@^1.4.0: 1559 | version "1.4.0" 1560 | resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" 1561 | integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== 1562 | dependencies: 1563 | big.js "^5.2.2" 1564 | emojis-list "^3.0.0" 1565 | json5 "^1.0.1" 1566 | 1567 | locate-path@^3.0.0: 1568 | version "3.0.0" 1569 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" 1570 | integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== 1571 | dependencies: 1572 | p-locate "^3.0.0" 1573 | path-exists "^3.0.0" 1574 | 1575 | lodash.camelcase@^4.3.0: 1576 | version "4.3.0" 1577 | resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" 1578 | integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= 1579 | 1580 | lodash@~4.17.0: 1581 | version "4.17.20" 1582 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" 1583 | integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== 1584 | 1585 | long@^4.0.0: 1586 | version "4.0.0" 1587 | resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" 1588 | integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== 1589 | 1590 | lru-cache@^5.1.1: 1591 | version "5.1.1" 1592 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" 1593 | integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== 1594 | dependencies: 1595 | yallist "^3.0.2" 1596 | 1597 | make-dir@^2.0.0: 1598 | version "2.1.0" 1599 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" 1600 | integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== 1601 | dependencies: 1602 | pify "^4.0.1" 1603 | semver "^5.6.0" 1604 | 1605 | map-cache@^0.2.2: 1606 | version "0.2.2" 1607 | resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" 1608 | integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= 1609 | 1610 | map-visit@^1.0.0: 1611 | version "1.0.0" 1612 | resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" 1613 | integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= 1614 | dependencies: 1615 | object-visit "^1.0.0" 1616 | 1617 | md5.js@^1.3.4: 1618 | version "1.3.5" 1619 | resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" 1620 | integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== 1621 | dependencies: 1622 | hash-base "^3.0.0" 1623 | inherits "^2.0.1" 1624 | safe-buffer "^5.1.2" 1625 | 1626 | memory-fs@^0.4.1: 1627 | version "0.4.1" 1628 | resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" 1629 | integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= 1630 | dependencies: 1631 | errno "^0.1.3" 1632 | readable-stream "^2.0.1" 1633 | 1634 | memory-fs@^0.5.0: 1635 | version "0.5.0" 1636 | resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" 1637 | integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== 1638 | dependencies: 1639 | errno "^0.1.3" 1640 | readable-stream "^2.0.1" 1641 | 1642 | micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: 1643 | version "3.1.10" 1644 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" 1645 | integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== 1646 | dependencies: 1647 | arr-diff "^4.0.0" 1648 | array-unique "^0.3.2" 1649 | braces "^2.3.1" 1650 | define-property "^2.0.2" 1651 | extend-shallow "^3.0.2" 1652 | extglob "^2.0.4" 1653 | fragment-cache "^0.2.1" 1654 | kind-of "^6.0.2" 1655 | nanomatch "^1.2.9" 1656 | object.pick "^1.3.0" 1657 | regex-not "^1.0.0" 1658 | snapdragon "^0.8.1" 1659 | to-regex "^3.0.2" 1660 | 1661 | miller-rabin@^4.0.0: 1662 | version "4.0.1" 1663 | resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" 1664 | integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== 1665 | dependencies: 1666 | bn.js "^4.0.0" 1667 | brorand "^1.0.1" 1668 | 1669 | minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: 1670 | version "1.0.1" 1671 | resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" 1672 | integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== 1673 | 1674 | minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: 1675 | version "1.0.1" 1676 | resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" 1677 | integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= 1678 | 1679 | minimatch@^3.0.4: 1680 | version "3.0.4" 1681 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1682 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1683 | dependencies: 1684 | brace-expansion "^1.1.7" 1685 | 1686 | minimist@^1.2.0, minimist@^1.2.5: 1687 | version "1.2.5" 1688 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 1689 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 1690 | 1691 | mississippi@^3.0.0: 1692 | version "3.0.0" 1693 | resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" 1694 | integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== 1695 | dependencies: 1696 | concat-stream "^1.5.0" 1697 | duplexify "^3.4.2" 1698 | end-of-stream "^1.1.0" 1699 | flush-write-stream "^1.0.0" 1700 | from2 "^2.1.0" 1701 | parallel-transform "^1.1.0" 1702 | pump "^3.0.0" 1703 | pumpify "^1.3.3" 1704 | stream-each "^1.1.0" 1705 | through2 "^2.0.0" 1706 | 1707 | mixin-deep@^1.2.0: 1708 | version "1.3.2" 1709 | resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" 1710 | integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== 1711 | dependencies: 1712 | for-in "^1.0.2" 1713 | is-extendable "^1.0.1" 1714 | 1715 | mkdirp@^0.5.1, mkdirp@^0.5.3: 1716 | version "0.5.5" 1717 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" 1718 | integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== 1719 | dependencies: 1720 | minimist "^1.2.5" 1721 | 1722 | move-concurrently@^1.0.1: 1723 | version "1.0.1" 1724 | resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" 1725 | integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= 1726 | dependencies: 1727 | aproba "^1.1.1" 1728 | copy-concurrently "^1.0.0" 1729 | fs-write-stream-atomic "^1.0.8" 1730 | mkdirp "^0.5.1" 1731 | rimraf "^2.5.4" 1732 | run-queue "^1.0.3" 1733 | 1734 | ms@2.0.0: 1735 | version "2.0.0" 1736 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1737 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1738 | 1739 | nan@^2.12.1: 1740 | version "2.14.1" 1741 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" 1742 | integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== 1743 | 1744 | nanomatch@^1.2.9: 1745 | version "1.2.13" 1746 | resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" 1747 | integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== 1748 | dependencies: 1749 | arr-diff "^4.0.0" 1750 | array-unique "^0.3.2" 1751 | define-property "^2.0.2" 1752 | extend-shallow "^3.0.2" 1753 | fragment-cache "^0.2.1" 1754 | is-windows "^1.0.2" 1755 | kind-of "^6.0.2" 1756 | object.pick "^1.3.0" 1757 | regex-not "^1.0.0" 1758 | snapdragon "^0.8.1" 1759 | to-regex "^3.0.1" 1760 | 1761 | neo-async@^2.5.0, neo-async@^2.6.1: 1762 | version "2.6.2" 1763 | resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" 1764 | integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== 1765 | 1766 | nice-try@^1.0.4: 1767 | version "1.0.5" 1768 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 1769 | integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== 1770 | 1771 | node-libs-browser@^2.2.1: 1772 | version "2.2.1" 1773 | resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" 1774 | integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== 1775 | dependencies: 1776 | assert "^1.1.1" 1777 | browserify-zlib "^0.2.0" 1778 | buffer "^4.3.0" 1779 | console-browserify "^1.1.0" 1780 | constants-browserify "^1.0.0" 1781 | crypto-browserify "^3.11.0" 1782 | domain-browser "^1.1.1" 1783 | events "^3.0.0" 1784 | https-browserify "^1.0.0" 1785 | os-browserify "^0.3.0" 1786 | path-browserify "0.0.1" 1787 | process "^0.11.10" 1788 | punycode "^1.2.4" 1789 | querystring-es3 "^0.2.0" 1790 | readable-stream "^2.3.3" 1791 | stream-browserify "^2.0.1" 1792 | stream-http "^2.7.2" 1793 | string_decoder "^1.0.0" 1794 | timers-browserify "^2.0.4" 1795 | tty-browserify "0.0.0" 1796 | url "^0.11.0" 1797 | util "^0.11.0" 1798 | vm-browserify "^1.0.1" 1799 | 1800 | normalize-path@^2.1.1: 1801 | version "2.1.1" 1802 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 1803 | integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= 1804 | dependencies: 1805 | remove-trailing-separator "^1.0.1" 1806 | 1807 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1808 | version "3.0.0" 1809 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1810 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1811 | 1812 | object-assign@^4.1.1: 1813 | version "4.1.1" 1814 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1815 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1816 | 1817 | object-copy@^0.1.0: 1818 | version "0.1.0" 1819 | resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" 1820 | integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= 1821 | dependencies: 1822 | copy-descriptor "^0.1.0" 1823 | define-property "^0.2.5" 1824 | kind-of "^3.0.3" 1825 | 1826 | object-visit@^1.0.0: 1827 | version "1.0.1" 1828 | resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" 1829 | integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= 1830 | dependencies: 1831 | isobject "^3.0.0" 1832 | 1833 | object.pick@^1.3.0: 1834 | version "1.3.0" 1835 | resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" 1836 | integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= 1837 | dependencies: 1838 | isobject "^3.0.1" 1839 | 1840 | once@^1.3.0, once@^1.3.1, once@^1.4.0: 1841 | version "1.4.0" 1842 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1843 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1844 | dependencies: 1845 | wrappy "1" 1846 | 1847 | os-browserify@^0.3.0: 1848 | version "0.3.0" 1849 | resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" 1850 | integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= 1851 | 1852 | p-limit@^2.0.0: 1853 | version "2.3.0" 1854 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1855 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 1856 | dependencies: 1857 | p-try "^2.0.0" 1858 | 1859 | p-locate@^3.0.0: 1860 | version "3.0.0" 1861 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 1862 | integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== 1863 | dependencies: 1864 | p-limit "^2.0.0" 1865 | 1866 | p-try@^2.0.0: 1867 | version "2.2.0" 1868 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1869 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1870 | 1871 | pako@~1.0.5: 1872 | version "1.0.11" 1873 | resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" 1874 | integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== 1875 | 1876 | parallel-transform@^1.1.0: 1877 | version "1.2.0" 1878 | resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" 1879 | integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== 1880 | dependencies: 1881 | cyclist "^1.0.1" 1882 | inherits "^2.0.3" 1883 | readable-stream "^2.1.5" 1884 | 1885 | parse-asn1@^5.0.0, parse-asn1@^5.1.5: 1886 | version "5.1.6" 1887 | resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" 1888 | integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== 1889 | dependencies: 1890 | asn1.js "^5.2.0" 1891 | browserify-aes "^1.0.0" 1892 | evp_bytestokey "^1.0.0" 1893 | pbkdf2 "^3.0.3" 1894 | safe-buffer "^5.1.1" 1895 | 1896 | parse-passwd@^1.0.0: 1897 | version "1.0.0" 1898 | resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" 1899 | integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= 1900 | 1901 | pascalcase@^0.1.1: 1902 | version "0.1.1" 1903 | resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" 1904 | integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= 1905 | 1906 | path-browserify@0.0.1: 1907 | version "0.0.1" 1908 | resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" 1909 | integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== 1910 | 1911 | path-dirname@^1.0.0: 1912 | version "1.0.2" 1913 | resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" 1914 | integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= 1915 | 1916 | path-exists@^3.0.0: 1917 | version "3.0.0" 1918 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1919 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 1920 | 1921 | path-is-absolute@^1.0.0: 1922 | version "1.0.1" 1923 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1924 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1925 | 1926 | path-key@^2.0.1: 1927 | version "2.0.1" 1928 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1929 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 1930 | 1931 | pbkdf2@^3.0.3: 1932 | version "3.1.1" 1933 | resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" 1934 | integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== 1935 | dependencies: 1936 | create-hash "^1.1.2" 1937 | create-hmac "^1.1.4" 1938 | ripemd160 "^2.0.1" 1939 | safe-buffer "^5.0.1" 1940 | sha.js "^2.4.8" 1941 | 1942 | picomatch@^2.0.4, picomatch@^2.2.1: 1943 | version "2.2.2" 1944 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" 1945 | integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== 1946 | 1947 | pify@^4.0.1: 1948 | version "4.0.1" 1949 | resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" 1950 | integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== 1951 | 1952 | pkg-dir@^3.0.0: 1953 | version "3.0.0" 1954 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" 1955 | integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== 1956 | dependencies: 1957 | find-up "^3.0.0" 1958 | 1959 | posix-character-classes@^0.1.0: 1960 | version "0.1.1" 1961 | resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" 1962 | integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= 1963 | 1964 | process-nextick-args@~2.0.0: 1965 | version "2.0.1" 1966 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 1967 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 1968 | 1969 | process@^0.11.10: 1970 | version "0.11.10" 1971 | resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" 1972 | integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= 1973 | 1974 | promise-inflight@^1.0.1: 1975 | version "1.0.1" 1976 | resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" 1977 | integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= 1978 | 1979 | protobufjs@^6.8.6: 1980 | version "6.10.1" 1981 | resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.10.1.tgz#e6a484dd8f04b29629e9053344e3970cccf13cd2" 1982 | integrity sha512-pb8kTchL+1Ceg4lFd5XUpK8PdWacbvV5SK2ULH2ebrYtl4GjJmS24m6CKME67jzV53tbJxHlnNOSqQHbTsR9JQ== 1983 | dependencies: 1984 | "@protobufjs/aspromise" "^1.1.2" 1985 | "@protobufjs/base64" "^1.1.2" 1986 | "@protobufjs/codegen" "^2.0.4" 1987 | "@protobufjs/eventemitter" "^1.1.0" 1988 | "@protobufjs/fetch" "^1.1.0" 1989 | "@protobufjs/float" "^1.0.2" 1990 | "@protobufjs/inquire" "^1.1.0" 1991 | "@protobufjs/path" "^1.1.2" 1992 | "@protobufjs/pool" "^1.1.0" 1993 | "@protobufjs/utf8" "^1.1.0" 1994 | "@types/long" "^4.0.1" 1995 | "@types/node" "^13.7.0" 1996 | long "^4.0.0" 1997 | 1998 | prr@~1.0.1: 1999 | version "1.0.1" 2000 | resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" 2001 | integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= 2002 | 2003 | public-encrypt@^4.0.0: 2004 | version "4.0.3" 2005 | resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" 2006 | integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== 2007 | dependencies: 2008 | bn.js "^4.1.0" 2009 | browserify-rsa "^4.0.0" 2010 | create-hash "^1.1.0" 2011 | parse-asn1 "^5.0.0" 2012 | randombytes "^2.0.1" 2013 | safe-buffer "^5.1.2" 2014 | 2015 | pump@^2.0.0: 2016 | version "2.0.1" 2017 | resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" 2018 | integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== 2019 | dependencies: 2020 | end-of-stream "^1.1.0" 2021 | once "^1.3.1" 2022 | 2023 | pump@^3.0.0: 2024 | version "3.0.0" 2025 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 2026 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 2027 | dependencies: 2028 | end-of-stream "^1.1.0" 2029 | once "^1.3.1" 2030 | 2031 | pumpify@^1.3.3: 2032 | version "1.5.1" 2033 | resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" 2034 | integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== 2035 | dependencies: 2036 | duplexify "^3.6.0" 2037 | inherits "^2.0.3" 2038 | pump "^2.0.0" 2039 | 2040 | punycode@1.3.2: 2041 | version "1.3.2" 2042 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" 2043 | integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= 2044 | 2045 | punycode@^1.2.4: 2046 | version "1.4.1" 2047 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 2048 | integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= 2049 | 2050 | punycode@^2.1.0: 2051 | version "2.1.1" 2052 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 2053 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 2054 | 2055 | querystring-es3@^0.2.0: 2056 | version "0.2.1" 2057 | resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" 2058 | integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= 2059 | 2060 | querystring@0.2.0: 2061 | version "0.2.0" 2062 | resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" 2063 | integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= 2064 | 2065 | randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: 2066 | version "2.1.0" 2067 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 2068 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 2069 | dependencies: 2070 | safe-buffer "^5.1.0" 2071 | 2072 | randomfill@^1.0.3: 2073 | version "1.0.4" 2074 | resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" 2075 | integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== 2076 | dependencies: 2077 | randombytes "^2.0.5" 2078 | safe-buffer "^5.1.0" 2079 | 2080 | "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: 2081 | version "2.3.7" 2082 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" 2083 | integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== 2084 | dependencies: 2085 | core-util-is "~1.0.0" 2086 | inherits "~2.0.3" 2087 | isarray "~1.0.0" 2088 | process-nextick-args "~2.0.0" 2089 | safe-buffer "~5.1.1" 2090 | string_decoder "~1.1.1" 2091 | util-deprecate "~1.0.1" 2092 | 2093 | readable-stream@^3.6.0: 2094 | version "3.6.0" 2095 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" 2096 | integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== 2097 | dependencies: 2098 | inherits "^2.0.3" 2099 | string_decoder "^1.1.1" 2100 | util-deprecate "^1.0.1" 2101 | 2102 | readdirp@^2.2.1: 2103 | version "2.2.1" 2104 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" 2105 | integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== 2106 | dependencies: 2107 | graceful-fs "^4.1.11" 2108 | micromatch "^3.1.10" 2109 | readable-stream "^2.0.2" 2110 | 2111 | readdirp@~3.4.0: 2112 | version "3.4.0" 2113 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" 2114 | integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== 2115 | dependencies: 2116 | picomatch "^2.2.1" 2117 | 2118 | regex-not@^1.0.0, regex-not@^1.0.2: 2119 | version "1.0.2" 2120 | resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" 2121 | integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== 2122 | dependencies: 2123 | extend-shallow "^3.0.2" 2124 | safe-regex "^1.1.0" 2125 | 2126 | remove-trailing-separator@^1.0.1: 2127 | version "1.1.0" 2128 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" 2129 | integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= 2130 | 2131 | repeat-element@^1.1.2: 2132 | version "1.1.3" 2133 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" 2134 | integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== 2135 | 2136 | repeat-string@^1.6.1: 2137 | version "1.6.1" 2138 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 2139 | integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= 2140 | 2141 | require-directory@^2.1.1: 2142 | version "2.1.1" 2143 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 2144 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 2145 | 2146 | require-main-filename@^2.0.0: 2147 | version "2.0.0" 2148 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" 2149 | integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== 2150 | 2151 | resolve-cwd@^2.0.0: 2152 | version "2.0.0" 2153 | resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" 2154 | integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= 2155 | dependencies: 2156 | resolve-from "^3.0.0" 2157 | 2158 | resolve-dir@^1.0.0, resolve-dir@^1.0.1: 2159 | version "1.0.1" 2160 | resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" 2161 | integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= 2162 | dependencies: 2163 | expand-tilde "^2.0.0" 2164 | global-modules "^1.0.0" 2165 | 2166 | resolve-from@^3.0.0: 2167 | version "3.0.0" 2168 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" 2169 | integrity sha1-six699nWiBvItuZTM17rywoYh0g= 2170 | 2171 | resolve-url@^0.2.1: 2172 | version "0.2.1" 2173 | resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" 2174 | integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= 2175 | 2176 | ret@~0.1.10: 2177 | version "0.1.15" 2178 | resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" 2179 | integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== 2180 | 2181 | rimraf@^2.5.4, rimraf@^2.6.3: 2182 | version "2.7.1" 2183 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" 2184 | integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== 2185 | dependencies: 2186 | glob "^7.1.3" 2187 | 2188 | ripemd160@^2.0.0, ripemd160@^2.0.1: 2189 | version "2.0.2" 2190 | resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" 2191 | integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== 2192 | dependencies: 2193 | hash-base "^3.0.0" 2194 | inherits "^2.0.1" 2195 | 2196 | run-queue@^1.0.0, run-queue@^1.0.3: 2197 | version "1.0.3" 2198 | resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" 2199 | integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= 2200 | dependencies: 2201 | aproba "^1.1.1" 2202 | 2203 | safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: 2204 | version "5.2.1" 2205 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 2206 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 2207 | 2208 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 2209 | version "5.1.2" 2210 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 2211 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 2212 | 2213 | safe-regex@^1.1.0: 2214 | version "1.1.0" 2215 | resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" 2216 | integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= 2217 | dependencies: 2218 | ret "~0.1.10" 2219 | 2220 | safer-buffer@^2.1.0: 2221 | version "2.1.2" 2222 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 2223 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 2224 | 2225 | schema-utils@^1.0.0: 2226 | version "1.0.0" 2227 | resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" 2228 | integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== 2229 | dependencies: 2230 | ajv "^6.1.0" 2231 | ajv-errors "^1.0.0" 2232 | ajv-keywords "^3.1.0" 2233 | 2234 | semver@^5.5.0, semver@^5.6.0: 2235 | version "5.7.1" 2236 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 2237 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 2238 | 2239 | semver@^6.2.0: 2240 | version "6.3.0" 2241 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 2242 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 2243 | 2244 | serialize-javascript@^4.0.0: 2245 | version "4.0.0" 2246 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" 2247 | integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== 2248 | dependencies: 2249 | randombytes "^2.1.0" 2250 | 2251 | set-blocking@^2.0.0: 2252 | version "2.0.0" 2253 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 2254 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 2255 | 2256 | set-value@^2.0.0, set-value@^2.0.1: 2257 | version "2.0.1" 2258 | resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" 2259 | integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== 2260 | dependencies: 2261 | extend-shallow "^2.0.1" 2262 | is-extendable "^0.1.1" 2263 | is-plain-object "^2.0.3" 2264 | split-string "^3.0.1" 2265 | 2266 | setimmediate@^1.0.4: 2267 | version "1.0.5" 2268 | resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" 2269 | integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= 2270 | 2271 | sha.js@^2.4.0, sha.js@^2.4.8: 2272 | version "2.4.11" 2273 | resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" 2274 | integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== 2275 | dependencies: 2276 | inherits "^2.0.1" 2277 | safe-buffer "^5.0.1" 2278 | 2279 | shebang-command@^1.2.0: 2280 | version "1.2.0" 2281 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 2282 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 2283 | dependencies: 2284 | shebang-regex "^1.0.0" 2285 | 2286 | shebang-regex@^1.0.0: 2287 | version "1.0.0" 2288 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 2289 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 2290 | 2291 | snapdragon-node@^2.0.1: 2292 | version "2.1.1" 2293 | resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" 2294 | integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== 2295 | dependencies: 2296 | define-property "^1.0.0" 2297 | isobject "^3.0.0" 2298 | snapdragon-util "^3.0.1" 2299 | 2300 | snapdragon-util@^3.0.1: 2301 | version "3.0.1" 2302 | resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" 2303 | integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== 2304 | dependencies: 2305 | kind-of "^3.2.0" 2306 | 2307 | snapdragon@^0.8.1: 2308 | version "0.8.2" 2309 | resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" 2310 | integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== 2311 | dependencies: 2312 | base "^0.11.1" 2313 | debug "^2.2.0" 2314 | define-property "^0.2.5" 2315 | extend-shallow "^2.0.1" 2316 | map-cache "^0.2.2" 2317 | source-map "^0.5.6" 2318 | source-map-resolve "^0.5.0" 2319 | use "^3.1.0" 2320 | 2321 | source-list-map@^2.0.0: 2322 | version "2.0.1" 2323 | resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" 2324 | integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== 2325 | 2326 | source-map-resolve@^0.5.0: 2327 | version "0.5.3" 2328 | resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" 2329 | integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== 2330 | dependencies: 2331 | atob "^2.1.2" 2332 | decode-uri-component "^0.2.0" 2333 | resolve-url "^0.2.1" 2334 | source-map-url "^0.4.0" 2335 | urix "^0.1.0" 2336 | 2337 | source-map-support@~0.5.12: 2338 | version "0.5.19" 2339 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" 2340 | integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== 2341 | dependencies: 2342 | buffer-from "^1.0.0" 2343 | source-map "^0.6.0" 2344 | 2345 | source-map-url@^0.4.0: 2346 | version "0.4.0" 2347 | resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" 2348 | integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= 2349 | 2350 | source-map@^0.5.6: 2351 | version "0.5.7" 2352 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 2353 | integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= 2354 | 2355 | source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: 2356 | version "0.6.1" 2357 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 2358 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 2359 | 2360 | split-string@^3.0.1, split-string@^3.0.2: 2361 | version "3.1.0" 2362 | resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" 2363 | integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== 2364 | dependencies: 2365 | extend-shallow "^3.0.0" 2366 | 2367 | ssri@^6.0.1: 2368 | version "6.0.1" 2369 | resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" 2370 | integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== 2371 | dependencies: 2372 | figgy-pudding "^3.5.1" 2373 | 2374 | static-extend@^0.1.1: 2375 | version "0.1.2" 2376 | resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" 2377 | integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= 2378 | dependencies: 2379 | define-property "^0.2.5" 2380 | object-copy "^0.1.0" 2381 | 2382 | stream-browserify@^2.0.1: 2383 | version "2.0.2" 2384 | resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" 2385 | integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== 2386 | dependencies: 2387 | inherits "~2.0.1" 2388 | readable-stream "^2.0.2" 2389 | 2390 | stream-each@^1.1.0: 2391 | version "1.2.3" 2392 | resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" 2393 | integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== 2394 | dependencies: 2395 | end-of-stream "^1.1.0" 2396 | stream-shift "^1.0.0" 2397 | 2398 | stream-http@^2.7.2: 2399 | version "2.8.3" 2400 | resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" 2401 | integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== 2402 | dependencies: 2403 | builtin-status-codes "^3.0.0" 2404 | inherits "^2.0.1" 2405 | readable-stream "^2.3.6" 2406 | to-arraybuffer "^1.0.0" 2407 | xtend "^4.0.0" 2408 | 2409 | stream-shift@^1.0.0: 2410 | version "1.0.1" 2411 | resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" 2412 | integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== 2413 | 2414 | string-width@^3.0.0, string-width@^3.1.0: 2415 | version "3.1.0" 2416 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 2417 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== 2418 | dependencies: 2419 | emoji-regex "^7.0.1" 2420 | is-fullwidth-code-point "^2.0.0" 2421 | strip-ansi "^5.1.0" 2422 | 2423 | string_decoder@^1.0.0, string_decoder@^1.1.1: 2424 | version "1.3.0" 2425 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 2426 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 2427 | dependencies: 2428 | safe-buffer "~5.2.0" 2429 | 2430 | string_decoder@~1.1.1: 2431 | version "1.1.1" 2432 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 2433 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 2434 | dependencies: 2435 | safe-buffer "~5.1.0" 2436 | 2437 | strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: 2438 | version "5.2.0" 2439 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 2440 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 2441 | dependencies: 2442 | ansi-regex "^4.1.0" 2443 | 2444 | supports-color@^5.3.0: 2445 | version "5.5.0" 2446 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 2447 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 2448 | dependencies: 2449 | has-flag "^3.0.0" 2450 | 2451 | supports-color@^6.1.0: 2452 | version "6.1.0" 2453 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" 2454 | integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== 2455 | dependencies: 2456 | has-flag "^3.0.0" 2457 | 2458 | tapable@^1.0.0, tapable@^1.1.3: 2459 | version "1.1.3" 2460 | resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" 2461 | integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== 2462 | 2463 | terser-webpack-plugin@^1.4.3: 2464 | version "1.4.5" 2465 | resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" 2466 | integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== 2467 | dependencies: 2468 | cacache "^12.0.2" 2469 | find-cache-dir "^2.1.0" 2470 | is-wsl "^1.1.0" 2471 | schema-utils "^1.0.0" 2472 | serialize-javascript "^4.0.0" 2473 | source-map "^0.6.1" 2474 | terser "^4.1.2" 2475 | webpack-sources "^1.4.0" 2476 | worker-farm "^1.7.0" 2477 | 2478 | terser@^4.1.2: 2479 | version "4.8.0" 2480 | resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" 2481 | integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== 2482 | dependencies: 2483 | commander "^2.20.0" 2484 | source-map "~0.6.1" 2485 | source-map-support "~0.5.12" 2486 | 2487 | through2@^2.0.0: 2488 | version "2.0.5" 2489 | resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" 2490 | integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== 2491 | dependencies: 2492 | readable-stream "~2.3.6" 2493 | xtend "~4.0.1" 2494 | 2495 | timers-browserify@^2.0.4: 2496 | version "2.0.11" 2497 | resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" 2498 | integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== 2499 | dependencies: 2500 | setimmediate "^1.0.4" 2501 | 2502 | to-arraybuffer@^1.0.0: 2503 | version "1.0.1" 2504 | resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" 2505 | integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= 2506 | 2507 | to-object-path@^0.3.0: 2508 | version "0.3.0" 2509 | resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" 2510 | integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= 2511 | dependencies: 2512 | kind-of "^3.0.2" 2513 | 2514 | to-regex-range@^2.1.0: 2515 | version "2.1.1" 2516 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" 2517 | integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= 2518 | dependencies: 2519 | is-number "^3.0.0" 2520 | repeat-string "^1.6.1" 2521 | 2522 | to-regex-range@^5.0.1: 2523 | version "5.0.1" 2524 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 2525 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 2526 | dependencies: 2527 | is-number "^7.0.0" 2528 | 2529 | to-regex@^3.0.1, to-regex@^3.0.2: 2530 | version "3.0.2" 2531 | resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" 2532 | integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== 2533 | dependencies: 2534 | define-property "^2.0.2" 2535 | extend-shallow "^3.0.2" 2536 | regex-not "^1.0.2" 2537 | safe-regex "^1.1.0" 2538 | 2539 | tslib@^1.9.0: 2540 | version "1.14.1" 2541 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" 2542 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 2543 | 2544 | tty-browserify@0.0.0: 2545 | version "0.0.0" 2546 | resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" 2547 | integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= 2548 | 2549 | typedarray@^0.0.6: 2550 | version "0.0.6" 2551 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 2552 | integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= 2553 | 2554 | union-value@^1.0.0: 2555 | version "1.0.1" 2556 | resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" 2557 | integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== 2558 | dependencies: 2559 | arr-union "^3.1.0" 2560 | get-value "^2.0.6" 2561 | is-extendable "^0.1.1" 2562 | set-value "^2.0.1" 2563 | 2564 | unique-filename@^1.1.1: 2565 | version "1.1.1" 2566 | resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" 2567 | integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== 2568 | dependencies: 2569 | unique-slug "^2.0.0" 2570 | 2571 | unique-slug@^2.0.0: 2572 | version "2.0.2" 2573 | resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" 2574 | integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== 2575 | dependencies: 2576 | imurmurhash "^0.1.4" 2577 | 2578 | unset-value@^1.0.0: 2579 | version "1.0.0" 2580 | resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" 2581 | integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= 2582 | dependencies: 2583 | has-value "^0.3.1" 2584 | isobject "^3.0.0" 2585 | 2586 | upath@^1.1.1: 2587 | version "1.2.0" 2588 | resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" 2589 | integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== 2590 | 2591 | uri-js@^4.2.2: 2592 | version "4.4.0" 2593 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" 2594 | integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== 2595 | dependencies: 2596 | punycode "^2.1.0" 2597 | 2598 | urix@^0.1.0: 2599 | version "0.1.0" 2600 | resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" 2601 | integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= 2602 | 2603 | url@^0.11.0: 2604 | version "0.11.0" 2605 | resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" 2606 | integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= 2607 | dependencies: 2608 | punycode "1.3.2" 2609 | querystring "0.2.0" 2610 | 2611 | use@^3.1.0: 2612 | version "3.1.1" 2613 | resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" 2614 | integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== 2615 | 2616 | util-deprecate@^1.0.1, util-deprecate@~1.0.1: 2617 | version "1.0.2" 2618 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2619 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 2620 | 2621 | util@0.10.3: 2622 | version "0.10.3" 2623 | resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" 2624 | integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= 2625 | dependencies: 2626 | inherits "2.0.1" 2627 | 2628 | util@^0.11.0: 2629 | version "0.11.1" 2630 | resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" 2631 | integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== 2632 | dependencies: 2633 | inherits "2.0.3" 2634 | 2635 | v8-compile-cache@^2.1.1: 2636 | version "2.1.1" 2637 | resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" 2638 | integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== 2639 | 2640 | vm-browserify@^1.0.1: 2641 | version "1.1.2" 2642 | resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" 2643 | integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== 2644 | 2645 | watchpack-chokidar2@^2.0.0: 2646 | version "2.0.0" 2647 | resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0" 2648 | integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA== 2649 | dependencies: 2650 | chokidar "^2.1.8" 2651 | 2652 | watchpack@^1.6.1: 2653 | version "1.7.4" 2654 | resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.4.tgz#6e9da53b3c80bb2d6508188f5b200410866cd30b" 2655 | integrity sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg== 2656 | dependencies: 2657 | graceful-fs "^4.1.2" 2658 | neo-async "^2.5.0" 2659 | optionalDependencies: 2660 | chokidar "^3.4.1" 2661 | watchpack-chokidar2 "^2.0.0" 2662 | 2663 | webpack-cli@~3.3.11: 2664 | version "3.3.12" 2665 | resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.12.tgz#94e9ada081453cd0aa609c99e500012fd3ad2d4a" 2666 | integrity sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag== 2667 | dependencies: 2668 | chalk "^2.4.2" 2669 | cross-spawn "^6.0.5" 2670 | enhanced-resolve "^4.1.1" 2671 | findup-sync "^3.0.0" 2672 | global-modules "^2.0.0" 2673 | import-local "^2.0.0" 2674 | interpret "^1.4.0" 2675 | loader-utils "^1.4.0" 2676 | supports-color "^6.1.0" 2677 | v8-compile-cache "^2.1.1" 2678 | yargs "^13.3.2" 2679 | 2680 | webpack-sources@^1.4.0, webpack-sources@^1.4.1: 2681 | version "1.4.3" 2682 | resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" 2683 | integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== 2684 | dependencies: 2685 | source-list-map "^2.0.0" 2686 | source-map "~0.6.1" 2687 | 2688 | webpack@~4.43.0: 2689 | version "4.43.0" 2690 | resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.43.0.tgz#c48547b11d563224c561dad1172c8aa0b8a678e6" 2691 | integrity sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g== 2692 | dependencies: 2693 | "@webassemblyjs/ast" "1.9.0" 2694 | "@webassemblyjs/helper-module-context" "1.9.0" 2695 | "@webassemblyjs/wasm-edit" "1.9.0" 2696 | "@webassemblyjs/wasm-parser" "1.9.0" 2697 | acorn "^6.4.1" 2698 | ajv "^6.10.2" 2699 | ajv-keywords "^3.4.1" 2700 | chrome-trace-event "^1.0.2" 2701 | enhanced-resolve "^4.1.0" 2702 | eslint-scope "^4.0.3" 2703 | json-parse-better-errors "^1.0.2" 2704 | loader-runner "^2.4.0" 2705 | loader-utils "^1.2.3" 2706 | memory-fs "^0.4.1" 2707 | micromatch "^3.1.10" 2708 | mkdirp "^0.5.3" 2709 | neo-async "^2.6.1" 2710 | node-libs-browser "^2.2.1" 2711 | schema-utils "^1.0.0" 2712 | tapable "^1.1.3" 2713 | terser-webpack-plugin "^1.4.3" 2714 | watchpack "^1.6.1" 2715 | webpack-sources "^1.4.1" 2716 | 2717 | which-module@^2.0.0: 2718 | version "2.0.0" 2719 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 2720 | integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= 2721 | 2722 | which@^1.2.14, which@^1.2.9, which@^1.3.1: 2723 | version "1.3.1" 2724 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 2725 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 2726 | dependencies: 2727 | isexe "^2.0.0" 2728 | 2729 | worker-farm@^1.7.0: 2730 | version "1.7.0" 2731 | resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" 2732 | integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== 2733 | dependencies: 2734 | errno "~0.1.7" 2735 | 2736 | wrap-ansi@^5.1.0: 2737 | version "5.1.0" 2738 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" 2739 | integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== 2740 | dependencies: 2741 | ansi-styles "^3.2.0" 2742 | string-width "^3.0.0" 2743 | strip-ansi "^5.0.0" 2744 | 2745 | wrappy@1: 2746 | version "1.0.2" 2747 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2748 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 2749 | 2750 | xtend@^4.0.0, xtend@~4.0.1: 2751 | version "4.0.2" 2752 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 2753 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 2754 | 2755 | y18n@^4.0.0: 2756 | version "4.0.0" 2757 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" 2758 | integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== 2759 | 2760 | yallist@^3.0.2: 2761 | version "3.1.1" 2762 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" 2763 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 2764 | 2765 | yargs-parser@^13.1.2: 2766 | version "13.1.2" 2767 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" 2768 | integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== 2769 | dependencies: 2770 | camelcase "^5.0.0" 2771 | decamelize "^1.2.0" 2772 | 2773 | yargs@^13.3.2: 2774 | version "13.3.2" 2775 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" 2776 | integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== 2777 | dependencies: 2778 | cliui "^5.0.0" 2779 | find-up "^3.0.0" 2780 | get-caller-file "^2.0.1" 2781 | require-directory "^2.1.1" 2782 | require-main-filename "^2.0.0" 2783 | set-blocking "^2.0.0" 2784 | string-width "^3.0.0" 2785 | which-module "^2.0.0" 2786 | y18n "^4.0.0" 2787 | yargs-parser "^13.1.2" 2788 | -------------------------------------------------------------------------------- /examples/helloworld/proto/helloworld.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package helloworld; 4 | 5 | service Greeter { 6 | // unary call 7 | rpc SayHello(HelloRequest) returns (HelloReply); 8 | // server streaming call 9 | rpc SayRepeatHello(RepeatHelloRequest) returns (stream HelloReply); 10 | } 11 | 12 | message HelloRequest { string name = 1; } 13 | 14 | message RepeatHelloRequest { 15 | string name = 1; 16 | int32 count = 2; 17 | } 18 | 19 | message HelloReply { string message = 1; } -------------------------------------------------------------------------------- /examples/helloworld/src/client.rs: -------------------------------------------------------------------------------- 1 | use hello_world::greeter_client::GreeterClient; 2 | use hello_world::HelloRequest; 3 | 4 | pub mod hello_world { 5 | tonic::include_proto!("helloworld"); 6 | } 7 | 8 | #[tokio::main] 9 | async fn main() -> Result<(), Box> { 10 | let mut client = GreeterClient::connect("http://[::1]:50052").await?; 11 | 12 | let request = tonic::Request::new(HelloRequest { 13 | name: "Tonic".into(), 14 | }); 15 | 16 | println!("REQUEST={:?}", request); 17 | 18 | let response = client.say_hello(request).await?; 19 | 20 | println!("RESPONSE={:?}", response); 21 | 22 | Ok(()) 23 | } -------------------------------------------------------------------------------- /examples/helloworld/src/server.rs: -------------------------------------------------------------------------------- 1 | use tonic::transport::Server; 2 | use tonic::{Request, Response, Status}; 3 | use tokio::sync::mpsc; 4 | use std::pin::Pin; 5 | use futures::Stream; 6 | 7 | mod proto { 8 | tonic::include_proto!("helloworld"); 9 | 10 | pub(crate) const FILE_DESCRIPTOR_SET: &'static [u8] = 11 | tonic::include_file_descriptor_set!("helloworld_descriptor"); 12 | } 13 | 14 | #[derive(Default)] 15 | pub struct MyGreeter {} 16 | 17 | #[tonic::async_trait] 18 | impl proto::greeter_server::Greeter for MyGreeter { 19 | async fn say_hello( 20 | &self, 21 | request: Request, 22 | ) -> Result, Status> { 23 | println!("SayHello = {:?}", request); 24 | 25 | let reply = proto::HelloReply { 26 | message: format!("Hello {}!", request.into_inner().name), 27 | }; 28 | Ok(Response::new(reply)) 29 | } 30 | 31 | type SayRepeatHelloStream = 32 | Pin> + Send + Sync + 'static>>; 33 | 34 | async fn say_repeat_hello( 35 | &self, 36 | request: Request, 37 | ) -> Result, Status> { 38 | println!("SayRepeatHello = {:?}", request); 39 | 40 | let (tx, rx) = mpsc::channel(4); 41 | 42 | tokio::spawn(async move { 43 | let request = request.into_inner(); 44 | for _ in 0..request.count { 45 | let reply = proto::HelloReply { 46 | message: format!("Hello {}!", request.name).into(), 47 | }; 48 | println!(" => send {:?}", reply); 49 | tx.send(Ok(reply)).await.unwrap(); 50 | } 51 | 52 | println!(" /// done sending"); 53 | }); 54 | 55 | 56 | Ok(Response::new(Box::pin( 57 | tokio_stream::wrappers::ReceiverStream::new(rx), 58 | ))) 59 | } 60 | } 61 | 62 | // fn intercept(req: Request<()>) -> Result, Status> { 63 | // println!("Intercepting request: {:?}", req); 64 | // Ok(req) 65 | // } 66 | 67 | #[tokio::main] 68 | async fn main() -> Result<(), Box> { 69 | let service = tonic_reflection::server::Builder::configure() 70 | .register_encoded_file_descriptor_set(proto::FILE_DESCRIPTOR_SET) 71 | .build() 72 | .unwrap(); 73 | 74 | let addr = "[::1]:50052".parse().unwrap(); 75 | let greeter = MyGreeter::default(); 76 | 77 | // let greeter = GreeterServer::with_interceptor(greeter, intercept); 78 | 79 | Server::builder() 80 | .add_service(service) 81 | .add_service(proto::greeter_server::GreeterServer::new(greeter)) 82 | .serve(addr) 83 | .await?; 84 | 85 | Ok(()) 86 | } -------------------------------------------------------------------------------- /grpc-web-proxy/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "rust-grpc-web-proxy" 3 | version = "0.1.0" 4 | authors = ["Gregory Hill "] 5 | edition = "2018" 6 | 7 | [[bin]] 8 | name = "grpc-web-proxy" 9 | path = "src/main.rs" 10 | 11 | [dependencies] 12 | tonic = { git = "https://github.com/hyperium/tonic", rev = "61555ff" } 13 | grpc-web = { path = "../grpc-web", package = "rust-grpc-web" } 14 | hyper = "0.14.4" 15 | futures = "0.3" 16 | tokio = { version = "1.0", features = ["rt-multi-thread", "time", "fs", "macros", "net"] } 17 | clap = "3.0.0-beta.2" 18 | env_logger = "0.7.1" 19 | log = "0.4.0" 20 | -------------------------------------------------------------------------------- /grpc-web-proxy/src/main.rs: -------------------------------------------------------------------------------- 1 | use clap::Clap; 2 | use grpc_web::Error; 3 | use hyper::service::{make_service_fn, service_fn}; 4 | use hyper::{http::HeaderValue, Server}; 5 | use std::net::SocketAddr; 6 | 7 | use proxy::{HttpConfig, Proxy}; 8 | 9 | mod proxy; 10 | 11 | /// Simple gRPC-Web proxy, built in Rust. 12 | #[derive(Clap)] 13 | #[clap(version = "0.1", author = "Gregory Hill ")] 14 | struct Opts { 15 | /// Address to forward grpc requests to. 16 | #[clap(long, default_value = "http://[::1]:50052")] 17 | grpc_addr: String, 18 | 19 | /// Address to bind this proxy server to. 20 | #[clap(long, default_value = "[::1]:8080")] 21 | host_addr: String, 22 | 23 | /// Comma separated list of allowed origins. 24 | #[clap(long, default_value = "*")] 25 | allowed_cors_domains: HeaderValue, 26 | 27 | /// Comma separated list of allowed headers. 28 | #[clap(long, default_value = "*")] 29 | allowed_cors_headers: HeaderValue, 30 | } 31 | 32 | #[tokio::main] 33 | async fn main() { 34 | env_logger::init(); 35 | let opts: Opts = Opts::parse(); 36 | 37 | let proxy = Proxy::new( 38 | opts.grpc_addr, 39 | HttpConfig { 40 | allowed_cors_domains: opts.allowed_cors_domains, 41 | allowed_cors_headers: opts.allowed_cors_headers, 42 | }, 43 | ) 44 | .await 45 | .expect("Unable to start proxy"); 46 | 47 | let addr: SocketAddr = opts.host_addr.parse().expect("Invalid host_addr"); 48 | 49 | let make_svc = make_service_fn(move |_| { 50 | let proxy = proxy.clone(); 51 | 52 | async move { 53 | Ok::<_, Error>(service_fn(move |req| { 54 | let mut proxy = proxy.clone(); 55 | async move { 56 | let result = proxy.handle_http_request(req).await; 57 | if let Err(ref err) = result { 58 | eprintln!("{:?}", err); 59 | } 60 | result 61 | } 62 | })) 63 | } 64 | }); 65 | 66 | let server = Server::bind(&addr).serve(make_svc); 67 | 68 | if let Err(e) = server.await { 69 | eprintln!("server error: {}", e); 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /grpc-web-proxy/src/proxy.rs: -------------------------------------------------------------------------------- 1 | use futures::stream::StreamExt; 2 | use grpc_web::{ 3 | ConnectionType, Error, GrpcRequest, GrpcWebRequest, GrpcWebResponse, Metadata, ProxyCodec, 4 | }; 5 | use hyper::{ 6 | http::{ 7 | header::{ACCESS_CONTROL_ALLOW_HEADERS, ACCESS_CONTROL_ALLOW_ORIGIN, CONTENT_TYPE}, 8 | HeaderValue, Method, 9 | }, 10 | Body, Request as HttpRequest, Response as HttpResponse, 11 | }; 12 | use std::convert::{TryFrom, TryInto}; 13 | use tonic::codegen::StdError; 14 | use tonic::transport::Channel; 15 | use tonic::transport::Endpoint; 16 | use tonic::{client::Grpc as GrpcClient, Status}; 17 | 18 | #[allow(dead_code)] 19 | pub const GRPC_CONTENT_TYPE: &str = "application/grpc"; 20 | #[allow(dead_code)] 21 | pub const GRPC_WEB_CONTENT_TYPE: &str = "application/grpc-web"; 22 | pub const GRPC_WEB_TEXT_CONTENT_TYPE: &str = "application/grpc-web-text"; 23 | pub const GRPC_WEB_TEXT_CONTENT_TYPE_PROTO: &str = "application/grpc-web-text+proto"; 24 | 25 | fn is_gprc_web_request(req: &HttpRequest) -> bool { 26 | req.headers() 27 | .get("content-type") 28 | .map_or(false, |content_type| { 29 | content_type == GRPC_WEB_TEXT_CONTENT_TYPE 30 | }) 31 | } 32 | 33 | #[derive(Clone)] 34 | pub(crate) struct HttpConfig { 35 | pub allowed_cors_domains: HeaderValue, 36 | pub allowed_cors_headers: HeaderValue, 37 | } 38 | 39 | impl HttpConfig { 40 | fn add_default_headers(&self, http_response: &mut HttpResponse) { 41 | let header_map = http_response.headers_mut(); 42 | header_map.insert( 43 | ACCESS_CONTROL_ALLOW_ORIGIN, 44 | self.allowed_cors_domains.clone(), 45 | ); 46 | header_map.insert( 47 | ACCESS_CONTROL_ALLOW_HEADERS, 48 | self.allowed_cors_headers.clone(), 49 | ); 50 | } 51 | } 52 | 53 | fn add_content_type(http_response: &mut HttpResponse) { 54 | // TODO: may not be proto 55 | let header_map = http_response.headers_mut(); 56 | header_map.insert( 57 | CONTENT_TYPE, 58 | HeaderValue::from_static(GRPC_WEB_TEXT_CONTENT_TYPE_PROTO), 59 | ); 60 | } 61 | 62 | #[derive(Clone)] 63 | pub(crate) struct Proxy { 64 | client: GrpcClient, 65 | metadata: Metadata, 66 | config: HttpConfig, 67 | } 68 | 69 | impl Proxy { 70 | pub async fn new(dst: D, config: HttpConfig) -> Result 71 | where 72 | D: Clone, 73 | D: std::convert::TryInto, 74 | D::Error: Into, 75 | { 76 | let metadata = Metadata::from_reflection_service(dst.clone()).await?; 77 | let channel = Endpoint::new(dst)?.connect().await?; 78 | let client = GrpcClient::new(channel); 79 | Ok(Self { 80 | client, 81 | metadata, 82 | config, 83 | }) 84 | } 85 | 86 | async fn forward_http_request( 87 | &mut self, 88 | http_request: HttpRequest, 89 | ) -> Result, Error> { 90 | self.client.ready().await?; 91 | 92 | let path = http_request 93 | .uri() 94 | .path_and_query() 95 | .ok_or(Error::InvalidRequest)? 96 | .to_owned(); 97 | let codec = ProxyCodec::default(); 98 | 99 | log::info!("Forwarding http request: {:?}", http_request); 100 | let grpc_request: GrpcRequest = GrpcWebRequest::from_http_request(http_request) 101 | .await? 102 | .try_into()?; 103 | 104 | match self.metadata.get_query_type(path.clone())? { 105 | ConnectionType::Unary => { 106 | let grpc_response = self.client.unary(grpc_request, path, codec).await?; 107 | let grpc_web_response = GrpcWebResponse::try_from(grpc_response)?; 108 | 109 | let mut http_response: HttpResponse = grpc_web_response.into(); 110 | self.config.add_default_headers(&mut http_response); 111 | add_content_type(&mut http_response); 112 | 113 | Ok(http_response) 114 | } 115 | ConnectionType::ServerStreaming => { 116 | let grpc_response = self 117 | .client 118 | .server_streaming(grpc_request, path, codec) 119 | .await?; 120 | let metadata = grpc_response.metadata().clone(); 121 | let streaming = grpc_response.into_inner(); 122 | 123 | let mut http_response = HttpResponse::new(Body::empty()); 124 | self.config.add_default_headers(&mut http_response); 125 | add_content_type(&mut http_response); 126 | 127 | *http_response.body_mut() = 128 | Body::wrap_stream(streaming.map::, Status>, _>(move |result| { 129 | let grpc_web_response = 130 | GrpcWebResponse::try_from((result?, metadata.clone())) 131 | .map_err(|err| Status::internal(err.to_string()))?; 132 | Ok(grpc_web_response.into()) 133 | })); 134 | 135 | Ok(http_response) 136 | } 137 | // NOTE: client-side and bi-directional streaming are not 138 | // currently supported by the gRPC-Web protocol 139 | _ => Err(Error::Unsupported), 140 | } 141 | } 142 | 143 | pub async fn handle_http_request( 144 | &mut self, 145 | http_request: HttpRequest, 146 | ) -> Result, Error> { 147 | match *http_request.method() { 148 | Method::OPTIONS => { 149 | let mut http_response = HttpResponse::new(Body::empty()); 150 | self.config.add_default_headers(&mut http_response); 151 | Ok(http_response) 152 | } 153 | Method::POST => { 154 | if is_gprc_web_request(&http_request) { 155 | self.forward_http_request(http_request).await 156 | } else { 157 | Err(Error::InvalidRequest) 158 | } 159 | } 160 | _ => Err(Error::InvalidRequest), 161 | } 162 | } 163 | } 164 | -------------------------------------------------------------------------------- /grpc-web/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "rust-grpc-web" 3 | version = "0.1.0" 4 | authors = ["Gregory Hill "] 5 | edition = "2018" 6 | 7 | [dependencies] 8 | tonic = { git = "https://github.com/hyperium/tonic", rev = "61555ff" } 9 | tonic-reflection = { git = "https://github.com/hyperium/tonic", rev = "61555ff" } 10 | prost = "0.7" 11 | tokio = { version = "1.0", features = ["rt-multi-thread", "time", "fs", "macros", "net"] } 12 | hyper = "0.14.4" 13 | base64 = "0.13.0" 14 | bytes = "1.0" 15 | byteorder = "1" 16 | futures = { version = "0.3", default-features = false, features = ["alloc"] } 17 | tokio-stream = { version = "0.1", features = ["net"] } 18 | prost-types = "0.7" 19 | thiserror = "1.0" 20 | log = "0.4.0" 21 | env_logger = "0.7.1" 22 | 23 | [build-dependencies] 24 | tonic-build = { git = "https://github.com/hyperium/tonic", rev = "61555ff" } 25 | -------------------------------------------------------------------------------- /grpc-web/build.rs: -------------------------------------------------------------------------------- 1 | use std::env; 2 | use std::path::PathBuf; 3 | 4 | fn main() { 5 | let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap()); 6 | tonic_build::configure() 7 | .file_descriptor_set_path(out_dir.join("reflection_descriptor.bin")) 8 | .compile(&["proto/reflection.proto"], &["proto"]) 9 | .unwrap(); 10 | } 11 | -------------------------------------------------------------------------------- /grpc-web/proto/reflection.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package grpc.reflection.v1alpha; 4 | 5 | service ServerReflection { 6 | // The reflection service is structured as a bidirectional stream, ensuring 7 | // all related requests go to a single server. 8 | rpc ServerReflectionInfo(stream ServerReflectionRequest) 9 | returns (stream ServerReflectionResponse); 10 | } 11 | 12 | // The message sent by the client when calling ServerReflectionInfo method. 13 | message ServerReflectionRequest { 14 | string host = 1; 15 | // To use reflection service, the client should set one of the following 16 | // fields in message_request. The server distinguishes requests by their 17 | // defined field and then handles them using corresponding methods. 18 | oneof message_request { 19 | // Find a proto file by the file name. 20 | string file_by_filename = 3; 21 | 22 | // Find the proto file that declares the given fully-qualified symbol name. 23 | // This field should be a fully-qualified symbol name 24 | // (e.g. .[.] or .). 25 | string file_containing_symbol = 4; 26 | 27 | // Find the proto file which defines an extension extending the given 28 | // message type with the given field number. 29 | ExtensionRequest file_containing_extension = 5; 30 | 31 | // Finds the tag numbers used by all known extensions of extendee_type, and 32 | // appends them to ExtensionNumberResponse in an undefined order. 33 | // Its corresponding method is best-effort: it's not guaranteed that the 34 | // reflection service will implement this method, and it's not guaranteed 35 | // that this method will provide all extensions. Returns 36 | // StatusCode::UNIMPLEMENTED if it's not implemented. 37 | // This field should be a fully-qualified type name. The format is 38 | // . 39 | string all_extension_numbers_of_type = 6; 40 | 41 | // List the full names of registered services. The content will not be 42 | // checked. 43 | string list_services = 7; 44 | } 45 | } 46 | 47 | // The type name and extension number sent by the client when requesting 48 | // file_containing_extension. 49 | message ExtensionRequest { 50 | // Fully-qualified type name. The format should be . 51 | string containing_type = 1; 52 | int32 extension_number = 2; 53 | } 54 | 55 | // The message sent by the server to answer ServerReflectionInfo method. 56 | message ServerReflectionResponse { 57 | string valid_host = 1; 58 | ServerReflectionRequest original_request = 2; 59 | // The server sets one of the following fields according to the 60 | // message_request in the request. 61 | oneof message_response { 62 | // This message is used to answer file_by_filename, file_containing_symbol, 63 | // file_containing_extension requests with transitive dependencies. 64 | // As the repeated label is not allowed in oneof fields, we use a 65 | // FileDescriptorResponse message to encapsulate the repeated fields. 66 | // The reflection service is allowed to avoid sending FileDescriptorProtos 67 | // that were previously sent in response to earlier requests in the stream. 68 | FileDescriptorResponse file_descriptor_response = 4; 69 | 70 | // This message is used to answer all_extension_numbers_of_type requests. 71 | ExtensionNumberResponse all_extension_numbers_response = 5; 72 | 73 | // This message is used to answer list_services requests. 74 | ListServiceResponse list_services_response = 6; 75 | 76 | // This message is used when an error occurs. 77 | ErrorResponse error_response = 7; 78 | } 79 | } 80 | 81 | // Serialized FileDescriptorProto messages sent by the server answering 82 | // a file_by_filename, file_containing_symbol, or file_containing_extension 83 | // request. 84 | message FileDescriptorResponse { 85 | // Serialized FileDescriptorProto messages. We avoid taking a dependency on 86 | // descriptor.proto, which uses proto2 only features, by making them opaque 87 | // bytes instead. 88 | repeated bytes file_descriptor_proto = 1; 89 | } 90 | 91 | // A list of extension numbers sent by the server answering 92 | // all_extension_numbers_of_type request. 93 | message ExtensionNumberResponse { 94 | // Full name of the base type, including the package name. The format 95 | // is . 96 | string base_type_name = 1; 97 | repeated int32 extension_number = 2; 98 | } 99 | 100 | // A list of ServiceResponse sent by the server answering list_services request. 101 | message ListServiceResponse { 102 | // The information of each service may be expanded in the future, so we use 103 | // ServiceResponse message to encapsulate it. 104 | repeated ServiceResponse service = 1; 105 | } 106 | 107 | // The information of a single service used by ListServiceResponse to answer 108 | // list_services request. 109 | message ServiceResponse { 110 | // Full name of a registered service, including its package name. The format 111 | // is . 112 | string name = 1; 113 | } 114 | 115 | // The error code and error message sent by the server when an error occurs. 116 | message ErrorResponse { 117 | // This field uses the error codes defined in grpc::StatusCode. 118 | int32 error_code = 1; 119 | string error_message = 2; 120 | } -------------------------------------------------------------------------------- /grpc-web/src/codec.rs: -------------------------------------------------------------------------------- 1 | use bytes::{Buf, BufMut}; 2 | use tonic::codec::{Codec, DecodeBuf, Decoder, EncodeBuf, Encoder}; 3 | 4 | #[derive(Debug, Clone, Default)] 5 | pub struct ProxyEncoder; 6 | 7 | impl Encoder for ProxyEncoder { 8 | type Item = Vec; 9 | type Error = tonic::Status; 10 | 11 | fn encode(&mut self, item: Self::Item, buf: &mut EncodeBuf<'_>) -> Result<(), Self::Error> { 12 | buf.put(&item[..]); 13 | Ok(()) 14 | } 15 | } 16 | 17 | #[derive(Debug, Clone, Default)] 18 | pub struct ProxyDecoder; 19 | 20 | impl Decoder for ProxyDecoder { 21 | type Item = Vec; 22 | type Error = tonic::Status; 23 | 24 | fn decode(&mut self, buf: &mut DecodeBuf<'_>) -> Result, Self::Error> { 25 | let mut out = vec![0u8; buf.remaining()]; 26 | buf.copy_to_slice(&mut out); 27 | Ok(Some(out)) 28 | } 29 | } 30 | 31 | #[derive(Debug, Clone, Default)] 32 | pub struct ProxyCodec; 33 | 34 | impl Codec for ProxyCodec { 35 | type Encode = Vec; 36 | type Decode = Vec; 37 | 38 | type Encoder = ProxyEncoder; 39 | type Decoder = ProxyDecoder; 40 | 41 | fn encoder(&mut self) -> Self::Encoder { 42 | ProxyEncoder 43 | } 44 | 45 | fn decoder(&mut self) -> Self::Decoder { 46 | ProxyDecoder 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /grpc-web/src/error.rs: -------------------------------------------------------------------------------- 1 | use base64::DecodeError as Base64DecodeError; 2 | use hyper::Error as HyperError; 3 | use prost::DecodeError as ProstDecodeError; 4 | use std::num::TryFromIntError; 5 | use thiserror::Error; 6 | use tonic::transport::Error as TransportError; 7 | use tonic::Status; 8 | 9 | #[derive(Error, Debug)] 10 | pub enum Error { 11 | #[error("No services found")] 12 | NoServices, 13 | #[error("No response")] 14 | NoResponse, 15 | #[error("Invalid request")] 16 | InvalidRequest, 17 | #[error("Invalid query")] 18 | InvalidQuery, 19 | #[error("Unsupported protocol")] 20 | Unsupported, 21 | #[error("Unknown service")] 22 | UnknownService, 23 | #[error("Unknown method")] 24 | UnknownMethod, 25 | 26 | #[error("HyperError: {0}")] 27 | HyperError(#[from] HyperError), 28 | #[error("TransportError: {0}")] 29 | TransportError(#[from] TransportError), 30 | #[error("Base64DecodeError: {0}")] 31 | Base64DecodeError(#[from] Base64DecodeError), 32 | #[error("ProstDecodeError: {0}")] 33 | ProstDecodeError(#[from] ProstDecodeError), 34 | #[error("Status: {0}")] 35 | Status(#[from] Status), 36 | #[error("TryFromIntError: {0}")] 37 | TryFromIntError(#[from] TryFromIntError), 38 | } 39 | -------------------------------------------------------------------------------- /grpc-web/src/lib.rs: -------------------------------------------------------------------------------- 1 | mod codec; 2 | mod error; 3 | mod metadata; 4 | mod request; 5 | mod response; 6 | 7 | pub use codec::ProxyCodec; 8 | pub use error::Error; 9 | pub use metadata::{ConnectionType, Metadata}; 10 | pub use request::{GrpcRequest, GrpcWebRequest}; 11 | pub use response::{GrpcResponse, GrpcWebResponse}; 12 | -------------------------------------------------------------------------------- /grpc-web/src/metadata.rs: -------------------------------------------------------------------------------- 1 | use crate::error::Error; 2 | use futures::stream; 3 | use hyper::http::uri::PathAndQuery; 4 | use prost::Message; 5 | use prost_types::{FileDescriptorProto, MethodDescriptorProto}; 6 | use std::collections::HashMap; 7 | use tokio_stream::StreamExt; 8 | use tonic::codegen::StdError; 9 | use tonic::transport::Channel; 10 | use tonic::Request as GrpcRequest; 11 | 12 | use proto::server_reflection_client::ServerReflectionClient; 13 | use proto::server_reflection_request::MessageRequest; 14 | use proto::server_reflection_response::MessageResponse; 15 | use proto::{ServerReflectionRequest, ServiceResponse}; 16 | 17 | pub mod proto { 18 | tonic::include_proto!("grpc.reflection.v1alpha"); 19 | } 20 | 21 | #[derive(Debug, Clone)] 22 | pub enum ConnectionType { 23 | Unary, 24 | ClientStreaming, 25 | ServerStreaming, 26 | Streaming, 27 | } 28 | 29 | impl From for ConnectionType { 30 | fn from(method: MethodDescriptorProto) -> Self { 31 | match method { 32 | MethodDescriptorProto { 33 | client_streaming: Some(true), 34 | server_streaming: None, 35 | .. 36 | } => ConnectionType::ClientStreaming, 37 | MethodDescriptorProto { 38 | client_streaming: None, 39 | server_streaming: Some(true), 40 | .. 41 | } => ConnectionType::ServerStreaming, 42 | MethodDescriptorProto { 43 | client_streaming: Some(true), 44 | server_streaming: Some(true), 45 | .. 46 | } => ConnectionType::Streaming, 47 | _ => ConnectionType::Unary, 48 | } 49 | } 50 | } 51 | 52 | #[derive(Clone)] 53 | pub struct Metadata(HashMap>); 54 | 55 | impl Metadata { 56 | pub async fn from_reflection_service(dst: D) -> Result 57 | where 58 | D: std::convert::TryInto, 59 | D::Error: Into, 60 | { 61 | let mut ref_client = ServerReflectionClient::connect(dst).await?; 62 | let services = get_services(&mut ref_client).await?; 63 | log::info!("Found {} services", services.len()); 64 | 65 | let mut metadata = HashMap::new(); 66 | for service in services { 67 | let methods = get_methods(&mut ref_client, service.name.clone()).await?; 68 | log::debug!("{:?}: {:?}", service, methods); 69 | 70 | metadata.insert( 71 | service.name, 72 | methods 73 | .iter() 74 | .filter_map(|method| { 75 | if let Some(name) = method.name.clone() { 76 | Some((name, method.clone().into())) 77 | } else { 78 | None 79 | } 80 | }) 81 | .collect(), 82 | ); 83 | } 84 | 85 | Ok(Self(metadata)) 86 | } 87 | 88 | pub fn get_query_type(&self, path: PathAndQuery) -> Result { 89 | let parts = path.path().split("/").collect::>(); 90 | let parts = parts.get(1..3).ok_or(Error::InvalidQuery)?; 91 | let connection_type = self 92 | .0 93 | .get(parts[0]) 94 | .ok_or(Error::UnknownService)? 95 | .get(parts[1]) 96 | .ok_or(Error::UnknownMethod)? 97 | .clone(); 98 | Ok(connection_type) 99 | } 100 | } 101 | 102 | async fn get_services( 103 | client: &mut ServerReflectionClient, 104 | ) -> Result, Error> { 105 | let request = ServerReflectionRequest { 106 | host: "".to_string(), 107 | message_request: Some(MessageRequest::ListServices(String::new())), 108 | }; 109 | 110 | let request = GrpcRequest::new(stream::iter(vec![request])); 111 | let mut inbound = client.server_reflection_info(request).await?.into_inner(); 112 | let response = inbound 113 | .next() 114 | .await 115 | .ok_or(Error::NoResponse)?? 116 | .message_response 117 | .ok_or(Error::NoResponse)?; 118 | 119 | if let MessageResponse::ListServicesResponse(services) = response { 120 | Ok(services.service) 121 | } else { 122 | Err(Error::NoServices) 123 | } 124 | } 125 | 126 | async fn get_methods( 127 | client: &mut ServerReflectionClient, 128 | service_name: String, 129 | ) -> Result, Error> { 130 | let request = ServerReflectionRequest { 131 | host: "".to_string(), 132 | message_request: Some(MessageRequest::FileContainingSymbol(service_name)), 133 | }; 134 | let request = GrpcRequest::new(stream::iter(vec![request])); 135 | let mut inbound = client.server_reflection_info(request).await?.into_inner(); 136 | 137 | let response = inbound 138 | .next() 139 | .await 140 | .ok_or(Error::NoResponse)?? 141 | .message_response 142 | .ok_or(Error::NoResponse)?; 143 | 144 | if let MessageResponse::FileDescriptorResponse(descriptor) = response { 145 | let file_descriptor_proto = descriptor 146 | .file_descriptor_proto 147 | .first() 148 | .expect("descriptor"); 149 | 150 | let service = FileDescriptorProto::decode(file_descriptor_proto.as_ref())?.service; 151 | let service = service.first().expect("service"); 152 | Ok(service.method.clone()) 153 | } else { 154 | Ok(vec![]) 155 | } 156 | } 157 | 158 | #[cfg(test)] 159 | mod tests { 160 | use super::*; 161 | 162 | macro_rules! assert_err { 163 | ($result:expr, $err:pat) => {{ 164 | match $result { 165 | Err($err) => (), 166 | Ok(v) => panic!("assertion failed: Ok({:?})", v), 167 | _ => panic!("expected: Err($err)"), 168 | } 169 | }}; 170 | } 171 | 172 | macro_rules! assert_ok { 173 | ( $x:expr $(,)? ) => { 174 | let is = $x; 175 | match is { 176 | Ok(_) => (), 177 | _ => assert!(false, "Expected Ok(_). Got {:#?}", is), 178 | } 179 | }; 180 | ( $x:expr, $y:expr $(,)? ) => { 181 | assert_eq!($x, Ok($y)); 182 | }; 183 | } 184 | 185 | #[tokio::test] 186 | async fn should_get_query_type() -> Result<(), Error> { 187 | let mut metadata = HashMap::new(); 188 | metadata.insert( 189 | "service".to_string(), 190 | vec![("method".to_string(), ConnectionType::Unary)] 191 | .into_iter() 192 | .collect(), 193 | ); 194 | 195 | let metadata = Metadata(metadata); 196 | assert_ok!(metadata.get_query_type(PathAndQuery::from_static("/service/method"))); 197 | assert_err!( 198 | metadata.get_query_type(PathAndQuery::from_static("/unknown/method")), 199 | Error::UnknownService 200 | ); 201 | assert_err!( 202 | metadata.get_query_type(PathAndQuery::from_static("/service/unknown")), 203 | Error::UnknownMethod 204 | ); 205 | 206 | Ok(()) 207 | } 208 | } 209 | -------------------------------------------------------------------------------- /grpc-web/src/request.rs: -------------------------------------------------------------------------------- 1 | use crate::Error; 2 | use hyper::{Body, Request as HttpRequest}; 3 | use std::convert::TryInto; 4 | use tonic::Request; 5 | 6 | pub type GrpcRequest = Request>; 7 | 8 | #[derive(Debug)] 9 | pub struct GrpcWebRequest(Vec); 10 | 11 | impl GrpcWebRequest { 12 | pub async fn from_http_request(mut req: HttpRequest) -> Result { 13 | let body = hyper::body::to_bytes(req.body_mut()).await?; 14 | Ok(Self(base64::decode(body)?)) 15 | } 16 | } 17 | 18 | impl TryInto for GrpcWebRequest { 19 | type Error = Error; 20 | 21 | fn try_into(self) -> Result { 22 | Ok(GrpcRequest::new( 23 | self.0.get(5..).ok_or(Error::InvalidRequest)?.to_vec(), 24 | )) 25 | } 26 | } 27 | 28 | #[cfg(test)] 29 | mod tests { 30 | use super::*; 31 | 32 | #[tokio::test] 33 | async fn should_decode_http_request() -> Result<(), Error> { 34 | let http_request = HttpRequest::::new(b"AAAAAAcKBVRvbmlj".to_vec().into()); 35 | assert_eq!( 36 | GrpcWebRequest::from_http_request(http_request).await?.0, 37 | vec![0, 0, 0, 0, 7, 10, 5, 84, 111, 110, 105, 99] 38 | ); 39 | 40 | Ok(()) 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /grpc-web/src/response.rs: -------------------------------------------------------------------------------- 1 | use crate::Error; 2 | use byteorder::{BigEndian, ByteOrder}; 3 | use hyper::{Body, Response as HttpResponse}; 4 | use std::convert::{TryFrom, TryInto}; 5 | use tonic::metadata::MetadataMap; 6 | 7 | pub type GrpcResponse = tonic::Response>; 8 | 9 | pub struct GrpcWebResponse(Vec); 10 | 11 | impl TryFrom<(Vec, MetadataMap)> for GrpcWebResponse { 12 | type Error = Error; 13 | 14 | fn try_from((body, metadata): (Vec, MetadataMap)) -> Result { 15 | let body = copy_trailers_to_payload(body)?; 16 | let mut body = base64::encode(body); 17 | body.push_str(&base64::encode(&extract_headers(metadata)?)); 18 | Ok(Self(body.into_bytes())) 19 | } 20 | } 21 | 22 | impl TryFrom for GrpcWebResponse { 23 | type Error = Error; 24 | 25 | fn try_from(grpc_response: GrpcResponse) -> Result { 26 | let body = grpc_response.get_ref().to_owned(); 27 | let metadata = grpc_response.metadata().clone(); 28 | Self::try_from((body, metadata)) 29 | } 30 | } 31 | 32 | impl Into> for GrpcWebResponse { 33 | fn into(self) -> Vec { 34 | self.0 35 | } 36 | } 37 | 38 | impl Into> for GrpcWebResponse { 39 | fn into(self) -> HttpResponse { 40 | HttpResponse::new(self.0.into()) 41 | } 42 | } 43 | 44 | fn copy_trailers_to_payload(body: Vec) -> Result, Error> { 45 | let mut trailer: Vec = vec![0, 0, 0, 0, 1 << 7]; 46 | BigEndian::write_u32(&mut trailer[1..5], body.len().try_into()?); 47 | Ok([&trailer[..], &body[..]].concat()) 48 | } 49 | 50 | fn extract_headers(meta: MetadataMap) -> Result, Error> { 51 | let headers = meta.into_headers(); 52 | 53 | let body: Vec = headers 54 | .into_iter() 55 | .filter_map(|(key, value)| { 56 | Some(format!("{}:{}\r\n", key?, value.to_str().ok()?).into_bytes()) 57 | }) 58 | .flatten() 59 | .collect(); 60 | 61 | let mut trailer: Vec = vec![1 << 7, 0, 0, 0, 0]; 62 | BigEndian::write_u32(&mut trailer[1..5], body.len().try_into()?); 63 | Ok([&trailer[..], &body[..]].concat()) 64 | } 65 | 66 | #[cfg(test)] 67 | mod tests { 68 | use super::*; 69 | use tonic::metadata::AsciiMetadataValue; 70 | 71 | #[test] 72 | fn should_copy_trailers_to_payload() -> Result<(), Error> { 73 | assert_eq!( 74 | copy_trailers_to_payload(Vec::from([0u8; 14]))?, 75 | vec![0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 76 | ); 77 | 78 | Ok(()) 79 | } 80 | 81 | #[test] 82 | fn should_extract_headers() -> Result<(), Error> { 83 | // "content-type": "application/grpc", "date": "Mon, 12 Oct 2020 08:32:05 GMT", "grpc-status": "0" 84 | 85 | let mut meta = MetadataMap::new(); 86 | meta.append( 87 | "content-type", 88 | AsciiMetadataValue::from_str("application/grpc").unwrap(), 89 | ); 90 | meta.append("grpc-status", AsciiMetadataValue::from_str("0").unwrap()); 91 | 92 | assert_eq!( 93 | vec![ 94 | 128, 0, 0, 0, 46, 99, 111, 110, 116, 101, 110, 116, 45, 116, 121, 112, 101, 58, 97, 95 | 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 103, 114, 112, 99, 13, 10, 103, 96 | 114, 112, 99, 45, 115, 116, 97, 116, 117, 115, 58, 48, 13, 10 97 | ], 98 | extract_headers(meta)? 99 | ); 100 | 101 | Ok(()) 102 | } 103 | } 104 | --------------------------------------------------------------------------------