diff --git a/.travis.yml b/.travis.yml index 1d9d488..5a45589 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,43 +1,30 @@ # It may be tempting to add parens around each individual clause in this expression, but Travis then builds pushes anyway -if: branch = master OR branch = components OR branch =~ ^release/ OR tag IS present +if: branch = master OR branch =~ ^release/ OR tag IS present language: go go: 1.9 sudo: true # give us 7.5GB and >2 bursted cores. git: depth: false before_install: - - export PULUMI_ROOT=/opt/pulumi - - if [ "${TRAVIS_SECURE_ENV_VARS:-}" = "true" ]; then git clone git@github.com:pulumi/home ${GOPATH}/src/github.com/pulumi/home; fi - - git clone git@github.com:pulumi/scripts ${GOPATH}/src/github.com/pulumi/scripts - # Install Docker 17.09. + - git clone https://github.com/pulumi/scripts ${GOPATH}/src/github.com/pulumi/scripts + - source ${GOPATH}/src/github.com/pulumi/scripts/ci/prepare-environment.sh + - source ${PULUMI_SCRIPTS}/ci/keep-failed-tests.sh +install: + - source ${PULUMI_SCRIPTS}/ci/install-common-toolchain.sh + # Install Docker - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" - sudo apt-get update - sudo apt-get -y install docker-ce=17.09.0~ce-0~ubuntu - docker version - # Dep for Go dependency management. - - go get -v github.com/golang/dep/cmd/dep - # Node.js 6.10.2 for Pulumi Fabric's Node.js runtime. - - nvm install v6.10.2 - # Ensure that we can access Pulumi's private NPM org. - - echo "//registry.npmjs.org/:_authToken=\${NPM_TOKEN}" > ~/.npmrc - # Install the AWS CLI so that we can publish the resulting release (if applicable) at the end. - - pip install --upgrade --user awscli - # Install Yarn as per https://yarnpkg.com/lang/en/docs/install-ci/#travis-tab. - - curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.2.1 - - export PATH=$HOME/.yarn/bin:$PATH # Install Pulumi - - curl -L https://get.pulumi.com/ | bash -s -- --version 0.14.0-rc1 + - curl -L https://get.pulumi.com/ | bash -s -- --version 0.14.0 - export PATH=$HOME/.pulumi/bin:$PATH - - if [ "${TRAVIS_SECURE_ENV_VARS:-}" = "true" ]; then source ${GOPATH}/src/github.com/pulumi/home/scripts/keep-failed-tests.sh; fi -install: - - make ensure before_script: - # Ensure the working tree is clean (make ensure may have updated lock files) - - ${GOPATH}/src/github.com/pulumi/scripts/ci/check-worktree-is-clean.sh + - ${PULUMI_SCRIPTS}/ci/ensure-dependencies script: - make travis_${TRAVIS_EVENT_TYPE} after_failure: - - if [ "${TRAVIS_SECURE_ENV_VARS:-}" = "true" ]; then ${GOPATH}/src/github.com/pulumi/home/scripts/upload-failed-tests; fi + - ${PULUMI_SCRIPTS}/ci/upload-failed-tests notifications: webhooks: https://ufci1w66n3.execute-api.us-west-2.amazonaws.com/stage/travis diff --git a/Gopkg.lock b/Gopkg.lock new file mode 100644 index 0000000..8c663a1 --- /dev/null +++ b/Gopkg.lock @@ -0,0 +1,891 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + name = "github.com/Azure/azure-sdk-for-go" + packages = [ + "services/appinsights/mgmt/2015-05-01/insights", + "services/automation/mgmt/2015-10-31/automation", + "services/cdn/mgmt/2017-04-02/cdn", + "services/compute/mgmt/2017-12-01/compute", + "services/containerinstance/mgmt/2018-02-01-preview/containerinstance", + "services/containerregistry/mgmt/2017-10-01/containerregistry", + "services/containerservice/mgmt/2017-09-30/containerservice", + "services/cosmos-db/mgmt/2015-04-08/documentdb", + "services/datalake/store/mgmt/2016-11-01/account", + "services/dns/mgmt/2016-04-01/dns", + "services/eventgrid/mgmt/2017-09-15-preview/eventgrid", + "services/eventhub/mgmt/2017-04-01/eventhub", + "services/graphrbac/1.6/graphrbac", + "services/iothub/mgmt/2017-07-01/devices", + "services/keyvault/2016-10-01/keyvault", + "services/keyvault/mgmt/2016-10-01/keyvault", + "services/monitor/mgmt/2017-05-01-preview/insights", + "services/mysql/mgmt/2017-12-01/mysql", + "services/network/mgmt/2017-09-01/network", + "services/operationalinsights/mgmt/2015-11-01-preview/operationalinsights", + "services/operationsmanagement/mgmt/2015-11-01-preview/operationsmanagement", + "services/postgresql/mgmt/2017-12-01/postgresql", + "services/preview/authorization/mgmt/2018-01-01-preview/authorization", + "services/recoveryservices/mgmt/2016-06-01/recoveryservices", + "services/redis/mgmt/2018-03-01/redis", + "services/relay/mgmt/2017-04-01/relay", + "services/resources/mgmt/2016-06-01/subscriptions", + "services/resources/mgmt/2016-09-01/locks", + "services/resources/mgmt/2016-12-01/policy", + "services/resources/mgmt/2017-05-10/resources", + "services/scheduler/mgmt/2016-03-01/scheduler", + "services/search/mgmt/2015-08-19/search", + "services/servicebus/mgmt/2017-04-01/servicebus", + "services/sql/mgmt/2015-05-01-preview/sql", + "services/storage/mgmt/2017-10-01/storage", + "services/trafficmanager/mgmt/2017-05-01/trafficmanager", + "services/web/mgmt/2016-09-01/web", + "storage", + "version" + ] + revision = "4e8cbbfb1aeab140cd0fa97fd16b64ee18c3ca6a" + version = "v19.1.0" + +[[projects]] + branch = "master" + name = "github.com/Azure/go-ansiterm" + packages = [ + ".", + "winterm" + ] + revision = "d6e3b3328b783f23731bc4d058875b0371ff8109" + +[[projects]] + name = "github.com/Azure/go-autorest" + packages = [ + "autorest", + "autorest/adal", + "autorest/azure", + "autorest/azure/cli", + "autorest/date", + "autorest/to", + "autorest/validation", + "logger", + "version" + ] + revision = "dd94e014aaf16d1df746762e392aa201c1b4c461" + version = "v10.15.0" + +[[projects]] + name = "github.com/Nvveen/Gotty" + packages = ["."] + revision = "a8b993ba6abdb0e0c12b0125c603323a71c7790c" + source = "https://github.com/ijc25/Gotty" + +[[projects]] + name = "github.com/Sirupsen/logrus" + packages = ["."] + revision = "3e01752db0189b9157070a0e1668a620f9a85da2" + version = "v1.0.6" + +[[projects]] + name = "github.com/agext/levenshtein" + packages = ["."] + revision = "5f10fee965225ac1eecdc234c09daf5cd9e7f7b6" + version = "v1.2.1" + +[[projects]] + branch = "master" + name = "github.com/apparentlymart/go-cidr" + packages = ["cidr"] + revision = "2bd8b58cf4275aeb086ade613de226773e29e853" + +[[projects]] + branch = "master" + name = "github.com/apparentlymart/go-textseg" + packages = ["textseg"] + revision = "b836f5c4d331d1945a2fead7188db25432d73b69" + +[[projects]] + branch = "master" + name = "github.com/armon/go-radix" + packages = ["."] + revision = "1fca145dffbcaa8fe914309b1ec0cfc67500fe61" + +[[projects]] + name = "github.com/aws/aws-sdk-go" + packages = [ + "aws", + "aws/awserr", + "aws/awsutil", + "aws/client", + "aws/client/metadata", + "aws/corehandlers", + "aws/credentials", + "aws/credentials/ec2rolecreds", + "aws/credentials/endpointcreds", + "aws/credentials/stscreds", + "aws/csm", + "aws/defaults", + "aws/ec2metadata", + "aws/endpoints", + "aws/request", + "aws/session", + "aws/signer/v4", + "internal/sdkio", + "internal/sdkrand", + "internal/sdkuri", + "internal/shareddefaults", + "private/protocol", + "private/protocol/eventstream", + "private/protocol/eventstream/eventstreamapi", + "private/protocol/json/jsonutil", + "private/protocol/jsonrpc", + "private/protocol/query", + "private/protocol/query/queryutil", + "private/protocol/rest", + "private/protocol/restxml", + "private/protocol/xml/xmlutil", + "service/cloudwatchlogs", + "service/s3", + "service/sts" + ] + revision = "d1f87361dea69f086010bc3d03c120a602320b97" + version = "v1.15.4" + +[[projects]] + branch = "master" + name = "github.com/bgentry/go-netrc" + packages = ["netrc"] + revision = "9fd32a8b3d3d3f9d43c341bfe098430e07609480" + +[[projects]] + name = "github.com/bgentry/speakeasy" + packages = ["."] + revision = "4aabc24848ce5fd31929f7d1e4ea74d3709c14cd" + version = "v0.1.0" + +[[projects]] + name = "github.com/blang/semver" + packages = ["."] + revision = "2ee87856327ba09384cabd113bc6b5d174e9ec0f" + version = "v3.5.1" + +[[projects]] + branch = "master" + name = "github.com/codahale/hdrhistogram" + packages = ["."] + revision = "3a0bb77429bd3a61596f5e8a3172445844342120" + +[[projects]] + name = "github.com/davecgh/go-spew" + packages = ["spew"] + revision = "346938d642f2ec3594ed81d874461961cd0faa76" + version = "v1.1.0" + +[[projects]] + name = "github.com/dgrijalva/jwt-go" + packages = ["."] + revision = "06ea1031745cb8b3dab3f6a236daf2b0aa468b7e" + version = "v3.2.0" + +[[projects]] + name = "github.com/dimchansky/utfbom" + packages = ["."] + revision = "5448fe645cb1964ba70ac8f9f2ffe975e61a536c" + version = "v1.0.0" + +[[projects]] + name = "github.com/djherbis/times" + packages = ["."] + revision = "95292e44976d1217cf3611dc7c8d9466877d3ed5" + version = "v1.0.1" + +[[projects]] + name = "github.com/docker/docker" + packages = [ + "pkg/term", + "pkg/term/windows" + ] + revision = "092cba3727bb9b4a2f0e922cd6c0f93ea270e363" + version = "v1.13.1" + +[[projects]] + name = "github.com/emirpasic/gods" + packages = [ + "containers", + "lists", + "lists/arraylist", + "trees", + "trees/binaryheap", + "utils" + ] + revision = "f6c17b524822278a87e3b3bd809fec33b51f5b46" + version = "v1.9.0" + +[[projects]] + name = "github.com/fatih/color" + packages = ["."] + revision = "5b77d2a35fb0ede96d138fc9a99f5c9b6aef11b4" + version = "v1.7.0" + +[[projects]] + branch = "master" + name = "github.com/gedex/inflector" + packages = ["."] + revision = "16278e9db8130ac7ec405dc174cfb94344f16325" + +[[projects]] + name = "github.com/go-ini/ini" + packages = ["."] + revision = "358ee7663966325963d4e8b2e1fbd570c5195153" + version = "v1.38.1" + +[[projects]] + branch = "master" + name = "github.com/golang/glog" + packages = ["."] + revision = "23def4e6c14b4da8ac2ed8007337bc5eb5007998" + +[[projects]] + name = "github.com/golang/protobuf" + packages = [ + "proto", + "protoc-gen-go/descriptor", + "ptypes", + "ptypes/any", + "ptypes/duration", + "ptypes/empty", + "ptypes/struct", + "ptypes/timestamp" + ] + revision = "b4deda0973fb4c70b50d226b1af49f3da59f5265" + version = "v1.1.0" + +[[projects]] + branch = "master" + name = "github.com/grpc-ecosystem/grpc-opentracing" + packages = ["go/otgrpc"] + revision = "8e809c8a86450a29b90dcc9efbf062d0fe6d9746" + +[[projects]] + branch = "master" + name = "github.com/hashicorp/errwrap" + packages = ["."] + revision = "d6c0cd88035724dd42e0f335ae30161c20575ecc" + +[[projects]] + branch = "master" + name = "github.com/hashicorp/go-cleanhttp" + packages = ["."] + revision = "d5fe4b57a186c716b0e00b8c301cbd9b4182694d" + +[[projects]] + branch = "master" + name = "github.com/hashicorp/go-getter" + packages = [ + ".", + "helper/url" + ] + revision = "a33f09ce9feed989941a4dfe08b3890a0f8aceb9" + +[[projects]] + branch = "master" + name = "github.com/hashicorp/go-multierror" + packages = ["."] + revision = "3d5d8f294aa03d8e98859feac328afbdf1ae0703" + +[[projects]] + branch = "master" + name = "github.com/hashicorp/go-safetemp" + packages = ["."] + revision = "b1a1dbde6fdc11e3ae79efd9039009e22d4ae240" + +[[projects]] + branch = "master" + name = "github.com/hashicorp/go-uuid" + packages = ["."] + revision = "27454136f0364f2d44b1276c552d69105cf8c498" + +[[projects]] + branch = "master" + name = "github.com/hashicorp/go-version" + packages = ["."] + revision = "270f2f71b1ee587f3b609f00f422b76a6b28f348" + +[[projects]] + branch = "master" + name = "github.com/hashicorp/hcl" + packages = [ + ".", + "hcl/ast", + "hcl/parser", + "hcl/scanner", + "hcl/strconv", + "hcl/token", + "json/parser", + "json/scanner", + "json/token" + ] + revision = "ef8a98b0bbce4a65b5aa4c368430a80ddc533168" + +[[projects]] + branch = "master" + name = "github.com/hashicorp/hcl2" + packages = [ + "gohcl", + "hcl", + "hcl/hclsyntax", + "hcl/json", + "hcldec", + "hclparse" + ] + revision = "77c0b55a597ce9ff855c699dba2a99c1632690e1" + +[[projects]] + branch = "master" + name = "github.com/hashicorp/hil" + packages = [ + ".", + "ast", + "parser", + "scanner" + ] + revision = "fa9f258a92500514cc8e9c67020487709df92432" + +[[projects]] + branch = "master" + name = "github.com/hashicorp/logutils" + packages = ["."] + revision = "0dc08b1671f34c4250ce212759ebd880f743d883" + +[[projects]] + name = "github.com/hashicorp/terraform" + packages = [ + "config", + "config/configschema", + "config/hcl2shim", + "config/module", + "dag", + "flatmap", + "helper/config", + "helper/hashcode", + "helper/hilmapstructure", + "helper/logging", + "helper/mutexkv", + "helper/resource", + "helper/schema", + "helper/structure", + "helper/validation", + "httpclient", + "moduledeps", + "plugin/discovery", + "registry", + "registry/regsrc", + "registry/response", + "svchost", + "svchost/auth", + "svchost/disco", + "terraform", + "tfdiags", + "version" + ] + revision = "41e50bd32a8825a84535e353c3674af8ce799161" + version = "v0.11.7" + +[[projects]] + name = "github.com/inconshreveable/mousetrap" + packages = ["."] + revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75" + version = "v1.0" + +[[projects]] + branch = "master" + name = "github.com/jbenet/go-context" + packages = ["io"] + revision = "d14ea06fba99483203c19d92cfcd13ebe73135f4" + +[[projects]] + name = "github.com/jmespath/go-jmespath" + packages = ["."] + revision = "0b12d6b5" + +[[projects]] + name = "github.com/kevinburke/ssh_config" + packages = ["."] + revision = "9fc7bb800b555d63157c65a904c86a2cc7b4e795" + version = "0.4" + +[[projects]] + name = "github.com/marstr/guid" + packages = ["."] + revision = "8bd9a64bf37eb297b492a4101fb28e80ac0b290f" + version = "v1.1.0" + +[[projects]] + name = "github.com/mattn/go-colorable" + packages = ["."] + revision = "167de6bfdfba052fa6b2d3664c8f5272e23c9072" + version = "v0.0.9" + +[[projects]] + name = "github.com/mattn/go-isatty" + packages = ["."] + revision = "0360b2af4f38e8d38c7fce2a9f4e702702d73a39" + version = "v0.0.3" + +[[projects]] + branch = "master" + name = "github.com/mitchellh/cli" + packages = ["."] + revision = "c48282d14eba4b0817ddef3f832ff8d13851aefd" + +[[projects]] + branch = "master" + name = "github.com/mitchellh/copystructure" + packages = ["."] + revision = "d23ffcb85de31694d6ccaa23ccb4a03e55c1303f" + +[[projects]] + branch = "master" + name = "github.com/mitchellh/go-homedir" + packages = ["."] + revision = "58046073cbffe2f25d425fe1331102f55cf719de" + +[[projects]] + branch = "master" + name = "github.com/mitchellh/go-ps" + packages = ["."] + revision = "4fdf99ab29366514c69ccccddab5dc58b8d84062" + +[[projects]] + branch = "master" + name = "github.com/mitchellh/go-testing-interface" + packages = ["."] + revision = "a61a99592b77c9ba629d254a693acffaeb4b7e28" + +[[projects]] + branch = "master" + name = "github.com/mitchellh/go-wordwrap" + packages = ["."] + revision = "ad45545899c7b13c020ea92b2072220eefad42b8" + +[[projects]] + branch = "master" + name = "github.com/mitchellh/hashstructure" + packages = ["."] + revision = "2bca23e0e452137f789efbc8610126fd8b94f73b" + +[[projects]] + branch = "master" + name = "github.com/mitchellh/mapstructure" + packages = ["."] + revision = "f15292f7a699fcc1a38a80977f80a046874ba8ac" + +[[projects]] + branch = "master" + name = "github.com/mitchellh/reflectwalk" + packages = ["."] + revision = "63d60e9d0dbc60cf9164e6510889b0db6683d98c" + +[[projects]] + name = "github.com/opentracing/opentracing-go" + packages = [ + ".", + "ext", + "log" + ] + revision = "1949ddbfd147afd4d964a9f00b24eb291e0e7c38" + version = "v1.0.2" + +[[projects]] + name = "github.com/pelletier/go-buffruneio" + packages = ["."] + revision = "c37440a7cf42ac63b919c752ca73a85067e05992" + version = "v0.2.0" + +[[projects]] + name = "github.com/pkg/errors" + packages = ["."] + revision = "645ef00459ed84a119197bfb8d8205042c6df63d" + version = "v0.8.0" + +[[projects]] + name = "github.com/pmezard/go-difflib" + packages = ["difflib"] + revision = "792786c7400a136282c1664665ae0a8db921c6c2" + version = "v1.0.0" + +[[projects]] + name = "github.com/posener/complete" + packages = [ + ".", + "cmd", + "cmd/install", + "match" + ] + revision = "98eb9847f27ba2008d380a32c98be474dea55bdf" + version = "v1.1.1" + +[[projects]] + name = "github.com/pulumi/pulumi" + packages = [ + "pkg/apitype", + "pkg/backend", + "pkg/backend/local", + "pkg/diag", + "pkg/diag/colors", + "pkg/encoding", + "pkg/engine", + "pkg/operations", + "pkg/resource", + "pkg/resource/config", + "pkg/resource/deploy", + "pkg/resource/graph", + "pkg/resource/plugin", + "pkg/resource/provider", + "pkg/resource/stack", + "pkg/testing", + "pkg/testing/integration", + "pkg/tokens", + "pkg/util/cancel", + "pkg/util/cmdutil", + "pkg/util/contract", + "pkg/util/fsutil", + "pkg/util/gitutil", + "pkg/util/httputil", + "pkg/util/logging", + "pkg/util/mapper", + "pkg/util/retry", + "pkg/util/rpcutil", + "pkg/util/rpcutil/rpcerror", + "pkg/util/testutil", + "pkg/version", + "pkg/workspace", + "sdk/proto/go" + ] + revision = "f1d8a752f1f447415bc29272359e5439c973b4df" + version = "v0.14.3" + +[[projects]] + name = "github.com/pulumi/pulumi-azure" + packages = ["."] + revision = "4fe9e0e10443a05e502ad5197041727d5dadbd07" + version = "v0.14.2" + +[[projects]] + branch = "master" + name = "github.com/pulumi/pulumi-terraform" + packages = ["pkg/tfbridge"] + revision = "c0f99e5d748ed3a7b17b319bb38675dd72288031" + +[[projects]] + branch = "master" + name = "github.com/reconquest/loreley" + packages = ["."] + revision = "2ab6b7470a54bfa9b5b0289f9b4e8fc4839838f7" + +[[projects]] + name = "github.com/satori/go.uuid" + packages = ["."] + revision = "f58768cc1a7a7e77a3bd49e98cdd21419399b6a3" + version = "v1.2.0" + +[[projects]] + name = "github.com/satori/uuid" + packages = ["."] + revision = "f58768cc1a7a7e77a3bd49e98cdd21419399b6a3" + version = "v1.2.0" + +[[projects]] + name = "github.com/sergi/go-diff" + packages = ["diffmatchpatch"] + revision = "1744e2970ca51c86172c8190fadad617561ed6e7" + version = "v1.0.0" + +[[projects]] + name = "github.com/spf13/cobra" + packages = ["."] + revision = "ef82de70bb3f60c65fb8eebacbb2d122ef517385" + version = "v0.0.3" + +[[projects]] + name = "github.com/spf13/pflag" + packages = ["."] + revision = "583c0c0531f06d5278b7d917446061adc344b5cd" + version = "v1.0.1" + +[[projects]] + name = "github.com/src-d/gcfg" + packages = [ + ".", + "scanner", + "token", + "types" + ] + revision = "f187355171c936ac84a82793659ebb4936bc1c23" + version = "v1.3.0" + +[[projects]] + name = "github.com/stretchr/testify" + packages = ["assert"] + revision = "f35b8ab0b5a2cef36673838d662e249dd9c94686" + version = "v1.2.2" + +[[projects]] + name = "github.com/terraform-providers/terraform-provider-azurerm" + packages = [ + "azurerm", + "azurerm/helpers/authentication", + "azurerm/helpers/kubernetes", + "azurerm/helpers/response", + "azurerm/helpers/schema", + "azurerm/helpers/subscription", + "azurerm/utils" + ] + revision = "93090f95e1f8e18972a94a20aa48e3991a62a7a7" + version = "v1.6.0" + +[[projects]] + name = "github.com/uber/jaeger-client-go" + packages = [ + ".", + "internal/baggage", + "internal/spanlog", + "internal/throttler", + "log", + "thrift", + "thrift-gen/agent", + "thrift-gen/jaeger", + "thrift-gen/sampling", + "thrift-gen/zipkincore", + "transport/zipkin", + "utils" + ] + revision = "b043381d944715b469fd6b37addfd30145ca1758" + version = "v2.14.0" + +[[projects]] + name = "github.com/uber/jaeger-lib" + packages = ["metrics"] + revision = "ed3a127ec5fef7ae9ea95b01b542c47fbd999ce5" + version = "v1.5.0" + +[[projects]] + name = "github.com/ulikunitz/xz" + packages = [ + ".", + "internal/hash", + "internal/xlog", + "lzma" + ] + revision = "0c6b41e72360850ca4f98dc341fd999726ea007f" + version = "v0.5.4" + +[[projects]] + name = "github.com/xanzy/ssh-agent" + packages = ["."] + revision = "640f0ab560aeb89d523bb6ac322b1244d5c3796c" + version = "v0.2.0" + +[[projects]] + branch = "master" + name = "github.com/zclconf/go-cty" + packages = [ + "cty", + "cty/convert", + "cty/function", + "cty/function/stdlib", + "cty/gocty", + "cty/json", + "cty/set" + ] + revision = "02bd58e97b5759d478019c5a6333edbfdfed16a0" + +[[projects]] + branch = "master" + name = "golang.org/x/crypto" + packages = [ + "bcrypt", + "blowfish", + "cast5", + "curve25519", + "ed25519", + "ed25519/internal/edwards25519", + "internal/chacha20", + "internal/subtle", + "openpgp", + "openpgp/armor", + "openpgp/elgamal", + "openpgp/errors", + "openpgp/packet", + "openpgp/s2k", + "pbkdf2", + "poly1305", + "ssh", + "ssh/agent", + "ssh/knownhosts", + "ssh/terminal" + ] + revision = "56440b844dfe139a8ac053f4ecac0b20b79058f4" + +[[projects]] + branch = "master" + name = "golang.org/x/net" + packages = [ + "context", + "html", + "html/atom", + "http/httpguts", + "http2", + "http2/hpack", + "idna", + "internal/timeseries", + "trace" + ] + revision = "f4c29de78a2a91c00474a2e689954305c350adf9" + +[[projects]] + branch = "master" + name = "golang.org/x/sys" + packages = [ + "unix", + "windows" + ] + revision = "0ffbfd41fbef8ffcf9b62b0b0aa3a5873ed7a4fe" + +[[projects]] + name = "golang.org/x/text" + packages = [ + "collate", + "collate/build", + "internal/colltab", + "internal/gen", + "internal/tag", + "internal/triegen", + "internal/ucd", + "language", + "secure/bidirule", + "transform", + "unicode/bidi", + "unicode/cldr", + "unicode/norm", + "unicode/rangetable" + ] + revision = "f21a4dfb5e38f5895301dc265a8def02365cc3d0" + version = "v0.3.0" + +[[projects]] + branch = "master" + name = "google.golang.org/genproto" + packages = ["googleapis/rpc/status"] + revision = "daca94659cb50e9f37c1b834680f2e46358f10b0" + +[[projects]] + name = "google.golang.org/grpc" + packages = [ + ".", + "balancer", + "balancer/base", + "balancer/roundrobin", + "codes", + "connectivity", + "credentials", + "encoding", + "encoding/proto", + "grpclog", + "internal", + "internal/backoff", + "internal/channelz", + "internal/envconfig", + "internal/grpcrand", + "internal/transport", + "keepalive", + "metadata", + "naming", + "peer", + "reflection", + "reflection/grpc_reflection_v1alpha", + "resolver", + "resolver/dns", + "resolver/passthrough", + "stats", + "status", + "tap" + ] + revision = "32fb0ac620c32ba40a4626ddf94d90d12cce3455" + version = "v1.14.0" + +[[projects]] + name = "gopkg.in/src-d/go-billy.v4" + packages = [ + ".", + "helper/chroot", + "helper/polyfill", + "osfs", + "util" + ] + revision = "83cf655d40b15b427014d7875d10850f96edba14" + version = "v4.2.0" + +[[projects]] + name = "gopkg.in/src-d/go-git.v4" + packages = [ + ".", + "config", + "internal/revision", + "plumbing", + "plumbing/cache", + "plumbing/filemode", + "plumbing/format/config", + "plumbing/format/diff", + "plumbing/format/gitignore", + "plumbing/format/idxfile", + "plumbing/format/index", + "plumbing/format/objfile", + "plumbing/format/packfile", + "plumbing/format/pktline", + "plumbing/object", + "plumbing/protocol/packp", + "plumbing/protocol/packp/capability", + "plumbing/protocol/packp/sideband", + "plumbing/revlist", + "plumbing/storer", + "plumbing/transport", + "plumbing/transport/client", + "plumbing/transport/file", + "plumbing/transport/git", + "plumbing/transport/http", + "plumbing/transport/internal/common", + "plumbing/transport/server", + "plumbing/transport/ssh", + "storage", + "storage/filesystem", + "storage/filesystem/dotgit", + "storage/memory", + "utils/binary", + "utils/diff", + "utils/ioutil", + "utils/merkletrie", + "utils/merkletrie/filesystem", + "utils/merkletrie/index", + "utils/merkletrie/internal/frame", + "utils/merkletrie/noder" + ] + revision = "3bd5e82b2512d85becae9677fa06b5a973fd4cfb" + version = "v4.5.0" + +[[projects]] + name = "gopkg.in/warnings.v0" + packages = ["."] + revision = "ec4a0fea49c7b46c2aeb0b51aac55779c607e52b" + version = "v0.1.2" + +[[projects]] + name = "gopkg.in/yaml.v2" + packages = ["."] + revision = "5420a8b6744d3b0345ab293f6fcba19c978f1183" + version = "v2.2.1" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + inputs-digest = "c1abc3be2fdd175bfed92d2876f8dc1638a3c7cb7ff9090d71ccd023a1a6296e" + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/Makefile b/Makefile index 6a1225f..0ebd19a 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,6 @@ PROJECT_NAME := Pulumi Azure Serverless Components SUB_PROJECTS := nodejs/azure-serverless include build/common.mk - .PHONY: publish_tgz publish_tgz: $(call STEP_MESSAGE) diff --git a/nodejs/azure-serverless/Makefile b/nodejs/azure-serverless/Makefile index d38fca4..f0b077c 100644 --- a/nodejs/azure-serverless/Makefile +++ b/nodejs/azure-serverless/Makefile @@ -19,4 +19,4 @@ lint:: tslint -c ../tslint.json -p tsconfig.json test_all:: - PATH=$(PULUMI_BIN):$(PATH) go test -v -cover -timeout 2h -parallel ${TESTPARALLELISM} . + PATH=$(PULUMI_BIN):$(PATH) go test -v -cover -timeout 2h -parallel ${TESTPARALLELISM} ./examples diff --git a/nodejs/azure-serverless/examples/azure_test.go b/nodejs/azure-serverless/examples/azure_test.go new file mode 100644 index 0000000..a81a70a --- /dev/null +++ b/nodejs/azure-serverless/examples/azure_test.go @@ -0,0 +1,60 @@ +// Copyright 2016-2018, Pulumi Corporation. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package examples + +import ( + "os" + "path" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/pulumi/pulumi/pkg/testing/integration" +) + +func Test_Examples(t *testing.T) { + environ := os.Getenv("ARM_ENVIRONMENT") + if environ == "" { + t.Skipf("Skipping test due to missing ARM_ENVIRONMENT variable") + } + cwd, err := os.Getwd() + if !assert.NoError(t, err, "expected a valid working directory: %v", err) { + return + } + + // base options shared amongst all tests. + base := integration.ProgramTestOptions{ + Config: map[string]string{ + "azure:environment": environ, + }, + Dependencies: []string{ + "@pulumi/azure-serverless", + }, + } + + examples := []integration.ProgramTestOptions{ + base.With(integration.ProgramTestOptions{Dir: path.Join(cwd, "blob")}), + } + + for _, ex := range examples { + example := ex.With(integration.ProgramTestOptions{ + ReportStats: integration.NewS3Reporter("us-west-2", "eng.pulumi.com", "testreports"), + Tracing: "https://tracing.pulumi-engineering.com/collector/api/v1/spans", + }) + t.Run(example.Dir, func(t *testing.T) { + integration.ProgramTest(t, &example) + }) + } +} diff --git a/nodejs/azure-serverless/examples/blob/.gitignore b/nodejs/azure-serverless/examples/blob/.gitignore new file mode 100644 index 0000000..c695889 --- /dev/null +++ b/nodejs/azure-serverless/examples/blob/.gitignore @@ -0,0 +1,2 @@ +/bin/ +/node_modules/ diff --git a/nodejs/azure-serverless/examples/blob/Pulumi.yaml b/nodejs/azure-serverless/examples/blob/Pulumi.yaml new file mode 100644 index 0000000..18b9bce --- /dev/null +++ b/nodejs/azure-serverless/examples/blob/Pulumi.yaml @@ -0,0 +1,3 @@ +name: azure-blob +runtime: nodejs +description: Work with Azure Blobs diff --git a/nodejs/azure-serverless/examples/blob/index.ts b/nodejs/azure-serverless/examples/blob/index.ts new file mode 100644 index 0000000..387fcf8 --- /dev/null +++ b/nodejs/azure-serverless/examples/blob/index.ts @@ -0,0 +1,34 @@ +// Copyright 2016-2017, Pulumi Corporation. All rights reserved. + +import * as pulumi from "@pulumi/pulumi"; +import * as azure from "@pulumi/azure"; +import * as serverless from "@pulumi/azure-serverless"; + + +const resourceGroup = new azure.core.ResourceGroup("resourcegroup", { + location: "West US 2", +}); +// Create a storage account for our images +const storageAccount = new azure.storage.Account("storage", { + resourceGroupName: resourceGroup.name, + location: resourceGroup.location, + accountReplicationType: "LRS", + accountTier: "Standard", +}); + +// And a container to use to upload images into +const storageContainer = new azure.storage.Container("images-container", { + resourceGroupName: resourceGroup.name, + storageAccountName: storageAccount.name, + name: "images", +}); + +// When a new PNG image is added, fire an event +serverless.storage.onBlobEvent("newImage", storageAccount, (context, blob) => { + context.log(context); + context.log(blob); + context.done(); +}, { containerName: storageContainer.name, filterSuffix: ".png", resourceGroup: resourceGroup}); + +// The storage account where images should be uploaded +export let storageAccountName = storageAccount.name; \ No newline at end of file diff --git a/nodejs/azure-serverless/examples/blob/package.json b/nodejs/azure-serverless/examples/blob/package.json new file mode 100644 index 0000000..4ed8109 --- /dev/null +++ b/nodejs/azure-serverless/examples/blob/package.json @@ -0,0 +1,22 @@ +{ + "name": "azure-blob", + "main": "bin/index.js", + "typings": "bin/index.d.ts", + "scripts": { + "build": "tsc" + }, + "dependencies": { + "@pulumi/pulumi": "^0.14.0", + "@pulumi/azure": "^0.14.2", + "mime-types": "^2.1.19" + }, + "devDependencies": { + "@types/node": "^8.0.26", + "typescript": "^2.5.3", + "azure-functions-ts-essentials": "^1.3.2" + }, + "peerDependencies": { + "@pulumi/azure-serverless": "latest" + }, + "license": "Apache 2.0" +} diff --git a/nodejs/azure-serverless/examples/blob/tsconfig.json b/nodejs/azure-serverless/examples/blob/tsconfig.json new file mode 100644 index 0000000..ae4e90d --- /dev/null +++ b/nodejs/azure-serverless/examples/blob/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "outDir": "bin", + "target": "es6", + "module": "commonjs", + "moduleResolution": "node", + "sourceMap": true, + "experimentalDecorators": true, + "pretty": true, + "noFallthroughCasesInSwitch": true, + "noImplicitAny": true, + "noImplicitReturns": true, + "forceConsistentCasingInFileNames": true, + "strictNullChecks": true + }, + "files": [ + "index.ts" + ] +} diff --git a/nodejs/azure-serverless/examples/blob/yarn.lock b/nodejs/azure-serverless/examples/blob/yarn.lock new file mode 100644 index 0000000..8de0972 --- /dev/null +++ b/nodejs/azure-serverless/examples/blob/yarn.lock @@ -0,0 +1,641 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + +"@pulumi/azure@^0.14.2": + version "0.14.2" + resolved "https://registry.yarnpkg.com/@pulumi/azure/-/azure-0.14.2.tgz#fecbb82f118d9bbec0efd63cf0d5a6415f04e21a" + dependencies: + "@pulumi/pulumi" "^0.14.0" + +"@pulumi/pulumi@^0.14.0": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@pulumi/pulumi/-/pulumi-0.14.3.tgz#dc2f26d18814a12488574d56b0dc5251673c41df" + dependencies: + google-protobuf "^3.5.0" + grpc "^1.12.2" + minimist "^1.2.0" + protobufjs "^6.8.6" + require-from-string "^2.0.1" + source-map-support "^0.4.16" + typescript "^2.5.2" + +"@types/long@^3.0.32": + version "3.0.32" + resolved "https://registry.yarnpkg.com/@types/long/-/long-3.0.32.tgz#f4e5af31e9e9b196d8e5fca8a5e2e20aa3d60b69" + +"@types/node@^8.0.26": + version "8.0.26" + resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.26.tgz#4d58be925306fd22b1141085535a0268b8beb189" + +"@types/node@^8.9.4": + version "8.10.17" + resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.17.tgz#d48cf10f0dc6dcf59f827f5a3fc7a4a6004318d3" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +ascli@~1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ascli/-/ascli-1.0.1.tgz#bcfa5974a62f18e81cabaeb49732ab4a88f906bc" + dependencies: + colour "~0.7.1" + optjs "~3.2.2" + +azure-functions-ts-essentials@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/azure-functions-ts-essentials/-/azure-functions-ts-essentials-1.3.2.tgz#a0917842ef700125411289e0c5c2f04e0d961d7c" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +bytebuffer@~5: + version "5.0.1" + resolved "https://registry.yarnpkg.com/bytebuffer/-/bytebuffer-5.0.1.tgz#582eea4b1a873b6d020a48d58df85f0bba6cfddd" + dependencies: + long "~3" + +camelcase@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + +chownr@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" + +cliui@^3.0.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +colour@~0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/colour/-/colour-0.7.1.tgz#9cb169917ec5d12c0736d3e8685746df1cadf778" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +debug@^2.1.2: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +decamelize@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + dependencies: + minipass "^2.2.1" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +glob@^7.0.5: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + 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" + +google-protobuf@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.5.0.tgz#b8cc63c74d83457bd8a9a904503c8efb26bca339" + +grpc@^1.12.2: + version "1.12.3" + resolved "https://registry.yarnpkg.com/grpc/-/grpc-1.12.3.tgz#b38bf05f26477d42f8285794c0b1f8b8c0b6dec3" + dependencies: + lodash "^4.17.5" + nan "^2.0.0" + node-pre-gyp "^0.10.0" + protobufjs "^5.0.3" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +iconv-lite@^0.4.4: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + dependencies: + minimatch "^3.0.4" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +lodash@^4.17.5: + version "4.17.10" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + +long@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + +long@~3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" + +mime-db@~1.35.0: + version "1.35.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47" + +mime-types@^2.1.19: + version "2.1.19" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0" + dependencies: + mime-db "~1.35.0" + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minipass@^2.2.1, minipass@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" + dependencies: + minipass "^2.2.1" + +mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +nan@^2.0.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" + +needle@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + +node-pre-gyp@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz#6e4ef5bb5c5203c6552448828c852c40111aac46" + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.0" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.1.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +npm-bundled@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" + +npm-packlist@^1.1.6: + version "1.1.10" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a" + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +optjs@~3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/optjs/-/optjs-3.2.2.tgz#69a6ce89c442a44403141ad2f9b370bd5bb6f4ee" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-tmpdir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + +protobufjs@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-5.0.3.tgz#e4dfe9fb67c90b2630d15868249bcc4961467a17" + dependencies: + ascli "~1" + bytebuffer "~5" + glob "^7.0.5" + yargs "^3.10.0" + +protobufjs@^6.8.6: + version "6.8.6" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.8.6.tgz#ce3cf4fff9625b62966c455fc4c15e4331a11ca2" + dependencies: + "@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" "^3.0.32" + "@types/node" "^8.9.4" + long "^4.0.0" + +rc@^1.1.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +readable-stream@^2.0.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + dependencies: + 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" + +require-from-string@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + +rimraf@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + dependencies: + glob "^7.0.5" + +safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + +semver@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +source-map-support@^0.4.16: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + dependencies: + source-map "^0.5.6" + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +tar@^4: + version "4.4.4" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd" + dependencies: + chownr "^1.0.1" + fs-minipass "^1.2.5" + minipass "^2.3.3" + minizlib "^1.1.0" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + +typescript@^2.5.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.3.tgz#5d817f9b6f31bb871835f4edf0089f21abe6c170" + +typescript@^2.5.3: + version "2.5.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.5.3.tgz#df3dcdc38f3beb800d4bc322646b04a3f6ca7f0d" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + dependencies: + string-width "^1.0.2 || 2" + +window-size@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +y18n@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" + +yargs@^3.10.0: + version "3.32.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" + dependencies: + camelcase "^2.0.1" + cliui "^3.0.3" + decamelize "^1.1.1" + os-locale "^1.4.0" + string-width "^1.0.1" + window-size "^0.1.4" + y18n "^3.2.0" diff --git a/nodejs/azure-serverless/functionApp.ts b/nodejs/azure-serverless/functionApp.ts index 19a1b90..810433a 100644 --- a/nodejs/azure-serverless/functionApp.ts +++ b/nodejs/azure-serverless/functionApp.ts @@ -16,7 +16,7 @@ import * as azure from "@pulumi/azure"; import * as pulumi from "@pulumi/pulumi"; import * as azurefunctions from "azure-functions-ts-essentials"; -import * as azurestorage from "azure-storage"; +import { signedBlobReadUrl } from "./util"; export type Context = azurefunctions.Context; export type HttpRequest = azurefunctions.HttpRequest; @@ -24,38 +24,6 @@ export * from "azure-functions-ts-essentials"; export type AzureFunctionHandler = (context: Context, request: HttpRequest) => void; -function signedBlobReadUrl( - blob: azure.storage.Blob | azure.storage.ZipBlob, - account: azure.storage.Account, - container: azure.storage.Container, -): pulumi.Output { - // Choose a fixed, far-future expiration date for signed blob URLs. - // The shared access signature (SAS) we generate for the Azure storage blob must remain valid for as long as the - // Function App is deployed, since new instances will download the code on startup. By using a fixed date, rather - // than (e.g.) "today plus ten years", the signing operation is idempotent. - const signatureExpiration = new Date(2100, 1); - - return pulumi.all([ - account.primaryConnectionString, - container.name, - blob.name, - ]).apply(([connectionString, containerName, blobName]) => { - const blobService = new azurestorage.BlobService(connectionString); - const signature = blobService.generateSharedAccessSignature( - containerName, - blobName, - { - AccessPolicy: { - Expiry: signatureExpiration, - Permissions: azurestorage.BlobUtilities.SharedAccessPermissions.READ, - }, - }, - ); - - return blobService.getUrl(containerName, blobName, signature); - }); -} - async function blobContent(name: string, handler: AzureFunctionHandler): Promise { const serializedHandler = await pulumi.runtime.serializeFunction(handler); const map: pulumi.asset.AssetMap = {}; diff --git a/nodejs/azure-serverless/index.ts b/nodejs/azure-serverless/index.ts index 139cb0a..7018a4c 100644 --- a/nodejs/azure-serverless/index.ts +++ b/nodejs/azure-serverless/index.ts @@ -13,10 +13,6 @@ // limitations under the License. import * as functionApp from "./functionApp"; +import * as storage from "./storage"; -// import * as apigateway from "./api"; -// import * as bucket from "./bucket"; -// import * as cloudwatch from "./cloudwatch"; -// import * as topic from "./topic"; - -// export { apigateway, bucket, cloudwatch, topic }; +export { storage, functionApp }; diff --git a/nodejs/azure-serverless/package.json b/nodejs/azure-serverless/package.json index f9a15f1..9ebac1e 100644 --- a/nodejs/azure-serverless/package.json +++ b/nodejs/azure-serverless/package.json @@ -1,7 +1,7 @@ { "name": "@pulumi/azure-serverless", "version": "${VERSION}", - "description": "Pulumi Azure Serverless Components.", + "description": "Pulumi Azure Serverless Components.", "keywords": [ "pulumi", "azure", @@ -12,11 +12,11 @@ "dependencies": { "@pulumi/azure": "^0.14.0-rc1", "@pulumi/pulumi": "^0.14.0-rc1", - "azure-storage": "^2.9.0-preview" + "read-package-tree": "^5.2.1", + "azure-functions-ts-essentials": "^1.3.2" }, "devDependencies": { "@types/node": "^8.0.26", - "azure-functions-ts-essentials": "^1.3.2", "tslint": "^5.7.0", "typescript": "^2.6.2" } diff --git a/nodejs/azure-serverless/storage/account.ts b/nodejs/azure-serverless/storage/account.ts new file mode 100644 index 0000000..04f533b --- /dev/null +++ b/nodejs/azure-serverless/storage/account.ts @@ -0,0 +1,194 @@ +// Copyright 2016-2018, Pulumi Corporation. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import * as azure from "@pulumi/azure"; +import * as pulumi from "@pulumi/pulumi"; +import * as subscription from "../subscription"; + +interface BlobBinding extends subscription.Binding { + /** + * The name of the property in the context object to bind the actual blob value to. Not really + * important in our implementation as the blob value will be passed as the second argument to + * the callback function. + */ + name: string; + + /** + * The type of a blob binding. Must be 'blobTrigger'. + */ + type: "blobTrigger"; + + /** + * The direction of the binding. We only 'support' blobs being inputs to functions. + */ + direction: "in"; + + /** + * How we want the blob represented when passed into the callback. We specify 'binary' + * so that all data is passed in as a buffer. Otherwise, Azure will attempt to sniff + * the content and convert it accordingly. This gives us a consistent way to know what + * data will be passed into the function. + */ + dataType: "binary"; + + /** + * The path to the blob we want to create a trigger for. + */ + path: string; + + /** + * The storage connection string for the storage account containing the blob. + */ + connection: string; +} + +/** + * Data that will be passed along in the context object to the BlobCallback. + */ +export interface BlobContext extends subscription.Context { + executionContext: { + invocationId: string; + functionName: string; + functionDirectory: string; + }; + + "bindingData": { + "blobTrigger": string; + "uri": string; + "properties": { + "cacheControl": any, + "contentDisposition": any, + "contentEncoding": any, + "contentLanguage": any, + "length": number, + "contentMD5": any, + "contentType": string, + "eTag": string, + "lastModified": string, + "blobType": string, + "leaseStatus": string, + "leaseState": string, + "leaseDuration": string, + "pageBlobSequenceNumber": any, + "appendBlobCommittedBlockCount": any, + "isServerEncrypted": boolean, + }, + "metadata": Record, + "sys": { + "methodName": string, + "utcNow": string, + }, + "invocationId": string, + }; +} + +/** + * Signature of the callback that can receive blob notifications. + */ +export type BlobCallback = subscription.Callback; + +export interface BlobEventSubscriptionArgs extends subscription.EventSubscriptionArgs { + /** + * A full path specifying which blob to register events for. For more information on this see: + * https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-blob + * + * If provided, [containerName], [filterPrefix] and [filterSuffix] should not be provided. + */ + path?: pulumi.Input; + + /** + * The name of the container to listen to events for. Must be provided if [path] + * is not provided. + */ + containerName?: pulumi.Input; + + /** + * An optional prefix or suffix to filter down notifications. See + * https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-blob#trigger---blob-name-patterns + * for more details. + * + * Only valid with [containerName] + */ + filterPrefix?: pulumi.Input; + filterSuffix?: pulumi.Input; +} + +/** + * Creates a new subscription to the given blob using the callback provided, along with optional + * options to control the behavior of the subscription. + */ +export async function onBlobEvent( + name: string, account: azure.storage.Account, callback: BlobCallback, + args: BlobEventSubscriptionArgs, opts?: pulumi.ResourceOptions): Promise { + + args = args || {}; + + let path: pulumi.Input; + if (args.path) { + path = args.path; + } else if (args.containerName) { + const prefix = args.filterPrefix || ""; + const suffix = args.filterSuffix || ""; + + path = pulumi.all([args.containerName, prefix, suffix]).apply( + ([cn, pr, su]) => cn + `/${pr}{blobName}${su}`); + } else { + throw new pulumi.RunError("Either [path] or [containerName] must be present in [args]"); + } + + // The blob binding does not store the storage connection string directly. Instead, the + // connection string is put into the app settings (under whatever key we want). Then, the + // .connection property of the binding contains the *name* of that app setting key. + const bindingConnectionKey = "BindingConnectionAppSettingsKey"; + + const bindings = pulumi.output(path).apply(p => { + const blobBinding: BlobBinding = { + name: "blob", + type: "blobTrigger", + direction: "in", + dataType: "binary", + path: p, + connection: bindingConnectionKey, + }; + + return [blobBinding]; + }); + + // Place the mapping from the well known key name to the storage account connection string in + // the 'app settings' object. + const appSettingsOutput = args.appSettings || pulumi.output({}); + + args.appSettings = pulumi.all([appSettingsOutput, account.primaryConnectionString]).apply( + ([appSettings, connectionString]) => { + appSettings[bindingConnectionKey] = connectionString; + return appSettings; + }); + + return new BlobEventSubscription(name, account, callback, bindings, args, opts); +} + +export class BlobEventSubscription extends subscription.EventSubscription { + readonly account: azure.storage.Account; + + constructor( + name: string, account: azure.storage.Account, + callback: BlobCallback, bindings: pulumi.Output, + args: subscription.EventSubscriptionArgs, options?: pulumi.ResourceOptions) { + + super("azure-serverless:account:BlobEventSubscription", name, callback, + bindings, args, options); + + this.account = account; + } +} diff --git a/nodejs/azure-serverless/storage/index.ts b/nodejs/azure-serverless/storage/index.ts new file mode 100644 index 0000000..3196122 --- /dev/null +++ b/nodejs/azure-serverless/storage/index.ts @@ -0,0 +1,15 @@ +// Copyright 2016-2018, Pulumi Corporation. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +export { onBlobEvent } from "./account"; diff --git a/nodejs/azure-serverless/subscription.ts b/nodejs/azure-serverless/subscription.ts new file mode 100644 index 0000000..2dfc8bf --- /dev/null +++ b/nodejs/azure-serverless/subscription.ts @@ -0,0 +1,316 @@ +// Copyright 2016-2018, Pulumi Corporation. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import * as azure from "@pulumi/azure"; +import * as pulumi from "@pulumi/pulumi"; +import * as fs from "fs"; +import * as filepath from "path"; + +import * as azurefunctions from "azure-functions-ts-essentials"; +import { signedBlobReadUrl } from "./util"; + +export interface Context extends azurefunctions.Context { + log: { + (...message: Array): void; + error(...message: Array): void; + warn(...message: Array): void; + info(...message: Array): void; + verbose(...message: Array): void; + metric(...message: Array): void; + }; +} + +/** + * A synchronous function that can be converted into an Azure FunctionApp. This callback should + * return nothing, and should signal that it is done by calling `context.Done()`. Errors can be + * signified by calling `context.Done(err)` + */ +export type Callback = (context: C, data: Data) => void; + +export interface EventSubscriptionArgs { + /** + * The resource group to create the serverless FunctionApp within. If not provided, a new + * resource group will be created with the same name as the pulumi resource. It will be created + * in the region specified by the config variable "azure:region" + */ + resourceGroup: azure.core.ResourceGroup; + + /** + * The storage account to use where the zip-file blob for the FunctionApp will be located. If + * not provided, a new storage account will create. It will be a 'Standard', 'LRS', 'StorageV2' + * account. + */ + storageAccount?: azure.storage.Account; + + /** + * The container to use where the zip-file blob for the FunctionApp will be located. If not + * provided, the root container of the storage account will be used. + */ + storageContainer?: azure.storage.Container; + + /** + * The consumption plan to put the FunctionApp in. If not provided, a 'Dynamic', 'Y1' plan will + * be used. See https://social.msdn.microsoft.com/Forums/azure/en-US/665c365d-2b86-4a77-8cea-72ccffef216c for + * additional details. + */ + appServicePlan?: azure.appservice.Plan; + + /** + * A key-value map to use as the 'App Settings' for this function. + */ + appSettings?: pulumi.Output>; +} + +/** + * Represents a Binding that will be emitted into the function.json config file for the FunctionApp. + * Individual services will have more specific information they will define in their own bindings. + */ +export interface Binding { + type: string; + direction: string; + name: string; +} + +/** + * Takes in a callback and a set of bindings, and produces the right AssetMap layout that Azure + * FunctionApps expect. + */ +function serializeCallback( + name: string, + handler: Callback, + bindingsOutput: pulumi.Input, + ): pulumi.Output { + + const includedPackages = new Set(); + const excludedPackages = new Set(); + + const pathSetOutput = pulumi.output(allFoldersForPackages(includedPackages, excludedPackages)); + + const serializedHandlerOutput = pulumi.output(pulumi.runtime.serializeFunction(handler)); + return pulumi.all([bindingsOutput, serializedHandlerOutput, pathSetOutput]).apply(([bindings, serializedHandler, pathSet]) => { + const map: pulumi.asset.AssetMap = {}; + map["host.json"] = new pulumi.asset.StringAsset(JSON.stringify({ + "tracing": { + "consoleLevel": "verbose", + }, + })); + + map[`${name}/function.json`] = new pulumi.asset.StringAsset(JSON.stringify({ + "disabled": false, + "bindings": bindings, + })); + map[`${name}/index.js`] = new pulumi.asset.StringAsset(`module.exports = require("./handler").handler`), + map[`${name}/handler.js`] = new pulumi.asset.StringAsset(serializedHandler.text); + + // TODO: unify this code with aws-serverless instead of straight copying. + // For each of the required paths, add the corresponding FileArchive or FileAsset to the AssetMap. + for (const path of pathSet.values()) { + // The Asset model does not support a consistent way to embed a file-or-directory into an `AssetArchive`, so + // we stat the path to figure out which it is and use the appropriate Asset constructor. + const stats = fs.lstatSync(path); + if (stats.isDirectory()) { + map[name + "/" + path] = new pulumi.asset.FileArchive(path); + } else { + map[name + "/" + path] = new pulumi.asset.FileAsset(path); + } + } + + return map; + }); +} + +// Package is a node in the package tree returned by readPackageTree. +interface Package { + name: string; + path: string; + package: { + dependencies?: { [key: string]: string; }; + }; + parent?: Package; + children: Package[]; +} + +const readPackageTree = require("read-package-tree"); + +// allFolders computes the set of package folders that are transitively required by the root +// 'dependencies' node in the client's project.json file. +function allFoldersForPackages(includedPackages: Set, excludedPackages: Set): Promise> { + return new Promise((resolve, reject) => { + readPackageTree(".", undefined, (err: any, root: Package) => { + if (err) { + return reject(err); + } + + // This is the core starting point of the algorithm. We use readPackageTree to get the + // package.json information for this project, and then we start by walking the + // .dependencies node in that package. Importantly, we do not look at things like + // .devDependencies or or .peerDependencies. These are not what are considered part of + // the final runtime configuration of the app and should not be uploaded. + const referencedPackages = new Set(includedPackages); + if (root.package && root.package.dependencies) { + for (const depName of Object.keys(root.package.dependencies)) { + referencedPackages.add(depName); + } + } + + const packagePaths = new Set(); + for (const pkg of referencedPackages) { + addPackageAndDependenciesToSet(root, pkg, packagePaths, excludedPackages); + } + + resolve(packagePaths); + }); + }); +} + +// addPackageAndDependenciesToSet adds all required dependencies for the requested pkg name from the given root package +// into the set. It will recurse into all dependencies of the package. +function addPackageAndDependenciesToSet( + root: Package, pkg: string, packagePaths: Set, excludedPackages: Set) { + // Don't process this packages if it was in the set the user wants to exclude. + + // Also, exclude it if it's an @pulumi package. These packages are intended for deployment + // time only and will only bloat up the serialized lambda package. + if (excludedPackages.has(pkg) || + pkg.startsWith("@pulumi")) { + + return; + } + + const child = findDependency(root, pkg); + if (!child) { + console.warn(`Could not include required dependency '${pkg}' in '${filepath.resolve(root.path)}'.`); + return; + } + + packagePaths.add(child.path); + if (child.package.dependencies) { + for (const dep of Object.keys(child.package.dependencies) ) { + addPackageAndDependenciesToSet(child, dep, packagePaths, excludedPackages); + } + } +} + +// findDependency searches the package tree starting at a root node (possibly a child) for a match for the given name. +// It is assumed that the tree was correctly construted such that dependencies are resolved to compatible versions in +// the closest available match starting at the provided root and walking up to the head of the tree. +function findDependency(root: Package, name: string) { + for (; root; root = root.parent!) { + for (const child of root.children) { + let childName = child.name; + // Note: `read-package-tree` returns incorrect `.name` properties for packages in an orgnaization - like + // `@types/express` or `@protobufjs/path`. Compute the correct name from the `path` property instead. Match + // any name that ends with something that looks like `@foo/bar`, such as `node_modules/@foo/bar` or + // `node_modules/baz/node_modules/@foo/bar. + const childFolderName = filepath.basename(child.path); + const parentFolderName = filepath.basename(filepath.dirname(child.path)); + if (parentFolderName[0] === "@") { + childName = filepath.join(parentFolderName, childFolderName); + } + if (childName === name) { + return child; + } + } + } + + return undefined; +} + +/** + * Base type for all subscription types. + */ +export class EventSubscription extends pulumi.ComponentResource { + readonly resourceGroup: azure.core.ResourceGroup; + readonly storageAccount: azure.storage.Account; + readonly storageContainer: azure.storage.Container; + readonly appServicePlan: azure.appservice.Plan; + + /** + * The FunctionApp instance created to respond to the specific Binding triggers. The + * code for it will be produced by serializing out the 'callback' parameter using pulumi + * serialization. + */ + readonly functionApp: azure.appservice.FunctionApp; + + constructor(type: string, name: string, callback: Callback, bindings: pulumi.Input, + args: EventSubscriptionArgs, options?: pulumi.ResourceOptions) { + super(type, name, {}, options); + + const parentArgs = { parent: this }; + + const appSettings = args.appSettings || pulumi.output({}); + + if (!args.resourceGroup) { + throw new pulumi.RunError("[resourceGroup] must be provided in [args]."); + } + + this.resourceGroup = args.resourceGroup; + + const resourceGroupArgs = { + resourceGroupName: this.resourceGroup.name, + location: this.resourceGroup.location, + }; + + this.storageAccount = args.storageAccount || new azure.storage.Account(`${name}`, { + ...resourceGroupArgs, + + accountKind: "StorageV2", + accountTier: "Standard", + accountReplicationType: "LRS", + }, parentArgs); + + this.storageContainer = args.storageContainer || new azure.storage.Container(`${name}`, { + resourceGroupName: this.resourceGroup.name, + storageAccountName: this.storageAccount.name, + containerAccessType: "private", + }, parentArgs); + + this.appServicePlan = args.appServicePlan || new azure.appservice.Plan(`${name}`, { + ...resourceGroupArgs, + + kind: "FunctionApp", + + sku: { + tier: "Dynamic", + size: "Y1", + }, + }, parentArgs); + + const assetMap = serializeCallback(name, callback, bindings); + + // const appSettings = assetAndAppSettings.apply(a => a.appSettings); + + const blob = new azure.storage.ZipBlob(`${name}`, { + resourceGroupName: this.resourceGroup.name, + storageAccountName: this.storageAccount.name, + storageContainerName: this.storageContainer.name, + type: "block", + content: assetMap.apply(m => new pulumi.asset.AssetArchive(m)), + }, parentArgs); + + const codeBlobUrl = signedBlobReadUrl(blob, this.storageAccount, this.storageContainer); + + this.functionApp = new azure.appservice.FunctionApp(`${name}`, { + ...resourceGroupArgs, + + appServicePlanId: this.appServicePlan.id, + storageConnectionString: this.storageAccount.primaryConnectionString, + + appSettings: appSettings.apply(settings => ({ + ...settings, + "WEBSITE_RUN_FROM_ZIP": codeBlobUrl, + })), + }, parentArgs); + } +} diff --git a/nodejs/azure-serverless/util.ts b/nodejs/azure-serverless/util.ts new file mode 100644 index 0000000..e59b657 --- /dev/null +++ b/nodejs/azure-serverless/util.ts @@ -0,0 +1,59 @@ +// Copyright 2016-2018, Pulumi Corporation. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import * as azure from "@pulumi/azure"; +import * as pulumi from "@pulumi/pulumi"; + +export function signedBlobReadUrl( + blob: azure.storage.Blob | azure.storage.ZipBlob, + account: azure.storage.Account, + container: azure.storage.Container, +): pulumi.Output { + // Choose a fixed, far-past and far-future expiration date for signed blob URLs. + // The shared access signature (SAS) we generate for the Azure storage blob must remain valid for as long as the + // Function App is deployed, since new instances will download the code on startup. By using a fixed date, rather + // than (e.g.) "today plus ten years", the signing operation is idempotent. + const signatureStart = new Date(0); + const signatureExpiration = new Date(2100, 1); + + return blob.url.apply(async (blobUrl) => { + const accountSAS = await azure.storage.getAccountSAS({ + connectionString: account.primaryConnectionString, + start: signatureStart.toISOString(), + expiry: signatureExpiration.toISOString(), + permissions: { + read: true, + write: false, + create: false, + add: false, + list: false, + delete: false, + update: false, + process: false, + }, + services: { + blob: true, + file: false, + queue: false, + table: false, + }, + resourceTypes: { + object: true, + container: false, + service: false, + }, + }); + return blobUrl + accountSAS.sas; + }); +} diff --git a/nodejs/azure-serverless/yarn.lock b/nodejs/azure-serverless/yarn.lock index 8af1868..3b21373 100644 --- a/nodejs/azure-serverless/yarn.lock +++ b/nodejs/azure-serverless/yarn.lock @@ -75,15 +75,6 @@ abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" -ajv@^5.1.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" - ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -119,6 +110,10 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +asap@^2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + ascli@~1: version "1.0.1" resolved "https://registry.yarnpkg.com/ascli/-/ascli-1.0.1.tgz#bcfa5974a62f18e81cabaeb49732ab4a88f906bc" @@ -126,46 +121,10 @@ ascli@~1: colour "~0.7.1" optjs "~3.2.2" -asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - -aws4@^1.6.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" - azure-functions-ts-essentials@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/azure-functions-ts-essentials/-/azure-functions-ts-essentials-1.3.2.tgz#a0917842ef700125411289e0c5c2f04e0d961d7c" -azure-storage@^2.9.0-preview: - version "2.9.0-preview" - resolved "https://registry.yarnpkg.com/azure-storage/-/azure-storage-2.9.0-preview.tgz#358a881a803d433bc4b96936cbbdc41ed841d672" - dependencies: - browserify-mime "~1.2.9" - extend "~1.2.1" - json-edm-parser "0.1.2" - md5.js "1.3.4" - readable-stream "~2.0.0" - request "^2.86.0" - underscore "~1.8.3" - uuid "^3.0.0" - validator "~9.4.1" - xml2js "0.2.8" - xmlbuilder "0.4.3" - babel-code-frame@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -178,12 +137,6 @@ balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" -bcrypt-pbkdf@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" - dependencies: - tweetnacl "^0.14.3" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -191,11 +144,7 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -browserify-mime@~1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/browserify-mime/-/browserify-mime-1.2.9.tgz#aeb1af28de6c0d7a6a2ce40adb68ff18422af31f" - -builtin-modules@^1.1.1: +builtin-modules@^1.0.0, builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -209,10 +158,6 @@ camelcase@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -243,10 +188,6 @@ cliui@^3.0.3: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" @@ -265,12 +206,6 @@ colour@~0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/colour/-/colour-0.7.1.tgz#9cb169917ec5d12c0736d3e8685746df1cadf778" -combined-stream@1.0.6, combined-stream@~1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" - dependencies: - delayed-stream "~1.0.0" - commander@^2.12.1: version "2.15.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" @@ -283,22 +218,20 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" -core-util-is@1.0.2, core-util-is@~1.0.0: +core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - dependencies: - assert-plus "^1.0.0" - debug@^2.1.2: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: ms "2.0.0" +debuglog@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" + decamelize@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -307,10 +240,6 @@ deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" @@ -319,16 +248,17 @@ detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" +dezalgo@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" + dependencies: + asap "^2.0.0" + wrappy "1" + diff@^3.2.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" -ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" - dependencies: - jsbn "~0.1.0" - escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -341,42 +271,6 @@ esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" -extend@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-1.2.1.tgz#a0f5fd6cfc83a5fe49ef698d60ec8a624dd4576c" - -extend@~3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - -fast-deep-equal@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" - -fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - -form-data@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" - dependencies: - asynckit "^0.4.0" - combined-stream "1.0.6" - mime-types "^2.1.12" - fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" @@ -400,12 +294,6 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - dependencies: - assert-plus "^1.0.0" - glob@^7.0.5, glob@^7.1.1: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" @@ -421,6 +309,10 @@ google-protobuf@^3.5.0: version "3.6.0" resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.6.0.tgz#e2bafb00c20a8734174d8f89e0a842709e2ceed0" +graceful-fs@^4.1.2: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + grpc@^1.12.2: version "1.12.4" resolved "https://registry.yarnpkg.com/grpc/-/grpc-1.12.4.tgz#85a3bc26dbf61fb8555d182aec42c1ab6b303ecd" @@ -430,17 +322,6 @@ grpc@^1.12.2: node-pre-gyp "^0.10.0" protobufjs "^5.0.3" -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - -har-validator@~5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" - dependencies: - ajv "^5.1.0" - har-schema "^2.0.0" - has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -455,20 +336,9 @@ has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" -hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" +hosted-git-info@^2.1.4: + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" iconv-lite@^0.4.4: version "0.4.23" @@ -489,7 +359,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -501,6 +371,12 @@ invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" @@ -511,18 +387,10 @@ is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" @@ -534,40 +402,9 @@ js-yaml@^3.7.0: argparse "^1.0.7" esprima "^4.0.0" -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - -json-edm-parser@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/json-edm-parser/-/json-edm-parser-0.1.2.tgz#1e60b0fef1bc0af67bc0d146dfdde5486cd615b4" - dependencies: - jsonparse "~1.2.0" - -json-schema-traverse@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - -jsonparse@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.2.0.tgz#5c0c5685107160e72fe7489bddea0b44c2bc67bd" - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" lcid@^1.0.0: version "1.0.0" @@ -587,23 +424,6 @@ long@~3: version "3.2.0" resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" -md5.js@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -mime-db@~1.33.0: - version "1.33.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" - -mime-types@^2.1.12, mime-types@~2.1.17: - version "2.1.18" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" - dependencies: - mime-db "~1.33.0" - minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -675,6 +495,15 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" +normalize-package-data@^2.0.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + npm-bundled@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" @@ -699,10 +528,6 @@ number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" -oauth-sign@~0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -746,14 +571,6 @@ path-parse@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" @@ -785,14 +602,6 @@ protobufjs@^6.8.6: "@types/node" "^8.9.4" long "^4.0.0" -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - -qs@~6.5.1: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -802,6 +611,27 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" +read-package-json@^2.0.0: + version "2.0.13" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.13.tgz#2e82ebd9f613baa6d2ebe3aa72cefe3f68e41f4a" + dependencies: + glob "^7.1.1" + json-parse-better-errors "^1.0.1" + normalize-package-data "^2.0.0" + slash "^1.0.0" + optionalDependencies: + graceful-fs "^4.1.2" + +read-package-tree@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.2.1.tgz#6218b187d6fac82289ce4387bbbaf8eef536ad63" + dependencies: + debuglog "^1.0.1" + dezalgo "^1.0.0" + once "^1.3.0" + read-package-json "^2.0.0" + readdir-scoped-modules "^1.0.0" + readable-stream@^2.0.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" @@ -814,41 +644,14 @@ readable-stream@^2.0.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@~2.0.0: - version "2.0.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" +readdir-scoped-modules@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~0.10.x" - util-deprecate "~1.0.1" - -request@^2.86.0: - version "2.87.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.6.0" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" - forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" - performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - tough-cookie "~2.3.3" - tunnel-agent "^0.6.0" - uuid "^3.1.0" + debuglog "^1.0.1" + dezalgo "^1.0.0" + graceful-fs "^4.1.2" + once "^1.3.0" require-from-string@^2.0.1: version "2.0.2" @@ -866,23 +669,19 @@ rimraf@^2.6.1: dependencies: glob "^7.0.5" -safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2: +"safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" -sax@0.5.x: - version "0.5.8" - resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1" - sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" -semver@^5.3.0: +"semver@2 || 3 || 4 || 5", semver@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" @@ -894,6 +693,10 @@ signal-exit@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + source-map-support@^0.4.16: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" @@ -904,25 +707,32 @@ source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" +spdx-correct@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" -sshpk@^1.7.0: - version "1.14.2" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98" - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - safer-buffer "^2.0.2" - optionalDependencies: - bcrypt-pbkdf "^1.0.0" - ecc-jsbn "~0.1.1" - jsbn "~0.1.0" - tweetnacl "~0.14.0" - string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -938,10 +748,6 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -986,12 +792,6 @@ tar@^4: safe-buffer "^5.1.2" yallist "^3.0.2" -tough-cookie@~2.3.3: - version "2.3.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" - dependencies: - punycode "^1.4.1" - tslib@^1.8.0, tslib@^1.8.1: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" @@ -1019,43 +819,20 @@ tsutils@^2.12.1: dependencies: tslib "^1.8.1" -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - typescript@^2.5.2, typescript@^2.6.2: version "2.9.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" -underscore@~1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" - util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" -uuid@^3.0.0, uuid@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.0.tgz#b237147804881d7b86f40a7ff8f590f15c37de32" - -validator@~9.4.1: - version "9.4.1" - resolved "https://registry.yarnpkg.com/validator/-/validator-9.4.1.tgz#abf466d398b561cd243050112c6ff1de6cc12663" - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" +validate-npm-package-license@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" wide-align@^1.1.0: version "1.1.3" @@ -1078,16 +855,6 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" -xml2js@0.2.8: - version "0.2.8" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.2.8.tgz#9b81690931631ff09d1957549faf54f4f980b3c2" - dependencies: - sax "0.5.x" - -xmlbuilder@0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-0.4.3.tgz#c4614ba74e0ad196e609c9272cd9e1ddb28a8a58" - y18n@^3.2.0: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"