diff --git a/.circleci/config.yml b/.circleci/config.yml index 408788728750..dfbaeeaa4114 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -7,11 +7,8 @@ # To validate changes, use an online parser, eg. # http://yaml-online-parser.appspot.com/ -## IMPORTANT -# If you change the `docker_image` version, also change the `cache_key` suffix and the version of -# `com_github_bazelbuild_buildtools` in the `/WORKSPACE` file. -var_1: &docker_image angular/ngcontainer:0.3.3 -var_2: &cache_key v2-ng-mat-{{ .Branch }}-{{ checksum "package-lock.json" }}-0.3.3 +var_1: &docker_image angular/ngcontainer:0.6.0 +var_2: &cache_key v2-ng-mat-{{ .Branch }}-{{ checksum "package-lock.json" }}-0.6.0 # Define common ENV vars var_3: &define_env_vars @@ -48,9 +45,8 @@ jobs: - restore_cache: key: *cache_key - - run: bazel run @nodejs//:npm install - # TODO(jelbourn): Update this command to run all tests if the Bazel issues have been fixed. - - run: bazel test src/lib/schematics:unit_tests + # TODO(jelbourn): Update this command to run all tests if the Bazel issues have been fixed. + - run: bazel test src/{cdk,lib}/schematics:unit_tests - save_cache: key: *cache_key diff --git a/BUILD.bazel b/BUILD.bazel index 9cbc68cdf026..7f3223bc9715 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -2,49 +2,13 @@ package(default_visibility = ["//visibility:public"]) # TODO(jelbourn): figure out if these workarounds are still needed -# This rule belongs in node_modules/BUILD -# It's here as a workaround for -# https://github.com/bazelbuild/bazel/issues/374#issuecomment-296217940 -filegroup( +# TODO: Replace with fine-grained node_modules using `npm_install` / `yarn_install`. +# TODO: See https://github.com/bazelbuild/rules_nodejs/wiki#migrating-to-rules_nodejs-013 +alias( name = "node_modules", - # Performance workaround: list individual files - # Reduces the number of files as inputs to nodejs_binary: - # bazel query "deps(:node_modules)" | wc -l - # This won't scale in the general case. - # TODO(alexeagle): figure out what to do - srcs = glob(["/".join(["node_modules", pkg, "**", ext]) for pkg in [ - "@angular", - "@angular-devkit", - "@schematics", - "@types", - "bytebuffer", - "hammerjs", - "jasmine", - "minimist", - "moment", - "parse5", - "protobufjs", - "protractor", - "reflect-metadata", - "rxjs", - "tsickle", - "tslib", - "tslint", - "typescript", - "zone.js", - ] for ext in [ - "*.js", - "*.json", - "*.d.ts", - ]] + [ - "node_modules/http-server/**", - # Reference all files of the "@schematics/angular" package because the schematic - # tests depend on the template files of the angular schematics. - "node_modules/@schematics/angular/**", - ]), + actual = "@npm//:node_modules", ) - # Glob pattern that matches all Angular testing bundles. ANGULAR_TESTING = [ "node_modules/@angular/*/bundles/*-testing.umd.js", diff --git a/WORKSPACE b/WORKSPACE index df060a2a4427..f3714ea149e9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -1,44 +1,52 @@ workspace(name = "angular_material") -# Add nodejs rules +# Load NodeJS rules. Note that this is technically not needed because +# `rules_typescript_dependencies()` would also load the NodeJS rules, but we specifically need +# at least v0.14.1 which includes: https://github.com/bazelbuild/rules_nodejs/pull/341 http_archive( name = "build_bazel_rules_nodejs", - url = "https://github.com/bazelbuild/rules_nodejs/archive/0.10.1.zip", - strip_prefix = "rules_nodejs-0.10.1", - sha256 = "634206524d90dc03c52392fa3f19a16637d2bcf154910436fe1d669a0d9d7b9c", + url = "https://github.com/bazelbuild/rules_nodejs/archive/0.14.1.zip", + strip_prefix = "rules_nodejs-0.14.1", + sha256 = "813eb51733d3632f456f3bb581d940ed64e80dab417595c93bf5ad19079898e2" ) -# NOTE: this rule installs nodejs, npm, and yarn, but does NOT install -# your npm dependencies. You must still run the package manager. -load("@build_bazel_rules_nodejs//:defs.bzl", "check_bazel_version", "node_repositories") +# Add TypeScript rules +http_archive( + name = "build_bazel_rules_typescript", + url = "https://github.com/bazelbuild/rules_typescript/archive/0.18.0.zip", + strip_prefix = "rules_typescript-0.18.0", + sha256 = "4726e07a2f8d23b5e3af166f3b2a6e8aa75adad94b35ab4d959e8fe875f90272", +) -check_bazel_version("0.15.0") -node_repositories(package_json = ["//:package.json"]) +# Fetch transient dependencies of the TypeScript bazel rules. +load("@build_bazel_rules_typescript//:package.bzl", "rules_typescript_dependencies") +rules_typescript_dependencies() # Add sass rules http_archive( name = "io_bazel_rules_sass", - url = "https://github.com/bazelbuild/rules_sass/archive/0.1.0.zip", - strip_prefix = "rules_sass-0.1.0", - sha256 = "b243c4d64f054c174051785862ab079050d90b37a1cef7da93821c6981cb9ad4", + url = "https://github.com/bazelbuild/rules_sass/archive/1.13.4.zip", + strip_prefix = "rules_sass-1.13.4", + sha256 = "5ddde0d3df96978fa537f76e766538c031dee4d29f91a895f4b1345b5e3f9b16", ) load("@io_bazel_rules_sass//sass:sass_repositories.bzl", "sass_repositories") sass_repositories() -# Add TypeScript rules -http_archive( - name = "build_bazel_rules_typescript", - url = "https://github.com/bazelbuild/rules_typescript/archive/0.15.1.zip", - strip_prefix = "rules_typescript-0.15.1", - sha256 = "3792cc20ef13bb1d1d8b1760894c3320f02a87843e3a04fed7e8e454a75328b6", -) +# NOTE: this rule installs nodejs, npm, and yarn, but does NOT install +# your npm dependencies. You must still run the package manager. +load("@build_bazel_rules_nodejs//:defs.bzl", "check_bazel_version", "node_repositories", + "npm_install") -http_archive( - name = "io_bazel_rules_webtesting", - url = "https://github.com/bazelbuild/rules_webtesting/archive/7ffe970bbf380891754487f66c3d680c087d67f2.zip", - strip_prefix = "rules_webtesting-7ffe970bbf380891754487f66c3d680c087d67f2", - sha256 = "4fb0dca8c9a90547891b7ef486592775a523330fc4555c88cd8f09270055c2ce", +check_bazel_version("0.15.0") +node_repositories() + +# Use Bazel managed node modules. See more below: +# https://github.com/bazelbuild/rules_nodejs#bazel-managed-vs-self-managed-dependencies +npm_install( + name = "npm", + package_json = "//:package.json", + package_lock_json = "//:package-lock.json", ) # Setup TypeScript Bazel workspace @@ -56,9 +64,3 @@ local_repository( name = "rxjs", path = "node_modules/rxjs/src", ) - - -# This commit matches the version of buildifier in angular/ngcontainer -# If you change this, also check if it matches the version in the angular/ngcontainer -# version in /.circleci/config.yml -BAZEL_BUILDTOOLS_VERSION = "82b21607e00913b16fe1c51bec80232d9d6de31c" diff --git a/package-lock.json b/package-lock.json index 8e4a27f723bc..267c6460df8c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -107,11 +107,60 @@ "protobufjs": "5.0.0" }, "dependencies": { + "@bazel/typescript": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/@bazel/typescript/-/typescript-0.15.3.tgz", + "integrity": "sha512-YWKX1cLGjWx2OdYBU0WeV7DlemlEaXuMcPKkeB3p2D7jiso5YYHaaOevWOQVJXKS4E/fbjd8nw7RGtRWsX8Myg==", + "dev": true, + "requires": { + "protobufjs": "5.0.0", + "tsickle": "0.25.x", + "tsutils": "2.20.0" + }, + "dependencies": { + "tsutils": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.20.0.tgz", + "integrity": "sha512-qPOBy1/hwLdBxh/TNIpim5qL1WRMR0tgVGBB6shjnpw6/SuS5ZKYyXXxKDYsMsMtVdFOcL+XPGZVEuc+eCOo4A==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + } + } + }, "@types/node": { "version": "6.0.84", "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.84.tgz", "integrity": "sha512-1SvEazClhUBRNroJM3oB3xf3u2r6xGmHDGbdigqNPHvNKLl8/BtATgO9eC04ZLuovpSh0B20BF1QJxdi+qmTlg==", "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "tsickle": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.25.6.tgz", + "integrity": "sha1-tZXbFrI2chgk7u2ouyYjZbR+8zQ=", + "dev": true, + "requires": { + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map": "^0.5.6", + "source-map-support": "^0.4.2" + } } } }, @@ -367,41 +416,36 @@ "dev": true }, "@bazel/typescript": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/@bazel/typescript/-/typescript-0.15.3.tgz", - "integrity": "sha512-YWKX1cLGjWx2OdYBU0WeV7DlemlEaXuMcPKkeB3p2D7jiso5YYHaaOevWOQVJXKS4E/fbjd8nw7RGtRWsX8Myg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@bazel/typescript/-/typescript-0.18.0.tgz", + "integrity": "sha512-0SSOM4DnccasR8ukhMMz+GmEAv0EeLxDT0f6eY0svlmJIv+tTpbK3+QY1WgaSYc2ALesQMyVldy3/BfHfnQxqQ==", "dev": true, "requires": { "protobufjs": "5.0.0", - "tsickle": "0.25.x", + "source-map-support": "0.5.9", + "tsickle": "0.28.0", "tsutils": "2.20.0" }, "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "tsickle": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.28.0.tgz", + "integrity": "sha512-cb/Z4NlKMPGiIIbgmklfBJIxDl4EQoYqC+0/BnPxZWzWcUvikeOHFkkkEmabJVqKh47jUqOwU/uMAu6UvhicZg==", "dev": true, "requires": { - "source-map": "^0.5.6" + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map": "^0.6.0", + "source-map-support": "^0.5.0" } }, - "tsickle": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.25.6.tgz", - "integrity": "sha1-tZXbFrI2chgk7u2ouyYjZbR+8zQ=", + "tsutils": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.20.0.tgz", + "integrity": "sha512-qPOBy1/hwLdBxh/TNIpim5qL1WRMR0tgVGBB6shjnpw6/SuS5ZKYyXXxKDYsMsMtVdFOcL+XPGZVEuc+eCOo4A==", "dev": true, "requires": { - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "source-map": "^0.5.6", - "source-map-support": "^0.4.2" + "tslib": "^1.8.1" } } } @@ -7090,22 +7134,26 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, "ansi-regex": { "version": "2.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "aproba": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, "are-we-there-yet": { "version": "1.1.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "requires": { "delegates": "^1.0.0", @@ -7114,12 +7162,14 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "brace-expansion": { "version": "1.1.11", - "bundled": true, + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -7128,32 +7178,38 @@ }, "chownr": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", "dev": true }, "code-point-at": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, "concat-map": { "version": "0.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true }, "core-util-is": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, "debug": { "version": "2.6.9", - "bundled": true, + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -7161,22 +7217,26 @@ }, "deep-extend": { "version": "0.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true }, "delegates": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true }, "detect-libc": { "version": "1.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true }, "fs-minipass": { "version": "1.2.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", "dev": true, "requires": { "minipass": "^2.2.1" @@ -7184,12 +7244,14 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "gauge": { "version": "2.7.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "requires": { "aproba": "^1.0.3", @@ -7204,7 +7266,8 @@ }, "glob": { "version": "7.1.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -7217,12 +7280,14 @@ }, "has-unicode": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true }, "iconv-lite": { "version": "0.4.24", - "bundled": true, + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" @@ -7230,7 +7295,8 @@ }, "ignore-walk": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", "dev": true, "requires": { "minimatch": "^3.0.4" @@ -7238,7 +7304,8 @@ }, "inflight": { "version": "1.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "^1.3.0", @@ -7247,17 +7314,20 @@ }, "inherits": { "version": "2.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, "ini": { "version": "1.3.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { "number-is-nan": "^1.0.0" @@ -7265,12 +7335,14 @@ }, "isarray": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "minimatch": { "version": "3.0.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -7278,12 +7350,14 @@ }, "minimist": { "version": "1.2.0", - "bundled": true, + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, "minipass": { "version": "2.3.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.4.tgz", + "integrity": "sha512-mlouk1OHlaUE8Odt1drMtG1bAJA4ZA6B/ehysgV0LUIrDHdKgo1KorZq3pK0b/7Z7LJIQ12MNM6aC+Tn6lUZ5w==", "dev": true, "requires": { "safe-buffer": "^5.1.2", @@ -7292,7 +7366,8 @@ }, "minizlib": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", + "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", "dev": true, "requires": { "minipass": "^2.2.1" @@ -7300,7 +7375,8 @@ }, "mkdirp": { "version": "0.5.1", - "bundled": true, + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { "minimist": "0.0.8" @@ -7308,19 +7384,22 @@ "dependencies": { "minimist": { "version": "0.0.8", - "bundled": true, + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true } } }, "ms": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "needle": { "version": "2.2.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.3.tgz", + "integrity": "sha512-GPL22d/U9cai87FcCPO6e+MT3vyHS2j+zwotakDc7kE2DtUAqFKMXLJCTtRp+5S75vXIwQPvIxkvlctxf9q4gQ==", "dev": true, "requires": { "debug": "^2.1.2", @@ -7330,7 +7409,8 @@ }, "node-pre-gyp": { "version": "0.10.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz", + "integrity": "sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A==", "dev": true, "requires": { "detect-libc": "^1.0.2", @@ -7347,7 +7427,8 @@ }, "nopt": { "version": "4.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "dev": true, "requires": { "abbrev": "1", @@ -7356,12 +7437,14 @@ }, "npm-bundled": { "version": "1.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.5.tgz", + "integrity": "sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g==", "dev": true }, "npm-packlist": { "version": "1.1.11", - "bundled": true, + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.11.tgz", + "integrity": "sha512-CxKlZ24urLkJk+9kCm48RTQ7L4hsmgSVzEk0TLGPzzyuFxD7VNgy5Sl24tOLMzQv773a/NeJ1ce1DKeacqffEA==", "dev": true, "requires": { "ignore-walk": "^3.0.1", @@ -7370,7 +7453,8 @@ }, "npmlog": { "version": "4.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "requires": { "are-we-there-yet": "~1.1.2", @@ -7381,17 +7465,20 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, "object-assign": { "version": "4.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1" @@ -7399,17 +7486,20 @@ }, "os-homedir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, "os-tmpdir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, "osenv": { "version": "0.1.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "requires": { "os-homedir": "^1.0.0", @@ -7418,12 +7508,14 @@ }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "process-nextick-args": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true }, "protobufjs": { @@ -7440,7 +7532,8 @@ }, "rc": { "version": "1.2.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "requires": { "deep-extend": "^0.6.0", @@ -7451,7 +7544,8 @@ }, "readable-stream": { "version": "2.3.6", - "bundled": true, + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -7465,7 +7559,8 @@ }, "rimraf": { "version": "2.6.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { "glob": "^7.0.5" @@ -7473,37 +7568,44 @@ }, "safe-buffer": { "version": "5.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, "safer-buffer": { "version": "2.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, "sax": { "version": "1.2.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, "semver": { "version": "5.5.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", "dev": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "signal-exit": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.1.tgz", + "integrity": "sha1-WkyISZK2OnrNm623iUw+6c/MrYE=", "dev": true }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { "code-point-at": "^1.0.0", @@ -7513,7 +7615,8 @@ }, "string_decoder": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -7521,7 +7624,8 @@ }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -7529,12 +7633,14 @@ }, "strip-json-comments": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, "tar": { "version": "4.4.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.6.tgz", + "integrity": "sha512-tMkTnh9EdzxyfW+6GK6fCahagXsnYk6kE6S9Gr9pjVdys769+laCTbodXDhPAjzVtEBazRgP0gYqOjnk9dQzLg==", "dev": true, "requires": { "chownr": "^1.0.1", @@ -7548,12 +7654,14 @@ }, "util-deprecate": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, "wide-align": { "version": "1.1.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "requires": { "string-width": "^1.0.2 || 2" @@ -7561,12 +7669,14 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "yallist": { "version": "3.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", "dev": true } } @@ -7779,12 +7889,14 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, "ajv": { "version": "5.5.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { "co": "^4.6.0", @@ -7795,17 +7907,20 @@ }, "ansi-regex": { "version": "2.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "aproba": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, "are-we-there-yet": { "version": "1.1.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "dev": true, "requires": { "delegates": "^1.0.0", @@ -7814,37 +7929,44 @@ }, "asn1": { "version": "0.2.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", "dev": true }, "assert-plus": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, "asynckit": { "version": "0.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, "aws-sign2": { "version": "0.7.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", "dev": true }, "aws4": { "version": "1.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", "dev": true }, "balanced-match": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "bcrypt-pbkdf": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "dev": true, "optional": true, "requires": { @@ -7853,7 +7975,8 @@ }, "block-stream": { "version": "0.0.9", - "bundled": true, + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "dev": true, "requires": { "inherits": "~2.0.0" @@ -7861,7 +7984,8 @@ }, "boom": { "version": "4.3.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", "dev": true, "requires": { "hoek": "4.x.x" @@ -7869,7 +7993,8 @@ }, "brace-expansion": { "version": "1.1.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -7878,22 +8003,26 @@ }, "caseless": { "version": "0.12.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, "co": { "version": "4.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, "code-point-at": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, "combined-stream": { "version": "1.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "dev": true, "requires": { "delayed-stream": "~1.0.0" @@ -7901,22 +8030,26 @@ }, "concat-map": { "version": "0.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true }, "core-util-is": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, "cryptiles": { "version": "3.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", "dev": true, "requires": { "boom": "5.x.x" @@ -7924,7 +8057,8 @@ "dependencies": { "boom": { "version": "5.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", "dev": true, "requires": { "hoek": "4.x.x" @@ -7934,7 +8068,8 @@ }, "dashdash": { "version": "1.14.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { "assert-plus": "^1.0.0" @@ -7942,7 +8077,8 @@ }, "debug": { "version": "2.6.9", - "bundled": true, + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -7950,27 +8086,32 @@ }, "deep-extend": { "version": "0.4.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", "dev": true }, "delayed-stream": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, "delegates": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true }, "detect-libc": { "version": "1.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true }, "ecc-jsbn": { "version": "0.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "dev": true, "optional": true, "requires": { @@ -7979,32 +8120,38 @@ }, "extend": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", "dev": true }, "extsprintf": { "version": "1.3.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, "fast-deep-equal": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", "dev": true }, "fast-json-stable-stringify": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", "dev": true }, "forever-agent": { "version": "0.6.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "dev": true }, "form-data": { "version": "2.3.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "dev": true, "requires": { "asynckit": "^0.4.0", @@ -8014,12 +8161,14 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "fstream": { "version": "1.0.11", - "bundled": true, + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -8030,7 +8179,8 @@ }, "fstream-ignore": { "version": "1.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", "dev": true, "requires": { "fstream": "^1.0.0", @@ -8040,7 +8190,8 @@ }, "gauge": { "version": "2.7.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "requires": { "aproba": "^1.0.3", @@ -8055,7 +8206,8 @@ }, "getpass": { "version": "0.1.7", - "bundled": true, + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { "assert-plus": "^1.0.0" @@ -8063,7 +8215,8 @@ }, "glob": { "version": "7.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -8076,17 +8229,20 @@ }, "graceful-fs": { "version": "4.1.11", - "bundled": true, + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, "har-schema": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true }, "har-validator": { "version": "5.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "dev": true, "requires": { "ajv": "^5.1.0", @@ -8095,12 +8251,14 @@ }, "has-unicode": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true }, "hawk": { "version": "6.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", "dev": true, "requires": { "boom": "4.x.x", @@ -8111,12 +8269,14 @@ }, "hoek": { "version": "4.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==", "dev": true }, "http-signature": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { "assert-plus": "^1.0.0", @@ -8126,7 +8286,8 @@ }, "inflight": { "version": "1.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "^1.3.0", @@ -8135,17 +8296,20 @@ }, "inherits": { "version": "2.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, "ini": { "version": "1.3.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { "number-is-nan": "^1.0.0" @@ -8153,43 +8317,51 @@ }, "is-typedarray": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, "isarray": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "isstream": { "version": "0.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, "jsbn": { "version": "0.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true, "optional": true }, "json-schema": { "version": "0.2.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, "json-schema-traverse": { "version": "0.3.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", "dev": true }, "json-stringify-safe": { "version": "5.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, "jsprim": { "version": "1.4.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "dev": true, "requires": { "assert-plus": "1.0.0", @@ -8200,12 +8372,14 @@ }, "mime-db": { "version": "1.33.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", "dev": true }, "mime-types": { "version": "2.1.18", - "bundled": true, + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "dev": true, "requires": { "mime-db": "~1.33.0" @@ -8213,7 +8387,8 @@ }, "minimatch": { "version": "3.0.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -8221,12 +8396,14 @@ }, "minimist": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, "mkdirp": { "version": "0.5.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { "minimist": "0.0.8" @@ -8234,19 +8411,22 @@ "dependencies": { "minimist": { "version": "0.0.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true } } }, "ms": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "node-pre-gyp": { "version": "0.7.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.7.0.tgz", + "integrity": "sha1-Va7/uu2TtQ0KRlfUaRmM2ArJ3zY=", "dev": true, "requires": { "detect-libc": "^1.0.2", @@ -8263,7 +8443,8 @@ }, "nopt": { "version": "4.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "dev": true, "requires": { "abbrev": "1", @@ -8272,7 +8453,8 @@ }, "npmlog": { "version": "4.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "requires": { "are-we-there-yet": "~1.1.2", @@ -8283,22 +8465,26 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, "oauth-sign": { "version": "0.8.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", "dev": true }, "object-assign": { "version": "4.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1" @@ -8306,17 +8492,20 @@ }, "os-homedir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, "os-tmpdir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, "osenv": { "version": "0.1.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "requires": { "os-homedir": "^1.0.0", @@ -8325,32 +8514,38 @@ }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "performance-now": { "version": "2.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, "process-nextick-args": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true }, "punycode": { "version": "1.4.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true }, "qs": { "version": "6.5.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", "dev": true }, "rc": { "version": "1.2.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", + "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", "dev": true, "requires": { "deep-extend": "~0.4.0", @@ -8361,7 +8556,8 @@ }, "readable-stream": { "version": "2.3.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", + "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -8375,7 +8571,8 @@ }, "request": { "version": "2.83.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", "dev": true, "requires": { "aws-sign2": "~0.7.0", @@ -8404,7 +8601,8 @@ }, "rimraf": { "version": "2.6.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { "glob": "^7.0.5" @@ -8412,27 +8610,32 @@ }, "safe-buffer": { "version": "5.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", "dev": true }, "semver": { "version": "5.5.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", "dev": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, "sntp": { "version": "2.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", "dev": true, "requires": { "hoek": "4.x.x" @@ -8440,7 +8643,8 @@ }, "sshpk": { "version": "1.14.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", + "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", "dev": true, "requires": { "asn1": "~0.2.3", @@ -8455,7 +8659,8 @@ }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { "code-point-at": "^1.0.0", @@ -8465,7 +8670,8 @@ }, "string_decoder": { "version": "1.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -8473,12 +8679,14 @@ }, "stringstream": { "version": "0.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", "dev": true }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -8486,12 +8694,14 @@ }, "strip-json-comments": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, "tar": { "version": "2.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "dev": true, "requires": { "block-stream": "*", @@ -8501,7 +8711,8 @@ }, "tar-pack": { "version": "3.4.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.1.tgz", + "integrity": "sha512-PPRybI9+jM5tjtCbN2cxmmRU7YmqT3Zv/UDy48tAh2XRkLa9bAORtSWLkVc13+GJF+cdTh1yEnHEk3cpTaL5Kg==", "dev": true, "requires": { "debug": "^2.2.0", @@ -8516,7 +8727,8 @@ }, "tough-cookie": { "version": "2.3.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "dev": true, "requires": { "punycode": "^1.4.1" @@ -8524,7 +8736,8 @@ }, "tunnel-agent": { "version": "0.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { "safe-buffer": "^5.0.1" @@ -8532,28 +8745,33 @@ }, "tweetnacl": { "version": "0.14.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true, "optional": true }, "uid-number": { "version": "0.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", "dev": true }, "util-deprecate": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, "uuid": { "version": "3.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", "dev": true }, "verror": { "version": "1.10.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { "assert-plus": "^1.0.0", @@ -8563,7 +8781,8 @@ }, "wide-align": { "version": "1.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "dev": true, "requires": { "string-width": "^1.0.2" @@ -8571,7 +8790,8 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true } } @@ -17453,9 +17673,9 @@ } }, "tsutils": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.20.0.tgz", - "integrity": "sha512-qPOBy1/hwLdBxh/TNIpim5qL1WRMR0tgVGBB6shjnpw6/SuS5ZKYyXXxKDYsMsMtVdFOcL+XPGZVEuc+eCOo4A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.0.0.tgz", + "integrity": "sha512-LjHBWR0vWAUHWdIAoTjoqi56Kz+FDKBgVEuL+gVPG/Pv7QW5IdaDDeK9Txlr6U0Cmckp5EgCIq1T25qe3J6hyw==", "dev": true, "requires": { "tslib": "^1.8.1" diff --git a/package.json b/package.json index 41c57ed1a0c0..0e65ed6fcde1 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,6 @@ "node": ">= 5.4.1" }, "scripts": { - "postinstall": "ngc -p angular.tsconfig.json", "build": "gulp :publish:build-releases", "demo-app": "gulp serve:devapp", "test": "gulp test", @@ -54,6 +53,7 @@ "@angular/router": "7.0.0-beta.5", "@angular/upgrade": "7.0.0-beta.5", "@bazel/ibazel": "0.3.1", + "@bazel/typescript": "^0.18.0", "@google-cloud/storage": "^1.1.1", "@octokit/rest": "^15.9.4", "@schematics/angular": "^0.9.0-beta.2", @@ -131,6 +131,7 @@ "ts-node": "^3.0.4", "tsconfig-paths": "^2.3.0", "tslint": "^5.11.0", + "tsutils": "^3.0.0", "typescript": "3.0.3", "uglify-js": "^2.8.14" } diff --git a/src/cdk/package.json b/src/cdk/package.json index 60587c5ca1e3..bc9a6862d685 100644 --- a/src/cdk/package.json +++ b/src/cdk/package.json @@ -34,12 +34,7 @@ }, "schematics": "./schematics/collection.json", "ng-update": { - "migrations": "./schematics/migration.json", - "packageGroup": [ - "@angular/material", - "@angular/cdk", - "@angular/material-moment-adapter" - ] + "migrations": "./schematics/migration.json" }, "sideEffects": false } diff --git a/src/cdk/schematics/BUILD.bazel b/src/cdk/schematics/BUILD.bazel index 86cd587cfddb..f3906a12a26e 100644 --- a/src/cdk/schematics/BUILD.bazel +++ b/src/cdk/schematics/BUILD.bazel @@ -6,7 +6,7 @@ load("//:packages.bzl", "VERSION_PLACEHOLDER_REPLACEMENTS") filegroup( name = "schematics_assets", - srcs = ["README.md"], + srcs = glob(["**/*.json"]) + ["README.md"], ) ts_library( @@ -14,6 +14,19 @@ ts_library( module_name = "@angular/cdk/schematics", srcs = glob(["**/*.ts"], exclude=["**/*.spec.ts"]), tsconfig = ":tsconfig.json", + deps = [ + "@npm//:@schematics/angular", + "@npm//:@angular-devkit/schematics", + # TODO(devversion): Only include jasmine for test sources. + "@npm//:@types/jasmine", + "@npm//:@types/node", + "@npm//:glob", + "@npm//:jasmine", + "@npm//:parse5", + "@npm//:rxjs", + "@npm//:tslint", + "@npm//:typescript" + ], ) # This package is intended to be combined into the main @angular/cdk package as a dep. @@ -29,13 +42,23 @@ npm_package( jasmine_node_test( name = "unit_tests", srcs = [":schematics_test_sources"], - data = [":schematics_assets"] + data = [":schematics_assets"], + deps = ["@npm//:jasmine"], ) ts_library( name = "schematics_test_sources", srcs = glob(["**/*.spec.ts"]), - deps = [":schematics"], + deps = [ + ":schematics", + "@npm//:@schematics/angular", + "@npm//:@angular-devkit/schematics", + "@npm//:@types/jasmine", + "@npm//:@types/node", + "@npm//:mock-fs", + "@npm//:tslint", + "@npm//:typescript", + ], tsconfig = ":tsconfig.json", testonly = True, ) diff --git a/src/cdk/schematics/collection.json b/src/cdk/schematics/collection.json index ff6a1e9fcbaf..c7ddf889ad09 100644 --- a/src/cdk/schematics/collection.json +++ b/src/cdk/schematics/collection.json @@ -1,4 +1,11 @@ { "$schema": "./node_modules/@angular-devkit/schematics/collection-schema.json", - "schematics": {} + "schematics": { + "ng-add": { + "description": "Installs the Angular CDK", + "factory": "./ng-add/index", + "schema": "./ng-add/schema.json", + "aliases": ["install"] + } + } } diff --git a/src/cdk/schematics/index.ts b/src/cdk/schematics/index.ts index 0cffc9cf9f8b..b553431e4736 100644 --- a/src/cdk/schematics/index.ts +++ b/src/cdk/schematics/index.ts @@ -7,4 +7,5 @@ */ export * from './utils'; +export * from './testing'; export * from './ng-update/public-api'; diff --git a/src/cdk/schematics/ng-add/index.spec.ts b/src/cdk/schematics/ng-add/index.spec.ts new file mode 100644 index 000000000000..0c5eab8bc3fc --- /dev/null +++ b/src/cdk/schematics/ng-add/index.spec.ts @@ -0,0 +1,24 @@ +import {Tree} from '@angular-devkit/schematics'; +import {SchematicTestRunner} from '@angular-devkit/schematics/testing'; +import {getFileContent} from '@schematics/angular/utility/test'; +import {createTestApp} from '../testing'; + +describe('CDK ng-add', () => { + let runner: SchematicTestRunner; + let appTree: Tree; + + beforeEach(() => { + runner = new SchematicTestRunner('schematics', require.resolve('../collection.json')); + appTree = createTestApp(runner); + }); + + it('should update the package.json', () => { + const tree = runner.runSchematic('ng-add', {}, appTree); + const packageJson = JSON.parse(getFileContent(tree, '/package.json')); + const dependencies = packageJson.dependencies; + + expect(dependencies['@angular/cdk']).toBeDefined(); + expect(Object.keys(dependencies)).toEqual(Object.keys(dependencies).sort(), + 'Expected the modified "dependencies" to be sorted alphabetically.'); + }); +}); diff --git a/src/cdk/schematics/ng-add/index.ts b/src/cdk/schematics/ng-add/index.ts new file mode 100644 index 000000000000..3cfe805ef6c5 --- /dev/null +++ b/src/cdk/schematics/ng-add/index.ts @@ -0,0 +1,34 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import {Rule, Tree} from '@angular-devkit/schematics'; +import {addPackageToPackageJson} from './package-config'; + +/** Name of the Angular CDK version that is shipped together with the schematics. */ +export const cdkVersion = loadPackageVersionGracefully('@angular/cdk'); + +/** + * Schematic factory entry-point for the `ng-add` schematic. The ng-add schematic will be + * automatically executed if developers run `ng add @angular/cdk`. + */ +export default function(): Rule { + return (host: Tree) => { + // By default, the CLI already installs the package that has been installed through `ng add`. + // We just store the version in the `package.json` in case the package manager didn't. + addPackageToPackageJson(host, '@angular/cdk', `^${cdkVersion}`); + }; +} + +/** Loads the full version from the given Angular package gracefully. */ +function loadPackageVersionGracefully(packageName: string): string | null { + try { + return require(`${packageName}/package.json`).version; + } catch { + return null; + } +} diff --git a/src/cdk/schematics/ng-add/package-config.ts b/src/cdk/schematics/ng-add/package-config.ts new file mode 100644 index 000000000000..c48f42f6abac --- /dev/null +++ b/src/cdk/schematics/ng-add/package-config.ts @@ -0,0 +1,39 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import {Tree} from '@angular-devkit/schematics'; + +/** + * Sorts the keys of the given object. + * @returns A new object instance with sorted keys + */ +function sortObjectByKeys(obj: object) { + return Object.keys(obj).sort().reduce((result, key) => (result[key] = obj[key]) && result, {}); +} + +/** Adds a package to the package.json in the given host tree. */ +export function addPackageToPackageJson(host: Tree, pkg: string, version: string): Tree { + + if (host.exists('package.json')) { + const sourceText = host.read('package.json')!.toString('utf-8'); + const json = JSON.parse(sourceText); + + if (!json.dependencies) { + json.dependencies = {}; + } + + if (!json.dependencies[pkg]) { + json.dependencies[pkg] = version; + json.dependencies = sortObjectByKeys(json.dependencies); + } + + host.overwrite('package.json', JSON.stringify(json, null, 2)); + } + + return host; +} diff --git a/src/cdk/schematics/ng-add/schema.json b/src/cdk/schematics/ng-add/schema.json new file mode 100644 index 000000000000..4f965a05e643 --- /dev/null +++ b/src/cdk/schematics/ng-add/schema.json @@ -0,0 +1,16 @@ +{ + "$schema": "http://json-schema.org/schema", + "id": "angular-cdk-ng-add", + "title": "Angular CDK ng-add", + "type": "object", + "properties": { + "project": { + "type": "string", + "description": "The name of the project.", + "$default": { + "$source": "projectName" + } + } + }, + "required": [] +} diff --git a/src/cdk/schematics/ng-add/schema.ts b/src/cdk/schematics/ng-add/schema.ts new file mode 100644 index 000000000000..ca929d03a1ff --- /dev/null +++ b/src/cdk/schematics/ng-add/schema.ts @@ -0,0 +1,13 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +export interface Schema { + + /** Name of the project to target. */ + project: string; +} diff --git a/src/cdk/schematics/testing/index.ts b/src/cdk/schematics/testing/index.ts new file mode 100644 index 000000000000..1141e3fde640 --- /dev/null +++ b/src/cdk/schematics/testing/index.ts @@ -0,0 +1,10 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +export * from './post-scheduled-tasks'; +export * from './test-app'; diff --git a/src/lib/schematics/test-setup/post-scheduled-tasks.ts b/src/cdk/schematics/testing/post-scheduled-tasks.ts similarity index 84% rename from src/lib/schematics/test-setup/post-scheduled-tasks.ts rename to src/cdk/schematics/testing/post-scheduled-tasks.ts index 994dca55954c..20f03ebf8d65 100644 --- a/src/lib/schematics/test-setup/post-scheduled-tasks.ts +++ b/src/cdk/schematics/testing/post-scheduled-tasks.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {EngineHost, TaskScheduler} from '@angular-devkit/schematics'; +import {EngineHost, TaskExecutor, TaskScheduler} from '@angular-devkit/schematics'; import {SchematicTestRunner} from '@angular-devkit/schematics/testing'; import {from as observableFrom, Observable} from 'rxjs'; import {concatMap, filter, last} from 'rxjs/operators'; @@ -20,18 +20,20 @@ import {concatMap, filter, last} from 'rxjs/operators'; * only when all tasks finished executing. */ export function runPostScheduledTasks(runner: SchematicTestRunner, taskName: string) - : Observable { + : Observable { // Workaround until there is a public API to run scheduled tasks in the @angular-devkit. // See: https://github.com/angular/angular-cli/issues/11739 const host = runner.engine['_host'] as EngineHost<{}, {}>; const tasks = runner.engine['_taskSchedulers'] as TaskScheduler[]; + const createTaskExecutor = (name: string) => + (host.createTaskExecutor(name) as any) as Observable>; return observableFrom(tasks).pipe( concatMap(scheduler => scheduler.finalize()), filter(task => task.configuration.name === taskName), concatMap(task => { - return host.createTaskExecutor(task.configuration.name) + return createTaskExecutor(task.configuration.name) .pipe(concatMap(executor => executor(task.configuration.options, task.context))); }), // Only emit the last emitted value because there can be multiple tasks with the same name. diff --git a/src/cdk/schematics/testing/test-app.ts b/src/cdk/schematics/testing/test-app.ts new file mode 100644 index 000000000000..b1b87bfd5960 --- /dev/null +++ b/src/cdk/schematics/testing/test-app.ts @@ -0,0 +1,21 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import {SchematicTestRunner, UnitTestTree} from '@angular-devkit/schematics/testing'; + +/** Create a base app used for testing. */ +export function createTestApp(runner: SchematicTestRunner, appOptions = {}): UnitTestTree { + const workspaceTree = runner.runExternalSchematic('@schematics/angular', 'workspace', { + name: 'workspace', + version: '6.0.0', + newProjectRoot: 'projects', + }); + + return runner.runExternalSchematic('@schematics/angular', 'application', + {...appOptions, name: 'material'}, workspaceTree); +} diff --git a/src/lib/schematics/BUILD.bazel b/src/lib/schematics/BUILD.bazel index d9d50479037a..ee4970b1bb14 100644 --- a/src/lib/schematics/BUILD.bazel +++ b/src/lib/schematics/BUILD.bazel @@ -18,7 +18,17 @@ ts_library( "test-setup/**/*", "ng-update/test-cases/**/*", ]), - deps = ["//src/cdk/schematics"], + deps = [ + "//src/cdk/schematics", + "@npm//:@angular-devkit/schematics", + "@npm//:@schematics/angular", + # TODO(devversion): Only include jasmine for test sources. + "@npm//:@types/jasmine", + "@npm//:@types/node", + "@npm//:parse5", + "@npm//:tslint", + "@npm//:typescript", + ], tsconfig = ":tsconfig.json", ) @@ -36,12 +46,21 @@ jasmine_node_test( name = "unit_tests", srcs = [":schematics_test_sources"], data = [":schematics_assets", ":schematics_test_cases"], + deps = ["@npm//:jasmine"] ) ts_library( name = "schematics_test_sources", srcs = glob(["**/*.spec.ts", "test-setup/**/*.ts"], exclude=["**/files/**/*"]), - deps = ["//src/cdk/schematics", ":schematics"], + deps = [ + ":schematics", + "//src/cdk/schematics", + "@npm//:@schematics/angular", + "@npm//:@angular-devkit/schematics", + "@npm//:@types/jasmine", + "@npm//:@types/node", + "@npm//:fs-extra", + ], tsconfig = ":tsconfig.json", testonly = True, ) diff --git a/src/lib/schematics/address-form/index.spec.ts b/src/lib/schematics/address-form/index.spec.ts index 6adb4791026d..cbe83e84ca24 100644 --- a/src/lib/schematics/address-form/index.spec.ts +++ b/src/lib/schematics/address-form/index.spec.ts @@ -1,5 +1,5 @@ import {SchematicTestRunner} from '@angular-devkit/schematics/testing'; -import {collectionPath, createTestApp} from '../test-setup/test-app'; +import {createTestApp} from '@angular/cdk/schematics'; import {getFileContent} from '@schematics/angular/utility/test'; import {Schema} from './schema'; @@ -12,11 +12,11 @@ describe('Material address-form schematic', () => { }; beforeEach(() => { - runner = new SchematicTestRunner('schematics', collectionPath); + runner = new SchematicTestRunner('schematics', require.resolve('../collection.json')); }); it('should create address-form files and add them to module', () => { - const tree = runner.runSchematic('address-form', baseOptions, createTestApp()); + const tree = runner.runSchematic('address-form', baseOptions, createTestApp(runner)); const files = tree.files; expect(files).toContain('/projects/material/src/app/foo/foo.component.css'); @@ -30,7 +30,7 @@ describe('Material address-form schematic', () => { }); it('should add address-form imports to module', () => { - const tree = runner.runSchematic('address-form', baseOptions, createTestApp()); + const tree = runner.runSchematic('address-form', baseOptions, createTestApp(runner)); const moduleContent = getFileContent(tree, '/projects/material/src/app/app.module.ts'); expect(moduleContent).toContain('MatInputModule'); @@ -43,13 +43,14 @@ describe('Material address-form schematic', () => { describe('styleext option', () => { it('should respect the option value', () => { const tree = runner.runSchematic( - 'address-form', {styleext: 'scss', ...baseOptions}, createTestApp()); + 'address-form', {styleext: 'scss', ...baseOptions}, createTestApp(runner)); expect(tree.files).toContain('/projects/material/src/app/foo/foo.component.scss'); }); it('should fallback to the @schematics/angular:component option value', () => { - const tree = runner.runSchematic('address-form', baseOptions, createTestApp({style: 'less'})); + const tree = runner.runSchematic( + 'address-form', baseOptions, createTestApp(runner, {style: 'less'})); expect(tree.files).toContain('/projects/material/src/app/foo/foo.component.less'); }); @@ -58,14 +59,14 @@ describe('Material address-form schematic', () => { describe('inlineStyle option', () => { it('should respect the option value', () => { const tree = runner.runSchematic( - 'address-form', {inlineStyle: true, ...baseOptions}, createTestApp()); + 'address-form', {inlineStyle: true, ...baseOptions}, createTestApp(runner)); expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.css'); }); it('should fallback to the @schematics/angular:component option value', () => { const tree = runner.runSchematic( - 'address-form', baseOptions, createTestApp({inlineStyle: true})); + 'address-form', baseOptions, createTestApp(runner, {inlineStyle: true})); expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.css'); }); @@ -74,14 +75,14 @@ describe('Material address-form schematic', () => { describe('inlineTemplate option', () => { it('should respect the option value', () => { const tree = runner.runSchematic( - 'address-form', {inlineTemplate: true, ...baseOptions}, createTestApp()); + 'address-form', {inlineTemplate: true, ...baseOptions}, createTestApp(runner)); expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.html'); }); it('should fallback to the @schematics/angular:component option value', () => { const tree = runner.runSchematic( - 'address-form', baseOptions, createTestApp({inlineTemplate: true})); + 'address-form', baseOptions, createTestApp(runner, {inlineTemplate: true})); expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.html'); }); @@ -90,14 +91,14 @@ describe('Material address-form schematic', () => { describe('spec option', () => { it('should respect the option value', () => { const tree = runner.runSchematic( - 'address-form', {spec: false, ...baseOptions}, createTestApp()); + 'address-form', {spec: false, ...baseOptions}, createTestApp(runner)); expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.spec.ts'); }); it('should fallback to the @schematics/angular:component option value', () => { const tree = runner.runSchematic( - 'address-form', baseOptions, createTestApp({skipTests: true})); + 'address-form', baseOptions, createTestApp(runner, {skipTests: true})); expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.spec.ts'); }); diff --git a/src/lib/schematics/dashboard/index.spec.ts b/src/lib/schematics/dashboard/index.spec.ts index 112dfb99f062..19f35645ce3c 100644 --- a/src/lib/schematics/dashboard/index.spec.ts +++ b/src/lib/schematics/dashboard/index.spec.ts @@ -1,5 +1,5 @@ import {SchematicTestRunner} from '@angular-devkit/schematics/testing'; -import {collectionPath, createTestApp} from '../test-setup/test-app'; +import {createTestApp} from '@angular/cdk/schematics'; import {getFileContent} from '@schematics/angular/utility/test'; import {Schema} from './schema'; @@ -12,11 +12,11 @@ describe('material-dashboard-schematic', () => { }; beforeEach(() => { - runner = new SchematicTestRunner('schematics', collectionPath); + runner = new SchematicTestRunner('schematics', require.resolve('../collection.json')); }); it('should create dashboard files and add them to module', () => { - const tree = runner.runSchematic('dashboard', baseOptions, createTestApp()); + const tree = runner.runSchematic('dashboard', baseOptions, createTestApp(runner)); const files = tree.files; expect(files).toContain('/projects/material/src/app/foo/foo.component.css'); @@ -30,7 +30,7 @@ describe('material-dashboard-schematic', () => { }); it('should add dashboard imports to module', () => { - const tree = runner.runSchematic('dashboard', baseOptions, createTestApp()); + const tree = runner.runSchematic('dashboard', baseOptions, createTestApp(runner)); const moduleContent = getFileContent(tree, '/projects/material/src/app/app.module.ts'); expect(moduleContent).toContain('MatGridListModule'); @@ -47,13 +47,14 @@ describe('material-dashboard-schematic', () => { describe('styleext option', () => { it('should respect the option value', () => { const tree = runner.runSchematic( - 'dashboard', {styleext: 'scss', ...baseOptions}, createTestApp()); + 'dashboard', {styleext: 'scss', ...baseOptions}, createTestApp(runner)); expect(tree.files).toContain('/projects/material/src/app/foo/foo.component.scss'); }); it('should fallback to the @schematics/angular:component option value', () => { - const tree = runner.runSchematic('dashboard', baseOptions, createTestApp({style: 'less'})); + const tree = runner.runSchematic( + 'dashboard', baseOptions, createTestApp(runner, {style: 'less'})); expect(tree.files).toContain('/projects/material/src/app/foo/foo.component.less'); }); @@ -62,14 +63,14 @@ describe('material-dashboard-schematic', () => { describe('inlineStyle option', () => { it('should respect the option value', () => { const tree = runner.runSchematic( - 'dashboard', {inlineStyle: true, ...baseOptions}, createTestApp()); + 'dashboard', {inlineStyle: true, ...baseOptions}, createTestApp(runner)); expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.css'); }); it('should fallback to the @schematics/angular:component option value', () => { const tree = runner.runSchematic( - 'dashboard', baseOptions, createTestApp({inlineStyle: true})); + 'dashboard', baseOptions, createTestApp(runner, {inlineStyle: true})); expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.css'); }); @@ -78,14 +79,14 @@ describe('material-dashboard-schematic', () => { describe('inlineTemplate option', () => { it('should respect the option value', () => { const tree = runner.runSchematic( - 'dashboard', {inlineTemplate: true, ...baseOptions}, createTestApp()); + 'dashboard', {inlineTemplate: true, ...baseOptions}, createTestApp(runner)); expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.html'); }); it('should fallback to the @schematics/angular:component option value', () => { const tree = runner.runSchematic( - 'dashboard', baseOptions, createTestApp({inlineTemplate: true})); + 'dashboard', baseOptions, createTestApp(runner, {inlineTemplate: true})); expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.html'); }); @@ -94,13 +95,14 @@ describe('material-dashboard-schematic', () => { describe('spec option', () => { it('should respect the option value', () => { const tree = runner.runSchematic( - 'dashboard', {spec: false, ...baseOptions}, createTestApp()); + 'dashboard', {spec: false, ...baseOptions}, createTestApp(runner)); expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.spec.ts'); }); it('should fallback to the @schematics/angular:component option value', () => { - const tree = runner.runSchematic('dashboard', baseOptions, createTestApp({skipTests: true})); + const tree = runner.runSchematic( + 'dashboard', baseOptions, createTestApp(runner, {skipTests: true})); expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.spec.ts'); }); diff --git a/src/lib/schematics/nav/index.spec.ts b/src/lib/schematics/nav/index.spec.ts index 9c93f7838ff3..962c83d69cea 100644 --- a/src/lib/schematics/nav/index.spec.ts +++ b/src/lib/schematics/nav/index.spec.ts @@ -1,7 +1,7 @@ import {SchematicTestRunner} from '@angular-devkit/schematics/testing'; import {Schema} from './schema'; import {getFileContent} from '@schematics/angular/utility/test'; -import {collectionPath, createTestApp} from '../test-setup/test-app'; +import {createTestApp} from '@angular/cdk/schematics'; describe('material-nav-schematic', () => { let runner: SchematicTestRunner; @@ -12,11 +12,11 @@ describe('material-nav-schematic', () => { }; beforeEach(() => { - runner = new SchematicTestRunner('schematics', collectionPath); + runner = new SchematicTestRunner('schematics', require.resolve('../collection.json')); }); it('should create nav files and add them to module', () => { - const tree = runner.runSchematic('nav', baseOptions, createTestApp()); + const tree = runner.runSchematic('nav', baseOptions, createTestApp(runner)); const files = tree.files; expect(files).toContain('/projects/material/src/app/foo/foo.component.css'); @@ -30,7 +30,7 @@ describe('material-nav-schematic', () => { }); it('should add nav imports to module', () => { - const tree = runner.runSchematic('nav', baseOptions, createTestApp()); + const tree = runner.runSchematic('nav', baseOptions, createTestApp(runner)); const moduleContent = getFileContent(tree, '/projects/material/src/app/app.module.ts'); expect(moduleContent).toContain('LayoutModule'); @@ -48,13 +48,15 @@ describe('material-nav-schematic', () => { describe('styleext option', () => { it('should respect the option value', () => { - const tree = runner.runSchematic('nav', {styleext: 'scss', ...baseOptions}, createTestApp()); + const tree = runner.runSchematic( + 'nav', {styleext: 'scss', ...baseOptions}, createTestApp(runner)); expect(tree.files).toContain('/projects/material/src/app/foo/foo.component.scss'); }); it('should fallback to the @schematics/angular:component option value', () => { - const tree = runner.runSchematic('nav', baseOptions, createTestApp({style: 'less'})); + const tree = runner.runSchematic( + 'nav', baseOptions, createTestApp(runner, {style: 'less'})); expect(tree.files).toContain('/projects/material/src/app/foo/foo.component.less'); }); @@ -63,13 +65,14 @@ describe('material-nav-schematic', () => { describe('inlineStyle option', () => { it('should respect the option value', () => { const tree = runner.runSchematic( - 'nav', {inlineStyle: true, ...baseOptions}, createTestApp()); + 'nav', {inlineStyle: true, ...baseOptions}, createTestApp(runner)); expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.css'); }); it('should fallback to the @schematics/angular:component option value', () => { - const tree = runner.runSchematic('nav', baseOptions, createTestApp({inlineStyle: true})); + const tree = runner.runSchematic( + 'nav', baseOptions, createTestApp(runner, {inlineStyle: true})); expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.css'); }); @@ -78,13 +81,14 @@ describe('material-nav-schematic', () => { describe('inlineTemplate option', () => { it('should respect the option value', () => { const tree = runner.runSchematic( - 'nav', {inlineTemplate: true, ...baseOptions}, createTestApp()); + 'nav', {inlineTemplate: true, ...baseOptions}, createTestApp(runner)); expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.html'); }); it('should fallback to the @schematics/angular:component option value', () => { - const tree = runner.runSchematic('nav', baseOptions, createTestApp({inlineTemplate: true})); + const tree = runner.runSchematic( + 'nav', baseOptions, createTestApp(runner, {inlineTemplate: true})); expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.html'); }); @@ -92,13 +96,15 @@ describe('material-nav-schematic', () => { describe('spec option', () => { it('should respect the option value', () => { - const tree = runner.runSchematic('nav', {spec: false, ...baseOptions}, createTestApp()); + const tree = runner.runSchematic( + 'nav', {spec: false, ...baseOptions}, createTestApp(runner)); expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.spec.ts'); }); it('should fallback to the @schematics/angular:component option value', () => { - const tree = runner.runSchematic('nav', baseOptions, createTestApp({skipTests: true})); + const tree = runner.runSchematic( + 'nav', baseOptions, createTestApp(runner, {skipTests: true})); expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.spec.ts'); }); diff --git a/src/lib/schematics/ng-add/index.spec.ts b/src/lib/schematics/ng-add/index.spec.ts index 26fce26c166a..29d9ef3cbefb 100644 --- a/src/lib/schematics/ng-add/index.spec.ts +++ b/src/lib/schematics/ng-add/index.spec.ts @@ -2,13 +2,13 @@ import {normalize} from '@angular-devkit/core'; import {Tree} from '@angular-devkit/schematics'; import {SchematicTestRunner} from '@angular-devkit/schematics/testing'; import { + createTestApp, getProjectFromWorkspace, getProjectStyleFile, getProjectTargetOptions, } from '@angular/cdk/schematics'; import {getWorkspace, WorkspaceProject} from '@schematics/angular/utility/config'; import {getFileContent} from '@schematics/angular/utility/test'; -import {collectionPath, createTestApp} from '../test-setup/test-app'; import {getIndexHtmlPath} from './fonts/project-index-html'; describe('ng-add schematic', () => { @@ -16,8 +16,8 @@ describe('ng-add schematic', () => { let appTree: Tree; beforeEach(() => { - appTree = createTestApp(); - runner = new SchematicTestRunner('schematics', collectionPath); + runner = new SchematicTestRunner('schematics', require.resolve('../collection.json')); + appTree = createTestApp(runner); }); /** Expects the given file to be in the styles of the specified workspace project. */ @@ -63,7 +63,8 @@ describe('ng-add schematic', () => { }); it('should support adding a custom theme', () => { - appTree = createTestApp({style: 'scss'}); + // TODO(devversion): do not re-create test app here. + appTree = createTestApp(runner, {style: 'scss'}); const tree = runner.runSchematic('ng-add-setup-project', {theme: 'custom'}, appTree); @@ -79,7 +80,8 @@ describe('ng-add schematic', () => { }); it('should create a custom theme file if no SCSS file could be found', () => { - appTree = createTestApp({style: 'css'}); + // TODO(devversion): do not re-create test app here. + appTree = createTestApp(runner, {style: 'css'}); const tree = runner.runSchematic('ng-add-setup-project', {theme: 'custom'}, appTree); const workspace = getWorkspace(tree); diff --git a/src/lib/schematics/ng-update/test-cases/index.spec.ts b/src/lib/schematics/ng-update/test-cases/index.spec.ts index 5ef4960f36a7..b2990c39d606 100644 --- a/src/lib/schematics/ng-update/test-cases/index.spec.ts +++ b/src/lib/schematics/ng-update/test-cases/index.spec.ts @@ -2,10 +2,12 @@ import {getSystemPath, normalize} from '@angular-devkit/core'; import {TempScopedNodeJsSyncHost} from '@angular-devkit/core/node/testing'; import * as virtualFs from '@angular-devkit/core/src/virtual-fs/host'; import {SchematicTestRunner} from '@angular-devkit/schematics/testing'; -import {runPostScheduledTasks} from '../../test-setup/post-scheduled-tasks'; import {readFileSync, writeFileSync, mkdirpSync} from 'fs-extra'; import {join, dirname} from 'path'; -import {createTestApp, migrationCollection} from '../../test-setup/test-app'; +import {createTestApp, runPostScheduledTasks} from '@angular/cdk/schematics'; + +/** Path to the schematic collection that includes the Angular Material migrations. */ +const migrationCollection = require.resolve('../../migration.json'); /** Module name suffix for data files of the `jasmine_node_test` Bazel rule. */ const bazelModuleSuffix = 'angular_material/src/lib/schematics/ng-update/test-cases'; @@ -31,9 +33,9 @@ export function resolveBazelDataFile(filePath: string) { * Creates a test app schematic tree that will be copied over to a real filesystem location. * This is necessary because TSLint is not able to read from the virtual filesystem tree. */ -export function createFileSystemTestApp() { +export function createFileSystemTestApp(runner: SchematicTestRunner) { const tempFileSystemHost = new TempScopedNodeJsSyncHost(); - const appTree = createTestApp(); + const appTree = createTestApp(runner); const tempPath = getSystemPath(tempFileSystemHost.root); // Since the TSLint fix task expects all files to be present on the real file system, we @@ -53,7 +55,7 @@ export async function runTestCases(migrationName: string, inputs: {[name: string let logOutput = ''; runner.logger.subscribe(entry => logOutput += entry.message); - const {appTree, tempPath} = createFileSystemTestApp(); + const {appTree, tempPath} = createFileSystemTestApp(runner); // Write each test-case input to the file-system. This is necessary because otherwise // TSLint won't be able to pick up the test cases. diff --git a/src/lib/schematics/table/index.spec.ts b/src/lib/schematics/table/index.spec.ts index c7250b34f9af..6c90020a08ac 100644 --- a/src/lib/schematics/table/index.spec.ts +++ b/src/lib/schematics/table/index.spec.ts @@ -1,7 +1,7 @@ import {SchematicTestRunner} from '@angular-devkit/schematics/testing'; -import {Schema} from './schema'; +import {createTestApp} from '@angular/cdk/schematics'; import {getFileContent} from '@schematics/angular/utility/test'; -import {collectionPath, createTestApp} from '../test-setup/test-app'; +import {Schema} from './schema'; describe('material-table-schematic', () => { let runner: SchematicTestRunner; @@ -12,11 +12,11 @@ describe('material-table-schematic', () => { }; beforeEach(() => { - runner = new SchematicTestRunner('schematics', collectionPath); + runner = new SchematicTestRunner('schematics', require.resolve('../collection.json')); }); it('should create table files and add them to module', () => { - const tree = runner.runSchematic('table', baseOptions, createTestApp()); + const tree = runner.runSchematic('table', baseOptions, createTestApp(runner)); const files = tree.files; expect(files).toContain('/projects/material/src/app/foo/foo.component.css'); @@ -42,7 +42,7 @@ describe('material-table-schematic', () => { }); it('should add table imports to module', () => { - const tree = runner.runSchematic('table', baseOptions, createTestApp()); + const tree = runner.runSchematic('table', baseOptions, createTestApp(runner)); const moduleContent = getFileContent(tree, '/projects/material/src/app/app.module.ts'); expect(moduleContent).toContain('MatTableModule'); @@ -56,13 +56,14 @@ describe('material-table-schematic', () => { describe('styleext option', () => { it('should respect the option value', () => { const tree = runner.runSchematic( - 'table', {styleext: 'scss', ...baseOptions}, createTestApp()); + 'table', {styleext: 'scss', ...baseOptions}, createTestApp(runner)); expect(tree.files).toContain('/projects/material/src/app/foo/foo.component.scss'); }); it('should fallback to the @schematics/angular:component option value', () => { - const tree = runner.runSchematic('table', baseOptions, createTestApp({style: 'less'})); + const tree = runner.runSchematic( + 'table', baseOptions, createTestApp(runner, {style: 'less'})); expect(tree.files).toContain('/projects/material/src/app/foo/foo.component.less'); }); @@ -71,13 +72,14 @@ describe('material-table-schematic', () => { describe('inlineStyle option', () => { it('should respect the option value', () => { const tree = runner.runSchematic( - 'table', {inlineStyle: true, ...baseOptions}, createTestApp()); + 'table', {inlineStyle: true, ...baseOptions}, createTestApp(runner)); expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.css'); }); it('should fallback to the @schematics/angular:component option value', () => { - const tree = runner.runSchematic('table', baseOptions, createTestApp({inlineStyle: true})); + const tree = runner.runSchematic( + 'table', baseOptions, createTestApp(runner, {inlineStyle: true})); expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.css'); }); @@ -86,14 +88,14 @@ describe('material-table-schematic', () => { describe('inlineTemplate option', () => { it('should respect the option value', () => { const tree = runner.runSchematic( - 'table', {inlineTemplate: true, ...baseOptions}, createTestApp()); + 'table', {inlineTemplate: true, ...baseOptions}, createTestApp(runner)); expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.html'); }); it('should fallback to the @schematics/angular:component option value', () => { const tree = runner.runSchematic( - 'table', baseOptions, createTestApp({inlineTemplate: true})); + 'table', baseOptions, createTestApp(runner, {inlineTemplate: true})); expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.html'); }); @@ -101,13 +103,15 @@ describe('material-table-schematic', () => { describe('spec option', () => { it('should respect the option value', () => { - const tree = runner.runSchematic('table', {spec: false, ...baseOptions}, createTestApp()); + const tree = runner.runSchematic( + 'table', {spec: false, ...baseOptions}, createTestApp(runner)); expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.spec.ts'); }); it('should fallback to the @schematics/angular:component option value', () => { - const tree = runner.runSchematic('table', baseOptions, createTestApp({skipTests: true})); + const tree = runner.runSchematic( + 'table', baseOptions, createTestApp(runner, {skipTests: true})); expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.spec.ts'); }); diff --git a/src/lib/schematics/test-setup/bazel-test-init.ts b/src/lib/schematics/test-setup/bazel-test-init.ts deleted file mode 100644 index e0de57c8ec6e..000000000000 --- a/src/lib/schematics/test-setup/bazel-test-init.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ - -/* - * NOTE: This file will run before the actual tests start inside of Bazel. - * - * It automatically runs before all spec files because the spec files are blocked - * until Jasmine runs the `describe` blocks. - * - * We copy all needed files into the proper Bazel bin output in order to be able to test - * the schematics. Workaround for: https://github.com/bazelbuild/rules_typescript/issues/154 - */ - -import {sync as globSync} from 'glob'; -import {dirname, join} from 'path'; -import {copySync} from 'fs-extra'; - -// Adding the test case files to the data of the `jasmine_node_test` Bazel rule does not mean -// that the files are being copied over to the Bazel bin output. Bazel just patches the NodeJS -// resolve function and maps the module paths to the original file location. Since we want to copy -// the files to the bazel test directory because TSLint and the schematic test runner expect a real -// file system, we need to resolve the original file path through a Bazel mapped file. -const sourceDirectory = dirname( - require.resolve('angular_material/src/lib/schematics/collection.json')); - -const bazelBinDir = join(__dirname, '../'); - -// Copy all schema files to the bazel bin directory. -globSync('**/schema.json', {cwd: sourceDirectory}) - .forEach(file => copySync(join(sourceDirectory, file), join(bazelBinDir, file))); - -// Copy all template files to the bazel bin directory. -globSync('**/files/**/*', {cwd: sourceDirectory}) - .forEach(file => copySync(join(sourceDirectory, file), join(bazelBinDir, file))); - -// Copy the collection.json and migration.json file to the bazel bin directory. -globSync('+(collection|migration).json', {cwd: sourceDirectory}) - .forEach(file => copySync(join(sourceDirectory, file), join(bazelBinDir, file))); diff --git a/src/lib/schematics/test-setup/test-app.ts b/src/lib/schematics/test-setup/test-app.ts deleted file mode 100644 index 109b04cef7f4..000000000000 --- a/src/lib/schematics/test-setup/test-app.ts +++ /dev/null @@ -1,30 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ - -import {SchematicTestRunner, UnitTestTree} from '@angular-devkit/schematics/testing'; -import {join} from 'path'; - -/** Path to the collection file for the Material schematics */ -export const collectionPath = join(__dirname, '..', 'collection.json'); - -/** Path to the migration file for the Material update schematics */ -export const migrationCollection = join(__dirname, '..', 'migration.json'); - -/** Create a base app used for testing. */ -export function createTestApp(appOptions = {}): UnitTestTree { - const baseRunner = new SchematicTestRunner('material-schematics', collectionPath); - - const workspaceTree = baseRunner.runExternalSchematic('@schematics/angular', 'workspace', { - name: 'workspace', - version: '6.0.0', - newProjectRoot: 'projects', - }); - - return baseRunner.runExternalSchematic('@schematics/angular', 'application', - {...appOptions, name: 'material'}, workspaceTree); -} diff --git a/src/lib/schematics/tree/index.spec.ts b/src/lib/schematics/tree/index.spec.ts index 1f02a17d5bb4..66a7a0d5805d 100644 --- a/src/lib/schematics/tree/index.spec.ts +++ b/src/lib/schematics/tree/index.spec.ts @@ -1,5 +1,5 @@ import {SchematicTestRunner} from '@angular-devkit/schematics/testing'; -import {collectionPath, createTestApp} from '../test-setup/test-app'; +import {createTestApp} from '@angular/cdk/schematics'; import {getFileContent} from '@schematics/angular/utility/test'; import {Schema} from './schema'; @@ -12,11 +12,11 @@ describe('Material tree schematic', () => { }; beforeEach(() => { - runner = new SchematicTestRunner('schematics', collectionPath); + runner = new SchematicTestRunner('schematics', require.resolve('../collection.json')); }); it('should create tree component files and add them to module', () => { - const tree = runner.runSchematic('tree', baseOptions, createTestApp()); + const tree = runner.runSchematic('tree', baseOptions, createTestApp(runner)); const files = tree.files; expect(files).toContain('/projects/material/src/app/foo/foo.component.css'); @@ -30,7 +30,7 @@ describe('Material tree schematic', () => { }); it('should add tree imports to module', () => { - const tree = runner.runSchematic('tree', baseOptions, createTestApp()); + const tree = runner.runSchematic('tree', baseOptions, createTestApp(runner)); const moduleContent = getFileContent(tree, '/projects/material/src/app/app.module.ts'); expect(moduleContent).toContain('MatTreeModule'); @@ -41,13 +41,14 @@ describe('Material tree schematic', () => { describe('styleext option', () => { it('should respect the option value', () => { const tree = runner.runSchematic( - 'tree', {styleext: 'scss', ...baseOptions}, createTestApp()); + 'tree', {styleext: 'scss', ...baseOptions}, createTestApp(runner)); expect(tree.files).toContain('/projects/material/src/app/foo/foo.component.scss'); }); it('should fallback to the @schematics/angular:component option value', () => { - const tree = runner.runSchematic('tree', baseOptions, createTestApp({style: 'less'})); + const tree = runner.runSchematic( + 'tree', baseOptions, createTestApp(runner, {style: 'less'})); expect(tree.files).toContain('/projects/material/src/app/foo/foo.component.less'); }); @@ -56,13 +57,15 @@ describe('Material tree schematic', () => { describe('inlineStyle option', () => { it('should respect the option value', () => { const tree = runner.runSchematic( - 'tree', {inlineStyle: true, ...baseOptions}, createTestApp()); + 'tree', {inlineStyle: true, ...baseOptions}, createTestApp(runner)); expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.css'); }); it('should fallback to the @schematics/angular:component option value', () => { - const tree = runner.runSchematic('tree', baseOptions, createTestApp({inlineStyle: true})); + const tree = runner.runSchematic( + 'tree', baseOptions, createTestApp(runner, {inlineStyle: true})); + expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.css'); }); }); @@ -70,14 +73,14 @@ describe('Material tree schematic', () => { describe('inlineTemplate option', () => { it('should respect the option value', () => { const tree = runner.runSchematic( - 'tree', {inlineTemplate: true, ...baseOptions}, createTestApp()); + 'tree', {inlineTemplate: true, ...baseOptions}, createTestApp(runner)); expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.html'); }); it('should fallback to the @schematics/angular:component option value', () => { const tree = runner.runSchematic( - 'tree', baseOptions, createTestApp({inlineTemplate: true})); + 'tree', baseOptions, createTestApp(runner, {inlineTemplate: true})); expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.html'); }); @@ -85,12 +88,16 @@ describe('Material tree schematic', () => { describe('spec option', () => { it('should respect the option value', () => { - const tree = runner.runSchematic('tree', {spec: false, ...baseOptions}, createTestApp()); + const tree = runner.runSchematic( + 'tree', {spec: false, ...baseOptions}, createTestApp(runner)); + expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.spec.ts'); }); it('should fallback to the @schematics/angular:component option value', () => { - const tree = runner.runSchematic('tree', baseOptions, createTestApp({skipTests: true})); + const tree = runner.runSchematic( + 'tree', baseOptions, createTestApp(runner, {skipTests: true})); + expect(tree.files).not.toContain('/projects/material/src/app/foo/foo.component.spec.ts'); }); });