From d82a2f192486d85c4d0bbaae37ded488f34bc2d9 Mon Sep 17 00:00:00 2001 From: Jonny Reeves Date: Fri, 8 Mar 2019 13:59:56 +0000 Subject: [PATCH] Hello World! MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Proof of concept protoc-plugin for generating service clients for use with @improbable-eng/grpc-web. ## Why? See conversation in https://github.com/improbable-eng/ts-protoc-gen/issues/145 ## Design Choices 1. This package uses [protoc-plugin](https://github.com/konsumer/node-protoc-plugin) which provides the ability to [extract comments from the source proto](https://github.com/konsumer/node-protoc-plugin#findcommentbypath) and in-line them into the generated code; this was a much requested feature on ts-protoc-gen 2. [ts-morph](https://dsherret.github.io/ts-morph/) is used to build TypeScript source code in-line; this is then compiled into TypeScript definition files (`.d.ts`) and JavaScript source files. This is great as it reduces the number of code-paths required. ## What's left to do? Loads, off the top of my head: 1. Generate service clients, at present we are only generating classes required to use directly against grpc-web ("Raw!") 2. Add unit/integration test coverage! 3. Add support for in-lined documentation from source protos. --- .../protoc-gen-improbable-grpc-web/README.md | 16 + .../bin/protoc-gen-improbable-grpc-web | 3 + .../generate-protos.sh | 15 + .../proto/examplecom/simple_service_pb.js | 464 +++++ .../examplecom/simple_service_pb_service.d.ts | 52 + .../examplecom/simple_service_pb_service.js | 52 + .../othercom/external_child_message_pb.js | 157 ++ .../external_child_message_pb_service.d.ts | 1 + .../external_child_message_pb_service.js | 2 + .../_proto/proto/othercom/external_enum_pb.js | 24 + .../othercom/external_enum_pb_service.d.ts | 1 + .../othercom/external_enum_pb_service.js | 2 + .../package-lock.json | 1523 +++++++++++++++++ .../package.json | 30 + .../proto/examplecom/simple_service.proto | 30 + .../othercom/external_child_message.proto | 7 + .../proto/othercom/external_enum.proto | 9 + .../src/codegen.ts | 156 ++ .../src/exportmap.ts | 182 ++ .../src/index.ts | 28 + .../src/util.ts | 52 + .../tsconfig.json | 27 + 22 files changed, 2833 insertions(+) create mode 100644 client/protoc-gen-improbable-grpc-web/README.md create mode 100755 client/protoc-gen-improbable-grpc-web/bin/protoc-gen-improbable-grpc-web create mode 100755 client/protoc-gen-improbable-grpc-web/generate-protos.sh create mode 100644 client/protoc-gen-improbable-grpc-web/generated/_proto/proto/examplecom/simple_service_pb.js create mode 100644 client/protoc-gen-improbable-grpc-web/generated/_proto/proto/examplecom/simple_service_pb_service.d.ts create mode 100644 client/protoc-gen-improbable-grpc-web/generated/_proto/proto/examplecom/simple_service_pb_service.js create mode 100644 client/protoc-gen-improbable-grpc-web/generated/_proto/proto/othercom/external_child_message_pb.js create mode 100644 client/protoc-gen-improbable-grpc-web/generated/_proto/proto/othercom/external_child_message_pb_service.d.ts create mode 100644 client/protoc-gen-improbable-grpc-web/generated/_proto/proto/othercom/external_child_message_pb_service.js create mode 100644 client/protoc-gen-improbable-grpc-web/generated/_proto/proto/othercom/external_enum_pb.js create mode 100644 client/protoc-gen-improbable-grpc-web/generated/_proto/proto/othercom/external_enum_pb_service.d.ts create mode 100644 client/protoc-gen-improbable-grpc-web/generated/_proto/proto/othercom/external_enum_pb_service.js create mode 100644 client/protoc-gen-improbable-grpc-web/package-lock.json create mode 100644 client/protoc-gen-improbable-grpc-web/package.json create mode 100644 client/protoc-gen-improbable-grpc-web/proto/examplecom/simple_service.proto create mode 100644 client/protoc-gen-improbable-grpc-web/proto/othercom/external_child_message.proto create mode 100644 client/protoc-gen-improbable-grpc-web/proto/othercom/external_enum.proto create mode 100644 client/protoc-gen-improbable-grpc-web/src/codegen.ts create mode 100644 client/protoc-gen-improbable-grpc-web/src/exportmap.ts create mode 100644 client/protoc-gen-improbable-grpc-web/src/index.ts create mode 100644 client/protoc-gen-improbable-grpc-web/src/util.ts create mode 100644 client/protoc-gen-improbable-grpc-web/tsconfig.json diff --git a/client/protoc-gen-improbable-grpc-web/README.md b/client/protoc-gen-improbable-grpc-web/README.md new file mode 100644 index 00000000..b2c6c5a6 --- /dev/null +++ b/client/protoc-gen-improbable-grpc-web/README.md @@ -0,0 +1,16 @@ +# @improbable-eng/protoc-gen-improbable-grpc-web +protoc-plugin for generating @improbable-eng/grpc-web service clients. + +## Usage +This plugin should be used in conjunction with the [protoc-js plugin](https://developers.google.com/protocol-buffers/docs/reference/javascript-generated) with the following caveats: +1. The output directory must be consistent between both plugins (ie: `js_out` and `improbable-grpc-web_out`). +2. You must use `import_style=commonjs,binary` in your protoc-js plugin configuration. + +```bash +OUT_DIR="generated" +protoc \ + --plugin=protoc-gen-improbable-grpc-web=./bin/protoc-gen-improbable-grpc-web \ + --js_out=import_style=commonjs,binary:${OUT_DIR} \ + --improbable-grpc-web_out=${OUT_DIR} \ + ./proto/some.proto +``` diff --git a/client/protoc-gen-improbable-grpc-web/bin/protoc-gen-improbable-grpc-web b/client/protoc-gen-improbable-grpc-web/bin/protoc-gen-improbable-grpc-web new file mode 100755 index 00000000..4bd2d67c --- /dev/null +++ b/client/protoc-gen-improbable-grpc-web/bin/protoc-gen-improbable-grpc-web @@ -0,0 +1,3 @@ +#!/usr/bin/env node + +require('../lib/index'); diff --git a/client/protoc-gen-improbable-grpc-web/generate-protos.sh b/client/protoc-gen-improbable-grpc-web/generate-protos.sh new file mode 100755 index 00000000..aecb509c --- /dev/null +++ b/client/protoc-gen-improbable-grpc-web/generate-protos.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)" +PROTOBUF_DIR=${PROTOBUF_DIR-${SCRIPT_DIR}/proto} +PROTOGEN_DIR=generated/_proto +GENERATION_DIR=${GENERATION_DIR-${SCRIPT_DIR}/${PROTOGEN_DIR}} + +mkdir -p ${GENERATION_DIR} 2> /dev/null +PROTO_SOURCES=$(npx glob-cli2 './proto/**/*.proto') + +protoc \ + --plugin=protoc-gen-improbable-grpc-web=./bin/protoc-gen-improbable-grpc-web \ + --js_out=import_style=commonjs,binary:${GENERATION_DIR} \ + --improbable-grpc-web_out=service=true:${GENERATION_DIR} \ + ${PROTO_SOURCES} diff --git a/client/protoc-gen-improbable-grpc-web/generated/_proto/proto/examplecom/simple_service_pb.js b/client/protoc-gen-improbable-grpc-web/generated/_proto/proto/examplecom/simple_service_pb.js new file mode 100644 index 00000000..2674f47d --- /dev/null +++ b/client/protoc-gen-improbable-grpc-web/generated/_proto/proto/examplecom/simple_service_pb.js @@ -0,0 +1,464 @@ +/** + * @fileoverview + * @enhanceable + * @suppress {messageConventions} JS Compiler reports an error if a variable or + * field starts with 'MSG_' and isn't a translatable message. + * @public + */ +// GENERATED CODE -- DO NOT EDIT! + +var jspb = require('google-protobuf'); +var goog = jspb; +var global = Function('return this')(); + +var proto_othercom_external_child_message_pb = require('../../proto/othercom/external_child_message_pb.js'); +var google_protobuf_empty_pb = require('google-protobuf/google/protobuf/empty_pb.js'); +var google_protobuf_timestamp_pb = require('google-protobuf/google/protobuf/timestamp_pb.js'); +goog.exportSymbol('proto.examplecom.StreamRequest', null, global); +goog.exportSymbol('proto.examplecom.UnaryRequest', null, global); +goog.exportSymbol('proto.examplecom.UnaryResponse', null, global); + +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.examplecom.UnaryRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.examplecom.UnaryRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + proto.examplecom.UnaryRequest.displayName = 'proto.examplecom.UnaryRequest'; +} + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto suitable for use in Soy templates. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. + * @param {boolean=} opt_includeInstance Whether to include the JSPB instance + * for transitional soy proto support: http://goto/soy-param-migration + * @return {!Object} + */ +proto.examplecom.UnaryRequest.prototype.toObject = function(opt_includeInstance) { + return proto.examplecom.UnaryRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Whether to include the JSPB + * instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.examplecom.UnaryRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.examplecom.UnaryRequest.toObject = function(includeInstance, msg) { + var f, obj = { + someInt64: jspb.Message.getFieldWithDefault(msg, 1, 0), + someTimestamp: (f = msg.getSomeTimestamp()) && google_protobuf_timestamp_pb.Timestamp.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.examplecom.UnaryRequest} + */ +proto.examplecom.UnaryRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.examplecom.UnaryRequest; + return proto.examplecom.UnaryRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.examplecom.UnaryRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.examplecom.UnaryRequest} + */ +proto.examplecom.UnaryRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readInt64()); + msg.setSomeInt64(value); + break; + case 2: + var value = new google_protobuf_timestamp_pb.Timestamp; + reader.readMessage(value,google_protobuf_timestamp_pb.Timestamp.deserializeBinaryFromReader); + msg.setSomeTimestamp(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.examplecom.UnaryRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.examplecom.UnaryRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.examplecom.UnaryRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.examplecom.UnaryRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getSomeInt64(); + if (f !== 0) { + writer.writeInt64( + 1, + f + ); + } + f = message.getSomeTimestamp(); + if (f != null) { + writer.writeMessage( + 2, + f, + google_protobuf_timestamp_pb.Timestamp.serializeBinaryToWriter + ); + } +}; + + +/** + * optional int64 some_int64 = 1; + * @return {number} + */ +proto.examplecom.UnaryRequest.prototype.getSomeInt64 = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** @param {number} value */ +proto.examplecom.UnaryRequest.prototype.setSomeInt64 = function(value) { + jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * optional google.protobuf.Timestamp some_timestamp = 2; + * @return {?proto.google.protobuf.Timestamp} + */ +proto.examplecom.UnaryRequest.prototype.getSomeTimestamp = function() { + return /** @type{?proto.google.protobuf.Timestamp} */ ( + jspb.Message.getWrapperField(this, google_protobuf_timestamp_pb.Timestamp, 2)); +}; + + +/** @param {?proto.google.protobuf.Timestamp|undefined} value */ +proto.examplecom.UnaryRequest.prototype.setSomeTimestamp = function(value) { + jspb.Message.setWrapperField(this, 2, value); +}; + + +proto.examplecom.UnaryRequest.prototype.clearSomeTimestamp = function() { + this.setSomeTimestamp(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {!boolean} + */ +proto.examplecom.UnaryRequest.prototype.hasSomeTimestamp = function() { + return jspb.Message.getField(this, 2) != null; +}; + + + +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.examplecom.UnaryResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.examplecom.UnaryResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + proto.examplecom.UnaryResponse.displayName = 'proto.examplecom.UnaryResponse'; +} + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto suitable for use in Soy templates. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. + * @param {boolean=} opt_includeInstance Whether to include the JSPB instance + * for transitional soy proto support: http://goto/soy-param-migration + * @return {!Object} + */ +proto.examplecom.UnaryResponse.prototype.toObject = function(opt_includeInstance) { + return proto.examplecom.UnaryResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Whether to include the JSPB + * instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.examplecom.UnaryResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.examplecom.UnaryResponse.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.examplecom.UnaryResponse} + */ +proto.examplecom.UnaryResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.examplecom.UnaryResponse; + return proto.examplecom.UnaryResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.examplecom.UnaryResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.examplecom.UnaryResponse} + */ +proto.examplecom.UnaryResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.examplecom.UnaryResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.examplecom.UnaryResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.examplecom.UnaryResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.examplecom.UnaryResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; +}; + + + +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.examplecom.StreamRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.examplecom.StreamRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + proto.examplecom.StreamRequest.displayName = 'proto.examplecom.StreamRequest'; +} + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto suitable for use in Soy templates. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. + * @param {boolean=} opt_includeInstance Whether to include the JSPB instance + * for transitional soy proto support: http://goto/soy-param-migration + * @return {!Object} + */ +proto.examplecom.StreamRequest.prototype.toObject = function(opt_includeInstance) { + return proto.examplecom.StreamRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Whether to include the JSPB + * instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.examplecom.StreamRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.examplecom.StreamRequest.toObject = function(includeInstance, msg) { + var f, obj = { + someString: jspb.Message.getFieldWithDefault(msg, 1, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.examplecom.StreamRequest} + */ +proto.examplecom.StreamRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.examplecom.StreamRequest; + return proto.examplecom.StreamRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.examplecom.StreamRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.examplecom.StreamRequest} + */ +proto.examplecom.StreamRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setSomeString(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.examplecom.StreamRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.examplecom.StreamRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.examplecom.StreamRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.examplecom.StreamRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getSomeString(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } +}; + + +/** + * optional string some_string = 1; + * @return {string} + */ +proto.examplecom.StreamRequest.prototype.getSomeString = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** @param {string} value */ +proto.examplecom.StreamRequest.prototype.setSomeString = function(value) { + jspb.Message.setProto3StringField(this, 1, value); +}; + + +goog.object.extend(exports, proto.examplecom); diff --git a/client/protoc-gen-improbable-grpc-web/generated/_proto/proto/examplecom/simple_service_pb_service.d.ts b/client/protoc-gen-improbable-grpc-web/generated/_proto/proto/examplecom/simple_service_pb_service.d.ts new file mode 100644 index 00000000..6bb14b77 --- /dev/null +++ b/client/protoc-gen-improbable-grpc-web/generated/_proto/proto/examplecom/simple_service_pb_service.d.ts @@ -0,0 +1,52 @@ +import * as proto_othercom_external_child_message_pb from "../../proto/othercom/external_child_message_pb"; +import * as google_protobuf_empty_pb from "google-protobuf/google/protobuf/empty_pb"; +import * as proto_examplecom_simple_service_pb from "../../proto/examplecom/simple_service_pb"; +declare type SimpleServiceDoUnary = { + methodName: "DoUnary"; + service: SimpleService; + requestStream: false; + responseStream: false; + requestType: proto_examplecom_simple_service_pb.UnaryRequest; + responseType: proto_othercom_external_child_message_pb.ExternalChildMessage; +}; +declare type SimpleServiceDoServerStream = { + methodName: "DoServerStream"; + service: SimpleService; + requestStream: false; + responseStream: true; + requestType: proto_examplecom_simple_service_pb.StreamRequest; + responseType: proto_othercom_external_child_message_pb.ExternalChildMessage; +}; +declare type SimpleServiceDoClientStream = { + methodName: "DoClientStream"; + service: SimpleService; + requestStream: true; + responseStream: false; + requestType: proto_examplecom_simple_service_pb.StreamRequest; + responseType: google_protobuf_empty_pb.Empty; +}; +declare type SimpleServiceDoBidiStream = { + methodName: "DoBidiStream"; + service: SimpleService; + requestStream: true; + responseStream: true; + requestType: proto_examplecom_simple_service_pb.StreamRequest; + responseType: proto_othercom_external_child_message_pb.ExternalChildMessage; +}; +declare type SimpleServiceDelete = { + methodName: "Delete"; + service: SimpleService; + requestStream: false; + responseStream: false; + requestType: proto_examplecom_simple_service_pb.UnaryRequest; + responseType: proto_examplecom_simple_service_pb.UnaryResponse; +}; +export declare class SimpleService { + static readonly serviceName: string; + static readonly DoUnary: SimpleServiceDoUnary; + static readonly DoServerStream: SimpleServiceDoServerStream; + static readonly DoClientStream: SimpleServiceDoClientStream; + static readonly DoBidiStream: SimpleServiceDoBidiStream; + static readonly Delete: SimpleServiceDelete; +} +export {}; diff --git a/client/protoc-gen-improbable-grpc-web/generated/_proto/proto/examplecom/simple_service_pb_service.js b/client/protoc-gen-improbable-grpc-web/generated/_proto/proto/examplecom/simple_service_pb_service.js new file mode 100644 index 00000000..cd98f296 --- /dev/null +++ b/client/protoc-gen-improbable-grpc-web/generated/_proto/proto/examplecom/simple_service_pb_service.js @@ -0,0 +1,52 @@ +"use strict"; +exports.__esModule = true; +var proto_othercom_external_child_message_pb = require("../../proto/othercom/external_child_message_pb"); +var google_protobuf_empty_pb = require("google-protobuf/google/protobuf/empty_pb"); +var proto_examplecom_simple_service_pb = require("../../proto/examplecom/simple_service_pb"); +var SimpleService = /** @class */ (function () { + function SimpleService() { + } + SimpleService.serviceName = "SimpleService"; + SimpleService.DoUnary = { + methodName: "DoUnary", + service: SimpleService, + requestStream: false, + responseStream: false, + requestType: proto_examplecom_simple_service_pb.UnaryRequest, + responseType: proto_othercom_external_child_message_pb.ExternalChildMessage + }; + SimpleService.DoServerStream = { + methodName: "DoServerStream", + service: SimpleService, + requestStream: false, + responseStream: true, + requestType: proto_examplecom_simple_service_pb.StreamRequest, + responseType: proto_othercom_external_child_message_pb.ExternalChildMessage + }; + SimpleService.DoClientStream = { + methodName: "DoClientStream", + service: SimpleService, + requestStream: true, + responseStream: false, + requestType: proto_examplecom_simple_service_pb.StreamRequest, + responseType: google_protobuf_empty_pb.Empty + }; + SimpleService.DoBidiStream = { + methodName: "DoBidiStream", + service: SimpleService, + requestStream: true, + responseStream: true, + requestType: proto_examplecom_simple_service_pb.StreamRequest, + responseType: proto_othercom_external_child_message_pb.ExternalChildMessage + }; + SimpleService.Delete = { + methodName: "Delete", + service: SimpleService, + requestStream: false, + responseStream: false, + requestType: proto_examplecom_simple_service_pb.UnaryRequest, + responseType: proto_examplecom_simple_service_pb.UnaryResponse + }; + return SimpleService; +}()); +exports.SimpleService = SimpleService; diff --git a/client/protoc-gen-improbable-grpc-web/generated/_proto/proto/othercom/external_child_message_pb.js b/client/protoc-gen-improbable-grpc-web/generated/_proto/proto/othercom/external_child_message_pb.js new file mode 100644 index 00000000..8b7a5ecb --- /dev/null +++ b/client/protoc-gen-improbable-grpc-web/generated/_proto/proto/othercom/external_child_message_pb.js @@ -0,0 +1,157 @@ +/** + * @fileoverview + * @enhanceable + * @suppress {messageConventions} JS Compiler reports an error if a variable or + * field starts with 'MSG_' and isn't a translatable message. + * @public + */ +// GENERATED CODE -- DO NOT EDIT! + +var jspb = require('google-protobuf'); +var goog = jspb; +var global = Function('return this')(); + +goog.exportSymbol('proto.othercom.ExternalChildMessage', null, global); + +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.othercom.ExternalChildMessage = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.othercom.ExternalChildMessage, jspb.Message); +if (goog.DEBUG && !COMPILED) { + proto.othercom.ExternalChildMessage.displayName = 'proto.othercom.ExternalChildMessage'; +} + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto suitable for use in Soy templates. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. + * @param {boolean=} opt_includeInstance Whether to include the JSPB instance + * for transitional soy proto support: http://goto/soy-param-migration + * @return {!Object} + */ +proto.othercom.ExternalChildMessage.prototype.toObject = function(opt_includeInstance) { + return proto.othercom.ExternalChildMessage.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Whether to include the JSPB + * instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.othercom.ExternalChildMessage} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.othercom.ExternalChildMessage.toObject = function(includeInstance, msg) { + var f, obj = { + myString: jspb.Message.getFieldWithDefault(msg, 1, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.othercom.ExternalChildMessage} + */ +proto.othercom.ExternalChildMessage.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.othercom.ExternalChildMessage; + return proto.othercom.ExternalChildMessage.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.othercom.ExternalChildMessage} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.othercom.ExternalChildMessage} + */ +proto.othercom.ExternalChildMessage.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setMyString(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.othercom.ExternalChildMessage.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.othercom.ExternalChildMessage.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.othercom.ExternalChildMessage} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.othercom.ExternalChildMessage.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getMyString(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } +}; + + +/** + * optional string my_string = 1; + * @return {string} + */ +proto.othercom.ExternalChildMessage.prototype.getMyString = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** @param {string} value */ +proto.othercom.ExternalChildMessage.prototype.setMyString = function(value) { + jspb.Message.setProto3StringField(this, 1, value); +}; + + +goog.object.extend(exports, proto.othercom); diff --git a/client/protoc-gen-improbable-grpc-web/generated/_proto/proto/othercom/external_child_message_pb_service.d.ts b/client/protoc-gen-improbable-grpc-web/generated/_proto/proto/othercom/external_child_message_pb_service.d.ts new file mode 100644 index 00000000..cb0ff5c3 --- /dev/null +++ b/client/protoc-gen-improbable-grpc-web/generated/_proto/proto/othercom/external_child_message_pb_service.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/client/protoc-gen-improbable-grpc-web/generated/_proto/proto/othercom/external_child_message_pb_service.js b/client/protoc-gen-improbable-grpc-web/generated/_proto/proto/othercom/external_child_message_pb_service.js new file mode 100644 index 00000000..0e345787 --- /dev/null +++ b/client/protoc-gen-improbable-grpc-web/generated/_proto/proto/othercom/external_child_message_pb_service.js @@ -0,0 +1,2 @@ +"use strict"; +exports.__esModule = true; diff --git a/client/protoc-gen-improbable-grpc-web/generated/_proto/proto/othercom/external_enum_pb.js b/client/protoc-gen-improbable-grpc-web/generated/_proto/proto/othercom/external_enum_pb.js new file mode 100644 index 00000000..bd852a79 --- /dev/null +++ b/client/protoc-gen-improbable-grpc-web/generated/_proto/proto/othercom/external_enum_pb.js @@ -0,0 +1,24 @@ +/** + * @fileoverview + * @enhanceable + * @suppress {messageConventions} JS Compiler reports an error if a variable or + * field starts with 'MSG_' and isn't a translatable message. + * @public + */ +// GENERATED CODE -- DO NOT EDIT! + +var jspb = require('google-protobuf'); +var goog = jspb; +var global = Function('return this')(); + +goog.exportSymbol('proto.othercom.ExternalEnum', null, global); +/** + * @enum {number} + */ +proto.othercom.ExternalEnum = { + DEFAULT: 0, + FIRST: 1, + SECOND: 2 +}; + +goog.object.extend(exports, proto.othercom); diff --git a/client/protoc-gen-improbable-grpc-web/generated/_proto/proto/othercom/external_enum_pb_service.d.ts b/client/protoc-gen-improbable-grpc-web/generated/_proto/proto/othercom/external_enum_pb_service.d.ts new file mode 100644 index 00000000..cb0ff5c3 --- /dev/null +++ b/client/protoc-gen-improbable-grpc-web/generated/_proto/proto/othercom/external_enum_pb_service.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/client/protoc-gen-improbable-grpc-web/generated/_proto/proto/othercom/external_enum_pb_service.js b/client/protoc-gen-improbable-grpc-web/generated/_proto/proto/othercom/external_enum_pb_service.js new file mode 100644 index 00000000..0e345787 --- /dev/null +++ b/client/protoc-gen-improbable-grpc-web/generated/_proto/proto/othercom/external_enum_pb_service.js @@ -0,0 +1,2 @@ +"use strict"; +exports.__esModule = true; diff --git a/client/protoc-gen-improbable-grpc-web/package-lock.json b/client/protoc-gen-improbable-grpc-web/package-lock.json new file mode 100644 index 00000000..3cd3e51b --- /dev/null +++ b/client/protoc-gen-improbable-grpc-web/package-lock.json @@ -0,0 +1,1523 @@ +{ + "name": "@improbable-eng/protoc-gen-improbable-grpc-web", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@dsherret/to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@dsherret/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-H2R13IvZdM6gei2vOGSzF7HdMyw=", + "dev": true, + "requires": { + "is-absolute": "1.0.0", + "is-negated-glob": "1.0.0" + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "1.0.1", + "glob-to-regexp": "0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "@types/google-protobuf": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.2.7.tgz", + "integrity": "sha512-Pb9wl5qDEwfnJeeu6Zpn5Y+waLrKETStqLZXHMGCTbkNuBBudPy4qOGN6veamyeoUBwTm2knOVeP/FlHHhhmzA==", + "dev": true + }, + "@types/node": { + "version": "11.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.10.5.tgz", + "integrity": "sha512-DuIRlQbX4K+d5I+GMnv+UfnGh+ist0RdlvOp+JZ7ePJ6KQONCFQv/gKYSU1ZzbVdFSUCKZOltjmpFAGGv5MdYA==", + "dev": true + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.3", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "buffer-to-uint8array": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-to-uint8array/-/buffer-to-uint8array-1.1.0.tgz", + "integrity": "sha1-z29BKHwCL0WNp1LDkcGo1TXsX3I=" + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "code-block-writer": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-7.2.2.tgz", + "integrity": "sha512-8SyXM1bWsMDCzvCoTdnDBhnnUbHntxcba4ApBIO3S3QX0M2Iq0xZCzs6SYdBOGaSUi4drysvrAK15JoXhlpsvQ==", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "path-type": "3.0.0" + } + }, + "end-of-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.1.0.tgz", + "integrity": "sha1-6TUyWLqpEIll78QcsO+K3i88+wc=", + "requires": { + "once": "1.3.3" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "fast-glob": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.6.tgz", + "integrity": "sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "2.2.1", + "@nodelib/fs.stat": "1.1.3", + "glob-parent": "3.1.0", + "is-glob": "4.0.0", + "merge2": "1.2.3", + "micromatch": "3.1.10" + }, + "dependencies": { + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "0.2.2" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "4.1.15", + "jsonfile": "4.0.0", + "universalify": "0.1.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.3.3", + "path-is-absolute": "1.0.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "globby": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", + "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", + "dev": true, + "requires": { + "array-union": "1.0.2", + "dir-glob": "2.0.0", + "fast-glob": "2.2.6", + "glob": "7.1.3", + "ignore": "3.3.10", + "pify": "3.0.0", + "slash": "1.0.0" + } + }, + "google-protobuf": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.6.1.tgz", + "integrity": "sha512-SJYemeX5GjDLPnadcmCNQePQHCS4Hl5fOcI/JawqDIYFhCmrtYAjcx/oTQx/Wi8UuCuZQhfvftbmPePPAYHFtA==" + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.3.3", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "1.0.0", + "is-windows": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "1.0.0" + } + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "0.1.2" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "4.1.15" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "1.0.1" + } + }, + "merge2": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", + "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.13", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multimatch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", + "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-union": "1.0.2", + "arrify": "1.0.1", + "minimatch": "3.0.4" + } + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "requires": { + "wrappy": "1.0.2" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "protoc-plugin": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/protoc-plugin/-/protoc-plugin-0.0.6.tgz", + "integrity": "sha1-r5F5mIqrf2wSsYDNxLUl069laUk=", + "requires": { + "buffer-to-uint8array": "1.1.0", + "google-protobuf": "3.6.1", + "stream-to-promise": "2.2.0" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "7.1.3" + } + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "0.1.15" + } + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.2", + "use": "3.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "2.1.2", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "stream-to-array": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz", + "integrity": "sha1-u/azn19D7DC8cbq8s3VXrOzzQ1M=", + "requires": { + "any-promise": "1.3.0" + } + }, + "stream-to-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-to-promise/-/stream-to-promise-2.2.0.tgz", + "integrity": "sha1-se2y4cjLESidG1A8CNPyrvUeZQ8=", + "requires": { + "any-promise": "1.3.0", + "end-of-stream": "1.1.0", + "stream-to-array": "2.3.0" + } + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + } + }, + "ts-morph": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-1.3.0.tgz", + "integrity": "sha512-hpdsCl5ZtFkhpBaYtFwfXXqtNvOffURzEnCEPptC3xLlZV5nIVmu5x+OfhNa4fd+06VgdgLc9pNYWRFFBALDuw==", + "dev": true, + "requires": { + "@dsherret/to-absolute-glob": "2.0.2", + "code-block-writer": "7.2.2", + "fs-extra": "7.0.1", + "glob-parent": "3.1.0", + "globby": "8.0.2", + "is-negated-glob": "1.0.0", + "multimatch": "2.1.0", + "tslib": "1.9.3", + "typescript": "3.3.3333" + } + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, + "typescript": { + "version": "3.3.3333", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.3333.tgz", + "integrity": "sha512-JjSKsAfuHBE/fB2oZ8NxtRTk5iGcg6hkYXMnZ3Wc+b2RSqejEqTaem11mHASMnFilHrax3sLK0GDzcJrekZYLw==", + "dev": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" + } + } + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + } + } +} diff --git a/client/protoc-gen-improbable-grpc-web/package.json b/client/protoc-gen-improbable-grpc-web/package.json new file mode 100644 index 00000000..3929778b --- /dev/null +++ b/client/protoc-gen-improbable-grpc-web/package.json @@ -0,0 +1,30 @@ +{ + "name": "@improbable-eng/protoc-gen-improbable-grpc-web", + "version": "1.0.0", + "description": "", + "main": "lib/index.js", + "bin": { + "protoc-gen-improbable-grpc-web": "bin/protoc-gen-improbable-grpc-web" + }, + "directories": { + "lib": "lib" + }, + "dependencies": { + "protoc-plugin": "0.0.6" + }, + "devDependencies": { + "@types/google-protobuf": "^3.2.7", + "@types/node": "^11.10.5", + "rimraf": "^2.6.3", + "ts-morph": "^1.3.0", + "typescript": "^3.3.3333" + }, + "scripts": { + "clean": "rimraf 'generated/**' 'lib/**'", + "build": "npm run clean && tsc", + "generate": "npm run build && ./generate-protos.sh", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC" +} diff --git a/client/protoc-gen-improbable-grpc-web/proto/examplecom/simple_service.proto b/client/protoc-gen-improbable-grpc-web/proto/examplecom/simple_service.proto new file mode 100644 index 00000000..8cf2571c --- /dev/null +++ b/client/protoc-gen-improbable-grpc-web/proto/examplecom/simple_service.proto @@ -0,0 +1,30 @@ +syntax = "proto3"; + +package examplecom; + +import "proto/othercom/external_child_message.proto"; + +// these imports should not be output in the generated typescript service +import "google/protobuf/empty.proto"; +import "google/protobuf/timestamp.proto"; + +message UnaryRequest { + int64 some_int64 = 1; + google.protobuf.Timestamp some_timestamp = 2; +} + +message UnaryResponse {} + +message StreamRequest { + string some_string = 1; +} + +service SimpleService { + rpc DoUnary(UnaryRequest) returns (othercom.ExternalChildMessage) {} + rpc DoServerStream(StreamRequest) returns (stream othercom.ExternalChildMessage) {} + rpc DoClientStream(stream StreamRequest) returns (google.protobuf.Empty) {} + rpc DoBidiStream(stream StreamRequest) returns (stream othercom.ExternalChildMessage) {} + + // checks that rpc methods that use reserved JS words don't generate invalid code + rpc Delete(UnaryRequest) returns (UnaryResponse) {} +} diff --git a/client/protoc-gen-improbable-grpc-web/proto/othercom/external_child_message.proto b/client/protoc-gen-improbable-grpc-web/proto/othercom/external_child_message.proto new file mode 100644 index 00000000..27d7e03f --- /dev/null +++ b/client/protoc-gen-improbable-grpc-web/proto/othercom/external_child_message.proto @@ -0,0 +1,7 @@ +syntax = "proto3"; + +package othercom; + +message ExternalChildMessage { + string my_string = 1; +} diff --git a/client/protoc-gen-improbable-grpc-web/proto/othercom/external_enum.proto b/client/protoc-gen-improbable-grpc-web/proto/othercom/external_enum.proto new file mode 100644 index 00000000..43a01650 --- /dev/null +++ b/client/protoc-gen-improbable-grpc-web/proto/othercom/external_enum.proto @@ -0,0 +1,9 @@ +syntax = "proto3"; + +package othercom; + +enum ExternalEnum { + DEFAULT = 0; + FIRST = 1; + SECOND = 2; +} \ No newline at end of file diff --git a/client/protoc-gen-improbable-grpc-web/src/codegen.ts b/client/protoc-gen-improbable-grpc-web/src/codegen.ts new file mode 100644 index 00000000..f2981cb4 --- /dev/null +++ b/client/protoc-gen-improbable-grpc-web/src/codegen.ts @@ -0,0 +1,156 @@ +import {ExportMap} from "./exportmap"; +import {FileDescriptorProto} from "google-protobuf/google/protobuf/descriptor_pb"; +import Project, {CodeBlockWriter} from "ts-morph"; +import * as path from "path"; +import {trimSuffix, makeImportTargetNamespace, getRelativePathToRoot, trimPrefix} from "./util"; + +type GeneratedOutput = { + name: string + content: string +} + +export class GrpcWebCodeGenerator { + private exportMap: ExportMap; + private project: Project; + + constructor(exportMap: ExportMap) { + this.exportMap = exportMap; + this.project = new Project({ + compilerOptions: { + declaration: true, + removeComments: false + } + }); + } + + generate(fileDescriptors: FileDescriptorProto[]): GeneratedOutput[] { + for (const fd of fileDescriptors) { + const inputFileParts = path.parse(fd.getName()); + const filename = path.join(inputFileParts.dir, `${inputFileParts.name}_pb_service.ts`); + + this.project.createSourceFile(filename, (writer => { + new ServiceDefinitionBuilder(writer, fd, this.exportMap) + .writeImports() + .writeServices(); + })); + } + + return this.project.emitToMemory().getFiles().map(f => { + return { + name: trimPrefix(f.filePath, process.cwd()), + content: f.text + } + }) + } +} + +class ServiceDefinitionBuilder { + private w: CodeBlockWriter; + private fd: FileDescriptorProto; + private exportMap: ExportMap; + private pathToProtoRoot: string; + + constructor(writer: CodeBlockWriter, fd: FileDescriptorProto, exportMap: ExportMap) { + this.w = writer; + this.fd = fd; + this.exportMap = exportMap; + this.pathToProtoRoot = getRelativePathToRoot(fd.getName()); + } + + writeImports() { + this.fd.getDependencyList() + .map(v => { + const targetNs = makeImportTargetNamespace(v); + if (this.exportMap.isWellKnownType(v)) { + return { targetNs, targetPath: this.exportMap.getWellKnownTypeImportPath(v)! } + } + return { targetNs, targetPath: this.makeRelativeProtoImportPath(v) } + }) + .concat({ + targetNs: makeImportTargetNamespace(this.fd.getName()), + targetPath: this.makeRelativeProtoImportPath(this.fd.getName()) + }) + .forEach(v => { + this.w.writeLine(`import * as ${v.targetNs} from "${v.targetPath}";`); + }); + this.w.writeLine(`import { grpc } from '@improbable-eng/grpc-web`); + this.w.blankLine(); + return this; + } + + writeServices() { + this.writeServiceMethodTypes(); + this.writeServiceClasses(); + return this; + } + + /** + * qualifiedTypeName return the correct, qualified JavaScript import variable name for a given + * message type value. + * + * @param {string} messageTypeName The name of the proto message to retrieve + * @returns {string} qualified JavaScript import path (eg: `some_module.Foo`) + */ + private qualifiedTypeName(messageTypeName: string): string { + return this.exportMap.getMessageType(trimPrefix(messageTypeName, "."), ""); + } + + /** + * makeRelativeProtoImportPath is used to generate an import target filepath which is relative + * to the root of all the generated protos. Note that the `_pb` suffix is added automatically + * by the 'protocgen-js' plugin. + * + * @param {string} protoFilename filename of the proto to generate the import statement for + * @returns {string} relative import path to the generated javascript sources of the supplied + * proto (note: javascript is generaed by the 'protoc-js' plugin) + */ + private makeRelativeProtoImportPath(protoFilename: string): string { + return this.pathToProtoRoot + trimSuffix(protoFilename, ".proto") + "_pb"; + } + + private writeServiceMethodTypes() { + for (const service of this.fd.getServiceList()) { + for (const method of service.getMethodList()) { + this.w.writeLine(`type ${service.getName()}${method.getName()} = {`); + this.w.indentBlock(() => { + this.w.indentBlock(() => { + this.w.writeLine(`methodName: "${method.getName()}"`); + this.w.writeLine(`service: ${service.getName()}`); + this.w.writeLine(`requestStream: ${method.getClientStreaming()}`); + this.w.writeLine(`responseStream: ${method.getServerStreaming()}`); + this.w.writeLine(`requestType: ${this.qualifiedTypeName(method.getInputType())}`); + this.w.writeLine(`responseType: ${this.qualifiedTypeName(method.getOutputType())}`); + }); + }); + this.w.writeLine("}"); + } + } + } + + private writeServiceClasses() { + for (const service of this.fd.getServiceList()) { + this.w.writeLine(`export class ${service.getName()} {`); + this.w.indentBlock(() => { + this.w.writeLine(`static readonly serviceName: string = "${service.getName()}"`); + + for (const method of service.getMethodList()) { + this.w.writeLine(`static readonly ${method.getName()}: ${service.getName()}${method.getName()} = {`); + this.w.indentBlock(() => { + this.w.indentBlock(() => { + this.w.writeLine(`methodName: "${method.getName()}"`); + this.w.writeLine(`service: ${service.getName()}`); + this.w.writeLine(`requestStream: ${method.getClientStreaming()}`); + this.w.writeLine(`responseStream: ${method.getServerStreaming()}`); + this.w.writeLine(`requestType: ${this.qualifiedTypeName(method.getInputType())}`); + this.w.writeLine(`responseType: ${this.qualifiedTypeName(method.getOutputType())}`); + }); + }); + this.w.writeLine(`}`); + } + + }); + this.w.writeLine(`}`); + this.w.blankLine(); + } + } +} \ No newline at end of file diff --git a/client/protoc-gen-improbable-grpc-web/src/exportmap.ts b/client/protoc-gen-improbable-grpc-web/src/exportmap.ts new file mode 100644 index 00000000..62dab8d8 --- /dev/null +++ b/client/protoc-gen-improbable-grpc-web/src/exportmap.ts @@ -0,0 +1,182 @@ +import { + FileDescriptorProto, + DescriptorProto, + MessageOptions, + EnumOptions, + FieldDescriptorProto +} from "google-protobuf/google/protobuf/descriptor_pb"; + +import Type = FieldDescriptorProto.Type; +import {makeImportTargetNamespace} from "./util"; + +export type ExportMessageEntry = { + pkg: string, + fileName: string, + messageOptions: MessageOptions, +}; + +export type ExportEnumEntry = { + pkg: string, + fileName: string, + enumOptions: EnumOptions, +}; + +const MESSAGE_TYPE = 11; +const BYTES_TYPE = 12; +const ENUM_TYPE = 14; + +const TypeNumToTypeString: {[key: number]: string} = {} +TypeNumToTypeString[1] = "number"; // TYPE_DOUBLE +TypeNumToTypeString[2] = "number"; // TYPE_FLOAT +TypeNumToTypeString[3] = "number"; // TYPE_INT64 +TypeNumToTypeString[4] = "number"; // TYPE_UINT64 +TypeNumToTypeString[5] = "number"; // TYPE_INT32 +TypeNumToTypeString[6] = "number"; // TYPE_FIXED64 +TypeNumToTypeString[7] = "number"; // TYPE_FIXED32 +TypeNumToTypeString[8] = "boolean"; // TYPE_BOOL +TypeNumToTypeString[9] = "string"; // TYPE_STRING +TypeNumToTypeString[10] = "Object"; // TYPE_GROUP +TypeNumToTypeString[MESSAGE_TYPE] = "Object"; // TYPE_MESSAGE - Length-delimited aggregate. +TypeNumToTypeString[BYTES_TYPE] = "Uint8Array"; // TYPE_BYTES +TypeNumToTypeString[13] = "number"; // TYPE_UINT32 +TypeNumToTypeString[ENUM_TYPE] = "number"; // TYPE_ENUM +TypeNumToTypeString[15] = "number"; // TYPE_SFIXED32 +TypeNumToTypeString[16] = "number"; // TYPE_SFIXED64 +TypeNumToTypeString[17] = "number"; // TYPE_SINT32 - Uses ZigZag encoding. +TypeNumToTypeString[18] = "number"; // TYPE_SINT64 - Uses ZigZag encoding. + +const defaultWellKnownTypes = { + "google/protobuf/compiler/plugin.proto": "google-protobuf/google/protobuf/compiler/plugin_pb", + "google/protobuf/any.proto": "google-protobuf/google/protobuf/any_pb", + "google/protobuf/api.proto": "google-protobuf/google/protobuf/api_pb", + "google/protobuf/descriptor.proto": "google-protobuf/google/protobuf/descriptor_pb", + "google/protobuf/duration.proto": "google-protobuf/google/protobuf/duration_pb", + "google/protobuf/empty.proto": "google-protobuf/google/protobuf/empty_pb", + "google/protobuf/field_mask.proto": "google-protobuf/google/protobuf/field_mask_pb", + "google/protobuf/source_context.proto": "google-protobuf/google/protobuf/source_context_pb", + "google/protobuf/struct.proto": "google-protobuf/google/protobuf/struct_pb", + "google/protobuf/timestamp.proto": "google-protobuf/google/protobuf/timestamp_pb", + "google/protobuf/type.proto": "google-protobuf/google/protobuf/type_pb", + "google/protobuf/wrappers.proto": "google-protobuf/google/protobuf/wrappers_pb" +}; + +export class ExportMap { + private messageMap: {[key: string]: ExportMessageEntry} = {}; + private enumMap: {[key: string]: ExportEnumEntry} = {}; + private fileDescriptorMap: {[key:string]: FileDescriptorProto} = {}; + private wellKnownTypesMap: {[key: string]: string} = defaultWellKnownTypes; + + constructor(descriptors: FileDescriptorProto[]) { + descriptors.forEach(d => { + this.add(d); + }); + } + + getMessage(str: string): ExportMessageEntry | undefined { + return this.messageMap[str]; + } + + getEnum(str: string): ExportEnumEntry | undefined { + return this.enumMap[str]; + } + + getDescriptor(filename: string): FileDescriptorProto | undefined { + return this.fileDescriptorMap[filename]; + } + + isWellKnownType(filename: string): boolean { + return filename in this.wellKnownTypesMap; + } + + getWellKnownTypeImportPath(filename: string): string | undefined { + return this.wellKnownTypesMap[filename]; + } + + getMessageType(typeName: string, currentFileName: string): string { + return this.getFieldType(MESSAGE_TYPE, typeName, currentFileName); + } + + getFieldType(type: Type, typeName: string, currentFileName: string): string { + if (type === MESSAGE_TYPE) { + const fromExport = this.getMessage(typeName); + if (!fromExport) { + throw new Error("Could not getFieldType for message: " + typeName); + } + const withinNamespace = this.withinNamespaceFromExportEntry(typeName, fromExport); + if (fromExport.fileName === currentFileName) { + return withinNamespace; + } + return makeImportTargetNamespace(fromExport.fileName) + "." + withinNamespace; + } + if (type === ENUM_TYPE) { + const fromExport = this.getEnum(typeName); + if (!fromExport) { + throw new Error("Could not getFieldType for enum: " + typeName); + } + const withinNamespace = this.withinNamespaceFromExportEntry(typeName, fromExport); + if (fromExport.fileName === currentFileName) { + return withinNamespace; + } else { + return makeImportTargetNamespace(fromExport.fileName) + "." + withinNamespace; + } + } else { + return TypeNumToTypeString[type]; + } + } + + private add(fileDescriptor: FileDescriptorProto) { + const scope: string = fileDescriptor.getPackage(); + const packagePrefix = this.makePackagePrefix(scope); + + this.fileDescriptorMap[fileDescriptor.getName()] = fileDescriptor; + + fileDescriptor.getMessageTypeList().forEach(messageType => { + this.exportNested(scope, fileDescriptor, messageType); + }); + + fileDescriptor.getEnumTypeList().forEach(enumType => { + const qualifiedEnumName = `${packagePrefix}${enumType.getName()}`; + this.enumMap[qualifiedEnumName] = { + pkg: fileDescriptor.getPackage(), + fileName: fileDescriptor.getName()!, + enumOptions: enumType.getOptions()!, + }; + }); + } + + private exportNested(scope: string, fileDescriptor: FileDescriptorProto, message: DescriptorProto) { + const messageEntry: ExportMessageEntry = { + pkg: fileDescriptor.getPackage(), + fileName: fileDescriptor.getName()!, + messageOptions: message.getOptions(), + }; + + const packagePrefix = this.makePackagePrefix(scope); + const entryName = `${packagePrefix}${message.getName()}`; + this.messageMap[entryName] = messageEntry; + + message.getNestedTypeList().forEach(nested => { + this.exportNested(`${packagePrefix}${message.getName()}`, fileDescriptor, nested); + }); + + message.getEnumTypeList().forEach(enumType => { + const identifier = `${packagePrefix}${message.getName()}.${enumType.getName()}`; + this.enumMap[identifier] = { + pkg: fileDescriptor.getPackage(), + fileName: fileDescriptor.getName()!, + enumOptions: enumType.getOptions()! + }; + }); + } + + withinNamespaceFromExportEntry(name: string, exportEntry: ExportMessageEntry | ExportEnumEntry) { + return exportEntry.pkg ? name.substring(exportEntry.pkg.length + 1) : name; + } + + private makePackagePrefix(scope: string) { + if (scope.length === 0) { + return ""; + } + return `${scope}.`; + } +} diff --git a/client/protoc-gen-improbable-grpc-web/src/index.ts b/client/protoc-gen-improbable-grpc-web/src/index.ts new file mode 100644 index 00000000..6e36d8a7 --- /dev/null +++ b/client/protoc-gen-improbable-grpc-web/src/index.ts @@ -0,0 +1,28 @@ +import {ExportMap} from "./exportmap"; +import {GrpcWebCodeGenerator} from "./codegen"; +import { + CodeGeneratorRequest as pb_CodeGeneratorRequest, + CodeGeneratorResponse as pb_CodeGeneratorResponse +} from "google-protobuf/google/protobuf/compiler/plugin_pb"; + +// TODO: Publish @types for protoc-plugin +declare function require(path: string): any; +const {CodeGeneratorRequest, CodeGeneratorResponse, CodeGeneratorResponseError} = require('protoc-plugin') + +CodeGeneratorRequest() + .then((req: pb_CodeGeneratorRequest) => { + const output: pb_CodeGeneratorResponse.File.AsObject[] = []; + const exportMap = new ExportMap(req.getProtoFileList()); + const codeGen = new GrpcWebCodeGenerator(exportMap); + + const descriptors = req.getFileToGenerateList() + .map((filename: string) => exportMap.getDescriptor(filename)!); + + for (const f of codeGen.generate(descriptors)) { + output.push(f); + } + + return output; + }) + .then(CodeGeneratorResponse()) + .catch(CodeGeneratorResponseError()); \ No newline at end of file diff --git a/client/protoc-gen-improbable-grpc-web/src/util.ts b/client/protoc-gen-improbable-grpc-web/src/util.ts new file mode 100644 index 00000000..5b262eec --- /dev/null +++ b/client/protoc-gen-improbable-grpc-web/src/util.ts @@ -0,0 +1,52 @@ +/** + * trimSuffix removes the supplied suffix from the end of the given string if present. + * + * @param {string} v source string which may contain the supplied suffix + * @param {string} suffix suffix to remove if present + * @returns {string} source string without suffix + */ +export function trimSuffix(v: string, suffix: string): string { + const hasSuffix = v.slice(v.length - suffix.length) === suffix; + return hasSuffix ? v.slice(0, -suffix.length) : v; +} + +/** + * trimPrefix removes the supplied prefix from the start of the given string if present. + * + * @param {string} v source string which may contain the supplied suffix + * @param {string} prefix string to remove from the start of the source string, if present + * @returns {string} source string without prefix + */ +export function trimPrefix(v: string, prefix: string): string { + const hasPrefix = v.slice(0, prefix.length) === prefix; + return hasPrefix ? v.slice(prefix.length) : v; +} + +/** + * makeImportNamespace creates a valid javascript variable name which can be used as the target namespace + * when `require`-ing a proto. + * + * @param {string} filename filename of the proto being imported, eg: `foo/bar.proto` + * @returns {string} a valid javascript variable name, eg: `foo_bar_pb` + */ +export function makeImportTargetNamespace(filename: string) { + return trimSuffix(filename, ".proto") + .replace(/\//g, "_") + .replace(/\./g, "_") + .replace(/-/g, "_") + "_pb"; +} + +/** + * getRelativePathToRoot returns a new relative filepath string which traverses upward the + * necessary number of folders to reach the root. + * + * @param {string} fp the input file path, eg: `foo/bar/baz` + * @returns {string} the appropriate relative filepath, eg: `../../`. + */ +export function getRelativePathToRoot(fp: string) { + const depth = fp.split("/").length; + if (depth === 1) { + return "./" + } + return new Array(depth).join("../"); +} \ No newline at end of file diff --git a/client/protoc-gen-improbable-grpc-web/tsconfig.json b/client/protoc-gen-improbable-grpc-web/tsconfig.json new file mode 100644 index 00000000..e553c347 --- /dev/null +++ b/client/protoc-gen-improbable-grpc-web/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "alwaysStrict": true, + "sourceMap": true, + "declaration": true, + "target": "es5", + "removeComments": true, + "noImplicitReturns": true, + "noImplicitAny": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "strictNullChecks": true, + "stripInternal": true, + "noFallthroughCasesInSwitch": true, + "outDir": "lib", + "noEmitOnError": true + }, + "types": [ + "node" + ], + "include": [ + "src" + ], + "exclude": [ + "node_modules" + ] +}