diff --git a/.circleci/config.yml b/.circleci/config.yml index 0c502c42e..93d924a24 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,72 +2,83 @@ version: 2.1 jobs: testGenerator: docker: - - image: circleci/node:10-browsers + - image: l.gcr.io/google/bazel working_directory: /home/circleci/project/gapic-generator-typescript steps: - checkout - - run: - name: Install protoc - command: | - wget https://github.com/protocolbuffers/protobuf/releases/download/v3.10.0/protoc-3.10.0-linux-x86_64.zip - cd / && sudo unzip /tmp/protoc-3.10.0-linux-x86_64.zip - protoc --version - working_directory: /tmp - - run: - name: Run npm install - command: | - npm install - run: name: Run generator unit tests command: | - npm link - npm test - environment: - NPM_CONFIG_PREFIX: /tmp/.npm-global - - run: - name: Run linting + bazel test //:unit_tests + - run: + name: Unzip baseline tests output command: | - npm run lint + mkdir /home/circleci/project/baselines + unzip bazel-testlogs/unit_tests/test.outputs/outputs.zip -d /home/circleci/project/baselines - run: - name: copy protos to generated client library & move .test-out-* to project/out/ + name: Copy protos to baselines command: | - for dir in .test-out-* ; do + for dir in /home/circleci/project/baselines/.test-out-* ; do cp -r test-fixtures/protos $dir done - - run: - name: move test out folders to a separate folder + - run: + name: Copy compiled test applications + # bazel-bin/ is a symlink to /root/.cache/bazel/... and we won't have it + # available in Node container. Let's just save what we need. command: | - mkdir /home/circleci/project/baselines - cp -r .test-out-* /home/circleci/project/baselines + mkdir test-application-runners + cp bazel-bin/test/test-application/test-*.js test-application-runners/ + cp bazel-testlogs/unit_tests/test.outputs/outputs.zip test-application-runners/ - persist_to_workspace: root: /home/circleci/project paths: - gapic-generator-typescript - baselines + lint: + docker: + - image: circleci/node:10-browsers + steps: + - attach_workspace: + at: /home/circleci/workspace + - run: + name: Run lint + working_directory: /home/circleci/workspace/gapic-generator-typescript + command: | + rm -f bazel-* # we don't need these broken symlinks here + # we have some extra stuff here in Circle that we don't want to lint + echo test-application-runners >> .eslintignore + echo test-application-runners >> .prettierignore + # and now finally... + npm run lint showcaseTestApplications: docker: - image: circleci/node:10-browsers - steps: - - checkout + steps: - attach_workspace: at: /home/circleci/workspace + - run: + name: Prepare test applications + working_directory: /home/circleci/workspace/gapic-generator-typescript + command: | + rm -f bazel-testlogs + mkdir -p bazel-testlogs/unit_tests/test.outputs + cp test-application-runners/outputs.zip bazel-testlogs/unit_tests/test.outputs/ - run: name: Run showcase test for Typescript users working_directory: /home/circleci/workspace/gapic-generator-typescript - command: npm run ts-test-application + command: npx mocha test-application-runners/test-ts.js environment: NPM_CONFIG_PREFIX: /tmp/.npm-global - run: name: Run showcase test for JavaScript users working_directory: /home/circleci/workspace/gapic-generator-typescript - command: npm run js-test-application + command: npx mocha test-application-runners/test-js.js environment: NPM_CONFIG_PREFIX: /tmp/.npm-global showcaseLibTest: docker: - image: circleci/node:10-browsers - steps: - - checkout + steps: - attach_workspace: at: /home/circleci/workspace - run: @@ -84,8 +95,7 @@ jobs: kmsLibTest: docker: - image: circleci/node:10-browsers - steps: - - checkout + steps: - attach_workspace: at: /home/circleci/workspace - run: @@ -95,8 +105,7 @@ jobs: translateLibTest: docker: - image: circleci/node:10-browsers - steps: - - checkout + steps: - attach_workspace: at: /home/circleci/workspace - run: @@ -106,8 +115,7 @@ jobs: monitoringLibTest: docker: - image: circleci/node:10-browsers - steps: - - checkout + steps: - attach_workspace: at: /home/circleci/workspace - run: @@ -117,8 +125,7 @@ jobs: dlpLibTest: docker: - image: circleci/node:10-browsers - steps: - - checkout + steps: - attach_workspace: at: /home/circleci/workspace - run: @@ -128,8 +135,7 @@ jobs: ttsLibTest: docker: - image: circleci/node:10-browsers - steps: - - checkout + steps: - attach_workspace: at: /home/circleci/workspace - run: @@ -141,6 +147,9 @@ workflows: tests: jobs: - testGenerator + - lint: + requires: + - testGenerator - showcaseTestApplications: requires: - testGenerator diff --git a/.eslintignore b/.eslintignore index 652b9d119..c80feb33c 100644 --- a/.eslintignore +++ b/.eslintignore @@ -4,4 +4,5 @@ build/ docs/ protos/ test-fixtures/ -pbjs-genfiles/ +bazel-*/ +coverage/ diff --git a/.gitignore b/.gitignore index a647892fa..766fb07dc 100644 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,6 @@ config.yaml ignored build .vscode -package-lock.json pbjs-genfiles/ .DS_Store .idea @@ -26,3 +25,4 @@ docker/gitlog.txt .showcase-typescript .test-application-js .test-application-ts +bazel-* diff --git a/.prettierignore b/.prettierignore index a4ac7b375..69a5029b4 100644 --- a/.prettierignore +++ b/.prettierignore @@ -3,3 +3,4 @@ build/ docs/ protos/ +bazel-*/ diff --git a/BUILD.bazel b/BUILD.bazel new file mode 100644 index 000000000..3a250cc14 --- /dev/null +++ b/BUILD.bazel @@ -0,0 +1,164 @@ +# Allow any ts_library rules in this workspace to reference the config +exports_files(["tsconfig.json"], visibility = ["//:__subpackages__"]) + +package(default_visibility = ["//visibility:public"]) + +load("@build_bazel_rules_nodejs//:index.bzl", "nodejs_binary", "nodejs_test") +load("@npm_bazel_typescript//:index.bzl", "ts_project", "ts_config") +load("@npm_bazel_labs//:index.bzl", "protobufjs_ts_library") + +proto_library( + name = "google_protobuf_protos", + srcs = glob(["node_modules/google-gax/build/protos/google/protobuf/*.proto"]) + + [ + "node_modules/google-gax/build/protos/google/protobuf/compiler/plugin.proto", + ], + strip_import_prefix = "node_modules/google-gax/build/protos", +) + +proto_library( + name = "google_rpc_protos", + deps = [ + ":google_protobuf_protos", + ], + srcs = glob(["node_modules/google-gax/build/protos/google/rpc/*.proto"]), + strip_import_prefix = "node_modules/google-gax/build/protos/", +) + +proto_library( + name = "google_api_protos", + deps = [ + ":google_protobuf_protos", + ], + srcs = glob(["node_modules/google-gax/build/protos/google/api/*.proto"]), + strip_import_prefix = "node_modules/google-gax/build/protos", +) + +proto_library( + name = "google_longrunning_protos", + deps = [ + ":google_protobuf_protos", + ":google_api_protos", + ":google_rpc_protos", + ], + srcs = ["node_modules/google-gax/build/protos/google/longrunning/operations.proto"], + strip_import_prefix = "node_modules/google-gax/build/protos", +) + +proto_library( + name = "service_config_proto", + deps = [ + ":google_protobuf_protos", + ":google_rpc_protos", + ], + srcs = ["protos/service_config.proto"], + strip_import_prefix = "protos/", +) + +protobufjs_ts_library( + name = "protos", + deps = [ + ":google_api_protos", + ":google_longrunning_protos", + ":service_config_proto", + ] +) + +filegroup( + name = "templates", + srcs = glob(["templates/**/*.*", "templates/**/.*"]), +) + +filegroup( + name = "test_fixtures", + srcs = glob(["test-fixtures/**/*.*"]), +) + +filegroup( + name = "baselines", + srcs = glob(["baselines/**/*.*", "baselines/**/.*"]), +) + +npm_runtime_dependencies = [ + "@npm//file-system", + "@npm//fs-extra", + "@npm//get-stdin", + "@npm//google-gax", + "@npm//js-yaml", + "@npm//module-alias", + "@npm//nunjucks", + "@npm//object-hash", + "@npm//protobufjs", + "@npm//yargs", +] + +npm_test_dependencies = npm_runtime_dependencies + [ + "@npm//assert-rejects", + "@npm//espower-typescript", + "@npm//sinon", + "@npm//mocha", +] + +npm_compile_dependencies = npm_test_dependencies + [ + "@npm//@types/js-yaml", + "@npm//@types/fs-extra", + "@npm//@types/get-stdin", + "@npm//@types/mocha", + "@npm//@types/module-alias", + "@npm//@types/node", + "@npm//@types/nunjucks", + "@npm//@types/object-hash", + "@npm//@types/sinon", + "@npm//@types/yargs", + "@npm//gts", +] + +ts_project( + name = "compile", + srcs = glob([ + "src/**/*.ts", + "test/**/*.ts", + "tools/**/*.ts", + "index.d.ts" + ]), + tsconfig = "//:tsconfig.json", + extends = ["@npm//:node_modules/gts/tsconfig-google.json"], + source_map = True, + declaration = True, + deps = [ + ":protos", + ] + npm_compile_dependencies, +) + +nodejs_binary( + name = "protoc_plugin", + entry_point = "//:src/protoc-plugin.js", + data = [ + ":compile", + ":templates", + ":protos", + ] + npm_runtime_dependencies, +) + +nodejs_binary( + name = "gapic_generator_typescript", + entry_point = "//:src/gapic-generator-typescript.js", + data = [ + ":protoc_plugin", + ":compile", + ":templates", + ":protos", + "@com_google_protobuf//:protoc", + ] + npm_runtime_dependencies, +) + +nodejs_test( + name = "unit_tests", + entry_point = "@npm//:node_modules/mocha/bin/mocha", + args = ["test/unit/"], + data = [ + ":gapic_generator_typescript", + ":test_fixtures", + ":baselines", + ] + npm_test_dependencies, +) diff --git a/README.md b/README.md index c6f152af0..bec2bb01a 100644 --- a/README.md +++ b/README.md @@ -83,48 +83,56 @@ If you came here to make changes to the generated TypeScript libraries (e.g. `@g you are in the right place! Chances are high you don't need to edit any code, just the [Nunjucks](https://mozilla.github.io/nunjucks/) templates located in the `templates` folder. -After you edited the files, make the generator available globally: +This project is written in TypeScript, but we use [Bazel](https://bazel.build/) for managing dependencies +(for unrelated reasons), which makes the build process a little bit unusual. + +Good news is that you don't really need to learn Bazel to make a quick fix. All bazel commands are +hidden under the hood, so just use regular `npm` commands and just don't be surprised to see a lot of extra +output. + +To compile the code: ```sh # in gapic-generator-typescript folder -$ npm install # install dependencies -$ npm install -g . -# make sure gapic-generator-typescript launch script in PATH +$ npm install # install dependencies +$ npm run compile # build project with Bazel ``` -You'll need `protoc` in your `PATH` as well, take the latest `protoc-*.zip` from -their [releases page](https://github.com/protocolbuffers/protobuf/releases). -Make sure it works: +To run the generator: ```sh -$ protoc --version -libprotoc 3.7.1 # the exact version does not really matter +bazel run //:gapic-generator-typescript -- --help ``` +**Note:** this section will be updated soon. After updating Bazel rules in `googleapis`, +the generator will be actually called by running `bazel build` on a specific target +in `googleapis` repository. Until this is ready, the following will work: + Checkout `googleapis`, which has a lot of protobuf definitions of real Google Cloud APIs: ```sh $ git clone https://github.com/googleapis/googleapis.git -$ cd googleapis +$ export GOOGLEAPIS="`pwd`/googleapis" # save the path. ``` Pick some API, how about `translate` `v3`? ```sh $ mkdir -p /tmp/translate-v3-typescript # where to put the result -# from googleapis folder: -$ gapic-generator-typescript -I . \ - --output_dir /tmp/translate-v3-typescript \ - --grpc-service-config google/cloud/translate/v3/translate_grpc_service_config.json \ - `find google/cloud/translate/v3 -name '*.proto'` \ - google/cloud/common_resources.proto +# from gapic-generator-typescript folder: +$ bazel run //:gapic-generator-typescript -- \ + --output-dir /tmp/translate-v3-typescript \ + -I "$GOOGLEAPIS" \ + --grpc-service-config "$GOOGLEAPIS/google/cloud/translate/v3/translate_grpc_service_config.json" \ + `find "$GOOGLEAPIS/google/cloud/translate/v3" -name '*.proto'` \ + "$GOOGLEAPIS/google/cloud/common_resources.proto" ``` -Line by line: -`-I .` means pass the current directory (i.e. `googleapis`) to `protoc` -`--output_dir /tmp/translate-v3-typescript` is where to put the result -`--grpc-service-config google/cloud/translate/v3/translate_grpc_service_config.json` -is an optional configuration file for timeouts and stuff +Line by line: +`-I "$GOOGLEAPIS"` means pass the `googleapis` to `protoc` +`--output-dir /tmp/translate-v3-typescript` is where to put the result +`--grpc-service-config "$GOOGLEAPIS/google/cloud/translate/v3/translate_grpc_service_config.json"` +is an optional configuration file for timeouts and stuff Then we add all the `translate` `v3` proto file to the command line, as well as the proto file that defines common resources (some APIs need it, some others don't). @@ -150,4 +158,3 @@ We support some cool things such as streaming RPCs, auto-pagination for certain ## Disclaimer **This is not an official Google product.** - diff --git a/WORKSPACE b/WORKSPACE new file mode 100644 index 000000000..f38b3dc7c --- /dev/null +++ b/WORKSPACE @@ -0,0 +1,59 @@ +# Declares that this directory is the root of a Bazel workspace. +# See https://docs.bazel.build/versions/master/build-ref.html#workspace +workspace( + # How this workspace would be referenced with absolute labels from another workspace + name = "gapic_generator_typescript", + # Map the @npm bazel workspace to the node_modules directory. + # This lets Bazel use the same node_modules as other local tooling. + managed_directories = {"@npm": ["node_modules"]}, +) + +# Install the nodejs "bootstrap" package +# This provides the basic tools for running and packaging nodejs programs in Bazel +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") +http_archive( + name = "build_bazel_rules_nodejs", + sha256 = "f9e7b9f42ae202cc2d2ce6d698ccb49a9f7f7ea572a78fd451696d03ef2ee116", + urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/1.6.0/rules_nodejs-1.6.0.tar.gz"], +) + +http_archive( + name = "rules_proto", + sha256 = "602e7161d9195e50246177e7c55b2f39950a9cf7366f74ed5f22fd45750cd208", + strip_prefix = "rules_proto-97d8af4dc474595af3900dd85cb3a29ad28cc313", + urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/rules_proto/archive/97d8af4dc474595af3900dd85cb3a29ad28cc313.tar.gz", + "https://github.com/bazelbuild/rules_proto/archive/97d8af4dc474595af3900dd85cb3a29ad28cc313.tar.gz", + ], +) +load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains") +rules_proto_dependencies() +rules_proto_toolchains() + +load("@build_bazel_rules_nodejs//:index.bzl", "node_repositories", "npm_install", "yarn_install") + +npm_install( + name = "npm", + package_json = "//:package.json", + package_lock_json = "//:package-lock.json", +) + +# Install any Bazel rules which were extracted earlier by the npm_install rule. +load("@npm//:install_bazel_dependencies.bzl", "install_bazel_dependencies") +install_bazel_dependencies() + +# Setup TypeScript toolchain +load("@npm_bazel_typescript//:index.bzl", "ts_setup_workspace") +ts_setup_workspace() + +load("@npm_bazel_labs//:index.bzl", "protobufjs_ts_library") + +yarn_install( + name = "build_bazel_rules_typescript_protobufs_compiletime_deps", + package_json = "@npm_bazel_labs//protobufjs:package.json", + yarn_lock = "@npm_bazel_labs//protobufjs:yarn.lock", + # Do not symlink node_modules as when used in downstream repos we should not create + # node_modules folders in the @npm_bazel_typescript external repository. This is + # not supported by managed_directories. + symlink_node_modules = False, +) diff --git a/baselines/asset/proto.list.baseline b/baselines/asset/proto.list.baseline deleted file mode 100644 index a2e2cc74b..000000000 --- a/baselines/asset/proto.list.baseline +++ /dev/null @@ -1,24 +0,0 @@ -google/api/http.proto -google/protobuf/descriptor.proto -google/api/annotations.proto -google/api/client.proto -google/api/field_behavior.proto -google/api/resource.proto -google/protobuf/empty.proto -google/protobuf/timestamp.proto -google/cloud/orgpolicy/v1/orgpolicy.proto -google/type/expr.proto -google/iam/v1/policy.proto -google/identity/accesscontextmanager/type/device_resources.proto -google/identity/accesscontextmanager/v1/access_level.proto -google/identity/accesscontextmanager/v1/access_policy.proto -google/identity/accesscontextmanager/v1/service_perimeter.proto -google/protobuf/any.proto -google/protobuf/struct.proto -google/cloud/asset/v1/assets.proto -google/protobuf/duration.proto -google/rpc/status.proto -google/longrunning/operations.proto -google/protobuf/field_mask.proto -google/cloud/asset/v1/asset_service.proto -google/cloud/common_resources.proto diff --git a/baselines/bigquery-storage/proto.list.baseline b/baselines/bigquery-storage/proto.list.baseline deleted file mode 100644 index 5451a6d74..000000000 --- a/baselines/bigquery-storage/proto.list.baseline +++ /dev/null @@ -1,13 +0,0 @@ -google/cloud/bigquery/storage/v1beta1/arrow.proto -google/cloud/bigquery/storage/v1beta1/avro.proto -google/cloud/bigquery/storage/v1beta1/read_options.proto -google/api/http.proto -google/protobuf/descriptor.proto -google/api/annotations.proto -google/api/client.proto -google/api/field_behavior.proto -google/api/resource.proto -google/protobuf/timestamp.proto -google/cloud/bigquery/storage/v1beta1/table_reference.proto -google/protobuf/empty.proto -google/cloud/bigquery/storage/v1beta1/storage.proto diff --git a/baselines/disable-packing-test/proto.list.baseline b/baselines/disable-packing-test/proto.list.baseline deleted file mode 100644 index f78aeca9c..000000000 --- a/baselines/disable-packing-test/proto.list.baseline +++ /dev/null @@ -1,18 +0,0 @@ -google/api/http.proto -google/protobuf/descriptor.proto -google/api/annotations.proto -google/api/client.proto -google/api/field_behavior.proto -google/protobuf/any.proto -google/protobuf/duration.proto -google/protobuf/empty.proto -google/rpc/status.proto -google/longrunning/operations.proto -google/protobuf/timestamp.proto -google/showcase/v1beta1/echo.proto -google/api/resource.proto -google/protobuf/field_mask.proto -google/showcase/v1beta1/identity.proto -google/rpc/error_details.proto -google/showcase/v1beta1/messaging.proto -google/showcase/v1beta1/testing.proto diff --git a/baselines/dlp/proto.list.baseline b/baselines/dlp/proto.list.baseline deleted file mode 100644 index edfc46b83..000000000 --- a/baselines/dlp/proto.list.baseline +++ /dev/null @@ -1,18 +0,0 @@ -google/api/http.proto -google/protobuf/descriptor.proto -google/api/annotations.proto -google/api/client.proto -google/api/field_behavior.proto -google/api/resource.proto -google/protobuf/timestamp.proto -google/privacy/dlp/v2/storage.proto -google/protobuf/duration.proto -google/protobuf/empty.proto -google/protobuf/field_mask.proto -google/protobuf/any.proto -google/rpc/status.proto -google/type/date.proto -google/type/dayofweek.proto -google/type/timeofday.proto -google/privacy/dlp/v2/dlp.proto -google/cloud/common_resources.proto diff --git a/baselines/kms/proto.list.baseline b/baselines/kms/proto.list.baseline deleted file mode 100644 index 8fd04cb8b..000000000 --- a/baselines/kms/proto.list.baseline +++ /dev/null @@ -1,9 +0,0 @@ -google/api/http.proto -google/protobuf/descriptor.proto -google/api/annotations.proto -google/protobuf/duration.proto -google/protobuf/timestamp.proto -google/cloud/kms/v1/resources.proto -google/protobuf/field_mask.proto -google/api/client.proto -google/cloud/kms/v1/service.proto diff --git a/baselines/logging/proto.list.baseline b/baselines/logging/proto.list.baseline deleted file mode 100644 index 40fea00c0..000000000 --- a/baselines/logging/proto.list.baseline +++ /dev/null @@ -1,25 +0,0 @@ -google/protobuf/descriptor.proto -google/api/field_behavior.proto -google/api/label.proto -google/api/launch_stage.proto -google/protobuf/struct.proto -google/api/monitored_resource.proto -google/api/resource.proto -google/protobuf/duration.proto -google/api/http.proto -google/api/annotations.proto -google/logging/type/http_request.proto -google/logging/type/log_severity.proto -google/protobuf/any.proto -google/protobuf/timestamp.proto -google/rpc/status.proto -google/logging/v2/log_entry.proto -google/api/client.proto -google/protobuf/empty.proto -google/protobuf/field_mask.proto -google/logging/v2/logging_config.proto -google/logging/v2/logging.proto -google/api/distribution.proto -google/api/metric.proto -google/logging/v2/logging_metrics.proto -google/cloud/common_resources.proto diff --git a/baselines/monitoring/proto.list.baseline b/baselines/monitoring/proto.list.baseline deleted file mode 100644 index b2914448e..000000000 --- a/baselines/monitoring/proto.list.baseline +++ /dev/null @@ -1,36 +0,0 @@ -google/protobuf/descriptor.proto -google/api/resource.proto -google/protobuf/any.proto -google/protobuf/timestamp.proto -google/api/distribution.proto -google/protobuf/duration.proto -google/monitoring/v3/common.proto -google/monitoring/v3/mutation_record.proto -google/protobuf/wrappers.proto -google/rpc/status.proto -google/monitoring/v3/alert.proto -google/api/http.proto -google/api/annotations.proto -google/api/client.proto -google/api/field_behavior.proto -google/protobuf/empty.proto -google/protobuf/field_mask.proto -google/monitoring/v3/alert_service.proto -google/monitoring/v3/dropped_labels.proto -google/monitoring/v3/group.proto -google/api/label.proto -google/api/launch_stage.proto -google/protobuf/struct.proto -google/api/monitored_resource.proto -google/monitoring/v3/group_service.proto -google/api/metric.proto -google/monitoring/v3/metric.proto -google/monitoring/v3/metric_service.proto -google/monitoring/v3/notification.proto -google/monitoring/v3/notification_service.proto -google/type/calendar_period.proto -google/monitoring/v3/service.proto -google/monitoring/v3/service_service.proto -google/monitoring/v3/span_context.proto -google/monitoring/v3/uptime.proto -google/monitoring/v3/uptime_service.proto diff --git a/baselines/redis/proto.list.baseline b/baselines/redis/proto.list.baseline deleted file mode 100644 index e8bacde53..000000000 --- a/baselines/redis/proto.list.baseline +++ /dev/null @@ -1,15 +0,0 @@ -google/api/http.proto -google/protobuf/descriptor.proto -google/api/annotations.proto -google/api/client.proto -google/api/field_behavior.proto -google/api/resource.proto -google/protobuf/any.proto -google/protobuf/duration.proto -google/protobuf/empty.proto -google/rpc/status.proto -google/longrunning/operations.proto -google/protobuf/field_mask.proto -google/protobuf/timestamp.proto -google/cloud/redis/v1beta1/cloud_redis.proto -google/cloud/common_resources.proto diff --git a/baselines/showcase/proto.list.baseline b/baselines/showcase/proto.list.baseline deleted file mode 100644 index f78aeca9c..000000000 --- a/baselines/showcase/proto.list.baseline +++ /dev/null @@ -1,18 +0,0 @@ -google/api/http.proto -google/protobuf/descriptor.proto -google/api/annotations.proto -google/api/client.proto -google/api/field_behavior.proto -google/protobuf/any.proto -google/protobuf/duration.proto -google/protobuf/empty.proto -google/rpc/status.proto -google/longrunning/operations.proto -google/protobuf/timestamp.proto -google/showcase/v1beta1/echo.proto -google/api/resource.proto -google/protobuf/field_mask.proto -google/showcase/v1beta1/identity.proto -google/rpc/error_details.proto -google/showcase/v1beta1/messaging.proto -google/showcase/v1beta1/testing.proto diff --git a/baselines/tasks/proto.list.baseline b/baselines/tasks/proto.list.baseline deleted file mode 100644 index a996684ec..000000000 --- a/baselines/tasks/proto.list.baseline +++ /dev/null @@ -1,20 +0,0 @@ -google/api/http.proto -google/protobuf/descriptor.proto -google/api/annotations.proto -google/api/client.proto -google/api/field_behavior.proto -google/api/resource.proto -google/cloud/tasks/v2/target.proto -google/protobuf/duration.proto -google/protobuf/timestamp.proto -google/cloud/tasks/v2/queue.proto -google/protobuf/any.proto -google/rpc/status.proto -google/cloud/tasks/v2/task.proto -google/iam/v1/options.proto -google/type/expr.proto -google/iam/v1/policy.proto -google/iam/v1/iam_policy.proto -google/protobuf/empty.proto -google/protobuf/field_mask.proto -google/cloud/tasks/v2/cloudtasks.proto diff --git a/baselines/texttospeech/proto.list.baseline b/baselines/texttospeech/proto.list.baseline deleted file mode 100644 index 683a7dcb6..000000000 --- a/baselines/texttospeech/proto.list.baseline +++ /dev/null @@ -1,6 +0,0 @@ -google/api/http.proto -google/protobuf/descriptor.proto -google/api/annotations.proto -google/api/client.proto -google/api/field_behavior.proto -google/cloud/texttospeech/v1/cloud_tts.proto diff --git a/baselines/translate/proto.list.baseline b/baselines/translate/proto.list.baseline deleted file mode 100644 index 0aece7694..000000000 --- a/baselines/translate/proto.list.baseline +++ /dev/null @@ -1,14 +0,0 @@ -google/api/http.proto -google/protobuf/descriptor.proto -google/api/annotations.proto -google/api/client.proto -google/api/field_behavior.proto -google/api/resource.proto -google/protobuf/any.proto -google/protobuf/duration.proto -google/protobuf/empty.proto -google/rpc/status.proto -google/longrunning/operations.proto -google/protobuf/timestamp.proto -google/cloud/translate/v3beta1/translation_service.proto -google/cloud/common_resources.proto diff --git a/baselines/videointelligence/proto.list.baseline b/baselines/videointelligence/proto.list.baseline deleted file mode 100644 index f989e552a..000000000 --- a/baselines/videointelligence/proto.list.baseline +++ /dev/null @@ -1,14 +0,0 @@ -google/api/http.proto -google/protobuf/descriptor.proto -google/api/annotations.proto -google/api/client.proto -google/api/field_behavior.proto -google/protobuf/any.proto -google/protobuf/duration.proto -google/protobuf/empty.proto -google/rpc/status.proto -google/longrunning/operations.proto -google/protobuf/timestamp.proto -google/cloud/videointelligence/v1/video_intelligence.proto -google/api/resource.proto -google/cloud/common_resources.proto diff --git a/docker/start.sh b/docker/start.sh index a5aa83e01..5015dbe4c 100644 --- a/docker/start.sh +++ b/docker/start.sh @@ -8,11 +8,11 @@ echo "Latest commit: " 1>&2 cat /gitlog.txt 1>&2 echo 1>&2 -# Change directory to the input directory. +# Change directory to the input directory. # Make it easier to pass gRPC service config relative to it, e.g. # --grpc-service-config google/cloud/texttospeech/v1/texttospeech_grpc_service_config.json -cd /in +cd /in gapic-generator-typescript \ --common-proto-path /protos/api-common-protos-master \ -I /in \ @@ -20,7 +20,4 @@ gapic-generator-typescript \ $* \ `find /in -name '*.proto'` -# The proto.list is only needed for generation, removing it -rm -f /out/proto.list - exit 0 diff --git a/typescript/index.d.ts b/index.d.ts similarity index 100% rename from typescript/index.d.ts rename to index.d.ts diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..2b7086cd7 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4881 @@ +{ + "name": "@google-cloud/gapic-generator", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", + "dev": true + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@bazel/bazelisk": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@bazel/bazelisk/-/bazelisk-1.4.0.tgz", + "integrity": "sha512-VNI/jF7baQiBy4x+u8gmSDsFehqaAuzMyLuCj0j6/aZCZSw2OssytJVj73m8sFYbXgj67D8iYEQ0gbuoafDk6w==", + "dev": true + }, + "@bazel/buildifier": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@bazel/buildifier/-/buildifier-2.2.1.tgz", + "integrity": "sha512-fDWMV2x03/K5dZnAEBeKS0gpn0LWCiv5kjhMB6q0f1Q5x6S7/+xoownxgWyNRo+qHxn+a2CtQSCRUpSC8QNg/w==", + "dev": true + }, + "@bazel/labs": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@bazel/labs/-/labs-1.6.0.tgz", + "integrity": "sha512-Pir3BhqAzlNNhwBCF3DguvhR0+S96OYXWc4Ha2m/0wm1/5G66bGB90CAKwahi52D8JGgg7PDwapCIPrD7ZGK9A==", + "dev": true + }, + "@bazel/typescript": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@bazel/typescript/-/typescript-1.6.0.tgz", + "integrity": "sha512-vAKuwy1Hgl+t3M3sH/G0oqHRYN35TdENj+0lsCI3x7EbSzyI6cbA3YQrLrlyvdScksqOpZa3PZ3UBGqfJJq2DA==", + "dev": true, + "requires": { + "protobufjs": "6.8.8", + "semver": "5.6.0", + "source-map-support": "0.5.9", + "tsutils": "2.27.2" + }, + "dependencies": { + "@types/node": { + "version": "10.17.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.21.tgz", + "integrity": "sha512-PQKsydPxYxF1DsAFWmunaxd3sOi3iMt6Zmx/tgaagHYmwJ/9cRH91hQkeJZaUGWbvn0K5HlSVEXkn5U/llWPpQ==", + "dev": true + }, + "protobufjs": { + "version": "6.8.8", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz", + "integrity": "sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==", + "dev": true, + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.0", + "@types/node": "^10.1.0", + "long": "^4.0.0" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + } + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@grpc/grpc-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.0.3.tgz", + "integrity": "sha512-JKV3f5Bv2TZxK6eJSB9EarsZrnLxrvcFNwI9goq0YRXa3S6NNoCSnI3cG3lkXVIJ03Wng1WXe76kc2JQtRe7AQ==", + "requires": { + "semver": "^6.2.0" + } + }, + "@grpc/proto-loader": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.4.tgz", + "integrity": "sha512-HTM4QpI9B2XFkPz7pjwMyMgZchJ93TVkL3kWPW8GDMDKYxsMnmf4w2TNMJK7+KNiYHS5cJrCEAFlF+AwtXWVPA==", + "requires": { + "lodash.camelcase": "^4.3.0", + "protobufjs": "^6.8.6" + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true + }, + "@sinonjs/commons": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.2.tgz", + "integrity": "sha512-+DUO6pnp3udV/v2VfUWgaY5BIE1IfT7lLfeDzPVeMT1XKkaAp9LgSI9x5RtrFQoZ9Oi0PgXQQHPaoKu7dCjVxw==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@sinonjs/formatio": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-5.0.1.tgz", + "integrity": "sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^5.0.2" + } + }, + "@sinonjs/samsam": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.0.3.tgz", + "integrity": "sha512-QucHkc2uMJ0pFGjJUDP3F9dq5dx8QIaqISl9QgwLOh6P9yv877uONPGXh/OH/0zmM3tW1JjuJltAZV2l7zU+uQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, + "@types/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-UoOfVEzAUpeSPmjm7h1uk5MH6KZma2z2O7a75onTGjnNvAvMVrPzPL/vBbT65iIGHWj6rokwfmYcmxmlSf2uwg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/get-stdin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/get-stdin/-/get-stdin-7.0.0.tgz", + "integrity": "sha512-kiDwIsKQvsLRvtBOnasij+6eChbCzcUT7OyVvrC5BEOE4QSKbpnwejEp0xND/9sIdOTfiu+BBl3zsB16MJ3Fww==", + "dev": true, + "requires": { + "get-stdin": "*" + } + }, + "@types/is-windows": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-1.0.0.tgz", + "integrity": "sha512-tJ1rq04tGKuIJoWIH0Gyuwv4RQ3+tIu7wQrC0MV47raQ44kIzXSSFKfrxFUOWVRvesoF7mrTqigXmqoZJsXwTg==", + "dev": true + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.2.tgz", + "integrity": "sha512-rsZg7eL+Xcxsxk2XlBt9KcG8nOp9iYdKCOikY9x2RFJCyOdNj4MKPQty0e8oZr29vVAzKXr1BmR+kZauti3o1w==", + "dev": true + }, + "@types/js-yaml": { + "version": "3.12.3", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-3.12.3.tgz", + "integrity": "sha512-otRe77JNNWzoVGLKw8TCspKswRoQToys4tuL6XYVBFxjgeM0RUrx7m3jkaTdxILxeGry3zM8mGYkGXMeQ02guA==" + }, + "@types/json-schema": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", + "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", + "dev": true + }, + "@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" + }, + "@types/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", + "dev": true + }, + "@types/mocha": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz", + "integrity": "sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==", + "dev": true + }, + "@types/module-alias": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/module-alias/-/module-alias-2.0.0.tgz", + "integrity": "sha512-e3sW4oEH0qS1QxSfX7PT6xIi5qk/YSMsrB9Lq8EtkhQBZB+bKyfkP+jpLJRySanvBhAQPSv2PEBe81M8Iy/7yg==", + "dev": true + }, + "@types/node": { + "version": "13.13.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.6.tgz", + "integrity": "sha512-zqRj8ugfROCjXCNbmPBe2mmQ0fJWP9lQaN519hwunOgpHgVykme4G6FW95++dyNFDvJUk4rtExkVkL0eciu5NA==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "@types/nunjucks": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/nunjucks/-/nunjucks-3.1.3.tgz", + "integrity": "sha512-42IiIIBdoB7ZDwCVhCWYT4fMCj+4TeacuVgh7xyT2du5EhkpA+OFeeDdYTFCUt1MrHb8Aw7ZqFvr8s1bwP9l8w==", + "dev": true + }, + "@types/object-hash": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-1.3.3.tgz", + "integrity": "sha512-75t+H8u2IU1zJPPqezkGLP4YxDlj8tx7H9SgYOT1G61NjJUUEELu1Lp7RKQKXhW+FL8nV7XyD/cNFAtrKGViYQ==", + "dev": true + }, + "@types/sinon": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-9.0.0.tgz", + "integrity": "sha512-v2TkYHkts4VXshMkcmot/H+ERZ2SevKa10saGaJPGCJ8vh3lKrC4u663zYEeRZxep+VbG6YRDtQ6gVqw9dYzPA==", + "dev": true, + "requires": { + "@types/sinonjs__fake-timers": "*" + } + }, + "@types/sinonjs__fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.1.tgz", + "integrity": "sha512-yYezQwGWty8ziyYLdZjwxyMb0CZR49h8JALHGrxjQHWlqGgc8kLdHEgWrgL0uZ29DMvEVBDnHU2Wg36zKSIUtA==", + "dev": true + }, + "@types/yargs": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", + "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.31.0.tgz", + "integrity": "sha512-iIC0Pb8qDaoit+m80Ln/aaeu9zKQdOLF4SHcGLarSeY1gurW6aU4JsOPMjKQwXlw70MvWKZQc6S2NamA8SJ/gg==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "2.31.0", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "tsutils": "^3.17.1" + }, + "dependencies": { + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.31.0.tgz", + "integrity": "sha512-MI6IWkutLYQYTQgZ48IVnRXmLR/0Q6oAyJgiOror74arUMh7EWjJkADfirZhRsUMHeLJ85U2iySDwHTSnNi9vA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.31.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.31.0.tgz", + "integrity": "sha512-uph+w6xUOlyV2DLSC6o+fBDzZ5i7+3/TxAsH4h3eC64tlga57oMb96vVlXoMwjR/nN+xyWlsnxtbDkB46M2EPQ==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "2.31.0", + "@typescript-eslint/typescript-estree": "2.31.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.31.0.tgz", + "integrity": "sha512-vxW149bXFXXuBrAak0eKHOzbcu9cvi6iNcJDzEtOkRwGHxJG15chiAQAwhLOsk+86p9GTr/TziYvw+H9kMaIgA==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^6.3.0", + "tsutils": "^3.17.1" + }, + "dependencies": { + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + } + } + }, + "a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==" + }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "dev": true + }, + "acorn-es7-plugin": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/acorn-es7-plugin/-/acorn-es7-plugin-1.1.7.tgz", + "integrity": "sha1-8u4fMiipDurRJF+asZIusucdM2s=", + "dev": true + }, + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "dev": true + }, + "agent-base": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", + "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", + "requires": { + "debug": "4" + } + }, + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dev": true, + "requires": { + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "argv": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", + "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", + "dev": true + }, + "array-find": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-find/-/array-find-1.0.0.tgz", + "integrity": "sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg=", + "dev": true + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "assert-rejects": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-rejects/-/assert-rejects-1.0.0.tgz", + "integrity": "sha512-xSmDqs5YxfrHUQBhVfrP/5+UoEvMBTY2+oRDoLfY9zsTA1hnW0KiKYcXKyeVWSgb0UpsQ4gyeBuKlXKzKUobZA==", + "dev": true, + "requires": { + "is-regexp": "^1.0.0" + } + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "bignumber.js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==" + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" + }, + "boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "dev": true, + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + }, + "dependencies": { + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "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": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "c8": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/c8/-/c8-7.1.2.tgz", + "integrity": "sha512-lCEwL9lbvWOQLxoLw8RF7PM8Cdj+rKxRp/PyWC9S8xASvYHRwXQ2gxzsNTgLhQM1Utc1YDAjzQYPQIxVEyelGg==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.2", + "find-up": "^4.0.0", + "foreground-child": "^2.0.0", + "furi": "^2.0.0", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.0.2", + "rimraf": "^3.0.0", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^4.1.2", + "yargs": "^15.0.0", + "yargs-parser": "^18.0.0" + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + } + } + }, + "call-matcher": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/call-matcher/-/call-matcher-1.1.0.tgz", + "integrity": "sha512-IoQLeNwwf9KTNbtSA7aEBb1yfDbdnzwjCetjkC8io5oGeOmK2CBNdg0xr+tadRYKO0p7uQyZzvon0kXlZbvGrw==", + "dev": true, + "requires": { + "core-js": "^2.0.0", + "deep-equal": "^1.0.0", + "espurify": "^1.6.0", + "estraverse": "^4.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + } + }, + "chalk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", + "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", + "optional": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cli-boxes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", + "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "codecov": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.6.5.tgz", + "integrity": "sha512-v48WuDMUug6JXwmmfsMzhCHRnhUf8O3duqXvltaYJKrO1OekZWpB/eH6iIoaxMl8Qli0+u3OxptdsBOYiD7VAQ==", + "dev": true, + "requires": { + "argv": "0.0.2", + "ignore-walk": "3.0.3", + "js-yaml": "3.13.1", + "teeny-request": "6.0.1", + "urlgrey": "0.4.4" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" + }, + "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 + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cross-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", + "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "empower-assert": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/empower-assert/-/empower-assert-1.1.0.tgz", + "integrity": "sha512-Ylck0Q6p8y/LpNzYeBccaxAPm2ZyuqBgErgZpO9KT0HuQWF0sJckBKCLmgS1/DEXEiyBi9XtYh3clZm5cAdARw==", + "dev": true, + "requires": { + "estraverse": "^4.2.0" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" + }, + "dependencies": { + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + } + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escallmatch": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/escallmatch/-/escallmatch-1.5.0.tgz", + "integrity": "sha1-UAmdhugJGwkt+N37w/mm+wWgJNA=", + "dev": true, + "requires": { + "call-matcher": "^1.0.0", + "esprima": "^2.0.0" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + } + } + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", + "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "eslint-config-prettier": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz", + "integrity": "sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + }, + "dependencies": { + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + } + } + }, + "eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "dev": true, + "requires": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + } + }, + "eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "requires": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "dev": true + } + } + }, + "eslint-plugin-prettier": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.3.tgz", + "integrity": "sha512-+HG5jmu/dN3ZV3T6eCD7a4BlAySdN7mLIbJYo0z1cFQuI+r2DiTJEFeF68ots93PsnrMxbzIZ2S/ieX+mkrBeQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", + "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "espower": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/espower/-/espower-2.1.2.tgz", + "integrity": "sha512-2qa3aEFtcgPB782jTKDPu82hOdw8+zJsWdOn12Tey8XlexHTqsYUIdLC2B7cUECENXly0vZblH1CEZcqttPNjw==", + "dev": true, + "requires": { + "array-find": "^1.0.0", + "escallmatch": "^1.5.0", + "escodegen": "^1.7.0", + "escope": "^3.3.0", + "espower-location-detector": "^1.0.0", + "espurify": "^1.3.0", + "estraverse": "^4.1.0", + "source-map": "^0.5.0", + "type-name": "^2.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "espower-location-detector": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/espower-location-detector/-/espower-location-detector-1.0.0.tgz", + "integrity": "sha1-oXt+zFnTDheeK+9z+0E3cEyzMbU=", + "dev": true, + "requires": { + "is-url": "^1.2.1", + "path-is-absolute": "^1.0.0", + "source-map": "^0.5.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "espower-source": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/espower-source/-/espower-source-2.3.0.tgz", + "integrity": "sha512-Wc4kC4zUAEV7Qt31JRPoBUc5jjowHRylml2L2VaDQ1XEbnqQofGWx+gPR03TZAPokAMl5dqyL36h3ITyMXy3iA==", + "dev": true, + "requires": { + "acorn": "^5.0.0", + "acorn-es7-plugin": "^1.0.10", + "convert-source-map": "^1.1.1", + "empower-assert": "^1.0.0", + "escodegen": "^1.10.0", + "espower": "^2.1.1", + "estraverse": "^4.0.0", + "merge-estraverse-visitors": "^1.0.0", + "multi-stage-sourcemap": "^0.2.1", + "path-is-absolute": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "espower-typescript": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/espower-typescript/-/espower-typescript-9.0.2.tgz", + "integrity": "sha512-d8A0Sz67iOHhsMw3Qk1Jwr/G4ZNSm+o0anl+/rQ2SxfnvL3+Y6vSzPUnSgT++OR9zGlHFG9f7a3jmJO/UIr3HA==", + "dev": true, + "requires": { + "espower-source": "^2.3.0", + "minimatch": "^3.0.3", + "source-map-support": "^0.5.9", + "ts-node": "^8.0.3" + } + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "acorn": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", + "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "espurify": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.8.1.tgz", + "integrity": "sha512-ZDko6eY/o+D/gHCWyHTU85mKDgYcS4FJj7S+YD6WIInm7GQ6AnOjmcL4+buFV/JOztVLELi/7MmuGU5NHta0Mg==", + "dev": true, + "requires": { + "core-js": "^2.0.0" + } + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, + "execa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.1.tgz", + "integrity": "sha512-SCjM/zlBdOK8Q5TIjOn6iEHZaPHFsMoTxXQ2nvUvtPnuohz3H2dIozSg+etNR98dGoYUp2ENSKLL/XaMmbxVgw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fast-text-encoding": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.2.tgz", + "integrity": "sha512-5rQdinSsycpzvAoHga2EDn+LRX1d5xLFsuNG0Kg61JrAT/tASXcLL0nf/33v+sAxlQcfYmWbTURa1mmAf55jGw==" + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/file-match/-/file-match-1.0.2.tgz", + "integrity": "sha1-ycrSZdLIrfOoFHWw30dYWQafrvc=", + "requires": { + "utils-extend": "^1.0.6" + } + }, + "file-system": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/file-system/-/file-system-2.2.2.tgz", + "integrity": "sha1-fWWDPjojR9zZVqgTxncVPtPt2Yc=", + "requires": { + "file-match": "^1.0.1", + "utils-extend": "^1.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "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" + } + } + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "fs-extra": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", + "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "furi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/furi/-/furi-2.0.0.tgz", + "integrity": "sha512-uKuNsaU0WVaK/vmvj23wW1bicOFfyqSsAIH71bRZx8kA4Xj+YCHin7CJKJJjkIsmxYaPFLk9ljmjEyB7xF7WvQ==", + "dev": true, + "requires": { + "@types/is-windows": "^1.0.0", + "is-windows": "^1.0.2" + } + }, + "gaxios": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-3.0.3.tgz", + "integrity": "sha512-PkzQludeIFhd535/yucALT/Wxyj/y2zLyrMwPcJmnLHDugmV49NvAi/vb+VUq/eWztATZCNcb8ue+ywPG+oLuw==", + "requires": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.3.0" + } + }, + "gcp-metadata": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.1.0.tgz", + "integrity": "sha512-r57SV28+olVsflPlKyVig3Muo/VDlcsObMtvDGOEtEJXj+DDE8bEl0coIkXh//hbkSDTvo+f5lbihZOndYXQQQ==", + "requires": { + "gaxios": "^3.0.0", + "json-bigint": "^0.3.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==" + }, + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "global-dirs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", + "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", + "dev": true, + "requires": { + "ini": "^1.3.5" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "google-auth-library": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.0.0.tgz", + "integrity": "sha512-uLydy1t6SHN/EvYUJrtN3GCHFrnJ0c8HJjOxXiGjoTuYHIoCUT3jVxnzmjHwVnSdkfE9Akasm2rM6qG1COTXfQ==", + "requires": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^3.0.0", + "gcp-metadata": "^4.0.0", + "gtoken": "^5.0.0", + "jws": "^4.0.0", + "lru-cache": "^5.0.0" + } + }, + "google-gax": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.3.1.tgz", + "integrity": "sha512-9dMa/PKMexVpYEGiLFrqupPj4CDorDPk4lqhyefxXblvdkmLIT+cHprNRxqyVknWGoTY0E0a9VuRDKlQQgOE8w==", + "requires": { + "@grpc/grpc-js": "~1.0.0", + "@grpc/proto-loader": "^0.5.1", + "@types/long": "^4.0.0", + "abort-controller": "^3.0.0", + "duplexify": "^3.6.0", + "google-auth-library": "^6.0.0", + "is-stream-ended": "^0.1.4", + "lodash.at": "^4.6.0", + "lodash.has": "^4.5.2", + "node-fetch": "^2.6.0", + "protobufjs": "^6.9.0", + "retry-request": "^4.0.0", + "semver": "^6.0.0", + "walkdir": "^0.4.0" + } + }, + "google-p12-pem": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.0.1.tgz", + "integrity": "sha512-VlQgtozgNVVVcYTXS36eQz4PXPt9gIPqLOhHN0QiV6W6h4qSCNVKPtKC5INtJsaHHF2r7+nOIa26MJeJMTaZEQ==", + "requires": { + "node-forge": "^0.9.0" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "dependencies": { + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + } + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "gtoken": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.0.1.tgz", + "integrity": "sha512-33w4FNDkUcyIOq/TqyC+drnKdI4PdXmWp9lZzssyEQKuvu9ZFN3KttaSnDKo52U3E51oujVGop93mKxmqO8HHg==", + "requires": { + "gaxios": "^3.0.0", + "google-p12-pem": "^3.0.0", + "jws": "^4.0.0", + "mime": "^2.2.0" + } + }, + "gts": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/gts/-/gts-2.0.2.tgz", + "integrity": "sha512-SLytzl2IqKXf6kGULwr07XQ9lVsvjrzFD3OAA7DEfIQYuD+lKBPt/cZ/RYGxaWerY4PTfmnXT7KdxEr9Ec8uHQ==", + "dev": true, + "requires": { + "@typescript-eslint/eslint-plugin": "2.31.0", + "@typescript-eslint/parser": "2.31.0", + "chalk": "^4.0.0", + "eslint": "^6.8.0", + "eslint-config-prettier": "^6.10.1", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-prettier": "^3.1.2", + "execa": "^4.0.0", + "inquirer": "^7.1.0", + "meow": "^7.0.0", + "ncp": "^2.0.0", + "prettier": "^2.0.4", + "rimraf": "^3.0.2", + "update-notifier": "^4.1.0", + "write-file-atomic": "^3.0.3" + } + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "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.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "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=" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "dev": true, + "requires": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + } + }, + "is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "is-stream-ended": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", + "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==" + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "dev": true + }, + "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 + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-bigint": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.0.tgz", + "integrity": "sha1-DM2RLEuCcNBfBW+9E4FLU9OCWx4=", + "requires": { + "bignumber.js": "^7.0.0" + } + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "jsonfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^1.0.0" + } + }, + "just-extend": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.0.tgz", + "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==", + "dev": true + }, + "jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "requires": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "requires": { + "package-json": "^6.3.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash.at": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.at/-/lodash.at-4.6.0.tgz", + "integrity": "sha1-k83OZk8KGZTqM9181A4jr9EbD/g=" + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lodash.has": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", + "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=" + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "map-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", + "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", + "dev": true + }, + "meow": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-7.0.1.tgz", + "integrity": "sha512-tBKIQqVrAHqwit0vfuFPY3LlzJYkEOFyKa3bPgxzNl6q/RtN8KQ+ALYEASYuFayzSAsjlhXj/JZ10rH85Q6TUw==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "arrify": "^2.0.1", + "camelcase": "^6.0.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "^4.0.2", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.13.1", + "yargs-parser": "^18.1.3" + }, + "dependencies": { + "camelcase": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", + "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", + "dev": true + }, + "type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + } + } + }, + "merge-estraverse-visitors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/merge-estraverse-visitors/-/merge-estraverse-visitors-1.0.0.tgz", + "integrity": "sha1-65aDOLXe1c7tgs7AMH3sui2OqZQ=", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "mime": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.5.tgz", + "integrity": "sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w==" + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "min-indent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz", + "integrity": "sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=", + "dev": true + }, + "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.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "dependencies": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mocha": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.1.tgz", + "integrity": "sha512-3qQsu3ijNS3GkWcccT5Zw0hf/rWvu1fTN9sPvEd81hlwsr30GX2GcDSSoBxo24IR8FelmrAydGC6/1J5QQP4WA==", + "dev": true, + "requires": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "chokidar": "3.3.0", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "3.0.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.3", + "ms": "2.1.1", + "node-environment-flags": "1.0.6", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "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.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "mkdirp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.4" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "module-alias": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz", + "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multi-stage-sourcemap": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/multi-stage-sourcemap/-/multi-stage-sourcemap-0.2.1.tgz", + "integrity": "sha1-sJ/IWG6qF/gdV1xK0C4Pej9rEQU=", + "dev": true, + "requires": { + "source-map": "^0.1.34" + }, + "dependencies": { + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "nise": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nise/-/nise-4.0.3.tgz", + "integrity": "sha512-EGlhjm7/4KvmmE6B/UFsKh7eHykRl9VH+au8dduHLCyWUO/hr7+N+WtTvDUwc9zHuM1IaIJs/0lQ6Ag1jDkQSg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^6.0.0", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node-environment-flags": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", + "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, + "node-forge": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.1.tgz", + "integrity": "sha512-G6RlQt5Sb4GMBzXvhfkeFmbqR6MzhtnT7VTHuLadjkii3rdYHNdw0m8zA4BTxVIh68FicCQ2NSUANpsqkr9jvQ==" + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "nunjucks": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.1.tgz", + "integrity": "sha512-LYlVuC1ZNSalQQkLNNPvcgPt2M9FTY9bs39mTCuFXtqh7jWbYzhDlmz2M6onPiXEhdZo+b9anRhc+uBGuJZ2bQ==", + "requires": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "chokidar": "^3.3.0", + "commander": "^3.0.2" + } + }, + "object-hash": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", + "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==" + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-is": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", + "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "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-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "prettier": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", + "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "protobufjs": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.9.0.tgz", + "integrity": "sha512-LlGVfEWDXoI/STstRDdZZKb/qusoAWUnmLg9R8OLSO473mBLWHowx8clbX5/+mKDEI+v7GzjoK9tRPZMMcoTrg==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": "^13.7.0", + "long": "^4.0.0" + }, + "dependencies": { + "@types/node": { + "version": "13.13.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.5.tgz", + "integrity": "sha512-3ySmiBYJPqgjiHA7oEaIo2Rzz0HrOZ7yrNO5HWyaE5q0lQ3BppDZ3N53Miz8bw2I7gh1/zir2MGVZBvpb1zq9g==" + } + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "pupa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", + "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", + "dev": true, + "requires": { + "escape-goat": "^2.0.0" + } + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + } + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "registry-auth-token": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz", + "integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "retry-request": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.1.1.tgz", + "integrity": "sha512-BINDzVtLI2BDukjWmjAIRZ0oglnCAkpP2vQjM3jdLhmT62h0xnQgciPwBRDAvHqpkPT2Wo1XuUyLyn6nbGrZQQ==", + "requires": { + "debug": "^4.1.1", + "through2": "^3.0.1" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "rxjs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "requires": { + "semver": "^6.3.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "sinon": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.0.2.tgz", + "integrity": "sha512-0uF8Q/QHkizNUmbK3LRFqx5cpTttEVXudywY9Uwzy8bTfZUhljZ7ARzSxnRHWYWtVTeh4Cw+tTb3iU21FQVO9A==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.2", + "@sinonjs/fake-timers": "^6.0.1", + "@sinonjs/formatio": "^5.0.1", + "@sinonjs/samsam": "^5.0.3", + "diff": "^4.0.2", + "nise": "^4.0.1", + "supports-color": "^7.1.0" + } + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", + "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "stream-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "dev": true, + "requires": { + "stubs": "^3.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", + "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", + "dev": true + }, + "stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "teeny-request": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-6.0.1.tgz", + "integrity": "sha512-TAK0c9a00ELOqLrZ49cFxvPVogMUFaWY8dUsQc/0CuQPGF+BOxOQzXfE413BAk2kLomwNplvdtMpeaeGWmoc2g==", + "dev": true, + "requires": { + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^4.0.0", + "node-fetch": "^2.2.0", + "stream-events": "^1.0.5", + "uuid": "^3.3.2" + }, + "dependencies": { + "agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "dev": true + }, + "https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "dev": true, + "requires": { + "agent-base": "5", + "debug": "4" + } + } + } + }, + "term-size": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", + "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==", + "dev": true + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "requires": { + "readable-stream": "2 || 3" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "trim-newlines": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", + "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", + "dev": true + }, + "ts-node": { + "version": "8.10.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.1.tgz", + "integrity": "sha512-bdNz1L4ekHiJul6SHtZWs1ujEKERJnHs4HxN7rjTyyVOFf3HaJ6sLqe6aPG62XTzAB/63pKRh5jTSWL0D7bsvw==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "dependencies": { + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + }, + "tsutils": { + "version": "2.27.2", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.27.2.tgz", + "integrity": "sha512-qf6rmT84TFMuxAKez2pIfR8UCai49iQsfB7YWVjV1bKpy/d0PWT5rEOSM6La9PiHZ0k1RRZQiwVdVJfQ3BPHgg==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "type-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/type-name/-/type-name-2.0.2.tgz", + "integrity": "sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q=", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.2.tgz", + "integrity": "sha512-q2ktq4n/uLuNNShyayit+DTobV2ApPEo/6so68JaD5ojvc/6GClBipedB9zNWYxRSAlZXAe405Rlijzl6qDiSw==", + "dev": true + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==" + }, + "update-notifier": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.0.tgz", + "integrity": "sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew==", + "dev": true, + "requires": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } + }, + "urlgrey": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz", + "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-extend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/utils-extend/-/utils-extend-1.0.8.tgz", + "integrity": "sha1-zP17ZFQPjpDuIe7Fd2nQZRyril8=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "dev": true + }, + "v8-to-istanbul": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz", + "integrity": "sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "walkdir": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz", + "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "requires": { + "string-width": "^4.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + } + }, + "yargs-parser": { + "version": "18.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", + "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + } + } +} diff --git a/package.json b/package.json index 1fea1329e..05525b5d6 100644 --- a/package.json +++ b/package.json @@ -13,30 +13,29 @@ "license": "Apache-2.0", "author": "Google LLC", "bin": { - "gapic-generator-typescript": "build/src/start-script.js", - "protoc-gen-typescript_gapic": "build/src/cli.js" + "gapic-generator-typescript": "build/src/gapic-generator-typescript.js", + "protoc-gen-typescript_gapic": "build/src/protoc-plugin.js" }, "files": [ - "build/src", - "pbjs-genfiles", - "templates" + "build/src/**/*.js", + "build/src/**/*.d.ts", + "build/protos.js", + "build/protos.d.ts", + "build/templates" ], "scripts": { - "baseline": "node build/tools/update-baselines.js", - "clean": "gts clean", - "codecov": "c8 --reporter=lcov mocha build/test/unit && c8 report", - "compile": "tsc -p .", - "compile-protos": "pbjs -p protos -p node_modules/google-gax/protos -t static-module -o pbjs-genfiles/plugin.js google/protobuf/compiler/plugin.proto google/api/annotations.proto google/api/field_behavior.proto google/api/resource.proto google/api/client.proto google/longrunning/operations.proto service_config.proto && pbts pbjs-genfiles/plugin.js -o pbjs-genfiles/plugin.d.ts", + "baseline": "node bazel-bin/tools/update-baselines.js", + "clean": "bazel clean && rm -rf build", + "codecov": "c8 --reporter=lcov mocha bazel-bin/test/unit && c8 report", + "compile": "bazel build //...", "docker-test": "sh docker/test.sh", "fix": "gts fix", - "js-test-application": "mocha build/test/test-application/test-js --timeout 600000", + "js-test-application": "mocha bazel-bin/test/test-application/test-js --timeout 600000", "lint": "gts check", - "prepack": "cd templates/typescript_gapic && rm -f package.json.njk && mv package.json package.json.njk", + "prepack": "npm run compile && cd templates/typescript_gapic && rm -f package.json.njk && mv package.json package.json.njk && cd ../.. && mkdir -p build && cp -rf bazel-bin/src bazel-bin/protos.js templates build/", "postpack": "cd templates/typescript_gapic && mv package.json.njk package.json && ln -s package.json package.json.njk", - "prepare": "npm run compile-protos && npm run compile", - "pretest": "npm run compile-protos && npm run compile", - "test": "c8 --reporter=lcov mocha build/test/unit", - "ts-test-application": "mocha build/test/test-application/test-ts --timeout 600000" + "test": "bazel test //:unit-tests", + "ts-test-application": "mocha bazel-bin/test/test-application/test-ts --timeout 600000" }, "dependencies": { "@types/js-yaml": "^3.12.3", @@ -45,20 +44,24 @@ "get-stdin": "^8.0.0", "google-gax": "^2.3.1", "js-yaml": "^3.13.1", + "module-alias": "^2.2.2", "nunjucks": "^3.2.1", "object-hash": "^2.0.3", "protobufjs": "^6.9.0", "yargs": "^15.3.1" }, "devDependencies": { + "@bazel/bazelisk": "^1.4.0", + "@bazel/buildifier": "^2.2.1", + "@bazel/labs": "^1.6.0", + "@bazel/typescript": "^1.6.0", "@types/fs-extra": "^8.1.0", "@types/get-stdin": "^7.0.0", "@types/mocha": "^7.0.2", - "@types/ncp": "^2.0.3", + "@types/module-alias": "^2.0.0", "@types/node": "^13.13.6", "@types/nunjucks": "^3.1.3", "@types/object-hash": "^1.3.2", - "@types/rimraf": "^3.0.0", "@types/sinon": "^9.0.0", "@types/yargs": "^15.0.5", "assert-rejects": "^1.0.0", @@ -67,8 +70,6 @@ "espower-typescript": "^9.0.2", "gts": "^2.0.2", "mocha": "^7.1.1", - "ncp": "^2.0.0", - "rimraf": "^3.0.2", "sinon": "^9.0.2", "typescript": "^3.9.2" }, diff --git a/pbjs-genfiles/README.md b/pbjs-genfiles/README.md deleted file mode 100644 index 489b963e0..000000000 --- a/pbjs-genfiles/README.md +++ /dev/null @@ -1,5 +0,0 @@ -This folder will contain JavaScript files and TypeScript type definitions -generated by `pbjs` and `pbts` tools (from `protobufjs`) based on the protobuf -definitions from the `protos` folder. - -Use `npm run compile-protos` to generate these files. diff --git a/protos/index.d.ts b/protos/index.d.ts new file mode 120000 index 000000000..b55ff98af --- /dev/null +++ b/protos/index.d.ts @@ -0,0 +1 @@ +../bazel-bin/protos.d.ts \ No newline at end of file diff --git a/protos/index.js b/protos/index.js new file mode 120000 index 000000000..5bdfc37b4 --- /dev/null +++ b/protos/index.js @@ -0,0 +1 @@ +../bazel-bin/protos.js \ No newline at end of file diff --git a/typescript/src/bundle.ts b/src/bundle.ts similarity index 100% rename from typescript/src/bundle.ts rename to src/bundle.ts diff --git a/typescript/src/start-script.ts b/src/gapic-generator-typescript.ts similarity index 84% rename from typescript/src/start-script.ts rename to src/gapic-generator-typescript.ts index df5b9579a..ccb52f037 100755 --- a/typescript/src/start-script.ts +++ b/src/gapic-generator-typescript.ts @@ -22,9 +22,15 @@ const fileSystem = require('file-system'); // eslint-disable-line const googleGaxPath = path.dirname(require.resolve('google-gax')); // ...../google-gax/build/src const googleGaxProtosDir = path.join(googleGaxPath, '..', '..', 'protos'); -const allTemplates = fs.readdirSync( - path.join(__dirname, '..', '..', 'templates') -); +const allTemplates = fs.readdirSync(path.join(__dirname, '..', 'templates')); + +// If we're built with bazel, we'll have a shell wrapper to be used as a protoc plugin. +// Just in case if someone builds us without bazel, let's have a fallback to an actual +// JS protoc plugin without a wrapper. +const protocPluginBash = path.join(__dirname, '..', 'protoc_plugin.sh'); +const protocPlugin = fs.existsSync(protocPluginBash) + ? protocPluginBash + : path.join(__dirname, 'protoc-plugin.js'); const argv = yargs .array('I') @@ -83,9 +89,8 @@ if (Array.isArray(argv._)) { const commonProtoPath = argv.commonProtoPath || googleGaxProtosDir; // run protoc command to generate client library -const cliPath = path.join(__dirname, 'cli.js'); const protocCommand = [ - `--plugin=protoc-gen-typescript_gapic=${cliPath}`, + `--plugin=protoc-gen-typescript_gapic=${protocPlugin}`, `--typescript_gapic_out=${outputDir}`, ]; if (grpcServiceConfig) { @@ -113,7 +118,19 @@ if (template) { protocCommand.push(...protoDirsArg); protocCommand.push(...protoFiles); protocCommand.push(`-I${commonProtoPath}`); -execFileSync('protoc', protocCommand, {stdio: 'inherit'}); + +const bazelProtocBinary = path.join( + __dirname, + '..', + '..', + 'com_google_protobuf', + 'protoc' +); +const protocBinary = fs.existsSync(bazelProtocBinary) + ? bazelProtocBinary + : 'protoc'; // hope for the best if we're not in bazel + +execFileSync(protocBinary, protocCommand, {stdio: 'inherit'}); // create protos folder to copy proto file const copyProtoDir = path.join(outputDir, 'protos'); @@ -138,3 +155,4 @@ fs.readFileSync(protoList) } }); }); +fs.unlinkSync(protoList); diff --git a/typescript/src/generator.ts b/src/generator.ts similarity index 88% rename from typescript/src/generator.ts rename to src/generator.ts index ebef44c5e..1875bb698 100644 --- a/typescript/src/generator.ts +++ b/src/generator.ts @@ -17,8 +17,7 @@ import * as path from 'path'; import * as fs from 'fs'; import * as util from 'util'; import * as yaml from 'js-yaml'; - -import * as plugin from '../../pbjs-genfiles/plugin'; +import * as protos from 'gapic_generator_typescript/protos'; import {API} from './schema/api'; import {processTemplates} from './templater'; @@ -30,13 +29,13 @@ export interface OptionsMap { } const readFile = util.promisify(fs.readFile); -const templatesDirectory = path.join(__dirname, '..', '..', 'templates'); +const templatesDirectory = path.join(__dirname, '..', 'templates'); const defaultTemplates = ['typescript_gapic', 'typescript_packing_test']; export class Generator { - request: plugin.google.protobuf.compiler.CodeGeneratorRequest; - response: plugin.google.protobuf.compiler.CodeGeneratorResponse; - grpcServiceConfig: plugin.grpc.service_config.ServiceConfig; + request: protos.google.protobuf.compiler.CodeGeneratorRequest; + response: protos.google.protobuf.compiler.CodeGeneratorResponse; + grpcServiceConfig: protos.grpc.service_config.ServiceConfig; bundleConfigs: BundleConfig[] = []; paramMap: OptionsMap; // This field is for users passing proper publish package name like @google-cloud/text-to-speech. @@ -48,9 +47,9 @@ export class Generator { templates: string[]; constructor() { - this.request = plugin.google.protobuf.compiler.CodeGeneratorRequest.create(); - this.response = plugin.google.protobuf.compiler.CodeGeneratorResponse.create(); - this.grpcServiceConfig = plugin.grpc.service_config.ServiceConfig.create(); + this.request = protos.google.protobuf.compiler.CodeGeneratorRequest.create(); + this.response = protos.google.protobuf.compiler.CodeGeneratorResponse.create(); + this.grpcServiceConfig = protos.grpc.service_config.ServiceConfig.create(); this.paramMap = {}; this.templates = defaultTemplates; } @@ -94,7 +93,7 @@ export class Generator { const content = await readFile(filename); const json = JSON.parse(content.toString()); Generator.updateDuration(json); - this.grpcServiceConfig = plugin.grpc.service_config.ServiceConfig.fromObject( + this.grpcServiceConfig = protos.grpc.service_config.ServiceConfig.fromObject( json ); } @@ -138,7 +137,7 @@ export class Generator { async initializeFromStdin() { const inputBuffer = await getStdin.buffer(); - this.request = plugin.google.protobuf.compiler.CodeGeneratorRequest.decode( + this.request = protos.google.protobuf.compiler.CodeGeneratorRequest.decode( inputBuffer ); if (this.request.parameter) { @@ -159,7 +158,7 @@ export class Generator { protoFilenames.push(proto.name); } } - const protoList = plugin.google.protobuf.compiler.CodeGeneratorResponse.File.create(); + const protoList = protos.google.protobuf.compiler.CodeGeneratorResponse.File.create(); protoList.name = 'proto.list'; protoList.content = protoFilenames.join('\n') + '\n'; this.response.file.push(protoList); @@ -201,13 +200,13 @@ export class Generator { } async generate() { - this.response = plugin.google.protobuf.compiler.CodeGeneratorResponse.create(); + this.response = protos.google.protobuf.compiler.CodeGeneratorResponse.create(); this.addProtosToResponse(); const api = this.buildAPIObject(); await this.processTemplates(api); - const outputBuffer = plugin.google.protobuf.compiler.CodeGeneratorResponse.encode( + const outputBuffer = protos.google.protobuf.compiler.CodeGeneratorResponse.encode( this.response ).finish(); process.stdout.write(outputBuffer); diff --git a/typescript/src/cli.ts b/src/protoc-plugin.ts similarity index 61% rename from typescript/src/cli.ts rename to src/protoc-plugin.ts index 320819236..d96725060 100644 --- a/typescript/src/cli.ts +++ b/src/protoc-plugin.ts @@ -14,6 +14,18 @@ // See the License for the specific language governing permissions and // limitations under the License. +// Making bazel build and bazel run work: +// To allow importing protos as "gapic_generator_typescript/protos" +// without using `../../`, we define a path alias in `tsconfig.json`: +// "paths": { +// "gapic_generator_typescript/*": ["*"] +// } +// Then we use this module-alias module that alters behavior of +// `require` by adding an alias to gapic_generator_typescript. +// TODO(@alexander-fenster): get rid of module-alias. +import * as moduleAlias from 'module-alias'; +import * as path from 'path'; +moduleAlias.addAlias('gapic_generator_typescript', path.join(__dirname, '..')); import * as yargs from 'yargs'; import {Generator} from './generator'; diff --git a/typescript/src/schema/api.ts b/src/schema/api.ts similarity index 91% rename from typescript/src/schema/api.ts rename to src/schema/api.ts index a0de12f5a..a7e1ff17b 100644 --- a/typescript/src/schema/api.ts +++ b/src/schema/api.ts @@ -12,10 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. -import * as plugin from '../../../pbjs-genfiles/plugin'; +import * as protos from 'gapic_generator_typescript/protos'; import {Naming, Options as namingOptions} from './naming'; -import {Proto, MessagesMap} from './proto'; +import {Proto, MessagesMap, ServiceDescriptorProto} from './proto'; import {ResourceDatabase, ResourceDescriptor} from './resource-database'; import {CommentsMap} from './comments'; @@ -35,7 +35,7 @@ export class API { mainServiceName: string; static isIgnoredService( - fd: plugin.google.protobuf.IFileDescriptorProto + fd: protos.google.protobuf.IFileDescriptorProto ): boolean { // Some common proto files define common services which we don't want to generate. // List them here. @@ -47,7 +47,7 @@ export class API { } constructor( - fileDescriptors: plugin.google.protobuf.IFileDescriptorProto[], + fileDescriptors: protos.google.protobuf.IFileDescriptorProto[], packageName: string, options: namingOptions ) { @@ -98,7 +98,7 @@ export class API { .reduce((servicesList, fd) => { servicesList.push(...fd.service!); return servicesList; - }, [] as plugin.google.protobuf.IServiceDescriptorProto[]) + }, [] as protos.google.protobuf.IServiceDescriptorProto[]) .filter(service => { if (!service.options || !service.options['.google.api.defaultHost']) { throw new Error( @@ -145,7 +145,7 @@ export class API { ...Object.keys(proto.services).map(name => proto.services[name]) ); return retval; - }, [] as plugin.google.protobuf.IServiceDescriptorProto[]) + }, [] as ServiceDescriptorProto[]) .sort((service1, service2) => service1.name!.localeCompare(service2.name!) ); @@ -171,7 +171,7 @@ export class API { } function getResourceDatabase( - fileDescriptors: plugin.google.protobuf.IFileDescriptorProto[] + fileDescriptors: protos.google.protobuf.IFileDescriptorProto[] ): ResourceDatabase[] { const resourceDatabase = new ResourceDatabase(); // resources that defined by `google.api.resource` const allResourceDatabase = new ResourceDatabase(); // all resources defined by `google.api.resource` or `google.api.resource_definition` @@ -184,9 +184,9 @@ function getResourceDatabase( `file ${fd.name} resource_definition option` ); } - const messagesStack: plugin.google.protobuf.IDescriptorProto[] = []; + const messagesStack: protos.google.protobuf.IDescriptorProto[] = []; const messages = (fd.messageType ?? []).filter( - (message: plugin.google.protobuf.IDescriptorProto) => message.name + (message: protos.google.protobuf.IDescriptorProto) => message.name ); // put first layer of messages in the stack messagesStack.push(...messages); @@ -202,7 +202,7 @@ function getResourceDatabase( m?.options?.['.google.api.resource'] as ResourceDescriptor | undefined, `file ${fd.name} message ${messageName}` ); - (m.nestedType ?? []).map(m => messagesStack.push(m)); + (m.nestedType ?? []).forEach(m => messagesStack.push(m)); } } return [allResourceDatabase, resourceDatabase]; diff --git a/typescript/src/schema/comments.ts b/src/schema/comments.ts similarity index 96% rename from typescript/src/schema/comments.ts rename to src/schema/comments.ts index 8b9a56a85..225b85cf3 100644 --- a/typescript/src/schema/comments.ts +++ b/src/schema/comments.ts @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -import * as plugin from '../../../pbjs-genfiles/plugin'; +import * as protos from 'gapic_generator_typescript/protos'; // For one comment in service and method level, paramName & paramName will be ''. // Only field has name and type of parameters. @@ -21,7 +21,7 @@ export interface Comment { paramType: string; comments: string[]; // LABEL_OPTIONAL = 1, LABEL_REQUIRED = 2 - fieldBehavior?: plugin.google.api.FieldBehavior; + fieldBehavior?: protos.google.api.FieldBehavior; } // For service, one item will be @@ -34,7 +34,7 @@ export interface Comments { export class CommentsMap { comments: Comments = {}; - constructor(fds: plugin.google.protobuf.IFileDescriptorProto[]) { + constructor(fds: protos.google.protobuf.IFileDescriptorProto[]) { const commentsMap: Comments = {}; for (const fd of fds) { if (fd && fd.sourceCodeInfo && fd.sourceCodeInfo.location) { @@ -110,7 +110,7 @@ export class CommentsMap { if (field) { //Type Enum: TYPE_STRING, TYPE_BOOL, etc. let paramType = - plugin.google.protobuf.FieldDescriptorProto.Type[ + protos.google.protobuf.FieldDescriptorProto.Type[ field.type! ]; // If field.label is 'REPEATED' then the paramType is an array. diff --git a/typescript/src/schema/naming.ts b/src/schema/naming.ts similarity index 93% rename from typescript/src/schema/naming.ts rename to src/schema/naming.ts index 6748fcb59..caa6d369d 100644 --- a/typescript/src/schema/naming.ts +++ b/src/schema/naming.ts @@ -12,13 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -import * as plugin from '../../../pbjs-genfiles/plugin'; +import * as protos from 'gapic_generator_typescript/protos'; import {commonPrefix} from '../util'; import {API} from './api'; -import {BundleConfig} from 'src/bundle'; +import {BundleConfig} from '../bundle'; export interface Options { - grpcServiceConfig: plugin.grpc.service_config.ServiceConfig; + grpcServiceConfig: protos.grpc.service_config.ServiceConfig; bundleConfigs?: BundleConfig[]; publishName?: string; mainServiceName?: string; @@ -33,7 +33,7 @@ export class Naming { protoPackage: string; constructor( - fileDescriptors: plugin.google.protobuf.IFileDescriptorProto[], + fileDescriptors: protos.google.protobuf.IFileDescriptorProto[], options?: Options ) { let rootPackage = ''; diff --git a/typescript/src/schema/proto.ts b/src/schema/proto.ts similarity index 94% rename from typescript/src/schema/proto.ts rename to src/schema/proto.ts index 3286b260a..a5db5afd1 100644 --- a/typescript/src/schema/proto.ts +++ b/src/schema/proto.ts @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -import * as plugin from '../../../pbjs-genfiles/plugin'; +import * as protos from 'gapic_generator_typescript/protos'; import {CommentsMap, Comment} from './comments'; import {milliseconds} from '../util'; import {ResourceDescriptor, ResourceDatabase} from './resource-database'; @@ -22,7 +22,7 @@ import { defaultNonIdempotentRetryCodesName, defaultParameters, } from './retryable-code-map'; -import {BundleConfig} from 'src/bundle'; +import {BundleConfig} from '../bundle'; import {Options} from './naming'; const COMMON_PROTO_LIST = [ @@ -33,8 +33,8 @@ const COMMON_PROTO_LIST = [ ]; interface MethodDescriptorProto - extends plugin.google.protobuf.IMethodDescriptorProto { - longRunning?: plugin.google.longrunning.IOperationInfo; + extends protos.google.protobuf.IMethodDescriptorProto { + longRunning?: protos.google.longrunning.IOperationInfo; longRunningResponseType?: string; longRunningMetadataType?: string; streaming: @@ -49,7 +49,7 @@ interface MethodDescriptorProto comments: string[]; // paramComments include comments for all input field paramComment?: Comment[]; - methodConfig: plugin.grpc.service_config.MethodConfig; + methodConfig: protos.grpc.service_config.MethodConfig; retryableCodesName: string; retryParamsName: string; timeoutMillis?: number; @@ -61,7 +61,7 @@ interface MethodDescriptorProto } export interface ServiceDescriptorProto - extends plugin.google.protobuf.IServiceDescriptorProto { + extends protos.google.protobuf.IServiceDescriptorProto { packageName: string; method: MethodDescriptorProto[]; simpleMethods: MethodDescriptorProto[]; @@ -78,7 +78,7 @@ export interface ServiceDescriptorProto pathTemplates: ResourceDescriptor[]; commentsMap: CommentsMap; retryableCodeMap: RetryableCodeMap; - grpcServiceConfig: plugin.grpc.service_config.ServiceConfig; + grpcServiceConfig: protos.grpc.service_config.ServiceConfig; bundleConfigsMethods: MethodDescriptorProto[]; bundleConfigs?: BundleConfig[]; iamService: boolean; @@ -89,7 +89,7 @@ export interface ServicesMap { } export interface MessagesMap { - [name: string]: plugin.google.protobuf.IDescriptorProto; + [name: string]: protos.google.protobuf.IDescriptorProto; } // The following functions are used to add some metadata such as idempotence @@ -205,7 +205,7 @@ function pagingField( const repeatedFields = outputType.field!.filter( field => field.label === - plugin.google.protobuf.FieldDescriptorProto.Label.LABEL_REPEATED + protos.google.protobuf.FieldDescriptorProto.Label.LABEL_REPEATED ); if (repeatedFields.length === 0) { return undefined; @@ -218,7 +218,7 @@ function pagingField( // (in order of appearance in the file AND field number). // We believe that all proto fields have numbers, hence !. const minFieldNumber = repeatedFields.reduce( - (min: number, field: plugin.google.protobuf.IFieldDescriptorProto) => { + (min: number, field: protos.google.protobuf.IFieldDescriptorProto) => { if (field.number! < min) { min = field.number!; } @@ -258,17 +258,17 @@ function pagingResponseType( return undefined; } if ( - field.type === plugin.google.protobuf.FieldDescriptorProto.Type.TYPE_MESSAGE + field.type === protos.google.protobuf.FieldDescriptorProto.Type.TYPE_MESSAGE ) { return field.typeName; //.google.showcase.v1beta1.EchoResponse } - const type = plugin.google.protobuf.FieldDescriptorProto.Type[field.type]; + const type = protos.google.protobuf.FieldDescriptorProto.Type[field.type]; // .google.protobuf.FieldDescriptorProto.Type.TYPE_STRING return '.google.protobuf.FieldDescriptorProto.Type.' + type; } export function getSingleHeaderParam( - rule: plugin.google.api.IHttpRule + rule: protos.google.api.IHttpRule ): string[] { const message = rule.post || rule.delete || rule.get || rule.put || rule.patch; @@ -280,12 +280,12 @@ export function getSingleHeaderParam( } function getMethodConfig( - grpcServiceConfig: plugin.grpc.service_config.ServiceConfig, + grpcServiceConfig: protos.grpc.service_config.ServiceConfig, serviceName: string, methodName: string -): plugin.grpc.service_config.MethodConfig { - let exactMatch: plugin.grpc.service_config.IMethodConfig | undefined; - let serviceMatch: plugin.grpc.service_config.IMethodConfig | undefined; +): protos.grpc.service_config.MethodConfig { + let exactMatch: protos.grpc.service_config.IMethodConfig | undefined; + let serviceMatch: protos.grpc.service_config.IMethodConfig | undefined; for (const config of grpcServiceConfig.methodConfig) { if (!config.name) { continue; @@ -299,7 +299,7 @@ function getMethodConfig( } } } - const result = plugin.grpc.service_config.MethodConfig.fromObject( + const result = protos.grpc.service_config.MethodConfig.fromObject( exactMatch || serviceMatch || {} ); return result; @@ -368,7 +368,7 @@ function augmentMethod( const repeatedFields = inputType.field!.filter( field => field.label === - plugin.google.protobuf.FieldDescriptorProto.Label + protos.google.protobuf.FieldDescriptorProto.Label .LABEL_REPEATED && field.name === bc.batchDescriptor.batched_field ); @@ -436,7 +436,7 @@ function augmentMethod( } export function getHeaderRequestParams( - httpRule: plugin.google.api.IHttpRule | null | undefined + httpRule: protos.google.api.IHttpRule | null | undefined ) { if (!httpRule) { return []; @@ -471,7 +471,7 @@ interface AugmentServiceParameters { allMessages: MessagesMap; localMessages: MessagesMap; packageName: string; - service: plugin.google.protobuf.IServiceDescriptorProto; + service: protos.google.protobuf.IServiceDescriptorProto; commentsMap: CommentsMap; allResourceDatabase: ResourceDatabase; resourceDatabase: ResourceDatabase; @@ -570,7 +570,7 @@ function augmentService(parameters: AugmentServiceParameters) { resourceReference?.childType, errorLocation ); - parentResources.map( + parentResources.forEach( resource => (uniqueResources[resource.name] = resource) ); @@ -610,7 +610,7 @@ function augmentService(parameters: AugmentServiceParameters) { } interface ProtoParameters { - fd: plugin.google.protobuf.IFileDescriptorProto; + fd: protos.google.protobuf.IFileDescriptorProto; packageName: string; allMessages: MessagesMap; allResourceDatabase: ResourceDatabase; @@ -620,7 +620,7 @@ interface ProtoParameters { } export class Proto { - filePB2: plugin.google.protobuf.IFileDescriptorProto; + filePB2: protos.google.protobuf.IFileDescriptorProto; services: ServicesMap = {}; allMessages: MessagesMap = {}; localMessages: MessagesMap = {}; diff --git a/typescript/src/schema/resource-database.ts b/src/schema/resource-database.ts similarity index 96% rename from typescript/src/schema/resource-database.ts rename to src/schema/resource-database.ts index 684111435..d14171551 100644 --- a/typescript/src/schema/resource-database.ts +++ b/src/schema/resource-database.ts @@ -12,11 +12,11 @@ // See the License for the specific language governing permissions and // limitations under the License. -import * as plugin from '../../../pbjs-genfiles/plugin'; +import * as protos from 'gapic_generator_typescript/protos'; import {getResourceNameByPattern} from '../util'; export interface ResourceDescriptor - extends plugin.google.api.IResourceDescriptor { + extends protos.google.api.IResourceDescriptor { name: string; params: string[]; } @@ -31,7 +31,7 @@ export class ResourceDatabase { } registerResource( - resource: plugin.google.api.IResourceDescriptor | undefined, + resource: protos.google.api.IResourceDescriptor | undefined, errorLocation?: string ) { if (!resource) { @@ -189,7 +189,7 @@ export class ResourceDatabase { private getResourceDescriptor( name: string, params: string[], - resource: plugin.google.api.IResourceDescriptor + resource: protos.google.api.IResourceDescriptor ): ResourceDescriptor { const resourceDescriptor = Object.assign( { diff --git a/typescript/src/schema/retryable-code-map.ts b/src/schema/retryable-code-map.ts similarity index 90% rename from typescript/src/schema/retryable-code-map.ts rename to src/schema/retryable-code-map.ts index d0de19c50..b0b5882b6 100644 --- a/typescript/src/schema/retryable-code-map.ts +++ b/src/schema/retryable-code-map.ts @@ -13,14 +13,14 @@ // limitations under the License. import * as objectHash from 'object-hash'; -import * as plugin from '../../../pbjs-genfiles/plugin'; +import * as protos from 'gapic_generator_typescript/protos'; export const defaultNonIdempotentRetryCodesName = 'non_idempotent'; -export const defaultNonIdempotentCodes: plugin.google.rpc.Code[] = []; +export const defaultNonIdempotentCodes: protos.google.rpc.Code[] = []; export const defaultIdempotentRetryCodesName = 'idempotent'; export const defaultIdempotentCodes = [ - plugin.google.rpc.Code.DEADLINE_EXCEEDED, - plugin.google.rpc.Code.UNAVAILABLE, + protos.google.rpc.Code.DEADLINE_EXCEEDED, + protos.google.rpc.Code.UNAVAILABLE, ]; export const defaultParametersName = 'default'; export const defaultParameters = { @@ -58,11 +58,11 @@ export class RetryableCodeMap { this.prettyParamNamesMap = {}; // build reverse mapping for enum: 0 => OK, 1 => CANCELLED, etc. this.codeEnumMapping = {}; - const allCodes = Object.keys(plugin.google.rpc.Code); + const allCodes = Object.keys(protos.google.rpc.Code); for (const code of allCodes) { this.codeEnumMapping[ - ((plugin.google.rpc.Code as unknown) as { - [key: string]: plugin.google.rpc.Code; + ((protos.google.rpc.Code as unknown) as { + [key: string]: protos.google.rpc.Code; })[code].toString() ] = code; } @@ -78,7 +78,7 @@ export class RetryableCodeMap { this.getParamsName(defaultParameters, 'default'); } private buildUniqueCodesName( - retryableStatusCodes: plugin.google.rpc.Code[] + retryableStatusCodes: protos.google.rpc.Code[] ): string { // generate an unique readable name for the given retryable set of codes const sortedCodes = retryableStatusCodes.sort( @@ -98,7 +98,7 @@ export class RetryableCodeMap { return objectHash(params); } getRetryableCodesName( - retryableStatusCodes: plugin.google.rpc.Code[], + retryableStatusCodes: protos.google.rpc.Code[], suggestedName?: string ): string { const uniqueName = this.buildUniqueCodesName(retryableStatusCodes); diff --git a/typescript/src/templater.ts b/src/templater.ts similarity index 93% rename from typescript/src/templater.ts rename to src/templater.ts index d00df9364..5d3257a09 100644 --- a/typescript/src/templater.ts +++ b/src/templater.ts @@ -17,7 +17,7 @@ import * as nunjucks from 'nunjucks'; import * as path from 'path'; import * as util from 'util'; -import * as plugin from '../../pbjs-genfiles/plugin'; +import * as protos from 'gapic_generator_typescript/protos'; import {API} from './schema/api'; @@ -68,7 +68,7 @@ function renderFile( ); } } - const output = plugin.google.protobuf.compiler.CodeGeneratorResponse.File.create(); + const output = protos.google.protobuf.compiler.CodeGeneratorResponse.File.create(); output.name = targetFilename; output.content = processed; return output; @@ -79,7 +79,7 @@ function processOneTemplate( templateFilename: string, api: API ) { - const result: plugin.google.protobuf.compiler.CodeGeneratorResponse.File[] = []; + const result: protos.google.protobuf.compiler.CodeGeneratorResponse.File[] = []; const relativeTemplateName = templateFilename.substr(basePath.length + 1); let outputFilename = relativeTemplateName.replace(/\.njk$/, ''); @@ -115,7 +115,7 @@ export async function processTemplates(basePath: string, api: API) { nunjucks.configure(basePath); basePath = basePath.replace(/\/*$/, ''); const templateFiles = await recursiveFileList(basePath, /^(?!_[^_]).*\.njk$/); - const result: plugin.google.protobuf.compiler.CodeGeneratorResponse.File[] = []; + const result: protos.google.protobuf.compiler.CodeGeneratorResponse.File[] = []; for (const templateFilename of templateFiles) { const generatedFiles = processOneTemplate(basePath, templateFilename, api); result.push(...generatedFiles); diff --git a/typescript/src/util.ts b/src/util.ts similarity index 94% rename from typescript/src/util.ts rename to src/util.ts index 2539377e6..db7bdaa2e 100644 --- a/typescript/src/util.ts +++ b/src/util.ts @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -import * as plugin from '../../pbjs-genfiles/plugin'; +import * as protos from 'gapic_generator_typescript/protos'; export function commonPrefix(strings: string[]): string { if (strings.length === 0) { @@ -33,7 +33,7 @@ export function commonPrefix(strings: string[]): string { // Convert a string Duration, e.g. "600s", to a proper protobuf type since // protobufjs does not support it at this moment. -export function duration(text: string): plugin.google.protobuf.Duration { +export function duration(text: string): protos.google.protobuf.Duration { const multipliers: {[suffix: string]: number} = { s: 1, m: 60, @@ -50,7 +50,7 @@ export function duration(text: string): plugin.google.protobuf.Duration { const seconds = float * multiplier; const floor = Math.floor(seconds); const frac = seconds - floor; - const result = plugin.google.protobuf.Duration.fromObject({ + const result = protos.google.protobuf.Duration.fromObject({ seconds: floor, nanos: frac * 1e9, }); @@ -58,13 +58,13 @@ export function duration(text: string): plugin.google.protobuf.Duration { } // Convert a Duration to (possibly fractional) seconds. -export function seconds(duration: plugin.google.protobuf.IDuration): number { +export function seconds(duration: protos.google.protobuf.IDuration): number { return Number(duration.seconds || 0) + Number(duration.nanos || 0) * 1e-9; } // Convert a Duration to (possibly fractional) milliseconds. export function milliseconds( - duration: plugin.google.protobuf.IDuration + duration: protos.google.protobuf.IDuration ): number { return ( Number(duration.seconds || 0) * 1000 + Number(duration.nanos || 0) * 1e-6 diff --git a/test-fixtures/test-application-ts/src/index.ts b/test-fixtures/test-application-ts/src/index.ts index c19611e80..795bc582f 100644 --- a/test-fixtures/test-application-ts/src/index.ts +++ b/test-fixtures/test-application-ts/src/index.ts @@ -14,6 +14,7 @@ import * as assert from 'assert'; import * as showcase from 'showcase'; +import {describe, it} from 'mocha'; interface ClientOptions{ [name: string]: {}; diff --git a/typescript/test/test-application/test-js.ts b/test/test-application/test-js.ts similarity index 62% rename from typescript/test/test-application/test-js.ts rename to test/test-application/test-js.ts index 4bc6fe112..5eb8efc19 100644 --- a/typescript/test/test-application/test-js.ts +++ b/test/test-application/test-js.ts @@ -17,53 +17,43 @@ import * as child_process from 'child_process'; import * as fs from 'fs-extra'; import * as path from 'path'; import {describe, it} from 'mocha'; + const exec = util.promisify(child_process.exec); -const SHOWCASE_LIB = path.join( - __dirname, - '..', - '..', - '..', - '.test-out-showcase' -); -const PACKED_LIB = 'showcase-0.1.0.tgz'; -const PACKED_LIB_PATH = path.join(SHOWCASE_LIB, PACKED_LIB); -const PROTOS = path.join( - __dirname, - '..', - '..', - '..', - 'test-fixtures', - 'protos' -); -const LOCAL_JS_APPLICATION = path.join( - __dirname, - '..', - '..', - '..', - '.test-application-js' -); -const JS_TEST_APPLICATION = path.join( - __dirname, - '..', - '..', - '..', - 'test-fixtures', - 'test-application-js' +const root = process.cwd(); +const baselineZip = path.join( + root, + 'bazel-testlogs', + 'unit_tests', + 'test.outputs', + 'outputs.zip' ); +const showcaseLib = path.join(root, '.test-out-showcase'); +const packedLib = 'showcase-0.1.0.tgz'; +const packedLibPath = path.join(showcaseLib, packedLib); +const testFixtures = path.join(root, 'test-fixtures'); +const protos = path.join(testFixtures, 'protos'); +const jsTestApplication = path.join(testFixtures, 'test-application-js'); +const localJsApplication = path.join(root, '.test-application-js'); + describe('Test application for JavaScript users', () => { + it('unzip showcase test output', async function () { + this.timeout(20000); + process.chdir(root); + await exec(`unzip -o "${baselineZip}" '.test-out-showcase/*' -d .`); + }); it('npm install showcase', async function () { this.timeout(60000); // copy protos to generated client library and copy test application to local. - fs.copySync(PROTOS, path.join(SHOWCASE_LIB, 'protos')); - fs.copySync(JS_TEST_APPLICATION, LOCAL_JS_APPLICATION); - process.chdir(SHOWCASE_LIB); + fs.copySync(protos, path.join(showcaseLib, 'protos')); + fs.copySync(jsTestApplication, localJsApplication); + process.chdir(showcaseLib); await exec('npm install'); }); it('npm pack showcase library and copy it to test application', async function () { this.timeout(60000); await exec('npm pack'); - process.chdir(LOCAL_JS_APPLICATION); - fs.copySync(PACKED_LIB_PATH, path.join(LOCAL_JS_APPLICATION, PACKED_LIB)); + process.chdir(localJsApplication); + fs.copySync(packedLibPath, path.join(localJsApplication, packedLib)); }); it('npm install showcase library in test application', async function () { this.timeout(60000); diff --git a/typescript/test/test-application/test-ts.ts b/test/test-application/test-ts.ts similarity index 59% rename from typescript/test/test-application/test-ts.ts rename to test/test-application/test-ts.ts index 93ebbf183..bf3319cb9 100644 --- a/typescript/test/test-application/test-ts.ts +++ b/test/test-application/test-ts.ts @@ -17,57 +17,47 @@ import * as child_process from 'child_process'; import * as fs from 'fs-extra'; import * as path from 'path'; import {describe, it} from 'mocha'; + const exec = util.promisify(child_process.exec); -const SHOWCASE_LIB = path.join( - __dirname, - '..', - '..', - '..', - '.test-out-showcase' -); -const PACKED_LIB = 'showcase-0.1.0.tgz'; -const PACKED_LIB_PATH = path.join(SHOWCASE_LIB, PACKED_LIB); -const PROTOS = path.join( - __dirname, - '..', - '..', - '..', - 'test-fixtures', - 'protos' -); -const LOCAL_TS_APPLICATION = path.join( - __dirname, - '..', - '..', - '..', - '.test-application-ts' -); -const TS_TEST_APPLICATION = path.join( - __dirname, - '..', - '..', - '..', - 'test-fixtures', - 'test-application-ts' +const root = process.cwd(); +const baselineZip = path.join( + root, + 'bazel-testlogs', + 'unit_tests', + 'test.outputs', + 'outputs.zip' ); +const showcaseLib = path.join(root, '.test-out-showcase'); +const packedLib = 'showcase-0.1.0.tgz'; +const packedLibPath = path.join(showcaseLib, packedLib); +const testFixtures = path.join(root, 'test-fixtures'); +const protos = path.join(testFixtures, 'protos'); +const tsTestApplication = path.join(testFixtures, 'test-application-ts'); +const localTsApplication = path.join(root, '.test-application-ts'); + describe('Test application for TypeScript users', () => { + it('unzip showcase test output', async function () { + this.timeout(20000); + process.chdir(root); + await exec(`unzip -o "${baselineZip}" '.test-out-showcase/*' -d .`); + }); it('npm install showcase', async function () { this.timeout(120000); // copy protos to generated client library and copy test application to local. - if (!fs.existsSync(path.join(SHOWCASE_LIB, 'protos'))) { - fs.copySync(PROTOS, path.join(SHOWCASE_LIB, 'protos')); + if (!fs.existsSync(path.join(showcaseLib, 'protos'))) { + fs.copySync(protos, path.join(showcaseLib, 'protos')); } - if (!fs.existsSync(LOCAL_TS_APPLICATION)) { - fs.copySync(TS_TEST_APPLICATION, LOCAL_TS_APPLICATION); + if (!fs.existsSync(localTsApplication)) { + fs.copySync(tsTestApplication, localTsApplication); } - process.chdir(SHOWCASE_LIB); + process.chdir(showcaseLib); await exec('npm install'); }); it('npm pack showcase library and copy it to test application', async function () { this.timeout(120000); await exec('npm pack'); - process.chdir(LOCAL_TS_APPLICATION); - fs.copySync(PACKED_LIB_PATH, path.join(LOCAL_TS_APPLICATION, PACKED_LIB)); + process.chdir(localTsApplication); + fs.copySync(packedLibPath, path.join(localTsApplication, packedLib)); }); it('npm install showcase library in test application', async function () { this.timeout(120000); diff --git a/typescript/test/unit/api.ts b/test/unit/api.ts similarity index 69% rename from typescript/test/unit/api.ts rename to test/unit/api.ts index 133c2f057..8495d4d9e 100644 --- a/typescript/test/unit/api.ts +++ b/test/unit/api.ts @@ -12,25 +12,31 @@ // See the License for the specific language governing permissions and // limitations under the License. -import {API} from '../../src/schema/api'; -import * as plugin from '../../../pbjs-genfiles/plugin'; +import * as moduleAlias from 'module-alias'; +import * as path from 'path'; +moduleAlias.addAlias( + 'gapic_generator_typescript', + path.join(__dirname, '..', '..') +); +import {API} from 'gapic_generator_typescript/src/schema/api'; +import * as protos from 'gapic_generator_typescript/protos'; import * as assert from 'assert'; import {afterEach, describe, it} from 'mocha'; import * as sinon from 'sinon'; -import * as proto from '../../src/schema/proto'; +import * as proto from 'gapic_generator_typescript/src/schema/proto'; describe('src/schema/api.ts', () => { it('should construct an API object and return list of protos', () => { - const fd = new plugin.google.protobuf.FileDescriptorProto(); + const fd = new protos.google.protobuf.FileDescriptorProto(); fd.name = 'google/cloud/test/v1/test.proto'; fd.package = 'google.cloud.test.v1'; - fd.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + fd.service = [new protos.google.protobuf.ServiceDescriptorProto()]; fd.service[0].name = 'ZService'; fd.service[0].options = { '.google.api.defaultHost': 'hostname.example.com:443', }; const api = new API([fd], 'google.cloud.test.v1', { - grpcServiceConfig: new plugin.grpc.service_config.ServiceConfig(), + grpcServiceConfig: new protos.grpc.service_config.ServiceConfig(), }); assert.deepStrictEqual(api.filesToGenerate, [ 'google/cloud/test/v1/test.proto', @@ -38,37 +44,37 @@ describe('src/schema/api.ts', () => { }); it('throw error if an api does not have default host', () => { - const fd = new plugin.google.protobuf.FileDescriptorProto(); + const fd = new protos.google.protobuf.FileDescriptorProto(); fd.name = 'google/cloud/test/v1/test.proto'; fd.package = 'google.cloud.test.v1'; - fd.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + fd.service = [new protos.google.protobuf.ServiceDescriptorProto()]; fd.service[0].name = 'ZService'; assert.throws(() => { new API([fd], 'google.cloud.test.v1', { - grpcServiceConfig: new plugin.grpc.service_config.ServiceConfig(), + grpcServiceConfig: new protos.grpc.service_config.ServiceConfig(), }); }, new Error('service ZService is missing option google.api.default_host')); }); it('should not return common protos in the list of protos', () => { - const fd1 = new plugin.google.protobuf.FileDescriptorProto(); + const fd1 = new protos.google.protobuf.FileDescriptorProto(); fd1.name = 'google/cloud/test/v1/test.proto'; fd1.package = 'google.cloud.test.v1'; - fd1.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + fd1.service = [new protos.google.protobuf.ServiceDescriptorProto()]; fd1.service[0].name = 'ZService'; fd1.service[0].options = { '.google.api.defaultHost': 'hostname.example.com:443', }; - const fd2 = new plugin.google.protobuf.FileDescriptorProto(); + const fd2 = new protos.google.protobuf.FileDescriptorProto(); fd2.name = 'google/longrunning/operation.proto'; fd2.package = 'google.longrunning'; - fd2.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; - const fd3 = new plugin.google.protobuf.FileDescriptorProto(); + fd2.service = [new protos.google.protobuf.ServiceDescriptorProto()]; + const fd3 = new protos.google.protobuf.FileDescriptorProto(); fd3.name = 'google/iam/v1/iam_policy.proto'; fd3.package = 'google.iam.v1'; - fd3.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + fd3.service = [new protos.google.protobuf.ServiceDescriptorProto()]; const api = new API([fd1, fd2, fd3], 'google.cloud.test.v1', { - grpcServiceConfig: new plugin.grpc.service_config.ServiceConfig(), + grpcServiceConfig: new protos.grpc.service_config.ServiceConfig(), }); assert.deepStrictEqual(api.filesToGenerate, [ 'google/cloud/test/v1/test.proto', @@ -76,25 +82,25 @@ describe('src/schema/api.ts', () => { }); it('should not return common protos in the proto list', () => { - const fd1 = new plugin.google.protobuf.FileDescriptorProto(); + const fd1 = new protos.google.protobuf.FileDescriptorProto(); fd1.name = 'google/cloud/test/v1/test.proto'; fd1.package = 'google.cloud.test.v1'; - fd1.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + fd1.service = [new protos.google.protobuf.ServiceDescriptorProto()]; fd1.service[0].name = 'ZService'; fd1.service[0].options = { '.google.api.defaultHost': 'hostname.example.com:443', }; - const fd2 = new plugin.google.protobuf.FileDescriptorProto(); + const fd2 = new protos.google.protobuf.FileDescriptorProto(); fd2.name = 'google/api/annotations.proto'; fd2.package = 'google.api'; - const fd3 = new plugin.google.protobuf.FileDescriptorProto(); + const fd3 = new protos.google.protobuf.FileDescriptorProto(); fd3.name = 'google/orgpolicy/v1/orgpolicy.proto'; fd3.package = 'google.orgpolicy.v1'; - const fd4 = new plugin.google.protobuf.FileDescriptorProto(); + const fd4 = new protos.google.protobuf.FileDescriptorProto(); fd4.name = 'google/cloud/common_resources.proto'; fd4.package = 'google.cloud'; const api = new API([fd1, fd2, fd3, fd4], 'google', { - grpcServiceConfig: new plugin.grpc.service_config.ServiceConfig(), + grpcServiceConfig: new protos.grpc.service_config.ServiceConfig(), }); assert.deepStrictEqual(api.filesToGenerate, [ 'google/cloud/test/v1/test.proto', @@ -103,83 +109,83 @@ describe('src/schema/api.ts', () => { }); it('should return lexicographically first service name as mainServiceName', () => { - const fd1 = new plugin.google.protobuf.FileDescriptorProto(); + const fd1 = new protos.google.protobuf.FileDescriptorProto(); fd1.name = 'google/cloud/test/v1/test.proto'; fd1.package = 'google.cloud.test.v1'; - fd1.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + fd1.service = [new protos.google.protobuf.ServiceDescriptorProto()]; fd1.service[0].name = 'ZService'; fd1.service[0].options = { '.google.api.defaultHost': 'hostname.example.com:443', }; - const fd2 = new plugin.google.protobuf.FileDescriptorProto(); + const fd2 = new protos.google.protobuf.FileDescriptorProto(); fd2.name = 'google/cloud/example/v1/example.proto'; fd2.package = 'google.cloud.example.v1'; - fd2.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + fd2.service = [new protos.google.protobuf.ServiceDescriptorProto()]; fd2.service[0].name = 'AService'; fd2.service[0].options = { '.google.api.defaultHost': 'hostname.example.com:443', }; const api = new API([fd1, fd2], 'google.cloud.test.v1', { - grpcServiceConfig: new plugin.grpc.service_config.ServiceConfig(), + grpcServiceConfig: new protos.grpc.service_config.ServiceConfig(), }); assert.deepStrictEqual(api.mainServiceName, 'AService'); }); it('should return correct mainServiceName for API without namespace', () => { - const fd1 = new plugin.google.protobuf.FileDescriptorProto(); + const fd1 = new protos.google.protobuf.FileDescriptorProto(); fd1.name = 'service/v1/test.proto'; fd1.package = 'service.v1'; - fd1.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + fd1.service = [new protos.google.protobuf.ServiceDescriptorProto()]; fd1.service[0].name = 'Service'; fd1.service[0].options = { '.google.api.defaultHost': 'hostname.example.com:443', }; const api = new API([fd1], 'service.v1', { - grpcServiceConfig: new plugin.grpc.service_config.ServiceConfig(), + grpcServiceConfig: new protos.grpc.service_config.ServiceConfig(), }); assert.deepStrictEqual(api.mainServiceName, 'Service'); }); it('should return main service name specificed as an option', () => { - const fd1 = new plugin.google.protobuf.FileDescriptorProto(); + const fd1 = new protos.google.protobuf.FileDescriptorProto(); fd1.name = 'google/cloud/test/v1/test.proto'; fd1.package = 'google.cloud.test.v1'; - fd1.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + fd1.service = [new protos.google.protobuf.ServiceDescriptorProto()]; fd1.service[0].name = 'ZService'; fd1.service[0].options = { '.google.api.defaultHost': 'hostname.example.com:443', }; - const fd2 = new plugin.google.protobuf.FileDescriptorProto(); + const fd2 = new protos.google.protobuf.FileDescriptorProto(); fd2.name = 'google/cloud/example/v1/example.proto'; fd2.package = 'google.cloud.example.v1'; - fd2.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + fd2.service = [new protos.google.protobuf.ServiceDescriptorProto()]; fd2.service[0].name = 'AService'; fd2.service[0].options = { '.google.api.defaultHost': 'hostname.example.com:443', }; const api = new API([fd1, fd2], 'google.cloud.test.v1', { - grpcServiceConfig: new plugin.grpc.service_config.ServiceConfig(), + grpcServiceConfig: new protos.grpc.service_config.ServiceConfig(), mainServiceName: 'OverriddenName', }); assert.deepStrictEqual(api.mainServiceName, 'OverriddenName'); }); it('should return list of protos in lexicographical order', () => { - const fd1 = new plugin.google.protobuf.FileDescriptorProto(); + const fd1 = new protos.google.protobuf.FileDescriptorProto(); fd1.name = 'google/cloud/example/v1/test.proto'; fd1.package = 'google.cloud.example.v1'; - fd1.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + fd1.service = [new protos.google.protobuf.ServiceDescriptorProto()]; fd1.service[0].name = 'Service'; fd1.service[0].options = { '.google.api.defaultHost': 'hostname.example.com:443', }; - const fd2 = new plugin.google.protobuf.FileDescriptorProto(); + const fd2 = new protos.google.protobuf.FileDescriptorProto(); fd2.name = 'google/cloud/example/v1/example.proto'; fd2.package = 'google.cloud.example.v1'; fd2.service = []; const api = new API([fd1, fd2], 'google.cloud.example.v1', { - grpcServiceConfig: new plugin.grpc.service_config.ServiceConfig(), + grpcServiceConfig: new protos.grpc.service_config.ServiceConfig(), }); assert.deepStrictEqual(JSON.parse(api.protoFilesToGenerateJSON), [ '../../protos/google/cloud/example/v1/example.proto', @@ -188,13 +194,13 @@ describe('src/schema/api.ts', () => { }); it('should throw error when the service name is not found', () => { - const fd = new plugin.google.protobuf.FileDescriptorProto(); + const fd = new protos.google.protobuf.FileDescriptorProto(); fd.name = 'google/cloud/test/v1/test.proto'; fd.package = 'google.cloud.test.v1'; - fd.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + fd.service = [new protos.google.protobuf.ServiceDescriptorProto()]; assert.throws(() => { const api = new API([fd], 'google.cloud.test.v1', { - grpcServiceConfig: new plugin.grpc.service_config.ServiceConfig(), + grpcServiceConfig: new protos.grpc.service_config.ServiceConfig(), }); assert(api); }); @@ -206,28 +212,28 @@ describe('src/schema/api.ts', () => { }); it('should pass all messages to Proto constructor', () => { - const fd1 = new plugin.google.protobuf.FileDescriptorProto(); + const fd1 = new protos.google.protobuf.FileDescriptorProto(); fd1.name = 'google/cloud/example/v1/test.proto'; fd1.package = 'google.cloud.example.v1'; - fd1.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + fd1.service = [new protos.google.protobuf.ServiceDescriptorProto()]; fd1.service[0].name = 'Service'; fd1.service[0].options = { '.google.api.defaultHost': 'hostname.example.com:443', }; - fd1.messageType = [new plugin.google.protobuf.MethodDescriptorProto()]; + fd1.messageType = [new protos.google.protobuf.MethodDescriptorProto()]; fd1.messageType[0].name = 'MessageA'; - const fd2 = new plugin.google.protobuf.FileDescriptorProto(); + const fd2 = new protos.google.protobuf.FileDescriptorProto(); fd2.name = 'google/cloud/example/v1/example.proto'; fd2.package = 'google.cloud.example.v1'; - fd2.messageType = [new plugin.google.protobuf.MethodDescriptorProto()]; + fd2.messageType = [new protos.google.protobuf.MethodDescriptorProto()]; fd2.messageType[0].name = 'MessageB'; const spy = sinon.spy(proto, 'Proto'); new API([fd1, fd2], 'google.cloud.example.v1', { - grpcServiceConfig: new plugin.grpc.service_config.ServiceConfig(), + grpcServiceConfig: new protos.grpc.service_config.ServiceConfig(), }); assert(spy.calledWithNew()); diff --git a/typescript/test/unit/baselines.ts b/test/unit/baselines.ts similarity index 94% rename from typescript/test/unit/baselines.ts rename to test/unit/baselines.ts index fc1e71205..b43d7407a 100644 --- a/typescript/test/unit/baselines.ts +++ b/test/unit/baselines.ts @@ -12,12 +12,16 @@ // See the License for the specific language governing permissions and // limitations under the License. +import * as moduleAlias from 'module-alias'; +import * as path from 'path'; +moduleAlias.addAlias( + 'gapic_generator_typescript', + path.join(__dirname, '..', '..') +); import {describe} from 'mocha'; -import {runBaselineTest, initBaselineTest} from '../util'; +import {runBaselineTest} from '../util'; describe('Baseline tests', () => { - initBaselineTest(); - runBaselineTest({ baselineName: 'dlp', outputDir: '.test-out-dlp', diff --git a/typescript/test/unit/naming.ts b/test/unit/naming.ts similarity index 68% rename from typescript/test/unit/naming.ts rename to test/unit/naming.ts index 240f7d87e..86a0c49ee 100644 --- a/typescript/test/unit/naming.ts +++ b/test/unit/naming.ts @@ -12,19 +12,25 @@ // See the License for the specific language governing permissions and // limitations under the License. +import * as moduleAlias from 'module-alias'; +import * as path from 'path'; +moduleAlias.addAlias( + 'gapic_generator_typescript', + path.join(__dirname, '..', '..') +); import * as assert from 'assert'; import {describe, it} from 'mocha'; -import * as plugin from '../../../pbjs-genfiles/plugin'; -import {Naming, Options} from '../../src/schema/naming'; +import * as protos from 'gapic_generator_typescript/protos'; +import {Naming, Options} from 'gapic_generator_typescript/src/schema/naming'; describe('src/schema/naming.ts', () => { it('parses name correctly', () => { - const descriptor1 = new plugin.google.protobuf.FileDescriptorProto(); - const descriptor2 = new plugin.google.protobuf.FileDescriptorProto(); + const descriptor1 = new protos.google.protobuf.FileDescriptorProto(); + const descriptor2 = new protos.google.protobuf.FileDescriptorProto(); descriptor1.package = 'google.namespace.service.v1beta1'; - descriptor1.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + descriptor1.service = [new protos.google.protobuf.ServiceDescriptorProto()]; descriptor2.package = 'google.namespace.service.v1beta1'; - descriptor2.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + descriptor2.service = [new protos.google.protobuf.ServiceDescriptorProto()]; const naming = new Naming([descriptor1, descriptor2]); assert.strictEqual(naming.name, 'Service'); assert.strictEqual(naming.productName, 'Service'); @@ -34,9 +40,9 @@ describe('src/schema/naming.ts', () => { }); it('parses name correctly 2', () => { - const descriptor1 = new plugin.google.protobuf.FileDescriptorProto(); + const descriptor1 = new protos.google.protobuf.FileDescriptorProto(); descriptor1.package = 'service.v1beta1'; - descriptor1.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + descriptor1.service = [new protos.google.protobuf.ServiceDescriptorProto()]; const naming = new Naming([descriptor1]); assert.strictEqual(naming.name, 'Service'); assert.strictEqual(naming.productName, 'Service'); @@ -46,9 +52,9 @@ describe('src/schema/naming.ts', () => { }); it('parses name correctly 3', () => { - const descriptor1 = new plugin.google.protobuf.FileDescriptorProto(); + const descriptor1 = new protos.google.protobuf.FileDescriptorProto(); descriptor1.package = 'company.service.v1beta1'; - descriptor1.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + descriptor1.service = [new protos.google.protobuf.ServiceDescriptorProto()]; const naming = new Naming([descriptor1]); assert.strictEqual(naming.name, 'Service'); assert.strictEqual(naming.productName, 'Service'); @@ -58,10 +64,10 @@ describe('src/schema/naming.ts', () => { }); it('ignores files with no services when determining package name', () => { - const descriptor1 = new plugin.google.protobuf.FileDescriptorProto(); - const descriptor2 = new plugin.google.protobuf.FileDescriptorProto(); + const descriptor1 = new protos.google.protobuf.FileDescriptorProto(); + const descriptor2 = new protos.google.protobuf.FileDescriptorProto(); descriptor1.package = 'google.namespace.service.v1beta1'; - descriptor1.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + descriptor1.service = [new protos.google.protobuf.ServiceDescriptorProto()]; descriptor2.package = 'google.namespace.service.v1beta2'; const naming = new Naming([descriptor1, descriptor2]); assert.strictEqual(naming.name, 'Service'); @@ -72,12 +78,12 @@ describe('src/schema/naming.ts', () => { }); it('ignores LRO files when determining package name', () => { - const descriptor1 = new plugin.google.protobuf.FileDescriptorProto(); - const descriptor2 = new plugin.google.protobuf.FileDescriptorProto(); + const descriptor1 = new protos.google.protobuf.FileDescriptorProto(); + const descriptor2 = new protos.google.protobuf.FileDescriptorProto(); descriptor1.package = 'google.namespace.service.v1beta1'; - descriptor1.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + descriptor1.service = [new protos.google.protobuf.ServiceDescriptorProto()]; descriptor2.package = 'google.longrunning'; - descriptor2.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + descriptor2.service = [new protos.google.protobuf.ServiceDescriptorProto()]; const naming = new Naming([descriptor1, descriptor2]); assert.strictEqual(naming.name, 'Service'); assert.strictEqual(naming.productName, 'Service'); @@ -87,9 +93,9 @@ describe('src/schema/naming.ts', () => { }); it('fails on bad package name 1', () => { - const descriptor = new plugin.google.protobuf.FileDescriptorProto(); + const descriptor = new protos.google.protobuf.FileDescriptorProto(); descriptor.package = 'nonamespace'; - descriptor.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + descriptor.service = [new protos.google.protobuf.ServiceDescriptorProto()]; assert.throws(() => { const naming = new Naming([descriptor]); assert(naming); @@ -97,9 +103,9 @@ describe('src/schema/naming.ts', () => { }); it('fails on bad package name 2', () => { - const descriptor = new plugin.google.protobuf.FileDescriptorProto(); + const descriptor = new protos.google.protobuf.FileDescriptorProto(); descriptor.package = '---'; - descriptor.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + descriptor.service = [new protos.google.protobuf.ServiceDescriptorProto()]; assert.throws(() => { const naming = new Naming([descriptor]); assert(naming); @@ -107,9 +113,9 @@ describe('src/schema/naming.ts', () => { }); it('fails on no package name', () => { - const descriptor = new plugin.google.protobuf.FileDescriptorProto(); + const descriptor = new protos.google.protobuf.FileDescriptorProto(); descriptor.package = ''; - descriptor.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + descriptor.service = [new protos.google.protobuf.ServiceDescriptorProto()]; assert.throws(() => { const naming = new Naming([descriptor]); assert(naming); @@ -117,12 +123,12 @@ describe('src/schema/naming.ts', () => { }); it('fails if no common package, no service-name', () => { - const descriptor1 = new plugin.google.protobuf.FileDescriptorProto(); - const descriptor2 = new plugin.google.protobuf.FileDescriptorProto(); + const descriptor1 = new protos.google.protobuf.FileDescriptorProto(); + const descriptor2 = new protos.google.protobuf.FileDescriptorProto(); descriptor1.package = 'namespace1.service.v1beta1'; - descriptor1.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + descriptor1.service = [new protos.google.protobuf.ServiceDescriptorProto()]; descriptor2.package = 'namespace2.service.v1beta1'; - descriptor2.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + descriptor2.service = [new protos.google.protobuf.ServiceDescriptorProto()]; assert.throws(() => { const naming = new Naming([descriptor1, descriptor2]); assert(naming); @@ -130,13 +136,13 @@ describe('src/schema/naming.ts', () => { }); it('parse name correctly if no common package, but service-name specified', () => { - const descriptor1 = new plugin.google.protobuf.FileDescriptorProto(); - const descriptor2 = new plugin.google.protobuf.FileDescriptorProto(); + const descriptor1 = new protos.google.protobuf.FileDescriptorProto(); + const descriptor2 = new protos.google.protobuf.FileDescriptorProto(); descriptor1.package = 'namespace1.service1.v1beta1'; - descriptor1.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + descriptor1.service = [new protos.google.protobuf.ServiceDescriptorProto()]; descriptor2.package = 'namespace2.service2.v1beta1'; - descriptor2.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; - const serviceConfig = new plugin.grpc.service_config.ServiceConfig(); + descriptor2.service = [new protos.google.protobuf.ServiceDescriptorProto()]; + const serviceConfig = new protos.grpc.service_config.ServiceConfig(); const options: Options = { grpcServiceConfig: serviceConfig, mainServiceName: 'service1', @@ -152,12 +158,12 @@ describe('src/schema/naming.ts', () => { }); it('fails if different versions', () => { - const descriptor1 = new plugin.google.protobuf.FileDescriptorProto(); - const descriptor2 = new plugin.google.protobuf.FileDescriptorProto(); + const descriptor1 = new protos.google.protobuf.FileDescriptorProto(); + const descriptor2 = new protos.google.protobuf.FileDescriptorProto(); descriptor1.package = 'namespace.service.v1beta1'; - descriptor1.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + descriptor1.service = [new protos.google.protobuf.ServiceDescriptorProto()]; descriptor2.package = 'namespace.service.v1beta2'; - descriptor2.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + descriptor2.service = [new protos.google.protobuf.ServiceDescriptorProto()]; assert.throws(() => { const naming = new Naming([descriptor1, descriptor2]); assert(naming); @@ -165,12 +171,12 @@ describe('src/schema/naming.ts', () => { }); it('fails if not all packages have versions', () => { - const descriptor1 = new plugin.google.protobuf.FileDescriptorProto(); - const descriptor2 = new plugin.google.protobuf.FileDescriptorProto(); + const descriptor1 = new protos.google.protobuf.FileDescriptorProto(); + const descriptor2 = new protos.google.protobuf.FileDescriptorProto(); descriptor1.package = 'namespace.service.v1beta1'; - descriptor1.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + descriptor1.service = [new protos.google.protobuf.ServiceDescriptorProto()]; descriptor2.package = 'namespace.service'; - descriptor2.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + descriptor2.service = [new protos.google.protobuf.ServiceDescriptorProto()]; assert.throws(() => { const naming = new Naming([descriptor1, descriptor2]); assert(naming); diff --git a/typescript/test/unit/proto.ts b/test/unit/proto.ts similarity index 73% rename from typescript/test/unit/proto.ts rename to test/unit/proto.ts index b64585406..ba15aa165 100644 --- a/typescript/test/unit/proto.ts +++ b/test/unit/proto.ts @@ -12,34 +12,42 @@ // See the License for the specific language governing permissions and // limitations under the License. +import * as moduleAlias from 'module-alias'; +import * as path from 'path'; +moduleAlias.addAlias( + 'gapic_generator_typescript', + path.join(__dirname, '..', '..') +); import * as assert from 'assert'; import {describe, it} from 'mocha'; -import * as plugin from '../../../pbjs-genfiles/plugin'; -import {getHeaderRequestParams, MessagesMap} from '../../src/schema/proto'; -import {Proto} from '../../src/schema/proto'; -import {Options} from '../../src/schema/naming'; - -import {ResourceDatabase} from '../../src/schema/resource-database'; -import {CommentsMap} from '../../src/schema/comments'; +import * as protos from 'gapic_generator_typescript/protos'; +import { + getHeaderRequestParams, + MessagesMap, +} from 'gapic_generator_typescript/src/schema/proto'; +import {Proto} from 'gapic_generator_typescript/src/schema/proto'; +import {Options} from 'gapic_generator_typescript/src/schema/naming'; +import {ResourceDatabase} from 'gapic_generator_typescript/src/schema/resource-database'; +import {CommentsMap} from 'gapic_generator_typescript/src/schema/comments'; describe('src/schema/proto.ts', () => { describe('should get header parameters from http rule', () => { it('works with no parameter', () => { - const httpRule: plugin.google.api.IHttpRule = { + const httpRule: protos.google.api.IHttpRule = { post: '{=abc/*/d/*/ef/}', }; assert.deepStrictEqual([], getHeaderRequestParams(httpRule)); }); it('works only one parameter', () => { - const httpRule: plugin.google.api.IHttpRule = { + const httpRule: protos.google.api.IHttpRule = { post: '{param1=abc/*/d/*/ef/}', }; assert.deepStrictEqual([['param1']], getHeaderRequestParams(httpRule)); }); it('works with multiple parameter', () => { - const httpRule: plugin.google.api.IHttpRule = { + const httpRule: protos.google.api.IHttpRule = { post: '{param1.param2.param3=abc/*/d/*/ef/}', }; assert.deepStrictEqual( @@ -49,7 +57,7 @@ describe('src/schema/proto.ts', () => { }); it('works with additional bindings', () => { - const httpRule: plugin.google.api.IHttpRule = { + const httpRule: protos.google.api.IHttpRule = { post: '{param1.param2.param3=abc/*/d/*/ef/}', additionalBindings: [ { @@ -74,7 +82,7 @@ describe('src/schema/proto.ts', () => { }); it('dedups parameters', () => { - const httpRule: plugin.google.api.IHttpRule = { + const httpRule: protos.google.api.IHttpRule = { post: '{param1.param2.param3=abc/*/d/*/ef/}', additionalBindings: [ { @@ -100,50 +108,50 @@ describe('src/schema/proto.ts', () => { describe('special work around for talent API', () => { it('The pagingFieldName should be undefined for SearchJobs & SearchProfiles rpc', () => { - const fd = new plugin.google.protobuf.FileDescriptorProto(); + const fd = new protos.google.protobuf.FileDescriptorProto(); fd.name = 'google/cloud/talent/v4beta1/service.proto'; fd.package = 'google.cloud.talent.v4beta1'; - fd.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + fd.service = [new protos.google.protobuf.ServiceDescriptorProto()]; fd.service[0].name = 'service'; fd.service[0].method = [ - new plugin.google.protobuf.MethodDescriptorProto(), + new protos.google.protobuf.MethodDescriptorProto(), ]; - fd.service[0].method[0] = new plugin.google.protobuf.MethodDescriptorProto(); + fd.service[0].method[0] = new protos.google.protobuf.MethodDescriptorProto(); fd.service[0].method[0].name = 'SearchJobs'; - fd.service[0].method[1] = new plugin.google.protobuf.MethodDescriptorProto(); + fd.service[0].method[1] = new protos.google.protobuf.MethodDescriptorProto(); fd.service[0].method[1].name = 'SearchProfiles'; - fd.service[0].method[2] = new plugin.google.protobuf.MethodDescriptorProto(); + fd.service[0].method[2] = new protos.google.protobuf.MethodDescriptorProto(); fd.service[0].method[2].name = 'SearchJobsForAlert'; - fd.service[0].method[3] = new plugin.google.protobuf.MethodDescriptorProto(); + fd.service[0].method[3] = new protos.google.protobuf.MethodDescriptorProto(); fd.service[0].method[3].name = 'ListJobs'; fd.service[0].method[3].outputType = '.google.cloud.talent.v4beta1.ListJobsOutput'; fd.service[0].method[3].inputType = '.google.cloud.talent.v4beta1.ListJobsInput'; - fd.messageType = [new plugin.google.protobuf.DescriptorProto()]; - fd.messageType[0] = new plugin.google.protobuf.DescriptorProto(); - fd.messageType[1] = new plugin.google.protobuf.DescriptorProto(); + fd.messageType = [new protos.google.protobuf.DescriptorProto()]; + fd.messageType[0] = new protos.google.protobuf.DescriptorProto(); + fd.messageType[1] = new protos.google.protobuf.DescriptorProto(); fd.messageType[0].name = 'ListJobsOutput'; fd.messageType[1].name = 'ListJobsInput'; fd.messageType[0].field = [ - new plugin.google.protobuf.FieldDescriptorProto(), + new protos.google.protobuf.FieldDescriptorProto(), ]; - fd.messageType[0].field[0] = new plugin.google.protobuf.FieldDescriptorProto(); + fd.messageType[0].field[0] = new protos.google.protobuf.FieldDescriptorProto(); fd.messageType[0].field[0].name = 'next_page_token'; fd.messageType[0].field[0].label = - plugin.google.protobuf.FieldDescriptorProto.Label.LABEL_REPEATED; + protos.google.protobuf.FieldDescriptorProto.Label.LABEL_REPEATED; fd.messageType[1].field = [ - new plugin.google.protobuf.FieldDescriptorProto(), + new protos.google.protobuf.FieldDescriptorProto(), ]; - fd.messageType[1].field[0] = new plugin.google.protobuf.FieldDescriptorProto(); + fd.messageType[1].field[0] = new protos.google.protobuf.FieldDescriptorProto(); fd.messageType[1].field[0].name = 'page_size'; - fd.messageType[1].field[1] = new plugin.google.protobuf.FieldDescriptorProto(); + fd.messageType[1].field[1] = new protos.google.protobuf.FieldDescriptorProto(); fd.messageType[1].field[1].name = 'page_token'; const options: Options = { - grpcServiceConfig: new plugin.grpc.service_config.ServiceConfig(), + grpcServiceConfig: new protos.grpc.service_config.ServiceConfig(), }; const allMessages: MessagesMap = {}; fd.messageType @@ -181,19 +189,19 @@ describe('src/schema/proto.ts', () => { }); describe('throw error for misconfigured LRO', () => { it('throw error if method returns Operation, but without operation_info option', () => { - const fd = new plugin.google.protobuf.FileDescriptorProto(); + const fd = new protos.google.protobuf.FileDescriptorProto(); fd.name = 'google/cloud/showcase/v1beta1/test.proto'; fd.package = 'google.cloud.showcase.v1beta1'; - fd.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + fd.service = [new protos.google.protobuf.ServiceDescriptorProto()]; fd.service[0].name = 'service'; fd.service[0].method = [ - new plugin.google.protobuf.MethodDescriptorProto(), + new protos.google.protobuf.MethodDescriptorProto(), ]; - fd.service[0].method[0] = new plugin.google.protobuf.MethodDescriptorProto(); + fd.service[0].method[0] = new protos.google.protobuf.MethodDescriptorProto(); fd.service[0].method[0].name = 'Test'; fd.service[0].method[0].outputType = '.google.longrunning.Operation'; const options: Options = { - grpcServiceConfig: new plugin.grpc.service_config.ServiceConfig(), + grpcServiceConfig: new protos.grpc.service_config.ServiceConfig(), }; const allMessages: MessagesMap = {}; fd.messageType @@ -215,21 +223,21 @@ describe('src/schema/proto.ts', () => { }, new Error('rpc Test returns google.longrunning.Operation but is missing option google.longrunning.operation_info')); }); it('throw error if method returns Operation, but without operation_info option', () => { - const fd = new plugin.google.protobuf.FileDescriptorProto(); + const fd = new protos.google.protobuf.FileDescriptorProto(); fd.name = 'google/cloud/showcase/v1beta1/test.proto'; fd.package = 'google.cloud.showcase.v1beta1'; - fd.service = [new plugin.google.protobuf.ServiceDescriptorProto()]; + fd.service = [new protos.google.protobuf.ServiceDescriptorProto()]; fd.service[0].name = 'service'; fd.service[0].method = [ - new plugin.google.protobuf.MethodDescriptorProto(), + new protos.google.protobuf.MethodDescriptorProto(), ]; - fd.service[0].method[0] = new plugin.google.protobuf.MethodDescriptorProto(); + fd.service[0].method[0] = new protos.google.protobuf.MethodDescriptorProto(); fd.service[0].method[0].name = 'Test'; fd.service[0].method[0].outputType = '.google.longrunning.Operation'; const options: Options = { - grpcServiceConfig: new plugin.grpc.service_config.ServiceConfig(), + grpcServiceConfig: new protos.grpc.service_config.ServiceConfig(), }; - fd.service[0].method[0].options = new plugin.google.protobuf.MethodOptions(); + fd.service[0].method[0].options = new protos.google.protobuf.MethodOptions(); fd.service[0].method[0].options['.google.longrunning.operationInfo'] = {}; const allMessages: MessagesMap = {}; fd.messageType diff --git a/typescript/test/unit/resource-database.ts b/test/unit/resource-database.ts similarity index 89% rename from typescript/test/unit/resource-database.ts rename to test/unit/resource-database.ts index 47b65835f..f23ad3d37 100644 --- a/typescript/test/unit/resource-database.ts +++ b/test/unit/resource-database.ts @@ -12,8 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -import * as plugin from '../../../pbjs-genfiles/plugin'; -import {ResourceDatabase} from '../../src/schema/resource-database'; +import * as moduleAlias from 'module-alias'; +import * as path from 'path'; +moduleAlias.addAlias( + 'gapic_generator_typescript', + path.join(__dirname, '..', '..') +); +import * as protos from 'gapic_generator_typescript/protos'; +import {ResourceDatabase} from 'gapic_generator_typescript/src/schema/resource-database'; import {describe, it, beforeEach, afterEach} from 'mocha'; import * as assert from 'assert'; @@ -46,7 +52,7 @@ describe('src/schema/resource-database.ts', () => { it('warns when registering resource with no type', () => { const rdb = new ResourceDatabase(); - const resource: plugin.google.api.IResourceDescriptor = { + const resource: protos.google.api.IResourceDescriptor = { type: '', pattern: [resourcePattern], }; @@ -57,7 +63,7 @@ describe('src/schema/resource-database.ts', () => { it('warns when registering resource with malformed type', () => { const rdb = new ResourceDatabase(); - const resource: plugin.google.api.IResourceDescriptor = { + const resource: protos.google.api.IResourceDescriptor = { type: 'examples.googleapis.com', pattern: [resourcePattern], }; @@ -68,7 +74,7 @@ describe('src/schema/resource-database.ts', () => { it('warns when registering resource with no pattern', () => { const rdb = new ResourceDatabase(); - const resource: plugin.google.api.IResourceDescriptor = { + const resource: protos.google.api.IResourceDescriptor = { type: resourceType, pattern: [], }; @@ -79,7 +85,7 @@ describe('src/schema/resource-database.ts', () => { it('can register multi-pattern resource properly', () => { const rdb = new ResourceDatabase(); - const resource: plugin.google.api.IResourceDescriptor = { + const resource: protos.google.api.IResourceDescriptor = { type: resourceType, pattern: [resourcePattern, resourcePattern2], }; @@ -102,7 +108,7 @@ describe('src/schema/resource-database.ts', () => { it('get correct resource name for special patterns', () => { const rdb = new ResourceDatabase(); - const resource: plugin.google.api.IResourceDescriptor = { + const resource: protos.google.api.IResourceDescriptor = { type: 'examples.googleapis.com/Case', pattern: [ resourcePatternSpecial1, @@ -142,7 +148,7 @@ describe('src/schema/resource-database.ts', () => { it('can get registered resource by type', () => { const rdb = new ResourceDatabase(); - const resource: plugin.google.api.IResourceDescriptor = { + const resource: protos.google.api.IResourceDescriptor = { type: resourceType, pattern: [resourcePattern], }; @@ -158,7 +164,7 @@ describe('src/schema/resource-database.ts', () => { it('can get registered resource by pattern', () => { const rdb = new ResourceDatabase(); - const resource: plugin.google.api.IResourceDescriptor = { + const resource: protos.google.api.IResourceDescriptor = { type: resourceType, pattern: [resourcePattern], }; @@ -174,7 +180,7 @@ describe('src/schema/resource-database.ts', () => { it('extracts parameters from pattern', () => { const rdb = new ResourceDatabase(); - const resource: plugin.google.api.IResourceDescriptor = { + const resource: protos.google.api.IResourceDescriptor = { type: resourceType, pattern: [resourcePattern], }; @@ -215,11 +221,11 @@ describe('src/schema/resource-database.ts', () => { it('returns known parent resources', () => { const rdb = new ResourceDatabase(); - const parentResource: plugin.google.api.IResourceDescriptor = { + const parentResource: protos.google.api.IResourceDescriptor = { type: parentResourceType, pattern: [parentResourcePattern], }; - const resource: plugin.google.api.IResourceDescriptor = { + const resource: protos.google.api.IResourceDescriptor = { type: resourceType, pattern: [resourcePattern], }; @@ -235,7 +241,7 @@ describe('src/schema/resource-database.ts', () => { it('can parse different patterns into parameters', () => { const rdb = new ResourceDatabase(); - const resource: plugin.google.api.IResourceDescriptor = { + const resource: protos.google.api.IResourceDescriptor = { type: resourceType, pattern: [ 'lettersdigits/{abc123}/underscores/{snake_case}/trailing/{trailing=**}', diff --git a/typescript/test/unit/retryable-code-map.ts b/test/unit/retryable-code-map.ts similarity index 94% rename from typescript/test/unit/retryable-code-map.ts rename to test/unit/retryable-code-map.ts index 105ef96f0..a8145471a 100644 --- a/typescript/test/unit/retryable-code-map.ts +++ b/test/unit/retryable-code-map.ts @@ -12,12 +12,18 @@ // See the License for the specific language governing permissions and // limitations under the License. -import {RetryableCodeMap} from '../../src/schema/retryable-code-map'; -import * as plugin from '../../../pbjs-genfiles/plugin'; +import * as moduleAlias from 'module-alias'; +import * as path from 'path'; +moduleAlias.addAlias( + 'gapic_generator_typescript', + path.join(__dirname, '..', '..') +); +import {RetryableCodeMap} from 'gapic_generator_typescript/src/schema/retryable-code-map'; +import * as protos from 'gapic_generator_typescript/protos'; import * as assert from 'assert'; import {describe, it} from 'mocha'; -const Code = plugin.google.rpc.Code; +const Code = protos.google.rpc.Code; describe('src/schema/retryable-code-map.ts', () => { describe('Retry codes', () => { diff --git a/typescript/test/unit/util.ts b/test/unit/util.ts similarity index 95% rename from typescript/test/unit/util.ts rename to test/unit/util.ts index c3df49014..641f39663 100644 --- a/typescript/test/unit/util.ts +++ b/test/unit/util.ts @@ -12,10 +12,21 @@ // See the License for the specific language governing permissions and // limitations under the License. +import * as moduleAlias from 'module-alias'; +import * as path from 'path'; +moduleAlias.addAlias( + 'gapic_generator_typescript', + path.join(__dirname, '..', '..') +); import * as assert from 'assert'; import {describe, it} from 'mocha'; -import {commonPrefix, duration, seconds, milliseconds} from '../../src/util'; -import * as plugin from '../../../pbjs-genfiles/plugin'; +import { + commonPrefix, + duration, + seconds, + milliseconds, +} from 'gapic_generator_typescript/src/util'; +import * as protos from 'gapic_generator_typescript/protos'; describe('src/util.ts', () => { describe('CommonPrefix', () => { @@ -77,7 +88,7 @@ describe('src/util.ts', () => { }); it('should convert Duration to whole seconds', () => { - const duration = plugin.google.protobuf.Duration.fromObject({ + const duration = protos.google.protobuf.Duration.fromObject({ seconds: 10, nanos: 0, }); @@ -86,7 +97,7 @@ describe('src/util.ts', () => { }); it('should convert Duration to fractional seconds', () => { - const duration = plugin.google.protobuf.Duration.fromObject({ + const duration = protos.google.protobuf.Duration.fromObject({ seconds: 5, nanos: 500000000, }); @@ -95,7 +106,7 @@ describe('src/util.ts', () => { }); it('should convert Duration to whole milliseconds', () => { - const duration = plugin.google.protobuf.Duration.fromObject({ + const duration = protos.google.protobuf.Duration.fromObject({ seconds: 10, nanos: 0, }); @@ -104,7 +115,7 @@ describe('src/util.ts', () => { }); it('should convert Duration to fractional milliseconds', () => { - const duration = plugin.google.protobuf.Duration.fromObject({ + const duration = protos.google.protobuf.Duration.fromObject({ seconds: 5, nanos: 500000000, }); diff --git a/typescript/test/util.ts b/test/util.ts similarity index 87% rename from typescript/test/util.ts rename to test/util.ts index ab1f61f4d..540de23ed 100644 --- a/typescript/test/util.ts +++ b/test/util.ts @@ -14,8 +14,7 @@ import * as fs from 'fs-extra'; import * as path from 'path'; -import {before, it} from 'mocha'; -import * as rimraf from 'rimraf'; +import {it} from 'mocha'; import {execSync} from 'child_process'; import * as assert from 'assert'; @@ -39,12 +38,6 @@ export interface BaselineOptions { } const cwd = process.cwd(); -const googleGaxProtosDir = path.join( - cwd, - 'node_modules', - 'google-gax', - 'protos' -); const protosDirRoot = path.join(cwd, 'test-fixtures', 'protos'); const commonProtoFilePath = path.join( protosDirRoot, @@ -53,29 +46,23 @@ const commonProtoFilePath = path.join( 'common_resources.proto' ); const baselineRootDir = path.join(cwd, 'baselines'); -const srcDir = path.join(cwd, 'build', 'src'); -const cliPath = path.join(srcDir, 'cli.js'); -const pluginPath = path.join(srcDir, 'protoc-gen-typescript_gapic'); -const startScriptPath = path.join(cwd, 'build', 'src', 'start-script.js'); - -export function initBaselineTest() { - before(() => { - if (fs.existsSync(pluginPath)) { - rimraf.sync(pluginPath); - } - fs.copyFileSync(cliPath, pluginPath); - process.env['PATH'] = srcDir + path.delimiter + process.env['PATH']; - - try { - execSync(`chmod +x ${pluginPath} ${cliPath}`); - } catch (err) { - console.warn(`Failed to chmod +x ${pluginPath}: ${err}. Ignoring...`); - } - }); -} +// Try to make it work both with and without bazel +const entryPointPath = + process.env['RUNFILES_DIR'] && process.env['BAZEL_WORKSPACE'] + ? path.join( + process.env['RUNFILES_DIR'], + process.env['BAZEL_WORKSPACE'], + 'gapic_generator_typescript.sh' + ) + : path.join(__dirname, '..', 'src', 'gapic-generator-typescript.js'); +// Try saving the generated baseline test outputs to the proper bazel location +const outputDirPrefix = + process.env['TEST_UNDECLARED_OUTPUTS_DIR'] ?? + process.env['TEST_TMPDIR'] ?? + cwd; export function runBaselineTest(options: BaselineOptions) { - const outputDir = path.join(cwd, options.outputDir); + const outputDir = path.join(outputDirPrefix, options.outputDir); const protos = options.protoPath.split(';'); const protoPaths = protos.map(proto => path.join(protosDirRoot, proto.split('/').join(path.sep)) @@ -91,16 +78,16 @@ export function runBaselineTest(options: BaselineOptions) { ? path.join(protosDirRoot, options.bundleConfig.split('/').join(path.sep)) : undefined; const iamService = options.iamService ?? false; - it(options.baselineName, function () { + it(options.baselineName, async function () { this.timeout(60000); if (fs.existsSync(outputDir)) { - rimraf.sync(outputDir); + await fs.remove(outputDir); } fs.mkdirSync(outputDir); let commandLine = - `node ${startScriptPath} --output_dir=${outputDir} ` + - `-I${protosDirRoot} -I${googleGaxProtosDir} ${protoPaths.join(' ')}`; + `${entryPointPath} --output_dir=${outputDir} ` + + `-I${protosDirRoot} ${protoPaths.join(' ')}`; if (options.useCommonProto) { commandLine += ` ${commonProtoFilePath}`; } diff --git a/typescript/tools/update-baselines.ts b/tools/update-baselines.ts similarity index 78% rename from typescript/tools/update-baselines.ts rename to tools/update-baselines.ts index a3f0aaea8..ab8cba00a 100644 --- a/typescript/tools/update-baselines.ts +++ b/tools/update-baselines.ts @@ -19,24 +19,29 @@ // Usage: node build/tools/update-baselines.js import {exec} from 'child_process'; -import * as util from 'util'; -import * as fs from 'fs'; import * as path from 'path'; -import * as rimraf from 'rimraf'; import {promisify} from 'util'; -import {readdir, mkdir, existsSync} from 'fs'; -import * as ncp from 'ncp'; +import { + readdir, + mkdirp, + existsSync, + stat, + symlink, + copy, + remove, +} from 'fs-extra'; -const rmrf = promisify(rimraf); -const readdirp = promisify(readdir); -const fsstat = util.promisify(fs.stat); -const fssymlink = util.promisify(fs.symlink); -const mkdirp = promisify(mkdir); const execp = promisify(exec); -const ncpp = promisify(ncp); -const root = path.resolve(__dirname, '..', '..'); +const root = process.cwd(); const resultPrefix = /^\.test-out-(.*)$/; +const baselineZip = path.join( + root, + 'bazel-testlogs', + 'unit-tests', + 'test.outputs', + 'outputs.zip' +); function getBaselineDirectory(library: string): string { return path.join(root, 'baselines', library); @@ -53,26 +58,26 @@ async function copyBaseline(library: string, root: string, directory = '.') { if (!existsSync(targetDirectory)) { await mkdirp(targetDirectory); } - const files = await readdirp(start); + const files = await readdir(start); for (const file of files) { const relativePath = `${directory}${path.sep}${file}`; const absolutePath = path.join(start, file); - const stat = await fsstat(absolutePath); - if (stat.isDirectory()) { + const stats = await stat(absolutePath); + if (stats.isDirectory()) { await copyBaseline(library, root, relativePath); - } else if (stat.isFile()) { + } else if (stats.isFile()) { const baseline = getBaselineFilename(library, relativePath); // In baselines/, update `package.json` instead of `package.json.baseline` // (package.json.baseline is a symlink to package.json to make renovate bot happy) if (relativePath.endsWith(`${path.sep}package.json`)) { const packageJson = baseline.substring(0, baseline.lastIndexOf('.')); - await ncpp(absolutePath, packageJson); + await copy(absolutePath, packageJson); const dirname = path.dirname(packageJson); process.chdir(dirname); - await fssymlink('package.json', 'package.json.baseline'); + await symlink('package.json', 'package.json.baseline'); process.chdir(cwd); } else { - await ncpp(absolutePath, baseline); + await copy(absolutePath, baseline); } console.log(` - ${relativePath}`); } @@ -90,8 +95,18 @@ async function main() { console.log("Tests failed - that's OK, will update baselines."); } + // remove old test out folders + const oldFolders = (await readdir(root)).filter(file => + file.match(resultPrefix) + ); + for (const oldFolder of oldFolders) { + await remove(oldFolder); + } + // unzip baselines + await execp(`unzip -o "${baselineZip}" -d .`); + // get a list of baselines - const files = await readdirp(root); + const files = await readdir(root); const outDirs = files.filter(file => file.match(resultPrefix)); // update baselines for all libraries @@ -105,7 +120,7 @@ async function main() { console.log(`Updating baseline for ${library}...`); console.log(` - rm -rf "${baselineDir}"...`); - await rmrf(baselineDir); + await remove(baselineDir); console.log(` - copying files from ${dir}...`); await copyBaseline(library, path.join(root, dir)); console.log('done!'); diff --git a/tsconfig.json b/tsconfig.json index c0ccb61bb..4e395b881 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,11 +1,18 @@ { "extends": "./node_modules/gts/tsconfig-google.json", "compilerOptions": { - "rootDir": "typescript", + "rootDir": ".", "outDir": "build", - "baseUrl": "typescript" + "baseUrl": ".", + "allowJs": true, + "paths": { + "gapic_generator_typescript/*": ["*"] + } }, "include": [ - "typescript/**/*.ts" + "src/**/*.ts", + "test/**/*.ts", + "tools/**/*.ts", + "./index.d.ts" ] }