From ca2fee5d6815a9a4aff544b356734be1a59fd005 Mon Sep 17 00:00:00 2001 From: Matt Mackay Date: Thu, 13 Aug 2020 15:11:31 -0400 Subject: [PATCH] docs: refresh docsite --- .bazelci/presubmit.yml | 6 +- docs/BUILD.bazel | 72 +- docs/Built-ins.html | 2863 ++++++++++++++++ docs/Built-ins.md | 2864 +++++++++++------ docs/Cypress.html | 411 +++ docs/Cypress.md | 125 +- docs/Jasmine.html | 395 +++ docs/Jasmine.md | 212 +- docs/Karma.html | 533 +++ docs/Karma.md | 376 ++- docs/Protractor.html | 463 +++ docs/Protractor.md | 331 +- docs/README.md | 18 +- docs/Rollup.html | 607 ++++ docs/Rollup.md | 356 +- docs/Terser.html | 438 +++ docs/Terser.md | 191 +- docs/TypeScript.html | 1491 +++++++++ docs/TypeScript.md | 1321 +++++--- docs/_config.yml | 16 +- docs/_includes/drawer.html | 73 - docs/_includes/footer-content.html | 7 + docs/_includes/footer.html | 184 +- docs/_includes/head.html | 50 +- docs/_includes/header.html | 43 +- docs/_includes/sidenav.html | 39 + docs/_layouts/default.html | 59 +- docs/_layouts/home.html | 23 - docs/changing-rules.html | 300 ++ docs/changing-rules.md | 47 + docs/css/BUILD.bazel | 15 + docs/css/_be.scss | 93 + docs/css/_docs.scss | 7 + docs/css/_footer.scss | 25 + docs/css/_navbar.scss | 96 + docs/css/_sidebar.scss | 166 + docs/css/_styles.scss | 254 ++ docs/css/_syntax.scss | 89 + docs/css/_tables.scss | 63 + docs/css/docs.css | 212 -- docs/css/home.css | 173 - docs/css/main.css | 1 + docs/css/main.scss | 11 + docs/debugging.html | 316 ++ docs/debugging.md | 67 + docs/dependencies.html | 534 +++ docs/dependencies.md | 277 ++ docs/examples.html | 431 +++ docs/examples.md | 47 +- docs/images/bazel-icon.png | Bin 0 -> 4945 bytes docs/images/bazel-icon.svg | 15 + docs/images/bazel-logo.png | Bin 0 -> 12169 bytes docs/images/bazel-logo.svg | 13 + docs/images/bazel-navbar.svg | 38 + docs/images/bazel-og-image.png | Bin 0 -> 15253 bytes docs/images/favicon-16x16.png | Bin 0 -> 553 bytes docs/images/favicon-32x32.png | Bin 0 -> 733 bytes docs/images/favicon.ico | Bin docs/index.html | 438 +++ docs/index.md | 232 +- docs/install.html | 420 +++ docs/install.md | 296 +- docs/repositories.html | 342 ++ docs/repositories.md | 5 +- docs/stamping.html | 323 ++ docs/stamping.md | 70 + internal/common/copy_to_bin.bzl | 2 +- internal/node/node.bzl | 22 +- internal/node/node_repositories.bzl | 128 +- internal/providers/linkable_package_info.bzl | 8 +- package.json | 2 +- packages/cypress/install.md | 4 +- packages/terser/terser_minified.bzl | 5 +- packages/typescript/install.md | 8 +- .../test/ts_project/simple/tsconfig.json | 2 +- tools/stardoc/BUILD.bazel | 5 +- tools/stardoc/index.bzl | 3 + tools/stardoc/jekyll.bzl | 153 + tools/stardoc/jekyll_serve_tpl.sh | 9 + tools/stardoc/post-process-docs.js | 33 + tools/stardoc/templates/aspect.vm | 60 +- tools/stardoc/templates/func.vm | 46 +- tools/stardoc/templates/header.vm | 3 - tools/stardoc/templates/provider.vm | 31 +- tools/stardoc/templates/rule.vm | 48 +- 85 files changed, 15986 insertions(+), 3569 deletions(-) create mode 100755 docs/Built-ins.html create mode 100755 docs/Cypress.html create mode 100755 docs/Jasmine.html create mode 100755 docs/Karma.html create mode 100755 docs/Protractor.html create mode 100755 docs/Rollup.html create mode 100755 docs/Terser.html create mode 100755 docs/TypeScript.html delete mode 100644 docs/_includes/drawer.html create mode 100644 docs/_includes/footer-content.html create mode 100644 docs/_includes/sidenav.html delete mode 100644 docs/_layouts/home.html create mode 100755 docs/changing-rules.html create mode 100644 docs/changing-rules.md create mode 100644 docs/css/BUILD.bazel create mode 100644 docs/css/_be.scss create mode 100644 docs/css/_docs.scss create mode 100644 docs/css/_footer.scss create mode 100644 docs/css/_navbar.scss create mode 100644 docs/css/_sidebar.scss create mode 100644 docs/css/_styles.scss create mode 100644 docs/css/_syntax.scss create mode 100644 docs/css/_tables.scss delete mode 100644 docs/css/docs.css delete mode 100644 docs/css/home.css create mode 100755 docs/css/main.css create mode 100644 docs/css/main.scss create mode 100755 docs/debugging.html create mode 100644 docs/debugging.md create mode 100755 docs/dependencies.html create mode 100644 docs/dependencies.md create mode 100755 docs/examples.html create mode 100644 docs/images/bazel-icon.png create mode 100755 docs/images/bazel-icon.svg create mode 100644 docs/images/bazel-logo.png create mode 100644 docs/images/bazel-logo.svg create mode 100644 docs/images/bazel-navbar.svg create mode 100644 docs/images/bazel-og-image.png create mode 100644 docs/images/favicon-16x16.png create mode 100644 docs/images/favicon-32x32.png mode change 100644 => 100755 docs/images/favicon.ico create mode 100755 docs/index.html create mode 100755 docs/install.html create mode 100755 docs/repositories.html create mode 100755 docs/stamping.html create mode 100644 docs/stamping.md create mode 100644 tools/stardoc/jekyll.bzl create mode 100644 tools/stardoc/jekyll_serve_tpl.sh create mode 100644 tools/stardoc/post-process-docs.js diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index 5e2c576ec9..08931b7c92 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -128,9 +128,9 @@ tasks: # TODO(gregmagolan): figure out how to install missing shared libs # Without this filter the @cypress external repository will be built and that build will fail due to missing shared libs. - "--build_tag_filters=-cypress" - # This target is tagged "manual" but we want some CI - # coverage of it to make sure it doesn't break. - - "//docs" + # Build the docs up to the point of running Jekyll as this requires some locally installed deps + # Building the stardoc targets provides a little test coverage in formatting etc + - "//docs:builtins_md" test_flags: # Both chrome & firefox are missing shared libs on bazelci ubuntu. # On circleci we have the same issue but we can work around it using apt-get. diff --git a/docs/BUILD.bazel b/docs/BUILD.bazel index eb16ffe8b8..e1c7430ded 100644 --- a/docs/BUILD.bazel +++ b/docs/BUILD.bazel @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -load("//tools/stardoc:index.bzl", "stardoc") +load("//tools/stardoc:index.bzl", "rules_nodejs_docs", "stardoc") stardoc( name = "builtins", @@ -53,45 +53,35 @@ genrule( tags = ["fix-windows"], ) -_PACKAGE_READMES = { - "Built-ins": ":builtins.doc", - "Cypress": "//packages/cypress:README.md", - "Jasmine": "//packages/jasmine:README.md", - "Karma": "//packages/karma:README.md", - "Protractor": "//packages/protractor:README.md", - "Rollup": "//packages/rollup:README.md", - "Terser": "//packages/terser:README.md", - "TypeScript": "//packages/typescript:README.md", -} - -_FRONT_MATTER = "\n".join([ - "---", - "title: %s", - "layout: default", - "stylesheet: docs", - "---", - "", -]) - -[ - genrule( - name = "%s_md" % readme[0], - srcs = [readme[1]], - outs = [readme[0] + ".md"], - cmd = "echo '%s' > $@;" % _FRONT_MATTER % readme[0] + - "cat $< >> $@", - tags = ["fix-windows"], - ) - for readme in _PACKAGE_READMES.items() -] - -filegroup( +rules_nodejs_docs( name = "docs", - srcs = [s + ".md" for s in _PACKAGE_READMES.keys()], - tags = ["fix-windows"], + assets = glob(["images/*"]), + config = "_config.yml", + css = "//docs/css", + docs = [ + "install.md", + "repositories.md", + "debugging.md", + "dependencies.md", + "stamping.md", + "index.md", + "examples.md", + "changing-rules.md", + ], + includes = glob(["_includes/*"]), + layouts = glob(["_layouts/*"]), + readmes = { + "Built-ins": ":builtins.doc", + "Cypress": "//packages/cypress:README.md", + "Jasmine": "//packages/jasmine:README.md", + "Karma": "//packages/karma:README.md", + "Protractor": "//packages/protractor:README.md", + "Rollup": "//packages/rollup:README.md", + "Terser": "//packages/terser:README.md", + "TypeScript": "//packages/typescript:README.md", + }, + tags = [ + "fix-windows", + "manual", + ], ) diff --git a/docs/Built-ins.html b/docs/Built-ins.html new file mode 100755 index 0000000000..fd5726f09e --- /dev/null +++ b/docs/Built-ins.html @@ -0,0 +1,2863 @@ + + + + + + + + + + rules_nodejs - Built-ins + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ +

Built-in rules

+ +

These rules are available without any npm installation, via the WORKSPACE install of the build_bazel_rules_nodejs workspace. This is necessary to bootstrap Bazel to run the package manager to download other rules from NPM.

+ +

node_repositories

+ +

To be run in user’s WORKSPACE to install rules_nodejs dependencies.

+ +

This rule sets up node, npm, and yarn. The versions of these tools can be specified in one of three ways

+ +

Simplest Usage

+ +

Specify no explicit versions. This will download and use the latest NodeJS & Yarn that were available when the +version of rules_nodejs you’re using was released. +Note that you can skip calling node_repositories in your WORKSPACE file - if you later try to yarn_install or npm_install, +we’ll automatically select this simple usage for you.

+ +

Forced version(s)

+ +

You can select the version of NodeJS and/or Yarn to download & use by specifying it when you call node_repositories, +using a value that matches a known version (see the default values)

+ +

Using a custom version

+ +

You can pass in a custom list of NodeJS and/or Yarn repositories and URLs for node_resositories to use.

+ +

Custom NodeJS versions

+ +

To specify custom NodeJS versions, use the node_repositories attribute

+ +
node_repositories(
+    node_repositories = {
+        "10.10.0-darwin_amd64": ("node-v10.10.0-darwin-x64.tar.gz", "node-v10.10.0-darwin-x64", "00b7a8426e076e9bf9d12ba2d571312e833fe962c70afafd10ad3682fdeeaa5e"),
+        "10.10.0-linux_amd64": ("node-v10.10.0-linux-x64.tar.xz", "node-v10.10.0-linux-x64", "686d2c7b7698097e67bcd68edc3d6b5d28d81f62436c7cf9e7779d134ec262a9"),
+        "10.10.0-windows_amd64": ("node-v10.10.0-win-x64.zip", "node-v10.10.0-win-x64", "70c46e6451798be9d052b700ce5dadccb75cf917f6bf0d6ed54344c856830cfb"),
+    },
+)
+ +

These can be mapped to a custom download URL, using node_urls

+ +
node_repositories(
+    node_version = "10.10.0",
+    node_repositories = {"10.10.0-darwin_amd64": ("node-v10.10.0-darwin-x64.tar.gz", "node-v10.10.0-darwin-x64", "00b7a8426e076e9bf9d12ba2d571312e833fe962c70afafd10ad3682fdeeaa5e")},
+    node_urls = ["https://mycorpproxy/mirror/node/v{version}/{filename}"],
+)
+ +

A Mac client will try to download node from https://mycorpproxy/mirror/node/v10.10.0/node-v10.10.0-darwin-x64.tar.gz +and expect that file to have sha256sum 00b7a8426e076e9bf9d12ba2d571312e833fe962c70afafd10ad3682fdeeaa5e

+ +

Custom Yarn versions

+ +

To specify custom Yarn versions, use the yarn_repositories attribute

+ +
node_repositories(
+    yarn_repositories = {
+        "1.12.1": ("yarn-v1.12.1.tar.gz", "yarn-v1.12.1", "09bea8f4ec41e9079fa03093d3b2db7ac5c5331852236d63815f8df42b3ba88d"),
+    },
+)
+ +

Like node_urls, the yarn_urls attribute can be used to provide a list of custom URLs to use to download yarn

+ +
node_repositories(
+    yarn_repositories = {
+        "1.12.1": ("yarn-v1.12.1.tar.gz", "yarn-v1.12.1", "09bea8f4ec41e9079fa03093d3b2db7ac5c5331852236d63815f8df42b3ba88d"),
+    },
+    yarn_version = "1.12.1",
+    yarn_urls = [
+        "https://github.com/yarnpkg/yarn/releases/download/v{version}/{filename}",
+    ],
+)
+ +

Will download yarn from https://github.com/yarnpkg/yarn/releases/download/v1.2.1/yarn-v1.12.1.tar.gz +and expect the file to have sha256sum 09bea8f4ec41e9079fa03093d3b2db7ac5c5331852236d63815f8df42b3ba88d.

+ +

Using a local version

+ +

To avoid downloads, you can check in vendored copies of NodeJS and/or Yarn and set vendored_node and or vendored_yarn +to point to those before calling node_repositories. You can also point to a location where node is installed on your computer, +but we don’t recommend this because it leads to version skew between you, your coworkers, and your Continuous Integration environment. +It also ties your build to a single platform, preventing you from cross-compiling into a Linux docker image on Mac for example.

+ +

See the the repositories documentation for how to use the resulting repositories.

+ +

Creating dependency installation scripts for manually-managed dependencies

+ +

You can optionally pass a </code>package_json array to node_repositories. This lets you use Bazel's version of yarn or npm, yet always run the package manager yourself. +This is an advanced scenario you can use in place of the npm_install or yarn_install` rules, but we don’t recommend it, and might remove it in the future.

+ +
load("@build_bazel_rules_nodejs//:index.bzl", "node_repositories")
+node_repositories(package_json = ["//:package.json", "//subpkg:package.json"])
+ +

Running bazel run @nodejs//:yarn_node_repositories in this repo would create /node_modules and /subpkg/node_modules.

+ +

Note that the dependency installation scripts will run in each subpackage indicated by the package_json attribute.

+ +
+node_repositories(name, node_repositories, node_urls, node_version, package_json, preserve_symlinks,
+                  vendored_node, vendored_yarn, yarn_repositories, yarn_urls, yarn_version)
+
+ +

ATTRIBUTES

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionTypeMandatoryDefault
name + A unique name for this repository. + Namerequired + +
node_repositories + Custom list of node repositories to use + +A dictionary mapping NodeJS versions to sets of hosts and their corresponding (filename, strip_prefix, sha256) tuples. +You should list a node binary for every platform users have, likely Mac, Windows, and Linux. + Dictionary: String -> List of stringsoptional + {"8.0.0-darwin_amd64": ("node-v8.0.0-darwin-x64.tar.gz", "node-v8.0.0-darwin-x64", "6e4a66917e2c11d5adc537c899941c973ae586293352b8172a4f32be0b7f0300"), "8.0.0-linux_arm64": ("node-v8.0.0-linux-arm64.tar.xz", "node-v8.0.0-linux-arm64", "8d6eaefcc252055de54a666d4e00eec78caf2143cd7a13b63f109e9eb78a795e"), "8.0.0-linux_amd64": ("node-v8.0.0-linux-x64.tar.xz", "node-v8.0.0-linux-x64", "0a536bb83eeccca23626e5e5ead52563a641e4331c35e367662892921dc7e8a4"), "8.0.0-windows_amd64": ("node-v8.0.0-win-x64.zip", "node-v8.0.0-win-x64", "84410377118857674e0fb6e7bc7627ffb8cc67a72f162a050276b076e328a9bb"), "8.1.0-darwin_amd64": ("node-v8.1.0-darwin-x64.tar.gz", "node-v8.1.0-darwin-x64", "08af5f1a7441728cabf9b11af25da28ee1725903524968dd9621b885b13303c7"), "8.1.0-linux_arm64": ("node-v8.1.0-linux-arm64.tar.xz", "node-v8.1.0-linux-arm64", "adf2f517c9847cbb5904b282c0819526b5264c256477ed5e4b258584daa1a2ea"), "8.1.0-linux_amd64": ("node-v8.1.0-linux-x64.tar.xz", "node-v8.1.0-linux-x64", "1638a0083c6eee122cbbefdf39cb8bcc43cf19fedff331a0317b05fd38dcb6df"), "8.1.0-windows_amd64": ("node-v8.1.0-win-x64.zip", "node-v8.1.0-win-x64", "cee1fd1c828e8996824a2d9f9056dfae771b77c05b15ad015bc7f8800409215c"), "8.1.1-darwin_amd64": ("node-v8.1.1-darwin-x64.tar.gz", "node-v8.1.1-darwin-x64", "2f67890a5a46564672cfd4522cc00c7ac04d307e6a942ae1ad38b6aee94c29e2"), "8.1.1-linux_arm64": ("node-v8.1.1-linux-arm64.tar.xz", "node-v8.1.1-linux-arm64", "3971543f9d29f77ddb8f47a54e4b99422a822173599748ab7fcd9c35c8e25124"), "8.1.1-linux_amd64": ("node-v8.1.1-linux-x64.tar.xz", "node-v8.1.1-linux-x64", "6a735e77bdd21c92fe85ea5f9f567d0d6930fa33e0e111946b17cdb7efefb8d5"), "8.1.1-windows_amd64": ("node-v8.1.1-win-x64.zip", "node-v8.1.1-win-x64", "459f3b62e58f4fac3b9b5e49694855f338f3dcf2fcf955299ee2a47f7687625a"), "8.1.2-darwin_amd64": ("node-v8.1.2-darwin-x64.tar.gz", "node-v8.1.2-darwin-x64", "70f353449b19d6d36262f5e38f9cc23e80b2034c21ae48623a6a4890f513eb53"), "8.1.2-linux_arm64": ("node-v8.1.2-linux-arm64.tar.xz", "node-v8.1.2-linux-arm64", "d468ac671047a5a5edb6edd34a9a625645505551c35ef73e2102c504535a09d4"), "8.1.2-linux_amd64": ("node-v8.1.2-linux-x64.tar.xz", "node-v8.1.2-linux-x64", "f5dc173d3005fbcfd107c83a15d4dbff9a28ff53ab42c23344a572d84814ecfe"), "8.1.2-windows_amd64": ("node-v8.1.2-win-x64.zip", "node-v8.1.2-win-x64", "5463c812afeb498ad8ab9c396246e455d9353ab48ae409c82a2a45193e161f66"), "8.1.3-darwin_amd64": ("node-v8.1.3-darwin-x64.tar.gz", "node-v8.1.3-darwin-x64", "ae588038480a6acc57b6b04802fa876e0b602231e9846944dd1b4437e8c1205f"), "8.1.3-linux_arm64": ("node-v8.1.3-linux-arm64.tar.xz", "node-v8.1.3-linux-arm64", "cebc2edd89f20613a530509a2435ecc42757ce16032559ef174ebe84875a1536"), "8.1.3-linux_amd64": ("node-v8.1.3-linux-x64.tar.xz", "node-v8.1.3-linux-x64", "d41dc375ea7e33fadf0fb1bf89d9dfd222a2fb85633fba3d2cf48ac03522ba71"), "8.1.3-windows_amd64": ("node-v8.1.3-win-x64.zip", "node-v8.1.3-win-x64", "be582920c723124ebad48c968f539ef66b1f628d8b6f2338dc68a32f95104856"), "8.1.4-darwin_amd64": ("node-v8.1.4-darwin-x64.tar.gz", "node-v8.1.4-darwin-x64", "a24858a10dd4ca8ad55fd61a7472b4fe9140eb3fa347c41717360c3f29438748"), "8.1.4-linux_arm64": ("node-v8.1.4-linux-arm64.tar.xz", "node-v8.1.4-linux-arm64", "3553c617f594286fea7052678d04aec9e167adddf702b70431d88ce42573c339"), "8.1.4-linux_amd64": ("node-v8.1.4-linux-x64.tar.xz", "node-v8.1.4-linux-x64", "d82fe7ef7e0f8ca1c343f00e3e490996553507ec7d42034f5df034cc7908caaf"), "8.1.4-windows_amd64": ("node-v8.1.4-win-x64.zip", "node-v8.1.4-win-x64", "cc3689ffefc738f6256aab1713343c3c64c24ec997600c0a48243fb26f5e0bce"), "8.2.0-darwin_amd64": ("node-v8.2.0-darwin-x64.tar.gz", "node-v8.2.0-darwin-x64", "da5cca37ae0afdbff3a269bb3dc71ff0d86e282920286f71ae5eb6757cfa5356"), "8.2.0-linux_arm64": ("node-v8.2.0-linux-arm64.tar.xz", "node-v8.2.0-linux-arm64", "3298ae4ae67c4ad714bed23383fd08db5711b164a077a25fb6b282533e65cf77"), "8.2.0-linux_amd64": ("node-v8.2.0-linux-x64.tar.xz", "node-v8.2.0-linux-x64", "e8ceaac3ee4385d53bcebc552a7a6b545b09b9652f5ca1b254aae698fd9a25f9"), "8.2.0-windows_amd64": ("node-v8.2.0-win-x64.zip", "node-v8.2.0-win-x64", "6bc3cc580f0e8190e6a03d6a5967c861c29d6a6eb50f995b3afb7d60b8cee4e1"), "8.2.1-darwin_amd64": ("node-v8.2.1-darwin-x64.tar.gz", "node-v8.2.1-darwin-x64", "32d0923c147470d57f18f055014f5a9fe8a3919406010a2e80ba85952d3c9923"), "8.2.1-linux_arm64": ("node-v8.2.1-linux-arm64.tar.xz", "node-v8.2.1-linux-arm64", "9ed01737f37d410067beeb42066e51f6d0385677c7d0daeeaf2e32cb2aca854a"), "8.2.1-linux_amd64": ("node-v8.2.1-linux-x64.tar.xz", "node-v8.2.1-linux-x64", "abcddeb95cc4465953b1edb0922d20e9b0b3de83688fc8150b863117032a978a"), "8.2.1-windows_amd64": ("node-v8.2.1-win-x64.zip", "node-v8.2.1-win-x64", "37e84e54c67e3d1e52d657c04835b211c94631a0b358f4e7dc351618fdb6c083"), "8.3.0-darwin_amd64": ("node-v8.3.0-darwin-x64.tar.gz", "node-v8.3.0-darwin-x64", "a627354982a514e77e5c37ed5952edc81a7dd9c4f661fd919f192c21ae548654"), "8.3.0-linux_arm64": ("node-v8.3.0-linux-arm64.tar.xz", "node-v8.3.0-linux-arm64", "9e0dab4913585a1b8117bda03c4b5581d9140aec67bb4be0e0b6a4999b41b4ab"), "8.3.0-linux_amd64": ("node-v8.3.0-linux-x64.tar.xz", "node-v8.3.0-linux-x64", "ae377995c6e1af8e2a60c4a929f77562ebed9a2c6897cbd311a2c331f76b4e0f"), "8.3.0-windows_amd64": ("node-v8.3.0-win-x64.zip", "node-v8.3.0-win-x64", "e762fa218465e5aa0952336eee2c3e42e5b48390b36838ca7b6a243812e0b7e5"), "8.4.0-darwin_amd64": ("node-v8.4.0-darwin-x64.tar.gz", "node-v8.4.0-darwin-x64", "cc10ffbd11586bd27a7cc5e6e2d03fd3e0b341368387a03ee9a0117a0288599d"), "8.4.0-linux_arm64": ("node-v8.4.0-linux-arm64.tar.xz", "node-v8.4.0-linux-arm64", "0a811bbe4905fc879f3cbfc976e5a37cca05bbd609774abe4332b29fea75f073"), "8.4.0-linux_amd64": ("node-v8.4.0-linux-x64.tar.xz", "node-v8.4.0-linux-x64", "7fd86abad06f96cb2f889c2a0e25686a3de3e9a078ad946ded91ee4f28d8218a"), "8.4.0-windows_amd64": ("node-v8.4.0-win-x64.zip", "node-v8.4.0-win-x64", "0f60c99479f74d75c7239795c90698826ba8252019d4c23e82ed0d72ceb8974f"), "8.5.0-darwin_amd64": ("node-v8.5.0-darwin-x64.tar.gz", "node-v8.5.0-darwin-x64", "0c8d4c4d90f858a19a29fe1ae7f42b2b7f1a4d3caaa25bea2e08479c00ebbd5f"), "8.5.0-linux_arm64": ("node-v8.5.0-linux-arm64.tar.xz", "node-v8.5.0-linux-arm64", "e0decdebe73dba516d6c72401e337cee6277c6e00f817b0bf1c592360adfd4e6"), "8.5.0-linux_amd64": ("node-v8.5.0-linux-x64.tar.xz", "node-v8.5.0-linux-x64", "a9651fcc6259b4a944ebb72e6dd116602c7b26ddf939599b060d1d3e6ead8c36"), "8.5.0-windows_amd64": ("node-v8.5.0-win-x64.zip", "node-v8.5.0-win-x64", "c385d162c15a7a85d42755ee8c78c1c73bd251e2f7cbf82e5e20c824564aa9df"), "8.6.0-darwin_amd64": ("node-v8.6.0-darwin-x64.tar.gz", "node-v8.6.0-darwin-x64", "2c95f3194a92e8b37aab8895fbaeb1f5fabef3494600ef78a7b7e078dba9a7c9"), "8.6.0-linux_arm64": ("node-v8.6.0-linux-arm64.tar.xz", "node-v8.6.0-linux-arm64", "6848567ab32d04694120e18c20ef47d0f4163229634f236e4bdbb8d135f3204e"), "8.6.0-linux_amd64": ("node-v8.6.0-linux-x64.tar.xz", "node-v8.6.0-linux-x64", "e6f52c3ed7e2cc34ebddbc563434fdf043feb449a60f028101eb45227aec3444"), "8.6.0-windows_amd64": ("node-v8.6.0-win-x64.zip", "node-v8.6.0-win-x64", "08e9b29c47567517ca95ca01d5cdb255279be5463952f92da5c372a99d620b23"), "8.7.0-darwin_amd64": ("node-v8.7.0-darwin-x64.tar.gz", "node-v8.7.0-darwin-x64", "5e59798c1deafd671a35ef4dcdb9b97ce98f9255a056832dc98d454613e9ea08"), "8.7.0-linux_arm64": ("node-v8.7.0-linux-arm64.tar.xz", "node-v8.7.0-linux-arm64", "5a1a1907fbb6d90667ce70ad42602534f6cc6eda873d1c50a3259349aee73418"), "8.7.0-linux_amd64": ("node-v8.7.0-linux-x64.tar.xz", "node-v8.7.0-linux-x64", "9d6f649576cac74ef0b6634af8265156370cf8fdf3676f03e867347d3207675d"), "8.7.0-windows_amd64": ("node-v8.7.0-win-x64.zip", "node-v8.7.0-win-x64", "e95be435674e82ea7133c3268cb70044eabde2d0aef28b2a3df5c7d8d23cadcc"), "8.8.0-darwin_amd64": ("node-v8.8.0-darwin-x64.tar.gz", "node-v8.8.0-darwin-x64", "69a37e240fac48289a2a5bb75ab96091f8d6457eeaf23c0a5125250abe418176"), "8.8.0-linux_arm64": ("node-v8.8.0-linux-arm64.tar.xz", "node-v8.8.0-linux-arm64", "454617ff94882d9a81dca0840065fb5a928ff68e8e8efe7c1748d996ab757b2e"), "8.8.0-linux_amd64": ("node-v8.8.0-linux-x64.tar.xz", "node-v8.8.0-linux-x64", "4304c297f41085ac1f7a6a8e68496d9fd5aa3b92590e7c3c6015a23939767e72"), "8.8.0-windows_amd64": ("node-v8.8.0-win-x64.zip", "node-v8.8.0-win-x64", "a7a1fd2c5f5c967d7df70fdec1a8b2d2d2b1b411fcdd4f23bcf8c9c837a7c3cb"), "8.8.1-darwin_amd64": ("node-v8.8.1-darwin-x64.tar.gz", "node-v8.8.1-darwin-x64", "bf208e29418fb3efc836d3d32b62b9162f0f0b36a0665abc0990f4e292cfc84b"), "8.8.1-linux_arm64": ("node-v8.8.1-linux-arm64.tar.xz", "node-v8.8.1-linux-arm64", "ea8ad0286a31e7519e979fcf99e503845a95da640cd140be5cff418a68fa6263"), "8.8.1-linux_amd64": ("node-v8.8.1-linux-x64.tar.xz", "node-v8.8.1-linux-x64", "004bc95267ef5d5b928f560582f681a679bada2201bf221735a02f4956f67b09"), "8.8.1-windows_amd64": ("node-v8.8.1-win-x64.zip", "node-v8.8.1-win-x64", "a7e60a1a5f46ef309cbe74e423c17e69dd0a573f0c92c9e325caade3388d192a"), "8.9.0-darwin_amd64": ("node-v8.9.0-darwin-x64.tar.gz", "node-v8.9.0-darwin-x64", "aaf165348bc6d20012b048a88a8f3a35cba6799496e8f4c1246d85c524a84dbc"), "8.9.0-linux_arm64": ("node-v8.9.0-linux-arm64.tar.xz", "node-v8.9.0-linux-arm64", "30cb00ac1cf6b466b1f27e7ce41363a67a66dbb64227c2dc5e33d221b09fc579"), "8.9.0-linux_amd64": ("node-v8.9.0-linux-x64.tar.xz", "node-v8.9.0-linux-x64", "e92b91fa473f9ad805a1241907b6f1bd3f8ceac8426a8b4cb05428e62e243bdd"), "8.9.0-windows_amd64": ("node-v8.9.0-win-x64.zip", "node-v8.9.0-win-x64", "dd971e43ff003213b0be31c1a8ce3421f72e0db2a703bc254ac685be4f7f609e"), "8.9.1-darwin_amd64": ("node-v8.9.1-darwin-x64.tar.gz", "node-v8.9.1-darwin-x64", "05c992a6621d28d564b92bf3051a5dc0adf83839237c0d4653a8cdb8a1c73b94"), "8.9.1-linux_arm64": ("node-v8.9.1-linux-arm64.tar.xz", "node-v8.9.1-linux-arm64", "f774660980dcf931bf29847a5f26317823a063fa4a56f85f37c3222d77cce7c1"), "8.9.1-linux_amd64": ("node-v8.9.1-linux-x64.tar.xz", "node-v8.9.1-linux-x64", "8be82805f7c1ab3e64d4569fb9a90ded2de78dd27cadbb91bad1bf975dae1e2d"), "8.9.1-windows_amd64": ("node-v8.9.1-win-x64.zip", "node-v8.9.1-win-x64", "db89c6e041da359561fbe7da075bb4f9881a0f7d3e98c203e83732cfb283fa4a"), "8.9.2-darwin_amd64": ("node-v8.9.2-darwin-x64.tar.gz", "node-v8.9.2-darwin-x64", "ba03ae4c0ebd33e8661b5b241211ddb9f7e3b5b959d8cbd68f5941cb1ed5784d"), "8.9.2-linux_arm64": ("node-v8.9.2-linux-arm64.tar.xz", "node-v8.9.2-linux-arm64", "cc222b4f910ff27ff66ccc96d5c7e2117942bcd161ec253d83cf430146b79bdf"), "8.9.2-linux_amd64": ("node-v8.9.2-linux-x64.tar.xz", "node-v8.9.2-linux-x64", "d4065724e7f5f11e999f78de50fb0faac74341799cb0c0dafcbe87e0ecb0be86"), "8.9.2-windows_amd64": ("node-v8.9.2-win-x64.zip", "node-v8.9.2-win-x64", "2afa8b899c0dddea50dcf5dda66ae7b0ca32326dbf66c52f947c082e7c95d090"), "8.9.3-darwin_amd64": ("node-v8.9.3-darwin-x64.tar.gz", "node-v8.9.3-darwin-x64", "fa7962f25db420a374e9e60d8a410188bd690a2f0ce8d403aa9b09d9b7ae8c1f"), "8.9.3-linux_arm64": ("node-v8.9.3-linux-arm64.tar.xz", "node-v8.9.3-linux-arm64", "8860678ad0c24059380af254574e5a12371a2d5c92ca5e1ac7267314af7df04f"), "8.9.3-linux_amd64": ("node-v8.9.3-linux-x64.tar.xz", "node-v8.9.3-linux-x64", "86f3aa593315f0503d069e3f4805019583ab8d86c0244a83c795d1942e3f99b7"), "8.9.3-windows_amd64": ("node-v8.9.3-win-x64.zip", "node-v8.9.3-win-x64", "17dee0c06d088269123a27db3905a39a17a51cc0ea65435ae942c718f0f94403"), "8.9.4-darwin_amd64": ("node-v8.9.4-darwin-x64.tar.gz", "node-v8.9.4-darwin-x64", "ca50f7d2035eb805306e303b644bb1cde170ce2615e0a2c6e95fb80881c48c24"), "8.9.4-linux_arm64": ("node-v8.9.4-linux-arm64.tar.xz", "node-v8.9.4-linux-arm64", "7c0369a5dbc98d0989c208ca3ee1b6db4cba576343014fdbf7d36fd2659f7089"), "8.9.4-linux_amd64": ("node-v8.9.4-linux-x64.tar.xz", "node-v8.9.4-linux-x64", "68b94aac38cd5d87ab79c5b38306e34a20575f31a3ea788d117c20fffcca3370"), "8.9.4-windows_amd64": ("node-v8.9.4-win-x64.zip", "node-v8.9.4-win-x64", "48946e99ac4484e071df25741d2300f3a656f476c5ff3f8116a4746c07ebe3b7"), "8.10.0-darwin_amd64": ("node-v8.10.0-darwin-x64.tar.gz", "node-v8.10.0-darwin-x64", "7d77bd35bc781f02ba7383779da30bd529f21849b86f14d87e097497671b0271"), "8.10.0-linux_arm64": ("node-v8.10.0-linux-arm64.tar.xz", "node-v8.10.0-linux-arm64", "cbec410109664f75d3c988a43483576fc56f745e05e3884891df9c509fbb1b12"), "8.10.0-linux_amd64": ("node-v8.10.0-linux-x64.tar.xz", "node-v8.10.0-linux-x64", "92220638d661a43bd0fee2bf478cb283ead6524f231aabccf14c549ebc2bc338"), "8.10.0-windows_amd64": ("node-v8.10.0-win-x64.zip", "node-v8.10.0-win-x64", "936ada36cb6f09a5565571e15eb8006e45c5a513529c19e21d070acf0e50321b"), "8.11.0-darwin_amd64": ("node-v8.11.0-darwin-x64.tar.gz", "node-v8.11.0-darwin-x64", "408323335b8c691d75397c76ddd7b00490852652c78c813c586ba7eccc5c382b"), "8.11.0-linux_arm64": ("node-v8.11.0-linux-arm64.tar.xz", "node-v8.11.0-linux-arm64", "a28f599a14ca9ef4062fa1e605b69cd046f81d3fc9a7d6dde1856fb593004b3a"), "8.11.0-linux_amd64": ("node-v8.11.0-linux-x64.tar.xz", "node-v8.11.0-linux-x64", "180ef8c2a39c1696b9a05832883ed981ba11475ffa44ca77781a8d1c1954f944"), "8.11.0-windows_amd64": ("node-v8.11.0-win-x64.zip", "node-v8.11.0-win-x64", "55b9c8d48b59569117a63fdb26e1de05e792c37f563feb7d44b4cd59be96aff8"), "8.11.1-darwin_amd64": ("node-v8.11.1-darwin-x64.tar.gz", "node-v8.11.1-darwin-x64", "5c7b05899ff56910a2b8180f139d48612f349ac2c5d20f08dbbeffbed9e3a089"), "8.11.1-linux_arm64": ("node-v8.11.1-linux-arm64.tar.xz", "node-v8.11.1-linux-arm64", "ff518f33751baa8ea4f18853d446357c2edecd930a1526ac9b2eaa79baddc1bf"), "8.11.1-linux_amd64": ("node-v8.11.1-linux-x64.tar.xz", "node-v8.11.1-linux-x64", "6617e245fa0f7fbe0e373e71d543fea878315324ab31dc64b4eba10e42d04c11"), "8.11.1-windows_amd64": ("node-v8.11.1-win-x64.zip", "node-v8.11.1-win-x64", "7d49b59c2b5d73a14c138e8a215d558a64a5241cd5035d9824f608e7bba097b1"), "8.11.2-darwin_amd64": ("node-v8.11.2-darwin-x64.tar.gz", "node-v8.11.2-darwin-x64", "6bd619ab577a1256531e50e31924d99a094eb920de8b5bd060a056a2608282b9"), "8.11.2-linux_arm64": ("node-v8.11.2-linux-arm64.tar.xz", "node-v8.11.2-linux-arm64", "c8e9833402277c1a5a31b41cc31c9cedad68ba87c2ef78aed6a3ced81af9da7f"), "8.11.2-linux_amd64": ("node-v8.11.2-linux-x64.tar.xz", "node-v8.11.2-linux-x64", "213599127d24496cbf1cbb2a7c51060a3506d6b11132c59bb7f9f8a0edd210a7"), "8.11.2-windows_amd64": ("node-v8.11.2-win-x64.zip", "node-v8.11.2-win-x64", "bbac1f56e8001a093acb2942f8a43c3bf22aec58216f446b7bf01f6f822dfe3f"), "8.11.3-darwin_amd64": ("node-v8.11.3-darwin-x64.tar.gz", "node-v8.11.3-darwin-x64", "77fa26b4c2fc34bdf5a5dd1cd39c93b12087fbd25148c6f04bf409698ee48b86"), "8.11.3-linux_arm64": ("node-v8.11.3-linux-arm64.tar.xz", "node-v8.11.3-linux-arm64", "b8fddec18f20533929a07bc1d38ae63b1999a0252740094f0974b2cbea76eaa4"), "8.11.3-linux_amd64": ("node-v8.11.3-linux-x64.tar.xz", "node-v8.11.3-linux-x64", "08e2fcfea66746bd966ea3a89f26851f1238d96f86c33eaf6274f67fce58421a"), "8.11.3-windows_amd64": ("node-v8.11.3-win-x64.zip", "node-v8.11.3-win-x64", "91b779def1b21dcd1def7fc9671a869a1e2f989952e76fdc08a5d73570075f31"), "8.11.4-darwin_amd64": ("node-v8.11.4-darwin-x64.tar.gz", "node-v8.11.4-darwin-x64", "aa1de83b388581d0d9ec3276f4526ee67e17e0f1bc0deb5133f960ce5dc9f1ef"), "8.11.4-linux_arm64": ("node-v8.11.4-linux-arm64.tar.xz", "node-v8.11.4-linux-arm64", "46e90dd916ddbf88c866de300c1b2a26f9216b19abd92b29e89439f62fb6fc1c"), "8.11.4-linux_amd64": ("node-v8.11.4-linux-x64.tar.xz", "node-v8.11.4-linux-x64", "85ea7cbb5bf624e130585bfe3946e99c85ce5cb84c2aee474038bdbe912f908c"), "8.11.4-windows_amd64": ("node-v8.11.4-win-x64.zip", "node-v8.11.4-win-x64", "72a21e2fcd3703994f57cf707b92e7f939df99c3e0298102e7436849e4948536"), "8.12.0-darwin_amd64": ("node-v8.12.0-darwin-x64.tar.gz", "node-v8.12.0-darwin-x64", "ca131b84dfcf2b6f653a6521d31f7a108ad7d83f4d7e781945b2eca8172064aa"), "8.12.0-linux_arm64": ("node-v8.12.0-linux-arm64.tar.xz", "node-v8.12.0-linux-arm64", "0fbdcfd8cf0cb5e8f5beff84ba091fd47126ba44c628e3a351501419b211aa1a"), "8.12.0-linux_amd64": ("node-v8.12.0-linux-x64.tar.xz", "node-v8.12.0-linux-x64", "29a20479cd1e3a03396a4e74a1784ccdd1cf2f96928b56f6ffa4c8dae40c88f2"), "8.12.0-windows_amd64": ("node-v8.12.0-win-x64.zip", "node-v8.12.0-win-x64", "9b22c9b23148b61ea0052826b3ac0255b8a3a542c125272b8f014f15bf11b091"), "8.13.0-darwin_amd64": ("node-v8.13.0-darwin-x64.tar.gz", "node-v8.13.0-darwin-x64", "f6261c7a09a2c8bd77a8760a0e110410f508e5641ca132511b4883600f2d65f0"), "8.13.0-linux_arm64": ("node-v8.13.0-linux-arm64.tar.xz", "node-v8.13.0-linux-arm64", "e8e0daab515dfd0c2323b8e1274475f61c8ca1cf582dcc254583cbf8593425e3"), "8.13.0-linux_amd64": ("node-v8.13.0-linux-x64.tar.xz", "node-v8.13.0-linux-x64", "8fa1227b28113e25a8960d7fa6779a8c18bf20cfaafc9c5d0e46a3ee88373669"), "8.13.0-windows_amd64": ("node-v8.13.0-win-x64.zip", "node-v8.13.0-win-x64", "46293121d207350bd8d334efb67303337933c4dac886a840f88ff6059bff9443"), "8.14.0-darwin_amd64": ("node-v8.14.0-darwin-x64.tar.gz", "node-v8.14.0-darwin-x64", "1e9bb233bb3c3b01826f9d7e1b3ecf1047840ce96a3a7d1921ddcb569c467329"), "8.14.0-linux_arm64": ("node-v8.14.0-linux-arm64.tar.xz", "node-v8.14.0-linux-arm64", "fbcef89a60f1f40699589850f861fc84354a6f240610e2726c3743455dd82525"), "8.14.0-linux_amd64": ("node-v8.14.0-linux-x64.tar.xz", "node-v8.14.0-linux-x64", "a56d1af4d7da81504338b09809cf10b3144808d47d4117b9bd9a5a4ec4d5d9b9"), "8.14.0-windows_amd64": ("node-v8.14.0-win-x64.zip", "node-v8.14.0-win-x64", "d0be7c96a25c5d2b69f8a3510e9f4414643d5fe361b4509d455249e57f9a50af"), "8.14.1-darwin_amd64": ("node-v8.14.1-darwin-x64.tar.gz", "node-v8.14.1-darwin-x64", "d180a9b70de569e4c3d10c0c4a0af74e40dbca3e845df43ce1ec522bb4252eda"), "8.14.1-linux_arm64": ("node-v8.14.1-linux-arm64.tar.xz", "node-v8.14.1-linux-arm64", "488a66288052c6497133179e4546efb7fbaf105e432cd0d9aab3471901ab5e58"), "8.14.1-linux_amd64": ("node-v8.14.1-linux-x64.tar.xz", "node-v8.14.1-linux-x64", "1fec92a0110f692c68f7bdbec41b340c474bd77063323520786a7b9b00473daf"), "8.14.1-windows_amd64": ("node-v8.14.1-win-x64.zip", "node-v8.14.1-win-x64", "41793b873f98ceed632b24120ef44b2df89625f3dfa90eb9298dad698249167c"), "8.15.0-darwin_amd64": ("node-v8.15.0-darwin-x64.tar.gz", "node-v8.15.0-darwin-x64", "a393971136408f837fbc0f7d71a63754f91cfb1851d48bd612d8219eb61956f1"), "8.15.0-linux_arm64": ("node-v8.15.0-linux-arm64.tar.xz", "node-v8.15.0-linux-arm64", "5985c6dce65b1161ff41253da5aa4e64b8f10eb010a5d2712ea9b659f70179d7"), "8.15.0-linux_amd64": ("node-v8.15.0-linux-x64.tar.xz", "node-v8.15.0-linux-x64", "c1f0c5facdba78b5dec5136aec40dcb00b5c7cf404d9236a99c955994f91d969"), "8.15.0-windows_amd64": ("node-v8.15.0-win-x64.zip", "node-v8.15.0-win-x64", "13d8eab29c191bd16c69a70a556178a5adc988b243a036aaf3d5158861b60d8e"), "8.15.1-darwin_amd64": ("node-v8.15.1-darwin-x64.tar.gz", "node-v8.15.1-darwin-x64", "f3da0b4397150226c008a86c99d77dbb835dc62219d863654913a78332ab19a5"), "8.15.1-linux_arm64": ("node-v8.15.1-linux-arm64.tar.xz", "node-v8.15.1-linux-arm64", "69e000d78342c3d39583922c57947a906ad723789d6294951deb10cbe8709605"), "8.15.1-linux_amd64": ("node-v8.15.1-linux-x64.tar.xz", "node-v8.15.1-linux-x64", "5643b54c583eebaa40c1623b16cba4e3955ff5dfdd44036f6bafd761160c993d"), "8.15.1-windows_amd64": ("node-v8.15.1-win-x64.zip", "node-v8.15.1-win-x64", "f636fa578dc079bacc6c4bef13284ddb893c99f7640b96701c2690bd9c1431f5"), "8.16.0-darwin_amd64": ("node-v8.16.0-darwin-x64.tar.gz", "node-v8.16.0-darwin-x64", "a6710b8af0862fab0ccdba0549dbcdad76b5f99070652e64f6a85158038fc9a6"), "8.16.0-linux_arm64": ("node-v8.16.0-linux-arm64.tar.xz", "node-v8.16.0-linux-arm64", "4583d1cb44ff8b51cbf0402a78f2fe086c13a6c900c20c8be14e3b0e28e34335"), "8.16.0-linux_amd64": ("node-v8.16.0-linux-x64.tar.xz", "node-v8.16.0-linux-x64", "e538ffaaf2f808c084e70f1a1d2ff5559cff892cfd56e0bb67d00b0a95fc3a7a"), "8.16.0-windows_amd64": ("node-v8.16.0-win-x64.zip", "node-v8.16.0-win-x64", "d6baa929bacb78b347b29ebb0263220ea649ce82f3cdfd3f0b41ac725d1bbba5"), "8.16.1-darwin_amd64": ("node-v8.16.1-darwin-x64.tar.gz", "node-v8.16.1-darwin-x64", "ef1cb93f03bca4b9528e5d3226bdf8efa135e4b12285eee1e4760da06bac631a"), "8.16.1-linux_arm64": ("node-v8.16.1-linux-arm64.tar.xz", "node-v8.16.1-linux-arm64", "0c61c6ae8a70d96ab19848a09b2010d29b806f2dd79177da22c743fd5e352a98"), "8.16.1-linux_amd64": ("node-v8.16.1-linux-x64.tar.xz", "node-v8.16.1-linux-x64", "22a2580569c787ea83960bda0eae5dfaf1fe79382a52ad5fa5cd3accb93a1818"), "8.16.1-windows_amd64": ("node-v8.16.1-win-x64.zip", "node-v8.16.1-win-x64", "396dc41740bca0355d11865780e2af8e88eb17581cd2c445ccaf29b862901ab8"), "8.16.2-darwin_amd64": ("node-v8.16.2-darwin-x64.tar.gz", "node-v8.16.2-darwin-x64", "359331120e83f0707219398fc543b05eee9476446ecce549c20c4d9c7c103d29"), "8.16.2-linux_arm64": ("node-v8.16.2-linux-arm64.tar.xz", "node-v8.16.2-linux-arm64", "5afe366affb05136d25e99ec97a7a1ee1b690cc26df43567af0509f36b45e682"), "8.16.2-linux_amd64": ("node-v8.16.2-linux-x64.tar.xz", "node-v8.16.2-linux-x64", "88617a293f5828cc94ee99c94a43fbea12b989e34fe643fc14885a14748a8da6"), "8.16.2-windows_amd64": ("node-v8.16.2-win-x64.zip", "node-v8.16.2-win-x64", "98c615221500434155a8a5aff5fe96cd000400f3e76858ca97e6624f1d15eb73"), "8.17.0-darwin_amd64": ("node-v8.17.0-darwin-x64.tar.gz", "node-v8.17.0-darwin-x64", "3117430fc93e9865e4a1842616cc98767b5d6987fd9d727c8be4068714570e16"), "8.17.0-linux_arm64": ("node-v8.17.0-linux-arm64.tar.xz", "node-v8.17.0-linux-arm64", "8318d1ee0265d84025ecbea76aaecd732974a6f4ac8492ddd84231cee77ba948"), "8.17.0-linux_amd64": ("node-v8.17.0-linux-x64.tar.xz", "node-v8.17.0-linux-x64", "b7f6dd77fb173c8c7c30d61d0702eefc236bba74398538aa77bfa2bb47bddce6"), "8.17.0-windows_amd64": ("node-v8.17.0-win-x64.zip", "node-v8.17.0-win-x64", "e95a63e81b27e78872c0efb9dd5809403014dbf9896035cc17adf51a350f88fa"), "9.0.0-darwin_amd64": ("node-v9.0.0-darwin-x64.tar.gz", "node-v9.0.0-darwin-x64", "40fe905e492deadbf84c46baba413294e516fa844ed8e68adb4117f8acabe9a9"), "9.0.0-linux_arm64": ("node-v9.0.0-linux-arm64.tar.xz", "node-v9.0.0-linux-arm64", "0250e13705259dcf736ac4216833c2ade459e3ade94d89af68bd98ded1783cb6"), "9.0.0-linux_amd64": ("node-v9.0.0-linux-x64.tar.xz", "node-v9.0.0-linux-x64", "8313d2f6d69dbea4cb860803a156f093041cbe352a843c06f9f05cab1f30e9cc"), "9.0.0-windows_amd64": ("node-v9.0.0-win-x64.zip", "node-v9.0.0-win-x64", "d25901007e7c48da3af162bc1917d5bdd78c7e3b9cb64f16f90c38b59ef7b412"), "9.1.0-darwin_amd64": ("node-v9.1.0-darwin-x64.tar.gz", "node-v9.1.0-darwin-x64", "8e180de9b3f6a79f09a391c89de54920bbf5375337d3e13c5bfcbce85af711ab"), "9.1.0-linux_arm64": ("node-v9.1.0-linux-arm64.tar.xz", "node-v9.1.0-linux-arm64", "37d329fa06b22e30243c503b64d9666d56abb6c0ce903251d4b43e7ad0833fb3"), "9.1.0-linux_amd64": ("node-v9.1.0-linux-x64.tar.xz", "node-v9.1.0-linux-x64", "b796ed115c97acd23211c294129b0a834ff3a6a0f583111443b89d2b24e0d4d9"), "9.1.0-windows_amd64": ("node-v9.1.0-win-x64.zip", "node-v9.1.0-win-x64", "f2e76f536ff4fedd9884684f0b1979e04d0fd1c2a65d7d1a5a013de885dd07b3"), "9.2.0-darwin_amd64": ("node-v9.2.0-darwin-x64.tar.gz", "node-v9.2.0-darwin-x64", "42f78982b8614f099bc70819db40074ff7c1c49d4bac71eca5ffe4120452f289"), "9.2.0-linux_arm64": ("node-v9.2.0-linux-arm64.tar.xz", "node-v9.2.0-linux-arm64", "1b5c44160b7bfc9e5d63697d63c82330ae3e6094ab48449bd958ebe0baef73f0"), "9.2.0-linux_amd64": ("node-v9.2.0-linux-x64.tar.xz", "node-v9.2.0-linux-x64", "ded9cef0243bbe8ac5a417be0c6471bed6ed82367714ccb23f79a5be0ba2bd5d"), "9.2.0-windows_amd64": ("node-v9.2.0-win-x64.zip", "node-v9.2.0-win-x64", "5e7feb536547c715155d772f90857239b37897c1a1a664809fd84a7aeae1a724"), "9.2.1-darwin_amd64": ("node-v9.2.1-darwin-x64.tar.gz", "node-v9.2.1-darwin-x64", "4263f3da0280e2decd3a2ab97672e6f718acdf704664a3f1251e4ea267ccc971"), "9.2.1-linux_arm64": ("node-v9.2.1-linux-arm64.tar.xz", "node-v9.2.1-linux-arm64", "09d362e2ed5f4af5e5dc2253bb4523d7bcb92135bcc11d9eb89ad8336229b756"), "9.2.1-linux_amd64": ("node-v9.2.1-linux-x64.tar.xz", "node-v9.2.1-linux-x64", "548d2959939235ca56c98740f64b64058e43d1499d760603b7941b7c37ad10fe"), "9.2.1-windows_amd64": ("node-v9.2.1-win-x64.zip", "node-v9.2.1-win-x64", "7b48ef7c718fe5748844f93101f9276a88ae1cf3c4c228f85306a6a266471b5b"), "9.3.0-darwin_amd64": ("node-v9.3.0-darwin-x64.tar.gz", "node-v9.3.0-darwin-x64", "0539601e67e9be6995d4ba4abe565a748e25699060631369f59166d5de43d21a"), "9.3.0-linux_arm64": ("node-v9.3.0-linux-arm64.tar.xz", "node-v9.3.0-linux-arm64", "11300e878220962adade33238dd6e55928ad6d1362e0daa1f12e272137e68c0b"), "9.3.0-linux_amd64": ("node-v9.3.0-linux-x64.tar.xz", "node-v9.3.0-linux-x64", "0424dd6fa059fc32e0b73f460cb587b92b13c7b0af56331bbdc53a52e43f24ea"), "9.3.0-windows_amd64": ("node-v9.3.0-win-x64.zip", "node-v9.3.0-win-x64", "53bceda79c8d5dd8a185221a5ea2fc8f2b24ed7e0c9c91d18f6016b3624ff096"), "9.4.0-darwin_amd64": ("node-v9.4.0-darwin-x64.tar.gz", "node-v9.4.0-darwin-x64", "fa271c6012d517851603829af2131b92dc7b03d6f167dcd197cb83468a4971e8"), "9.4.0-linux_arm64": ("node-v9.4.0-linux-arm64.tar.xz", "node-v9.4.0-linux-arm64", "ceed69e91723cb902fcf70e790d34147a91241509257c77a62327871dfad04fa"), "9.4.0-linux_amd64": ("node-v9.4.0-linux-x64.tar.xz", "node-v9.4.0-linux-x64", "6d331d75a39fc5292dd128ad83f6dd14bbbdcb84ba0dfe793fade833be5de95a"), "9.4.0-windows_amd64": ("node-v9.4.0-win-x64.zip", "node-v9.4.0-win-x64", "89d49d73eb92483af0133c97e57a5b521c523960c130c76727daa3412af7d5d8"), "9.5.0-darwin_amd64": ("node-v9.5.0-darwin-x64.tar.gz", "node-v9.5.0-darwin-x64", "bc5c6eb21a90dbcaf90479838416c90524fe6d47e92c928ef57d7e96a54eb5fe"), "9.5.0-linux_arm64": ("node-v9.5.0-linux-arm64.tar.xz", "node-v9.5.0-linux-arm64", "d6a98a51c032963014f606acc80babb456f3dc4c041534ca565f573a2382b253"), "9.5.0-linux_amd64": ("node-v9.5.0-linux-x64.tar.xz", "node-v9.5.0-linux-x64", "76dd38bb5a16a610894353228ef020653f81209a2e509d38aee78ace4410599e"), "9.5.0-windows_amd64": ("node-v9.5.0-win-x64.zip", "node-v9.5.0-win-x64", "2fd1c3865a34827af6b5d799aee68e011a16a637276cbf71e923c8bedd010ee8"), "9.6.0-darwin_amd64": ("node-v9.6.0-darwin-x64.tar.gz", "node-v9.6.0-darwin-x64", "4f2001075b724791bf652b5432073aaaaec03cb00b17cda054ab0a05126035fe"), "9.6.0-linux_arm64": ("node-v9.6.0-linux-arm64.tar.xz", "node-v9.6.0-linux-arm64", "eb10815b1d21e8f5111b90c15b19050279b44666d08a12f26906271e9f6b02dd"), "9.6.0-linux_amd64": ("node-v9.6.0-linux-x64.tar.xz", "node-v9.6.0-linux-x64", "24b8670c819278135b4b8851d880615dee8458fdb5f5390ed0c88c383377f5d3"), "9.6.0-windows_amd64": ("node-v9.6.0-win-x64.zip", "node-v9.6.0-win-x64", "5f1da1ef6ba776449900c931e7acc3b60e47f3080425bf0e6a1c0c5a07dbd6fd"), "9.6.1-darwin_amd64": ("node-v9.6.1-darwin-x64.tar.gz", "node-v9.6.1-darwin-x64", "de486bc479817df2df1f91468e85e5da228a19101422c0c9a27153c1d0013c6d"), "9.6.1-linux_arm64": ("node-v9.6.1-linux-arm64.tar.xz", "node-v9.6.1-linux-arm64", "6246c85acab2dd92463fa1c456db31a24cd7b50b3fa556c4976c5a91473b8c8f"), "9.6.1-linux_amd64": ("node-v9.6.1-linux-x64.tar.xz", "node-v9.6.1-linux-x64", "d38f1707faccc54fae3cb201c25b02c4a3474d2c409c64f2a1d08925b238f8ad"), "9.6.1-windows_amd64": ("node-v9.6.1-win-x64.zip", "node-v9.6.1-win-x64", "c8176d317945ce6221473d70999ec7e725f1c9a7477e991bd7c729026c46dffb"), "9.7.0-darwin_amd64": ("node-v9.7.0-darwin-x64.tar.gz", "node-v9.7.0-darwin-x64", "9730cf3c4c5e228d4855c3362b63dbe59041202d89ae30d7f5ca42f60f742c5d"), "9.7.0-linux_arm64": ("node-v9.7.0-linux-arm64.tar.xz", "node-v9.7.0-linux-arm64", "18bec2bec5e2496f33b4d9d7f3bea7411cdb5d108f390b5c1949ddeda0e61125"), "9.7.0-linux_amd64": ("node-v9.7.0-linux-x64.tar.xz", "node-v9.7.0-linux-x64", "5c7549ceeebdc7ac5acdcae5fffbeb9585e3b9e2003e70e116d9f19c768f73d1"), "9.7.0-windows_amd64": ("node-v9.7.0-win-x64.zip", "node-v9.7.0-win-x64", "a17796c9c888e88a9a086dc1a22cdd872d8e948fbf1e988a8132fef716990530"), "9.7.1-darwin_amd64": ("node-v9.7.1-darwin-x64.tar.gz", "node-v9.7.1-darwin-x64", "9ee0fa891787865b1eccc63ef56134e7de8bbf67b660a1dde9e309305a1dc3b0"), "9.7.1-linux_arm64": ("node-v9.7.1-linux-arm64.tar.xz", "node-v9.7.1-linux-arm64", "d9143c23f7aa171449229abd456c8a9e07dc1033a1e791132b3387d439e2475d"), "9.7.1-linux_amd64": ("node-v9.7.1-linux-x64.tar.xz", "node-v9.7.1-linux-x64", "33b3ecd0a1de891a4a2f3586f1c6498c95c1ecc15864a6e3f4f7826792850d99"), "9.7.1-windows_amd64": ("node-v9.7.1-win-x64.zip", "node-v9.7.1-win-x64", "8590ff193e645d7f719e25d9519633376c72cfa1b36192031705e0065b7d69b2"), "9.8.0-darwin_amd64": ("node-v9.8.0-darwin-x64.tar.gz", "node-v9.8.0-darwin-x64", "c95326d6d8d01e5d4fbf0ca1b1e4fc0d800d00516f38532cc887e17c78f2af07"), "9.8.0-linux_arm64": ("node-v9.8.0-linux-arm64.tar.xz", "node-v9.8.0-linux-arm64", "f3537d06f010e77739be073003fca0b477efec8a72d503dc5a1d942a19973b07"), "9.8.0-linux_amd64": ("node-v9.8.0-linux-x64.tar.xz", "node-v9.8.0-linux-x64", "9f631739b0a9b96b8760c42869e88592db9c3fda2425202bd8b2d09e6371133a"), "9.8.0-windows_amd64": ("node-v9.8.0-win-x64.zip", "node-v9.8.0-win-x64", "dd3971c126907a033f2bc93fdd29327af3ff5b9d151b3b90eb5db1832fe6df9e"), "9.9.0-darwin_amd64": ("node-v9.9.0-darwin-x64.tar.gz", "node-v9.9.0-darwin-x64", "15e71817fe172119d6f9e0166ab869f12c67bdb7371d27a78b0621c408239692"), "9.9.0-linux_arm64": ("node-v9.9.0-linux-arm64.tar.xz", "node-v9.9.0-linux-arm64", "06feb32656c91c3963270de18d4a7befe52d2d8c0fd78fbbb7792a881ffeec7a"), "9.9.0-linux_amd64": ("node-v9.9.0-linux-x64.tar.xz", "node-v9.9.0-linux-x64", "457151b4e6f27222232742ce44de1df73768a251309dddbfca2b385052ee977f"), "9.9.0-windows_amd64": ("node-v9.9.0-win-x64.zip", "node-v9.9.0-win-x64", "5186747c7cab6ff153e725c42446727e460d54e6c62353d5dc550046f5c05653"), "9.10.0-darwin_amd64": ("node-v9.10.0-darwin-x64.tar.gz", "node-v9.10.0-darwin-x64", "c4b98cc2f3c00b770f24549de112902b56d57be7963a1047cd116b357bc61569"), "9.10.0-linux_arm64": ("node-v9.10.0-linux-arm64.tar.xz", "node-v9.10.0-linux-arm64", "ba1d682aa1d5a12eeb39e7f51e4c67c6122b24482869ca2547c6f094eae90658"), "9.10.0-linux_amd64": ("node-v9.10.0-linux-x64.tar.xz", "node-v9.10.0-linux-x64", "b9bfffc03ef0e2c97d463619911552c7f5b1b8699de07bb913990a8b33800cb9"), "9.10.0-windows_amd64": ("node-v9.10.0-win-x64.zip", "node-v9.10.0-win-x64", "3f159de87fd987e7bf30bbffce722e2e5133c44fc847883053359e9b08d6fa88"), "9.10.1-darwin_amd64": ("node-v9.10.1-darwin-x64.tar.gz", "node-v9.10.1-darwin-x64", "ae2d9dfdd3fdb6a6fe588e5479a768ee502968f6544ac8ad6133cb2e05726793"), "9.10.1-linux_arm64": ("node-v9.10.1-linux-arm64.tar.xz", "node-v9.10.1-linux-arm64", "9b084b30e48a3a145fcc6cb282a1b46145b703c13a5eaee40afc7f9d82ad697b"), "9.10.1-linux_amd64": ("node-v9.10.1-linux-x64.tar.xz", "node-v9.10.1-linux-x64", "fc810056be2a0665d0f67b42d25e1b8442bd885d4893b3256a7cfe676bd973de"), "9.10.1-windows_amd64": ("node-v9.10.1-win-x64.zip", "node-v9.10.1-win-x64", "43bf882dec1550e00a039f77190a3e2a778354577e542563be4b5c205de17df1"), "9.11.0-darwin_amd64": ("node-v9.11.0-darwin-x64.tar.gz", "node-v9.11.0-darwin-x64", "e562cfc01a4d8e62c1d86f59cef4f00439b4ad279c97f95f76a39f4b3530b8e5"), "9.11.0-linux_arm64": ("node-v9.11.0-linux-arm64.tar.xz", "node-v9.11.0-linux-arm64", "8df1dd7a1ec298900cf699a7ee8e5f0f478075d0e4c4fd3fb6e3a4ad3527545c"), "9.11.0-linux_amd64": ("node-v9.11.0-linux-x64.tar.xz", "node-v9.11.0-linux-x64", "a4349420b74804b3404a4eea27341297968f61998b01f6504dbbad603700e944"), "9.11.0-windows_amd64": ("node-v9.11.0-win-x64.zip", "node-v9.11.0-win-x64", "6e7f586ece923fd71e36d5db80b6a6d731a2b156464058cb2304f6c0192637cb"), "9.11.1-darwin_amd64": ("node-v9.11.1-darwin-x64.tar.gz", "node-v9.11.1-darwin-x64", "7b1fb394aa41a62b477e36df16644bd383cc9084808511f6cd318b835a06aac6"), "9.11.1-linux_arm64": ("node-v9.11.1-linux-arm64.tar.xz", "node-v9.11.1-linux-arm64", "dba2de106fbde2013a204ca9fafdfe67c0426b4e63d186f888e59432ad2dbb03"), "9.11.1-linux_amd64": ("node-v9.11.1-linux-x64.tar.xz", "node-v9.11.1-linux-x64", "4d27a95d5c2f1c8ef99118794c9c4903e63963418d3e16ca7576760cff39879b"), "9.11.1-windows_amd64": ("node-v9.11.1-win-x64.zip", "node-v9.11.1-win-x64", "0a3566d57ccb7fed95d18fc6c3bc1552a1b1e4753f9bc6c5d45e04f325e1ee53"), "9.11.2-darwin_amd64": ("node-v9.11.2-darwin-x64.tar.gz", "node-v9.11.2-darwin-x64", "340993096108d1dc0e0b598560d87ec645fc94b0fc83a423c36343f2da45f4b8"), "9.11.2-linux_arm64": ("node-v9.11.2-linux-arm64.tar.xz", "node-v9.11.2-linux-arm64", "9a713a6f4473425b83bf67e13e4b3c9f1f683c996b913f1f6854d208996367b6"), "9.11.2-linux_amd64": ("node-v9.11.2-linux-x64.tar.xz", "node-v9.11.2-linux-x64", "a2e7fe4ee3c4e3f31e00dff241c92c2ed779a9f36735578603d2be966f938a4b"), "9.11.2-windows_amd64": ("node-v9.11.2-win-x64.zip", "node-v9.11.2-win-x64", "051db8f4d3c0503e3082173f16b25e2362de8f9a5e509c403992b2069d826c25"), "10.0.0-darwin_amd64": ("node-v10.0.0-darwin-x64.tar.gz", "node-v10.0.0-darwin-x64", "37447fdb5f5cbcf1307ca1661ed67e6e911e0e988c0cb6d15f92eebb211dce88"), "10.0.0-linux_arm64": ("node-v10.0.0-linux-arm64.tar.xz", "node-v10.0.0-linux-arm64", "18f626a967d72294d969bdf000ca80ef483a8bb75482a2c4d14f5e0141626611"), "10.0.0-linux_amd64": ("node-v10.0.0-linux-x64.tar.xz", "node-v10.0.0-linux-x64", "d57c391daef40e706ca71abeaf9d53271c9d0fdb9cd18a80f6296b04dbaf2d5a"), "10.0.0-windows_amd64": ("node-v10.0.0-win-x64.zip", "node-v10.0.0-win-x64", "a95d88e2c28cbcbadb1fa431ec0b686f196dda00d4a25b0829450dc8f5214ec3"), "10.1.0-darwin_amd64": ("node-v10.1.0-darwin-x64.tar.gz", "node-v10.1.0-darwin-x64", "383ef526e27b92113f8dc0dad406b771f6ecaf9e3fddd4f5357590a3cf543d7b"), "10.1.0-linux_arm64": ("node-v10.1.0-linux-arm64.tar.xz", "node-v10.1.0-linux-arm64", "01e252589cf1ce61d2aaa316895001eb24c90a48b04a0e4896de252d2840ffe9"), "10.1.0-linux_amd64": ("node-v10.1.0-linux-x64.tar.xz", "node-v10.1.0-linux-x64", "cb5860c0d3249330d882fb8c6619c082cf3cda177536d4ed979388dde0034f22"), "10.1.0-windows_amd64": ("node-v10.1.0-win-x64.zip", "node-v10.1.0-win-x64", "8448bbd50731e98a4ed8bb4f3f3964170ff3a26418e9bcb3caf770faa9fb06d7"), "10.2.0-darwin_amd64": ("node-v10.2.0-darwin-x64.tar.gz", "node-v10.2.0-darwin-x64", "35fcc482d07218119ce5fde62620994324f03f8c4426dd680886c6844b62232a"), "10.2.0-linux_arm64": ("node-v10.2.0-linux-arm64.tar.xz", "node-v10.2.0-linux-arm64", "8f970be59a6a11f511a04ae1bd303746f0c5409498e062fb1d263d3c3c1093bd"), "10.2.0-linux_amd64": ("node-v10.2.0-linux-x64.tar.xz", "node-v10.2.0-linux-x64", "a6ef9adc824db795b36f81ad0856adc5c878395c4ce2af20f5ba7b76a1ca9982"), "10.2.0-windows_amd64": ("node-v10.2.0-win-x64.zip", "node-v10.2.0-win-x64", "7d7144d57b1b910d10f51d5445ae4306f10d3d9f45ca08b49e8777472993db51"), "10.2.1-darwin_amd64": ("node-v10.2.1-darwin-x64.tar.gz", "node-v10.2.1-darwin-x64", "6ffa149f67e8bd68d291d62591b6573146a65682affd99eefe2835a9c048d3ef"), "10.2.1-linux_arm64": ("node-v10.2.1-linux-arm64.tar.xz", "node-v10.2.1-linux-arm64", "6899cab91fd01af6b73183d23693120ff0de547601d01822b53647d0f5d934ee"), "10.2.1-linux_amd64": ("node-v10.2.1-linux-x64.tar.xz", "node-v10.2.1-linux-x64", "59ffaba5f54ea6a62ada1013a0cc1741c6e6fa790ab9ab2302a98932e7fb85d5"), "10.2.1-windows_amd64": ("node-v10.2.1-win-x64.zip", "node-v10.2.1-win-x64", "ebe78920d72b7a226a345653f3f718f99dc531add35157d37d229050f3685705"), "10.3.0-darwin_amd64": ("node-v10.3.0-darwin-x64.tar.gz", "node-v10.3.0-darwin-x64", "0bb5b7e3fe8cccda2abda958d1eb0408f1518a8b0cb58b75ade5d507cd5d6053"), "10.3.0-linux_arm64": ("node-v10.3.0-linux-arm64.tar.xz", "node-v10.3.0-linux-arm64", "6811b7b9807135902990508143605c0c758d07f7726092ed1b2e27cc60111bd0"), "10.3.0-linux_amd64": ("node-v10.3.0-linux-x64.tar.xz", "node-v10.3.0-linux-x64", "eb3c3e2585494699716ad3197c8eedf4003d3f110829b30c5a0dc34414c47423"), "10.3.0-windows_amd64": ("node-v10.3.0-win-x64.zip", "node-v10.3.0-win-x64", "65d586afb087406a2800d8e51f664c88b26d510f077b85a3b177a1bb79f73677"), "10.4.0-darwin_amd64": ("node-v10.4.0-darwin-x64.tar.gz", "node-v10.4.0-darwin-x64", "82b27983c990a6860e8d729e0b15acf9643ffca0eff282a926268849dfd2c3d2"), "10.4.0-linux_arm64": ("node-v10.4.0-linux-arm64.tar.xz", "node-v10.4.0-linux-arm64", "18d01e0937cdd05386f59f792613aac7b6614a37312ede0c299bd589584976e9"), "10.4.0-linux_amd64": ("node-v10.4.0-linux-x64.tar.xz", "node-v10.4.0-linux-x64", "ce2232578408f7d6bdc7d8bbb49d3416225fe68c52540ac23f4a6e0294d947f6"), "10.4.0-windows_amd64": ("node-v10.4.0-win-x64.zip", "node-v10.4.0-win-x64", "315fc4099902a71b634fee15e4e160a0780703c59a66e7e4542045f6f2b91451"), "10.4.1-darwin_amd64": ("node-v10.4.1-darwin-x64.tar.gz", "node-v10.4.1-darwin-x64", "c232241c97e1f4659186205d50b44132e62b61cdc517f1fb86905a21d03e9189"), "10.4.1-linux_arm64": ("node-v10.4.1-linux-arm64.tar.xz", "node-v10.4.1-linux-arm64", "c00b75a28eb69e4238c9d560f50da3652395ba7bfa6e325d5a2b0cd0926070f7"), "10.4.1-linux_amd64": ("node-v10.4.1-linux-x64.tar.xz", "node-v10.4.1-linux-x64", "6196daea2b291cdb865b3597e6b819b13068cb2c9dbf27cb150256c557a81082"), "10.4.1-windows_amd64": ("node-v10.4.1-win-x64.zip", "node-v10.4.1-win-x64", "70e0b9f0036f878884fdfc585c1001a439508d1d4e6448c4aced60274a2dc191"), "10.5.0-darwin_amd64": ("node-v10.5.0-darwin-x64.tar.gz", "node-v10.5.0-darwin-x64", "a85bda6ab91da8595e71736944cbd77c61afe05092217defd0fb74d9f77109f0"), "10.5.0-linux_arm64": ("node-v10.5.0-linux-arm64.tar.xz", "node-v10.5.0-linux-arm64", "28e6baa2a4ac5b0f0f5adf85489574038d0a4ca48efe76a4e5831b6b222652ba"), "10.5.0-linux_amd64": ("node-v10.5.0-linux-x64.tar.xz", "node-v10.5.0-linux-x64", "8b12be967f5962a8173dca235e1a6f642ee29dcf5fc27697004af898ffeca187"), "10.5.0-windows_amd64": ("node-v10.5.0-win-x64.zip", "node-v10.5.0-win-x64", "ce2b1f9976de64bcc0a5ce877edee0d29c4db1ebab5a7fd713afffd661e99e08"), "10.6.0-darwin_amd64": ("node-v10.6.0-darwin-x64.tar.gz", "node-v10.6.0-darwin-x64", "537efef0c6fd998502fa10baf82ee21edf513256cc73575991354e19442d0b69"), "10.6.0-linux_arm64": ("node-v10.6.0-linux-arm64.tar.xz", "node-v10.6.0-linux-arm64", "be37aade1c085093e276b5822a05233a1057bcafe77f5b9526dbdf622330c4bb"), "10.6.0-linux_amd64": ("node-v10.6.0-linux-x64.tar.xz", "node-v10.6.0-linux-x64", "cfd47380729f2451169b8900b3bd65e4b9db669d1d540613758cd2ededf7b5e6"), "10.6.0-windows_amd64": ("node-v10.6.0-win-x64.zip", "node-v10.6.0-win-x64", "0b58e0414d76e48432588910ea682f002ba69d7be88deb3355ceffb2fe472f6d"), "10.7.0-darwin_amd64": ("node-v10.7.0-darwin-x64.tar.gz", "node-v10.7.0-darwin-x64", "913473055605c8ae92f46923e6ac400133895aafe7766574fd46899bc6b0c5a4"), "10.7.0-linux_arm64": ("node-v10.7.0-linux-arm64.tar.xz", "node-v10.7.0-linux-arm64", "c23856b3123f9e2cfae3f8b0668019f83e9450ee78dede02a8d43031255b7ba0"), "10.7.0-linux_amd64": ("node-v10.7.0-linux-x64.tar.xz", "node-v10.7.0-linux-x64", "ad1d44cbe64ef44db5d8d42690a76dd186d6a6f71a3c3d38449757fe73135329"), "10.7.0-windows_amd64": ("node-v10.7.0-win-x64.zip", "node-v10.7.0-win-x64", "a0914d4c1fb82f51a03a4f57c66c9ce6a65ccd4f3237706042c55799843f4b14"), "10.8.0-darwin_amd64": ("node-v10.8.0-darwin-x64.tar.gz", "node-v10.8.0-darwin-x64", "b800d8b55c234b1f7d972e9464b00328a1caea5f86f94fdb5fc88ebbed7852b7"), "10.8.0-linux_arm64": ("node-v10.8.0-linux-arm64.tar.xz", "node-v10.8.0-linux-arm64", "0333da24d1fe54abac26b0a06437d3336c0fb4816b280507a9851ab3742ef2e4"), "10.8.0-linux_amd64": ("node-v10.8.0-linux-x64.tar.xz", "node-v10.8.0-linux-x64", "497f3b243d7374ee0fe9ab200b175868b172c3a22282cedc6d7fb0cad82471f0"), "10.8.0-windows_amd64": ("node-v10.8.0-win-x64.zip", "node-v10.8.0-win-x64", "f98575fb551d78691a6f74ca4f9c254bbd9fb62135e9ec0ab7ec8c40a03648b0"), "10.9.0-darwin_amd64": ("node-v10.9.0-darwin-x64.tar.gz", "node-v10.9.0-darwin-x64", "3c4fe75dacfcc495a432a7ba2dec9045cff359af2a5d7d0429c84a424ef686fc"), "10.9.0-linux_arm64": ("node-v10.9.0-linux-arm64.tar.xz", "node-v10.9.0-linux-arm64", "3d6aa717d98bbf901c5325a02a81048eb47212bdc44963ef8d59c6e52e987b7c"), "10.9.0-linux_amd64": ("node-v10.9.0-linux-x64.tar.xz", "node-v10.9.0-linux-x64", "c5acb8b7055ee0b6ac653dc4e458c5db45348cecc564b388f4ed1def84a329ff"), "10.9.0-windows_amd64": ("node-v10.9.0-win-x64.zip", "node-v10.9.0-win-x64", "6a75cdbb69d62ed242d6cbf0238a470bcbf628567ee339d4d098a5efcda2401e"), "10.10.0-darwin_amd64": ("node-v10.10.0-darwin-x64.tar.gz", "node-v10.10.0-darwin-x64", "00b7a8426e076e9bf9d12ba2d571312e833fe962c70afafd10ad3682fdeeaa5e"), "10.10.0-linux_arm64": ("node-v10.10.0-linux-arm64.tar.xz", "node-v10.10.0-linux-arm64", "7d57961d18ea70b4e99906d87f9de1a2defc45a36fcd8cd84295e9ae5c4281da"), "10.10.0-linux_amd64": ("node-v10.10.0-linux-x64.tar.xz", "node-v10.10.0-linux-x64", "686d2c7b7698097e67bcd68edc3d6b5d28d81f62436c7cf9e7779d134ec262a9"), "10.10.0-windows_amd64": ("node-v10.10.0-win-x64.zip", "node-v10.10.0-win-x64", "70c46e6451798be9d052b700ce5dadccb75cf917f6bf0d6ed54344c856830cfb"), "10.11.0-darwin_amd64": ("node-v10.11.0-darwin-x64.tar.gz", "node-v10.11.0-darwin-x64", "32ad850a0e5cfdefc32d4267707abad05bd5c9eabb047e8ed9bf97faeffc52b6"), "10.11.0-linux_arm64": ("node-v10.11.0-linux-arm64.tar.xz", "node-v10.11.0-linux-arm64", "289302470520fd63e2a92a878869061dda557fe1aabfea2bd5ff88f7af76d98d"), "10.11.0-linux_amd64": ("node-v10.11.0-linux-x64.tar.xz", "node-v10.11.0-linux-x64", "c2eab149e7f0712a6a3eb672a76d657b049a3b3ae0c2edc2e0571df5049fe82c"), "10.11.0-windows_amd64": ("node-v10.11.0-win-x64.zip", "node-v10.11.0-win-x64", "78b2a7a4305aa108b9a82ac7586d7200ab51428c2b882d1318fb44ca300a8609"), "10.12.0-darwin_amd64": ("node-v10.12.0-darwin-x64.tar.gz", "node-v10.12.0-darwin-x64", "f275c901b9aeaacea2bf22648329c2e9ade5e1ff63a446b83446d5d4e19464cc"), "10.12.0-linux_arm64": ("node-v10.12.0-linux-arm64.tar.xz", "node-v10.12.0-linux-arm64", "b327deca4e380559c8c1fbacb9e668b49127ea998de4c8fe83912838cf786786"), "10.12.0-linux_amd64": ("node-v10.12.0-linux-x64.tar.xz", "node-v10.12.0-linux-x64", "4eba2e9a6db95745b769915d58e57df6ca6724ec1f023f76556fce30ceca2367"), "10.12.0-windows_amd64": ("node-v10.12.0-win-x64.zip", "node-v10.12.0-win-x64", "44c938cf1409562d25d23b7c6bce110b53cd2a73774bed573b2979f0d88f51f8"), "10.13.0-darwin_amd64": ("node-v10.13.0-darwin-x64.tar.gz", "node-v10.13.0-darwin-x64", "815a5d18516934a3963ace9f0574f7d41f0c0ce9186a19be3d89e039e57598c5"), "10.13.0-linux_arm64": ("node-v10.13.0-linux-arm64.tar.xz", "node-v10.13.0-linux-arm64", "1537ebe64dc34a2a9b8ab6254213079789e9d59ed0ed26987afb1da37b6a8f87"), "10.13.0-linux_amd64": ("node-v10.13.0-linux-x64.tar.xz", "node-v10.13.0-linux-x64", "0dc6dba645550b66f8f00541a428c29da7c3cde32fb7eda2eb626a9db3bbf08d"), "10.13.0-windows_amd64": ("node-v10.13.0-win-x64.zip", "node-v10.13.0-win-x64", "eb09c9e9677f1919ec1ca78623c09b2a718ec5388b72b7662d5c41e5f628a52c"), "10.14.0-darwin_amd64": ("node-v10.14.0-darwin-x64.tar.gz", "node-v10.14.0-darwin-x64", "dd044aa0ddeb5e32fefa80a13b33bafe3f7e0536e15fe93c1e81b052c2f1965c"), "10.14.0-linux_arm64": ("node-v10.14.0-linux-arm64.tar.xz", "node-v10.14.0-linux-arm64", "4d80efe675c40d6d3af697e17e33cad8af1caf50655276ca99d0c4ca8e2f2cf2"), "10.14.0-linux_amd64": ("node-v10.14.0-linux-x64.tar.xz", "node-v10.14.0-linux-x64", "5f576f9893e0335f0c1b071a42fdf8b3e302577ad6ea38237aaef08ad0ca898e"), "10.14.0-windows_amd64": ("node-v10.14.0-win-x64.zip", "node-v10.14.0-win-x64", "a3acbbdbbdb6ff6d5ae6e6f5ccea55aef83cfa54f52c080538edc3ac6326797b"), "10.14.1-darwin_amd64": ("node-v10.14.1-darwin-x64.tar.gz", "node-v10.14.1-darwin-x64", "91ebe7d6da8a40c72618ac9d0b0a8e224ae01febd3f5595b43b1a58190dcacb1"), "10.14.1-linux_arm64": ("node-v10.14.1-linux-arm64.tar.xz", "node-v10.14.1-linux-arm64", "c1ca91356b007cc7624c7a9e00f3b7bed8dd10aba959be5f55e4ff13da334828"), "10.14.1-linux_amd64": ("node-v10.14.1-linux-x64.tar.xz", "node-v10.14.1-linux-x64", "b65e735cdf61fb80f114c498c8955efe8e096e4b3e173281d68aa9d2c05b0f97"), "10.14.1-windows_amd64": ("node-v10.14.1-win-x64.zip", "node-v10.14.1-win-x64", "7d51aa233ad290eb916a4c3134815204eb34ecb0a001dcecc5ea57333030f303"), "10.14.2-darwin_amd64": ("node-v10.14.2-darwin-x64.tar.gz", "node-v10.14.2-darwin-x64", "5306da5db576d9c984167b4693600a2e3074cc5a701961279837753fa2139baa"), "10.14.2-linux_arm64": ("node-v10.14.2-linux-arm64.tar.xz", "node-v10.14.2-linux-arm64", "8493b30c99d697b24fbaa5bfb3b43108ab3e334ab674188b7b7982fef903aa04"), "10.14.2-linux_amd64": ("node-v10.14.2-linux-x64.tar.xz", "node-v10.14.2-linux-x64", "e43de13bf7bee440a106a844c1bc3a2adb8829fd58b857702c8f1838fdd02a2a"), "10.14.2-windows_amd64": ("node-v10.14.2-win-x64.zip", "node-v10.14.2-win-x64", "45841fe5ffe87378c748dcb9799507f6192c34117409b2c6c18480d112a337de"), "10.15.0-darwin_amd64": ("node-v10.15.0-darwin-x64.tar.gz", "node-v10.15.0-darwin-x64", "353402461c898c569658d0a963790476f4d9828cc6c9286d81617ee8afcba4e8"), "10.15.0-linux_arm64": ("node-v10.15.0-linux-arm64.tar.xz", "node-v10.15.0-linux-arm64", "77aa4a02c5471b6eb7ba935cbc6829889a27115353cff7226a208c08b654e972"), "10.15.0-linux_amd64": ("node-v10.15.0-linux-x64.tar.xz", "node-v10.15.0-linux-x64", "4ee8503c1133797777880ebf75dcf6ae3f9b894c66fd2d5da507e407064c13b5"), "10.15.0-windows_amd64": ("node-v10.15.0-win-x64.zip", "node-v10.15.0-win-x64", "c1dbc9372ad789cd21727cb5f63b4a44ed3eae216763959cff8e68e68c6fcfe1"), "10.15.1-darwin_amd64": ("node-v10.15.1-darwin-x64.tar.gz", "node-v10.15.1-darwin-x64", "327dcef4b61dead1ae04d2743d3390a2b7e6cc6c389c62cfcfeb0486c5a9f181"), "10.15.1-linux_arm64": ("node-v10.15.1-linux-arm64.tar.xz", "node-v10.15.1-linux-arm64", "0fb6d24972fd991f476a942b1b21aca5059f93b9302318c5883120445ee6cd54"), "10.15.1-linux_amd64": ("node-v10.15.1-linux-x64.tar.xz", "node-v10.15.1-linux-x64", "77db68544c7812e925b82ccc41cd4669fdeb191cea8e20053e3f0e86889c4fce"), "10.15.1-windows_amd64": ("node-v10.15.1-win-x64.zip", "node-v10.15.1-win-x64", "bb5bdc9363e4050c94b3f82888141b81630230f86e520abb7dde49081f1292b9"), "10.15.2-darwin_amd64": ("node-v10.15.2-darwin-x64.tar.gz", "node-v10.15.2-darwin-x64", "8bbb6c15a0572f493d33ef044d06ccd0ff7ead8daa67f9a32df3e863277568e8"), "10.15.2-linux_arm64": ("node-v10.15.2-linux-arm64.tar.xz", "node-v10.15.2-linux-arm64", "2978e82d85654505d732b40dfa58f21276d99712d5d001101eaf87100d350139"), "10.15.2-linux_amd64": ("node-v10.15.2-linux-x64.tar.xz", "node-v10.15.2-linux-x64", "c10eece562cfeef1627f0d2bde7dc0be810948f6bf9a932e30a8c3b425652015"), "10.15.2-windows_amd64": ("node-v10.15.2-win-x64.zip", "node-v10.15.2-win-x64", "d97cf4788ccea6deef037ce27c91cc1a814644b878311b71811ab04d0bb8c47f"), "10.15.3-darwin_amd64": ("node-v10.15.3-darwin-x64.tar.gz", "node-v10.15.3-darwin-x64", "7a5eaa1f69614375a695ccb62017248e5dcc15b0b8edffa7db5b52997cf992ba"), "10.15.3-linux_arm64": ("node-v10.15.3-linux-arm64.tar.xz", "node-v10.15.3-linux-arm64", "3d7abbf64bffb07c55168ca0f1c17be12b0d93affe9b6cadd39724649215fab9"), "10.15.3-linux_amd64": ("node-v10.15.3-linux-x64.tar.xz", "node-v10.15.3-linux-x64", "faddbe418064baf2226c2fcbd038c3ef4ae6f936eb952a1138c7ff8cfe862438"), "10.15.3-windows_amd64": ("node-v10.15.3-win-x64.zip", "node-v10.15.3-win-x64", "93c881fdc0455a932dd5b506a7a03df27d9fe36155c1d3f351ebfa4e20bf1c0d"), "10.16.0-darwin_amd64": ("node-v10.16.0-darwin-x64.tar.gz", "node-v10.16.0-darwin-x64", "6c009df1b724026d84ae9a838c5b382662e30f6c5563a0995532f2bece39fa9c"), "10.16.0-linux_arm64": ("node-v10.16.0-linux-arm64.tar.xz", "node-v10.16.0-linux-arm64", "ae2e74ab2f5dbff96bf0b7d8457004bf3538233916f8834740bbe2d5a35442e5"), "10.16.0-linux_amd64": ("node-v10.16.0-linux-x64.tar.xz", "node-v10.16.0-linux-x64", "1827f5b99084740234de0c506f4dd2202a696ed60f76059696747c34339b9d48"), "10.16.0-windows_amd64": ("node-v10.16.0-win-x64.zip", "node-v10.16.0-win-x64", "aa22cb357f0fb54ccbc06b19b60e37eefea5d7dd9940912675d3ed988bf9a059"), "10.16.1-darwin_amd64": ("node-v10.16.1-darwin-x64.tar.gz", "node-v10.16.1-darwin-x64", "328e61fdacfe2f6f1a049d57e248b3eafc0345747831323a14fe1edf98d9b3bb"), "10.16.1-linux_arm64": ("node-v10.16.1-linux-arm64.tar.xz", "node-v10.16.1-linux-arm64", "c46ba1a8e9b9c0490ae81f8b2b13d332ed6f5c86d172fa817f749042ab329b93"), "10.16.1-linux_amd64": ("node-v10.16.1-linux-x64.tar.xz", "node-v10.16.1-linux-x64", "127d9b2f485523805208f867fc513842570b29b4d6831773eeb6dd403a22ba9d"), "10.16.1-windows_amd64": ("node-v10.16.1-win-x64.zip", "node-v10.16.1-win-x64", "1ff8b26670e1b935b51f4b795728f29845c31a3c38b3220b4fe71fb139bc5623"), "10.16.2-darwin_amd64": ("node-v10.16.2-darwin-x64.tar.gz", "node-v10.16.2-darwin-x64", "21ee8bdb04909f553e97af7c6e41009e15d06b886dd3e2ca8a92ce3e0a148a09"), "10.16.2-linux_arm64": ("node-v10.16.2-linux-arm64.tar.xz", "node-v10.16.2-linux-arm64", "5fb2b7d3c2b6b40e237cdc172eabfac2e485ee309ac2bcfbff413de1ed79a59e"), "10.16.2-linux_amd64": ("node-v10.16.2-linux-x64.tar.xz", "node-v10.16.2-linux-x64", "406718dc2f3164b3d1981c36b68b70ea448fbbac29cefbe23ff286b3cd55f264"), "10.16.2-windows_amd64": ("node-v10.16.2-win-x64.zip", "node-v10.16.2-win-x64", "01654dc79d82e9f3c89d01c8cf1cdce68d3a9118dbe968ee86a3ffd6ee153567"), "10.16.3-darwin_amd64": ("node-v10.16.3-darwin-x64.tar.gz", "node-v10.16.3-darwin-x64", "6febc571e1543c2845fa919c6d06b36a24e4e142c91aedbe28b6ff7d296119e4"), "10.16.3-linux_arm64": ("node-v10.16.3-linux-arm64.tar.xz", "node-v10.16.3-linux-arm64", "8ee77bad022bd460bf2867a97bf56ce7ddc4aa2ace067e45995fb1721a958428"), "10.16.3-linux_amd64": ("node-v10.16.3-linux-x64.tar.xz", "node-v10.16.3-linux-x64", "d2271fd8cf997fa7447d638dfa92749ff18ca4b0d796bf89f2a82bf7800d5506"), "10.16.3-windows_amd64": ("node-v10.16.3-win-x64.zip", "node-v10.16.3-win-x64", "19aa47de7c5950d7bd71a1e878013b98d93871cc311d7185f5472e6d3f633146"), "10.17.0-darwin_amd64": ("node-v10.17.0-darwin-x64.tar.gz", "node-v10.17.0-darwin-x64", "9b96140ad74b217f216c83ddf50d1f70a4296576f6edbbbfb65d0f478015d9df"), "10.17.0-linux_arm64": ("node-v10.17.0-linux-arm64.tar.xz", "node-v10.17.0-linux-arm64", "3ab8ee2b5c9aa4d060c68667ddef70cc2960e12bcfe4a0f2de7ebc0f008bf13d"), "10.17.0-linux_amd64": ("node-v10.17.0-linux-x64.tar.xz", "node-v10.17.0-linux-x64", "2b49cd296f969ef0ffb7922719ffa6542bedb89d6c959a47c023d11ce222f5d6"), "10.17.0-windows_amd64": ("node-v10.17.0-win-x64.zip", "node-v10.17.0-win-x64", "e84a1f3685219811bb4662eb3e3b55abd0c764c24cd2b224ba31b3f9f162baf6"), "10.18.0-darwin_amd64": ("node-v10.18.0-darwin-x64.tar.gz", "node-v10.18.0-darwin-x64", "a7af53e3363e8ab654b97387bc7cf352dddb324562404c1d35fe10cba3f27e0f"), "10.18.0-linux_arm64": ("node-v10.18.0-linux-arm64.tar.xz", "node-v10.18.0-linux-arm64", "b2b34dd43ea3979890663afa270e09e09c219f046e39e8e439eeda2821cc9643"), "10.18.0-linux_amd64": ("node-v10.18.0-linux-x64.tar.xz", "node-v10.18.0-linux-x64", "eac160acfc2c5b6fca021baa9943341fea50859f19c7ccbd56669b1fe04e691e"), "10.18.0-windows_amd64": ("node-v10.18.0-win-x64.zip", "node-v10.18.0-win-x64", "56afcc9c191dfc99017725be92ac1331e23afb1930913446eb91852cb02a8687"), "10.18.1-darwin_amd64": ("node-v10.18.1-darwin-x64.tar.gz", "node-v10.18.1-darwin-x64", "2b2d3379420e626eee393cabf1c90bc55957ff5bb067b82a74eb2f92147d6757"), "10.18.1-linux_arm64": ("node-v10.18.1-linux-arm64.tar.xz", "node-v10.18.1-linux-arm64", "9a6203697e0087a1c909961481d579c76777df1df622921e4ce16198851f30fe"), "10.18.1-linux_amd64": ("node-v10.18.1-linux-x64.tar.xz", "node-v10.18.1-linux-x64", "8cc40f45c2c62529b15e83a6bbe0ac1febf57af3c5720df68067c96c0fddbbdf"), "10.18.1-windows_amd64": ("node-v10.18.1-win-x64.zip", "node-v10.18.1-win-x64", "fb27bb95c27c72f2e25d0c41309b606b2ae48ba0d6094a19f206ad1df9dc5e19"), "10.19.0-darwin_amd64": ("node-v10.19.0-darwin-x64.tar.gz", "node-v10.19.0-darwin-x64", "b16328570651be44213a2303c1f9515fc506e0a96a273806f71ed000e3ca3cb3"), "10.19.0-linux_arm64": ("node-v10.19.0-linux-arm64.tar.xz", "node-v10.19.0-linux-arm64", "77bdbf859fc38e6e860efd479b0a7b7b6bd3e7cb05337e5cc5638251eb5d3a59"), "10.19.0-linux_amd64": ("node-v10.19.0-linux-x64.tar.xz", "node-v10.19.0-linux-x64", "34127c7c6b1ba02d6d4dc3a926f38a5fb88bb37fc7f051349005ce331c7a53c6"), "10.19.0-windows_amd64": ("node-v10.19.0-win-x64.zip", "node-v10.19.0-win-x64", "210efd45a7f79cf4c350d8f575f990becdd3833cd922796a4c83b27996f5679e"), "10.20.0-darwin_amd64": ("node-v10.20.0-darwin-x64.tar.gz", "node-v10.20.0-darwin-x64", "c153832774afcae89a82efb55ed80557d1a41e1880638ad57128a9a3762d212f"), "10.20.0-linux_arm64": ("node-v10.20.0-linux-arm64.tar.xz", "node-v10.20.0-linux-arm64", "f3567924d6b7f0fa55c4ee0a7330ec0dcaeec557982794796d6b312e7053c674"), "10.20.0-linux_amd64": ("node-v10.20.0-linux-x64.tar.xz", "node-v10.20.0-linux-x64", "c5721a89feecc0e98d42386e171cb763c077f782033ddc998819edcf9d93b691"), "10.20.0-windows_amd64": ("node-v10.20.0-win-x64.zip", "node-v10.20.0-win-x64", "d266313fa22885a6ec76eea521fb8a1131b4d9fb3a57afb045a98301aeb7d24e"), "10.20.1-darwin_amd64": ("node-v10.20.1-darwin-x64.tar.gz", "node-v10.20.1-darwin-x64", "6437e364cd93be246ffb67dd40775cbb467bb8d28d8af4413123f478bb6234b9"), "10.20.1-linux_arm64": ("node-v10.20.1-linux-arm64.tar.xz", "node-v10.20.1-linux-arm64", "e33cafff94a6308916530b4b724bbc138399484d96f71b1c23677596bec268d0"), "10.20.1-linux_amd64": ("node-v10.20.1-linux-x64.tar.xz", "node-v10.20.1-linux-x64", "5e0b1fbc6cf8c2c34dc33d880670ee1bc1c1e931099de3796a96143a962c92ee"), "10.20.1-windows_amd64": ("node-v10.20.1-win-x64.zip", "node-v10.20.1-win-x64", "5e4ec0936c51047c218c0c164cc80283cd36ecd40e0a6979281d395c1be8ee10"), "10.21.0-darwin_amd64": ("node-v10.21.0-darwin-x64.tar.gz", "node-v10.21.0-darwin-x64", "596900700c4a0de0303bb4c378a1abcd63f31efc848704c5fbc1230de628577a"), "10.21.0-linux_arm64": ("node-v10.21.0-linux-arm64.tar.xz", "node-v10.21.0-linux-arm64", "3af40706ff0da7fe0baa4683ead6c74445405a2553e7373e627f24d19d4ac100"), "10.21.0-linux_amd64": ("node-v10.21.0-linux-x64.tar.xz", "node-v10.21.0-linux-x64", "1d3296763e46540047099e4910812e81c4899c0595f2d82474e2099c1e1603e2"), "10.21.0-windows_amd64": ("node-v10.21.0-win-x64.zip", "node-v10.21.0-win-x64", "03dddcdaccdb40978ddf15d189acdc20409d9a666636db2595118690ff83ce82"), "10.22.0-darwin_amd64": ("node-v10.22.0-darwin-x64.tar.gz", "node-v10.22.0-darwin-x64", "c7583a297ba9c6cfc03688a32776155d02fabf9ff45847c63b12a68d400f1dc1"), "10.22.0-linux_arm64": ("node-v10.22.0-linux-arm64.tar.xz", "node-v10.22.0-linux-arm64", "abacc6f37e8dfbe398843c7dc7b9bb7153ff6e653ad50e85d73d86088da48372"), "10.22.0-linux_amd64": ("node-v10.22.0-linux-x64.tar.xz", "node-v10.22.0-linux-x64", "ddf33e038c593d6df36b1dd4b25c1b6fa8230c615e6312ad33e80ef863e4a74f"), "10.22.0-windows_amd64": ("node-v10.22.0-win-x64.zip", "node-v10.22.0-win-x64", "931c2907450790f89aa178fa84c1adbd1f7cb7ab0a34f8bfb4af25640e8d4e06"), "11.0.0-darwin_amd64": ("node-v11.0.0-darwin-x64.tar.gz", "node-v11.0.0-darwin-x64", "f70e12d246ba35e88c5c08a195215c5c913ce66c9d95d0bd21cc1d3e69904279"), "11.0.0-linux_arm64": ("node-v11.0.0-linux-arm64.tar.xz", "node-v11.0.0-linux-arm64", "0d0c7013fd00a8e713c36aa96bcc268eeadbad2ce48d87e19849d66f4c618cad"), "11.0.0-linux_amd64": ("node-v11.0.0-linux-x64.tar.xz", "node-v11.0.0-linux-x64", "418b1a73bcafbf5dd3bc787f0440c2b4123dfecc2b239f5651f0256cb5ab606d"), "11.0.0-windows_amd64": ("node-v11.0.0-win-x64.zip", "node-v11.0.0-win-x64", "4dd3ef7f5c8181be39cd45476b22ed34b6da2bf77377b699384d426702f8c969"), "11.1.0-darwin_amd64": ("node-v11.1.0-darwin-x64.tar.gz", "node-v11.1.0-darwin-x64", "5d6b84d2b0fd6afee07c371bc815a9e4b6671b85bedcb38815310bd0f884d3c8"), "11.1.0-linux_arm64": ("node-v11.1.0-linux-arm64.tar.xz", "node-v11.1.0-linux-arm64", "cbba27e1c90701fbb9db66cc2c6cc3049aaf08adb16cabd0cad970b74cdaf6d3"), "11.1.0-linux_amd64": ("node-v11.1.0-linux-x64.tar.xz", "node-v11.1.0-linux-x64", "c70419674d932452017556080264de2b6d1105c112647dd1dd495b739456dd91"), "11.1.0-windows_amd64": ("node-v11.1.0-win-x64.zip", "node-v11.1.0-win-x64", "985e4edc758cb5f77f85cddda0155616b92f163b8d3842c542b1c8a395068418"), "11.2.0-darwin_amd64": ("node-v11.2.0-darwin-x64.tar.gz", "node-v11.2.0-darwin-x64", "cd17fafcdb21ae80fb94e455e63567c70b3bceedf982b93ae9e4aea411f6a6ea"), "11.2.0-linux_arm64": ("node-v11.2.0-linux-arm64.tar.xz", "node-v11.2.0-linux-arm64", "3e6c47a29b85030b4305bdc2e15cbe37e1b54a2338ce1790637384ce349ed1fd"), "11.2.0-linux_amd64": ("node-v11.2.0-linux-x64.tar.xz", "node-v11.2.0-linux-x64", "629a603443c275f8ecd851994b81a9c02a36343dbcbafc279cbecb9ccd9cf906"), "11.2.0-windows_amd64": ("node-v11.2.0-win-x64.zip", "node-v11.2.0-win-x64", "3440b2880b4e3b78c9c18865df263317e7d3c3e179dad960d526004dc7e6ba9a"), "11.3.0-darwin_amd64": ("node-v11.3.0-darwin-x64.tar.gz", "node-v11.3.0-darwin-x64", "54acc7bdeffae79fdd73f959712305aee1d8d487d56813b43cae96d151ec79db"), "11.3.0-linux_arm64": ("node-v11.3.0-linux-arm64.tar.xz", "node-v11.3.0-linux-arm64", "642cc3fc94a856ad6d09e76eaf869672bef925308afdad398a58f18eeaf4e4b8"), "11.3.0-linux_amd64": ("node-v11.3.0-linux-x64.tar.xz", "node-v11.3.0-linux-x64", "d37fb7fae8a185409bccf106e91d8ffa3450115852795512fc62e6da0b5e3dbb"), "11.3.0-windows_amd64": ("node-v11.3.0-win-x64.zip", "node-v11.3.0-win-x64", "b801e908ec36a07f06df388845e22e0b7f3cede7a4030896712c8ee28cdb3f05"), "11.4.0-darwin_amd64": ("node-v11.4.0-darwin-x64.tar.gz", "node-v11.4.0-darwin-x64", "05a515146d5bc397625f442a6ecbbc7f0d071a2a7efbf1e2b2ed46d728bc7b30"), "11.4.0-linux_arm64": ("node-v11.4.0-linux-arm64.tar.xz", "node-v11.4.0-linux-arm64", "c32e752e74794a4254ae4caa892b7beb3be60dba6851e8e5d637febfb659ee3a"), "11.4.0-linux_amd64": ("node-v11.4.0-linux-x64.tar.xz", "node-v11.4.0-linux-x64", "24d9be161e7fb28e761801639cb452ff223269ed53d967e5745b5c6391eb3fbd"), "11.4.0-windows_amd64": ("node-v11.4.0-win-x64.zip", "node-v11.4.0-win-x64", "30b84ab0101c8916694e6cd6c0ccb5182e4555da5e06deb080e906ef5b3893df"), "11.5.0-darwin_amd64": ("node-v11.5.0-darwin-x64.tar.gz", "node-v11.5.0-darwin-x64", "741abd58ac67b4bf8d2ef991a7487ea17e421b2248688b93be0d2f34886c6aa2"), "11.5.0-linux_arm64": ("node-v11.5.0-linux-arm64.tar.xz", "node-v11.5.0-linux-arm64", "3f1436c1de70b2e34f7a63a5af7e6b106a8ebe9289b3f7d045ac4a4856570164"), "11.5.0-linux_amd64": ("node-v11.5.0-linux-x64.tar.xz", "node-v11.5.0-linux-x64", "ada54407b505b7e6f516c753f0e49220917dd11efa5ee892d3252bdd65d4a54c"), "11.5.0-windows_amd64": ("node-v11.5.0-win-x64.zip", "node-v11.5.0-win-x64", "3692939b1bbd7ee8b0a967429eef6b1d45078c2f4fc289aae261ca5bde5a0607"), "11.6.0-darwin_amd64": ("node-v11.6.0-darwin-x64.tar.gz", "node-v11.6.0-darwin-x64", "c880063b112c48130dba8f7b058de61959ae46fddcfa363715571b22c1cbeb26"), "11.6.0-linux_arm64": ("node-v11.6.0-linux-arm64.tar.xz", "node-v11.6.0-linux-arm64", "956016db41f4f96f8e005d36c738d7c833442d09a970462552eb214027e0268a"), "11.6.0-linux_amd64": ("node-v11.6.0-linux-x64.tar.xz", "node-v11.6.0-linux-x64", "2251a6c5b332e7ea69bbefba11950cb6c27ba50fa700468711f729da6a6f5324"), "11.6.0-windows_amd64": ("node-v11.6.0-win-x64.zip", "node-v11.6.0-win-x64", "d230828c1cc9863c9768106ffee0320ba42049b594bd2689e430b872e8f0b2dd"), "11.7.0-darwin_amd64": ("node-v11.7.0-darwin-x64.tar.gz", "node-v11.7.0-darwin-x64", "873b47e6fc97aef2f73b0e8dde641967b2a84a3b63d1697b9d8813e14fb3b01c"), "11.7.0-linux_arm64": ("node-v11.7.0-linux-arm64.tar.xz", "node-v11.7.0-linux-arm64", "82b9726c6b367a43530f868f61b1b2a05c942d3decdf9d2e18b4a9bdf353c223"), "11.7.0-linux_amd64": ("node-v11.7.0-linux-x64.tar.xz", "node-v11.7.0-linux-x64", "b2a0a7dde17fe0da5f86ce5fea3da2861d652a5e702e2177ee62813ff86451c0"), "11.7.0-windows_amd64": ("node-v11.7.0-win-x64.zip", "node-v11.7.0-win-x64", "00834d16532f24583bf56d2baab03904b0220154cc712344be95e4d05c6234dd"), "11.8.0-darwin_amd64": ("node-v11.8.0-darwin-x64.tar.gz", "node-v11.8.0-darwin-x64", "fbb26b38f408c2f2324a5821062c16103f54de16d24f9f24c4e270a3a41f4832"), "11.8.0-linux_arm64": ("node-v11.8.0-linux-arm64.tar.xz", "node-v11.8.0-linux-arm64", "42b190c686cb8bafbdbf418a6c20c6785a23ba0f1a1a85af44595057a3d5e25e"), "11.8.0-linux_amd64": ("node-v11.8.0-linux-x64.tar.xz", "node-v11.8.0-linux-x64", "85ca19c495d5cac6acf6ee4a3c8dfb4489fb67fefc184c61eb4513eb5ef99a88"), "11.8.0-windows_amd64": ("node-v11.8.0-win-x64.zip", "node-v11.8.0-win-x64", "cd4db1b9e7ac29ed81d433f2de85582902670a121961aa3f350533d5b2fd44c6"), "11.9.0-darwin_amd64": ("node-v11.9.0-darwin-x64.tar.gz", "node-v11.9.0-darwin-x64", "1df3dd99d174bb8cb61cc8e2aa419a4998c7ada9454123c34991ce30632f1ef8"), "11.9.0-linux_arm64": ("node-v11.9.0-linux-arm64.tar.xz", "node-v11.9.0-linux-arm64", "f39baa8d212e9676bfa7f1601f94d789c6dc6b35caf440df6ec815d238978457"), "11.9.0-linux_amd64": ("node-v11.9.0-linux-x64.tar.xz", "node-v11.9.0-linux-x64", "9bc461fb7f5fd3344301abfda834160d5397a4e289f9749ab03ba0b7e9a4c853"), "11.9.0-windows_amd64": ("node-v11.9.0-win-x64.zip", "node-v11.9.0-win-x64", "c62c01436f632858fea0194d4168b483e1aa485c3fc72247add4899a103c2677"), "11.10.0-darwin_amd64": ("node-v11.10.0-darwin-x64.tar.gz", "node-v11.10.0-darwin-x64", "1956528c6f3934a97508e36a4855c154f40f1923ccd61e296d5a85679103e3a1"), "11.10.0-linux_arm64": ("node-v11.10.0-linux-arm64.tar.xz", "node-v11.10.0-linux-arm64", "60ed6caa90d8188a55f0dbc63f4aef263fb4863e036d32989b820a2e40582c66"), "11.10.0-linux_amd64": ("node-v11.10.0-linux-x64.tar.xz", "node-v11.10.0-linux-x64", "fe4c617aaf88b5228bce0341d1c77bbae2622d69eaa17a15b7d4bcc60c4777c5"), "11.10.0-windows_amd64": ("node-v11.10.0-win-x64.zip", "node-v11.10.0-win-x64", "c39e711aebe678455fa74edf6d8f6184d6d93e20f160197799040a0c17005dba"), "11.10.1-darwin_amd64": ("node-v11.10.1-darwin-x64.tar.gz", "node-v11.10.1-darwin-x64", "dea52b86f6875efae26fbb6d0269d9769da7ca69408b74b6ab724d4b64004b07"), "11.10.1-linux_arm64": ("node-v11.10.1-linux-arm64.tar.xz", "node-v11.10.1-linux-arm64", "b116e57906ed73c970d64e7518b08c6de236575c5cd8bf09f4c1bd668524a014"), "11.10.1-linux_amd64": ("node-v11.10.1-linux-x64.tar.xz", "node-v11.10.1-linux-x64", "414216a7e47dbfb77141dce7a4452901ae2cdb4cd0deef3ab3ab49e0b2111f82"), "11.10.1-windows_amd64": ("node-v11.10.1-win-x64.zip", "node-v11.10.1-win-x64", "80cf14abacbc6b636bc192f4eee49421f082f21cdaa9c1ea5995c38f8c1375e5"), "11.11.0-darwin_amd64": ("node-v11.11.0-darwin-x64.tar.gz", "node-v11.11.0-darwin-x64", "6b7c8d93096bf065de0d0a42e8f027c424172c82df6f015d3149a5dbfa03c1cc"), "11.11.0-linux_arm64": ("node-v11.11.0-linux-arm64.tar.xz", "node-v11.11.0-linux-arm64", "febb698e74264ec0ecc738c86347e6bfb5d27e33ed492a031626df988a5fb4f3"), "11.11.0-linux_amd64": ("node-v11.11.0-linux-x64.tar.xz", "node-v11.11.0-linux-x64", "ee09c7712e741f84948f76a72b651bf088e516c3f38569b9e6f30c38c026c262"), "11.11.0-windows_amd64": ("node-v11.11.0-win-x64.zip", "node-v11.11.0-win-x64", "154a5b7ca7033382743c4752fa465a5d9902f4abed4263a38ea3f41ffa113910"), "11.12.0-darwin_amd64": ("node-v11.12.0-darwin-x64.tar.gz", "node-v11.12.0-darwin-x64", "93d68c1af41d02b262b3383d69b46eb326707ec010b321ad5655b91c4956e783"), "11.12.0-linux_arm64": ("node-v11.12.0-linux-arm64.tar.xz", "node-v11.12.0-linux-arm64", "9e89838e290c9bb478351bd403707d0b741ec56021c379c9f6da515a4cd1064a"), "11.12.0-linux_amd64": ("node-v11.12.0-linux-x64.tar.xz", "node-v11.12.0-linux-x64", "1c6bb93a24eda832708c1c10ec20316e1e4f30b3cfca9c5ee5d446762414b116"), "11.12.0-windows_amd64": ("node-v11.12.0-win-x64.zip", "node-v11.12.0-win-x64", "68e5bca1d6dd6b3de20870e7c593f9a890c48d2c9c83e15034baad6f7c0da426"), "11.13.0-darwin_amd64": ("node-v11.13.0-darwin-x64.tar.gz", "node-v11.13.0-darwin-x64", "c1a8f94b4778dad2d9f513cfdf9091810dc733a2daf4fa7e03d49ad133415b5d"), "11.13.0-linux_arm64": ("node-v11.13.0-linux-arm64.tar.xz", "node-v11.13.0-linux-arm64", "0edb29004fdbb5808331e765b4adde8b025a13d6619f49fec60a14582aba9ed7"), "11.13.0-linux_amd64": ("node-v11.13.0-linux-x64.tar.xz", "node-v11.13.0-linux-x64", "c2ae3caced5f181df282a6974ab3f5e232b5decb821aa8ea8fe758b0e0528223"), "11.13.0-windows_amd64": ("node-v11.13.0-win-x64.zip", "node-v11.13.0-win-x64", "f3dafd1f19841244f8f12952f9919c0a2857f6920b11f2a89554b061cd5a4525"), "11.14.0-darwin_amd64": ("node-v11.14.0-darwin-x64.tar.gz", "node-v11.14.0-darwin-x64", "37b8db4f6700a4b5aa3b6d4283538753953f6293aff99866aa9a81038848a4d9"), "11.14.0-linux_arm64": ("node-v11.14.0-linux-arm64.tar.xz", "node-v11.14.0-linux-arm64", "3d463f3b48e1060027f8a552657de6f3ee4724d718d546aa4ea5c301ee4ed083"), "11.14.0-linux_amd64": ("node-v11.14.0-linux-x64.tar.xz", "node-v11.14.0-linux-x64", "89e2cb0effa9bf075ee8bb6d92a6a50f7ccfdad03dd687f52ecdfab91230f9a1"), "11.14.0-windows_amd64": ("node-v11.14.0-win-x64.zip", "node-v11.14.0-win-x64", "58a5d3316c04335ff3da2ce66b89f3cce86b1d1ca878d1d6d68478160c66dc12"), "11.15.0-darwin_amd64": ("node-v11.15.0-darwin-x64.tar.gz", "node-v11.15.0-darwin-x64", "e953b657b1049e1de509a3fd0700cfeecd175f75a0d141d71393aa0d71fa29a9"), "11.15.0-linux_arm64": ("node-v11.15.0-linux-arm64.tar.xz", "node-v11.15.0-linux-arm64", "e458aa4c69da9ca2ae566c8eb56dc8b36d573b415bfd8eebca4ff2229fc4983d"), "11.15.0-linux_amd64": ("node-v11.15.0-linux-x64.tar.xz", "node-v11.15.0-linux-x64", "17424aef198fa322b93c79217ce7e8cdd264fed40383abbbd3e63c305ce1d7d8"), "11.15.0-windows_amd64": ("node-v11.15.0-win-x64.zip", "node-v11.15.0-win-x64", "f3cef50acf566724a5ec5df7697fb527d7339cafdae6c7c406a39358aee6cdf8"), "12.0.0-darwin_amd64": ("node-v12.0.0-darwin-x64.tar.gz", "node-v12.0.0-darwin-x64", "92c81a284e909424b50dd01e175260b75bbbdb487fdfe1885229817187ea76bc"), "12.0.0-linux_arm64": ("node-v12.0.0-linux-arm64.tar.xz", "node-v12.0.0-linux-arm64", "2ac36aa51f76654a8914d41a32bd5c3d3213cba14eea84abd9919d022b5694b4"), "12.0.0-linux_amd64": ("node-v12.0.0-linux-x64.tar.xz", "node-v12.0.0-linux-x64", "7a5609167265954cfb912e4dc8f36e5469335b6be1bb11d60d8427f92c03f5f9"), "12.0.0-windows_amd64": ("node-v12.0.0-win-x64.zip", "node-v12.0.0-win-x64", "96ab5f9f61d75daf3fb1072930b6e9249f15b77bc3b3dca516ae8439dc1500fb"), "12.1.0-darwin_amd64": ("node-v12.1.0-darwin-x64.tar.gz", "node-v12.1.0-darwin-x64", "57c592b13940aa44611aec08e7b425f35565a2c95c51736f433cb36eb65105b7"), "12.1.0-linux_arm64": ("node-v12.1.0-linux-arm64.tar.xz", "node-v12.1.0-linux-arm64", "67805a7976bef30d0e12211f18a99c6de405931e493fd32f451512473661ee10"), "12.1.0-linux_amd64": ("node-v12.1.0-linux-x64.tar.xz", "node-v12.1.0-linux-x64", "331c43176a20e705c6f4fdb61c69fee44dd3c2c93a20410be2c13b4f8515ef7b"), "12.1.0-windows_amd64": ("node-v12.1.0-win-x64.zip", "node-v12.1.0-win-x64", "6dc3ef4a6b4ce527f187270a1b0c5560771126df487ab9ddc4c3cd3b37d57eb6"), "12.2.0-darwin_amd64": ("node-v12.2.0-darwin-x64.tar.gz", "node-v12.2.0-darwin-x64", "c72ae8a2b989138c6e6e9b393812502df8c28546a016cf24e7a82dd27e3838af"), "12.2.0-linux_arm64": ("node-v12.2.0-linux-arm64.tar.xz", "node-v12.2.0-linux-arm64", "42e4a5c6ad0b402e281daf46a27a269249bdb8b4e31ff8869701aaddac2cc8c4"), "12.2.0-linux_amd64": ("node-v12.2.0-linux-x64.tar.xz", "node-v12.2.0-linux-x64", "89059969861606e2a435ff2619c4df6f41c040120e507d9c4f03374353357307"), "12.2.0-windows_amd64": ("node-v12.2.0-win-x64.zip", "node-v12.2.0-win-x64", "c1e7fb3c1c15d8f2ab5c1db9c9662097f9c682164b3f7397955ccce946442c97"), "12.3.0-darwin_amd64": ("node-v12.3.0-darwin-x64.tar.gz", "node-v12.3.0-darwin-x64", "4a9faa038fb4e6e930a0fecd9818a4820b4ca91d1c45a1c1279fe49cdbd28160"), "12.3.0-linux_arm64": ("node-v12.3.0-linux-arm64.tar.xz", "node-v12.3.0-linux-arm64", "3d6e7046b938ff1f2535bdcc892a82abf44d875d1e96779cc3ea9a074ccfa200"), "12.3.0-linux_amd64": ("node-v12.3.0-linux-x64.tar.xz", "node-v12.3.0-linux-x64", "2ce2c7a4d7fe3c560415e8dcbc5905a66a8bf28e2a2b2cff7e7a4eeb5753015d"), "12.3.0-windows_amd64": ("node-v12.3.0-win-x64.zip", "node-v12.3.0-win-x64", "b36c9f9809c90ce704465f066861314d6e33176a5d45da14c1519c3e4f35063e"), "12.3.1-darwin_amd64": ("node-v12.3.1-darwin-x64.tar.gz", "node-v12.3.1-darwin-x64", "b9c979f63a356090d8ff88ed141fd856ad853165c73633794a9d3a060334378e"), "12.3.1-linux_arm64": ("node-v12.3.1-linux-arm64.tar.xz", "node-v12.3.1-linux-arm64", "88df7f2e0c4a58661bb79b637daa417929efc6c4d6a77bba42a5127c5c383257"), "12.3.1-linux_amd64": ("node-v12.3.1-linux-x64.tar.xz", "node-v12.3.1-linux-x64", "46f52868c0643fe0d167ce24c3c873880c8e1494276c89c07114fb099da4f75a"), "12.3.1-windows_amd64": ("node-v12.3.1-win-x64.zip", "node-v12.3.1-win-x64", "aac3c4543f846c7ebf63e1498dec7955119dffffe65722bd8c6d2124ed4ecbd7"), "12.4.0-darwin_amd64": ("node-v12.4.0-darwin-x64.tar.gz", "node-v12.4.0-darwin-x64", "aaff97d59cda775165ef966ae74e70f55f3267e86d735ed3740ae9bf1d40531e"), "12.4.0-linux_arm64": ("node-v12.4.0-linux-arm64.tar.xz", "node-v12.4.0-linux-arm64", "bb2e7eabebdceb52424516dabce94cb37f55419e6ed19493916843a323c423cd"), "12.4.0-linux_amd64": ("node-v12.4.0-linux-x64.tar.xz", "node-v12.4.0-linux-x64", "9aec6a2a50c1791704a6069cbda6da62781361e44814d024e8bbaaf0deb41c5e"), "12.4.0-windows_amd64": ("node-v12.4.0-win-x64.zip", "node-v12.4.0-win-x64", "ec8623e2528a35d3219200308e7ed41e24d4f7cd96530a4e6ac2513e44f7fad1"), "12.5.0-darwin_amd64": ("node-v12.5.0-darwin-x64.tar.gz", "node-v12.5.0-darwin-x64", "a9ba9f584f015f1705063c10dd8d84d43f5b09dc7ecf4ee3968ab1ff1fe5d2b5"), "12.5.0-linux_arm64": ("node-v12.5.0-linux-arm64.tar.xz", "node-v12.5.0-linux-arm64", "d43b71a97f5484d13b655a8a0c1b1c0fc7e83b3719063cc362fe557d6e26bd69"), "12.5.0-linux_amd64": ("node-v12.5.0-linux-x64.tar.xz", "node-v12.5.0-linux-x64", "37c0c539aae69370f3c014cc4947748ce45ac5fa560f9b085724f22029834b27"), "12.5.0-windows_amd64": ("node-v12.5.0-win-x64.zip", "node-v12.5.0-win-x64", "f1b426fcd39ffdfec5d8ba60c6842cc11e9f49269cd49bc34c4fcee0517ddf66"), "12.6.0-darwin_amd64": ("node-v12.6.0-darwin-x64.tar.gz", "node-v12.6.0-darwin-x64", "004b7992a2621eb35a47c94d258510ca5744b5a8072364f235dc7e3d4bff7457"), "12.6.0-linux_arm64": ("node-v12.6.0-linux-arm64.tar.xz", "node-v12.6.0-linux-arm64", "b7a6580f0c5406b990b3c9f0d91297b103e38e2752b8b745c4d15310a9dd79d1"), "12.6.0-linux_amd64": ("node-v12.6.0-linux-x64.tar.xz", "node-v12.6.0-linux-x64", "1ac14567e2be5562df209900e28430bd11575d985a85e8a6df2743428570de33"), "12.6.0-windows_amd64": ("node-v12.6.0-win-x64.zip", "node-v12.6.0-win-x64", "0c5ac670c5bb0ea0d389bb7269cb84104702826f791a1d057eae02cdb9eed717"), "12.7.0-darwin_amd64": ("node-v12.7.0-darwin-x64.tar.gz", "node-v12.7.0-darwin-x64", "1a76bea7f7ed8c5c921852269ddd1300c9baba2f1e3f0377200a22c22cdea177"), "12.7.0-linux_arm64": ("node-v12.7.0-linux-arm64.tar.xz", "node-v12.7.0-linux-arm64", "abc4500eff8437503d475726b8ac2ed3463d2982bd66925a782f91b7d96e31de"), "12.7.0-linux_amd64": ("node-v12.7.0-linux-x64.tar.xz", "node-v12.7.0-linux-x64", "95867fdcfd4f821d84b3dd9fab5803fb29e093e911f2ab3c7111bcaf8bd5b9da"), "12.7.0-windows_amd64": ("node-v12.7.0-win-x64.zip", "node-v12.7.0-win-x64", "68802316ca4eb4d72ec5f9ff837752a6ec8cd73537ad7c346f30899ee523f4b7"), "12.8.0-darwin_amd64": ("node-v12.8.0-darwin-x64.tar.gz", "node-v12.8.0-darwin-x64", "5229571a1736befd6426dc0a6907be416e9f5c24695e3ef275ed2ba70f496499"), "12.8.0-linux_arm64": ("node-v12.8.0-linux-arm64.tar.xz", "node-v12.8.0-linux-arm64", "9f22aff38a8622b05821129f69dbe90695e01166f55c8d2a39b6c6a5aef8c6a8"), "12.8.0-linux_amd64": ("node-v12.8.0-linux-x64.tar.xz", "node-v12.8.0-linux-x64", "b6a9ab2e6e872375e0e27eda0698820a64495b31b1beab36cc54f9876b3a2052"), "12.8.0-windows_amd64": ("node-v12.8.0-win-x64.zip", "node-v12.8.0-win-x64", "b295aedebde069c4148534a9dfb2394ceba28cf367ddd8204a27d69c095a9e00"), "12.8.1-darwin_amd64": ("node-v12.8.1-darwin-x64.tar.gz", "node-v12.8.1-darwin-x64", "caccf8b409af342e35672cc766430587664f88d01dab622a5de44c8be1336e44"), "12.8.1-linux_arm64": ("node-v12.8.1-linux-arm64.tar.xz", "node-v12.8.1-linux-arm64", "3707240c402aae0b5879ce1ba17b32ebd224d47f5147639c6881a1b71ce65383"), "12.8.1-linux_amd64": ("node-v12.8.1-linux-x64.tar.xz", "node-v12.8.1-linux-x64", "1c7cf61cb8fa98a76d92445823d6dd1649e985899e16900b39eacdd8cd4094f3"), "12.8.1-windows_amd64": ("node-v12.8.1-win-x64.zip", "node-v12.8.1-win-x64", "c81ecaa03dc882dde36087c854e4831c13d3eb237f262f9ce74ccc6f156684da"), "12.9.0-darwin_amd64": ("node-v12.9.0-darwin-x64.tar.gz", "node-v12.9.0-darwin-x64", "24c1f0c93e485961446814662db942f1b309d843fb4ecbe50466d9857a51b343"), "12.9.0-linux_arm64": ("node-v12.9.0-linux-arm64.tar.xz", "node-v12.9.0-linux-arm64", "f7f6f102d097d64eba26f84f2760597f9831886ef7d0db3cba88459847f2743d"), "12.9.0-linux_amd64": ("node-v12.9.0-linux-x64.tar.xz", "node-v12.9.0-linux-x64", "7110bdd16e397870142ff0e8d92d4a4502d43ec047d970c843a9a4e5f9e79283"), "12.9.0-windows_amd64": ("node-v12.9.0-win-x64.zip", "node-v12.9.0-win-x64", "b5f05deb31ac04b9c3a487542daf151e01c05017403a56ba443da623f36b153b"), "12.9.1-darwin_amd64": ("node-v12.9.1-darwin-x64.tar.gz", "node-v12.9.1-darwin-x64", "9aaf29d30056e2233fd15dfac56eec12e8342d91bb6c13d54fb5e599383dddb9"), "12.9.1-linux_arm64": ("node-v12.9.1-linux-arm64.tar.xz", "node-v12.9.1-linux-arm64", "b6d986faf3a77b6c353c344645c93f2a0e0436c43865e6c215a24301a076a11f"), "12.9.1-linux_amd64": ("node-v12.9.1-linux-x64.tar.xz", "node-v12.9.1-linux-x64", "680a1263c9f5f91adadcada549f0a9c29f1b26d09658d2b501c334c3f63719e5"), "12.9.1-windows_amd64": ("node-v12.9.1-win-x64.zip", "node-v12.9.1-win-x64", "6a4e54bda091bd02dbd8ff1b9f6671e036297da012a53891e3834d4bf4bed297"), "12.10.0-darwin_amd64": ("node-v12.10.0-darwin-x64.tar.gz", "node-v12.10.0-darwin-x64", "4c16d1f6454f5dc3977ad00cea123792b8d4e1d6d1bf42bbc82a4202039a5971"), "12.10.0-linux_arm64": ("node-v12.10.0-linux-arm64.tar.xz", "node-v12.10.0-linux-arm64", "fa1afb9e8cfd964867351b6dac6cd918784ff309291612251c4745aeb0b10e02"), "12.10.0-linux_amd64": ("node-v12.10.0-linux-x64.tar.xz", "node-v12.10.0-linux-x64", "e8d2e6b62dd8183dc59a139a9ca3edc7c419a0d3d92e90fea9cb0ad52489843a"), "12.10.0-windows_amd64": ("node-v12.10.0-win-x64.zip", "node-v12.10.0-win-x64", "de341476711c71f82d06fabcc9874c1ff9e865fd7274334d64a67b1e31a53fd0"), "12.11.0-darwin_amd64": ("node-v12.11.0-darwin-x64.tar.gz", "node-v12.11.0-darwin-x64", "a0fd5c1c9e67099f52b73c732aa52a878c6ff67f50ff0e94c2c5628a87455130"), "12.11.0-linux_arm64": ("node-v12.11.0-linux-arm64.tar.xz", "node-v12.11.0-linux-arm64", "d1126439ff6d079b682a7cd6308cb226afd247e5cb0f7cc60cfb0e609a096622"), "12.11.0-linux_amd64": ("node-v12.11.0-linux-x64.tar.xz", "node-v12.11.0-linux-x64", "c0dc88110ac3ee095e3d09077545435b72d4cd52e35c43cd3fa666cff7446d46"), "12.11.0-windows_amd64": ("node-v12.11.0-win-x64.zip", "node-v12.11.0-win-x64", "457157358bd029196d47865dee66f8c263a3a4a5a8cdd1c0a8cf43ac45e9eda3"), "12.11.1-darwin_amd64": ("node-v12.11.1-darwin-x64.tar.gz", "node-v12.11.1-darwin-x64", "7dd24ee6d81668e65ce1b77b4bb4cdaf517d8f80bb19740d286606028506970b"), "12.11.1-linux_arm64": ("node-v12.11.1-linux-arm64.tar.xz", "node-v12.11.1-linux-arm64", "12777294258da80410fd7d5cbed46ead5d3cabacf376ee10ddb9e1a335b114e7"), "12.11.1-linux_amd64": ("node-v12.11.1-linux-x64.tar.xz", "node-v12.11.1-linux-x64", "00f7a0b59ff38c1c74d81732df925aa5ac5788b58412437327421f796878793d"), "12.11.1-windows_amd64": ("node-v12.11.1-win-x64.zip", "node-v12.11.1-win-x64", "0bab4473cd2ba03511b8859ddf2202bb012d5c541f9d57b555a5bbbf101fcb35"), "12.12.0-darwin_amd64": ("node-v12.12.0-darwin-x64.tar.gz", "node-v12.12.0-darwin-x64", "14a98237e8859bc22695719dbc2e9db5529a33ada0c6c377df4dc27b5622ffbb"), "12.12.0-linux_arm64": ("node-v12.12.0-linux-arm64.tar.xz", "node-v12.12.0-linux-arm64", "ad536aba218df64d8e901b28985f4c5f72f634bf903c449b0c84929f6940853c"), "12.12.0-linux_amd64": ("node-v12.12.0-linux-x64.tar.xz", "node-v12.12.0-linux-x64", "e3a38dfaf1233a3c43c2528869af52e74575781984369a5b705c89d84dfa3ac2"), "12.12.0-windows_amd64": ("node-v12.12.0-win-x64.zip", "node-v12.12.0-win-x64", "930e7bcd2ae5bcb1d4163c2adf09a392ed0e9a824b069d19daeb4f9f3430a195"), "12.13.0-darwin_amd64": ("node-v12.13.0-darwin-x64.tar.gz", "node-v12.13.0-darwin-x64", "49a7374670a111b033ce16611b20fd1aafd3296bbc662b184fe8fb26a29c22cc"), "12.13.0-linux_arm64": ("node-v12.13.0-linux-arm64.tar.xz", "node-v12.13.0-linux-arm64", "d65b3ce27639f15ae22941e3ff98a1c900aa9049fcc15518038615b0676037d5"), "12.13.0-linux_amd64": ("node-v12.13.0-linux-x64.tar.xz", "node-v12.13.0-linux-x64", "7a57ef2cb3036d7eacd50ae7ba07245a28336a93652641c065f747adb2a356d9"), "12.13.0-windows_amd64": ("node-v12.13.0-win-x64.zip", "node-v12.13.0-win-x64", "6f920cebeecb4957b4ef0def6d9b04c49d4582864f8d1a207ce8d0665865781a"), "12.13.1-darwin_amd64": ("node-v12.13.1-darwin-x64.tar.gz", "node-v12.13.1-darwin-x64", "12d14c7fbd98876a163a2b7e0aeb13657dc3e967e993efaf2dcacbe475a285e8"), "12.13.1-linux_arm64": ("node-v12.13.1-linux-arm64.tar.xz", "node-v12.13.1-linux-arm64", "3aef0178a8ab74c8e5c133e23d1896e53ed5c273415d165a0e72e005f5467cba"), "12.13.1-linux_amd64": ("node-v12.13.1-linux-x64.tar.xz", "node-v12.13.1-linux-x64", "aca06db37589966829b1ef0f163a5859b156a1d8e51b415bf47590f667c30a25"), "12.13.1-windows_amd64": ("node-v12.13.1-win-x64.zip", "node-v12.13.1-win-x64", "db33fb758ba49b96d073311ef9e9134b51bf96246ffd938909b2e02c65a6e890"), "12.14.0-darwin_amd64": ("node-v12.14.0-darwin-x64.tar.gz", "node-v12.14.0-darwin-x64", "5f3170b346b29e6902c0ca7e0993e3d1b4b650615348aa866de17ad965377048"), "12.14.0-linux_arm64": ("node-v12.14.0-linux-arm64.tar.xz", "node-v12.14.0-linux-arm64", "733b4f71ccdf114038bbe0f20574a1e8f4f60b53d39caf445f518745596eadda"), "12.14.0-linux_amd64": ("node-v12.14.0-linux-x64.tar.xz", "node-v12.14.0-linux-x64", "82ae74ee0a204de7ebf7767eaa8e382518d9b49668dcbb5bd7fd003154445d1f"), "12.14.0-windows_amd64": ("node-v12.14.0-win-x64.zip", "node-v12.14.0-win-x64", "526f4b01ffb270bdd8213b58b38843fa3c88f03c89b1898c641bc0e32607913e"), "12.14.1-darwin_amd64": ("node-v12.14.1-darwin-x64.tar.gz", "node-v12.14.1-darwin-x64", "0be10a28737527a1e5e3784d3ad844d742fe8b0718acd701fd48f718fd3af78f"), "12.14.1-linux_arm64": ("node-v12.14.1-linux-arm64.tar.xz", "node-v12.14.1-linux-arm64", "6cd28a5e6340f596aec8dbfd6720f444f011e6b9018622290a60dbd17f9baff6"), "12.14.1-linux_amd64": ("node-v12.14.1-linux-x64.tar.xz", "node-v12.14.1-linux-x64", "07cfcaa0aa9d0fcb6e99725408d9e0b07be03b844701588e3ab5dbc395b98e1b"), "12.14.1-windows_amd64": ("node-v12.14.1-win-x64.zip", "node-v12.14.1-win-x64", "1f96ccce3ba045ecea3f458e189500adb90b8bc1a34de5d82fc10a5bf66ce7e3"), "12.15.0-darwin_amd64": ("node-v12.15.0-darwin-x64.tar.gz", "node-v12.15.0-darwin-x64", "b6449cec39ac15b37abe4e59ef0eae50dcdfbf060c5276a01cc590f2a3372b7d"), "12.15.0-linux_arm64": ("node-v12.15.0-linux-arm64.tar.xz", "node-v12.15.0-linux-arm64", "c582cb65a0ec7f648618d3d33b4f87c374a3f930518b57eca1693828c965d6e5"), "12.15.0-linux_amd64": ("node-v12.15.0-linux-x64.tar.xz", "node-v12.15.0-linux-x64", "63df953deb091c1500e1044bef01d1953117970e757e74e90d915e1a4a0d1c9c"), "12.15.0-windows_amd64": ("node-v12.15.0-win-x64.zip", "node-v12.15.0-win-x64", "48b29cab597962f12b0aac081522e6192bc8642c582cd0fc1bf51557273888da"), "12.16.0-darwin_amd64": ("node-v12.16.0-darwin-x64.tar.gz", "node-v12.16.0-darwin-x64", "af3b9bbfdd9ae1b46390e7deeb77a2c1d8dbc6fb4171bbb0cfe8686fc1ecef1d"), "12.16.0-linux_arm64": ("node-v12.16.0-linux-arm64.tar.xz", "node-v12.16.0-linux-arm64", "f2d97187bd8d3175bf6266193107a030bfb827003d57ba6dd21de16aa622548d"), "12.16.0-linux_amd64": ("node-v12.16.0-linux-x64.tar.xz", "node-v12.16.0-linux-x64", "e8c38659540766db9d85bd7325ba8cce8ded56204f84507f73fdb41a26d9bd73"), "12.16.0-windows_amd64": ("node-v12.16.0-win-x64.zip", "node-v12.16.0-win-x64", "9a590dd064b491fbd40b366ae4a119fe6cef516a25fb4d78d7c2a64b37574da8"), "12.16.1-darwin_amd64": ("node-v12.16.1-darwin-x64.tar.gz", "node-v12.16.1-darwin-x64", "34895bce210ca4b3cf19cd480e6563588880dd7f5d798f3782e3650580d35920"), "12.16.1-linux_arm64": ("node-v12.16.1-linux-arm64.tar.xz", "node-v12.16.1-linux-arm64", "396c43ba507b8ec33c70cdc6f73b4a7c725bddb3f74a85a8b8ed77b436856fed"), "12.16.1-linux_amd64": ("node-v12.16.1-linux-x64.tar.xz", "node-v12.16.1-linux-x64", "b826753f14df9771609ffb8e7d2cc4cb395247cb704cf0cea0f04132d9cf3505"), "12.16.1-windows_amd64": ("node-v12.16.1-win-x64.zip", "node-v12.16.1-win-x64", "b93b73572c5e495154a9823d494de5729c77d1c83b041171154c4b5f3f76b590"), "12.16.2-darwin_amd64": ("node-v12.16.2-darwin-x64.tar.gz", "node-v12.16.2-darwin-x64", "483954e311a5ff649ddf32b473f635a58890790d284b5788bdd8d7ff850c6db2"), "12.16.2-linux_arm64": ("node-v12.16.2-linux-arm64.tar.xz", "node-v12.16.2-linux-arm64", "c88005467f6dcdb621d454b35ec39bb42e165c6a2e1cee74cabcdc01af307e81"), "12.16.2-linux_amd64": ("node-v12.16.2-linux-x64.tar.xz", "node-v12.16.2-linux-x64", "f94a6eb06e80ef2794ebf51a2baed0b89ed307d3196ab5579f16c0fa7cc62901"), "12.16.2-windows_amd64": ("node-v12.16.2-win-x64.zip", "node-v12.16.2-win-x64", "f34303a49384aee2e5daab5f248c5a719e850a9ebb19e7098fe2bfffb26efe03"), "12.16.3-darwin_amd64": ("node-v12.16.3-darwin-x64.tar.gz", "node-v12.16.3-darwin-x64", "0718812b3ab8e77e8d1354f4d10428ae99d78f721bdcceee527c4b592ea7fed0"), "12.16.3-linux_arm64": ("node-v12.16.3-linux-arm64.tar.xz", "node-v12.16.3-linux-arm64", "8311f513a7d1911200502dd3e00142cef56d600c851d5870f68d939802205b73"), "12.16.3-linux_amd64": ("node-v12.16.3-linux-x64.tar.xz", "node-v12.16.3-linux-x64", "1956e196e3c3c8ef5f0c45db76d7c1245af4ccdda2b7ab30a57ce91d6e165caa"), "12.16.3-windows_amd64": ("node-v12.16.3-win-x64.zip", "node-v12.16.3-win-x64", "d0bb0e0b1f1a948529ddd543e2cfe0bfe209eb843defc70217b3d2f84cbf3b78"), "12.17.0-darwin_amd64": ("node-v12.17.0-darwin-x64.tar.gz", "node-v12.17.0-darwin-x64", "8c3b9459462b8adaa10549f4da6a5ff5cdfaf7140a8a8020a87cc96d79022cc0"), "12.17.0-linux_arm64": ("node-v12.17.0-linux-arm64.tar.xz", "node-v12.17.0-linux-arm64", "54a0dbb203ff1700341d258cefa304bd31044bf0226e9e59a0de1128418cb5aa"), "12.17.0-linux_amd64": ("node-v12.17.0-linux-x64.tar.xz", "node-v12.17.0-linux-x64", "988653492a4f422fb112421c5c9d1c140146b665b480c2b24c66fffdd0b88a88"), "12.17.0-windows_amd64": ("node-v12.17.0-win-x64.zip", "node-v12.17.0-win-x64", "f3a64dc6ad48577f1f81521aa144c028beb7e353d0fcd05d7b420a72a84f50fc"), "12.18.0-darwin_amd64": ("node-v12.18.0-darwin-x64.tar.gz", "node-v12.18.0-darwin-x64", "11fe50e670315d2d3c46317d23f7a019f46a3d08b534fbadee9a1bc3d4f81852"), "12.18.0-linux_arm64": ("node-v12.18.0-linux-arm64.tar.xz", "node-v12.18.0-linux-arm64", "51b301102984ff73a74894396b774d00259bb3bb8c1de7c82674713acec7a214"), "12.18.0-linux_amd64": ("node-v12.18.0-linux-x64.tar.xz", "node-v12.18.0-linux-x64", "2febc2506c298048bfddf896056be6191c1f08716876d960a4990bd63a7fe05a"), "12.18.0-windows_amd64": ("node-v12.18.0-win-x64.zip", "node-v12.18.0-win-x64", "ca73a989eba5e863971cb600e5520cb4c5edf9c600fe8f76d9e4771ad03b5d08"), "12.18.1-darwin_amd64": ("node-v12.18.1-darwin-x64.tar.gz", "node-v12.18.1-darwin-x64", "80e1d644fe78838da47cd16de234b612c20e06ffe14447125db9622e381ed1ba"), "12.18.1-linux_arm64": ("node-v12.18.1-linux-arm64.tar.xz", "node-v12.18.1-linux-arm64", "b6683e6e887c6c44a3fe9ff419e80d36eaafed39eb2c2d1b04ee54b440a03217"), "12.18.1-linux_amd64": ("node-v12.18.1-linux-x64.tar.xz", "node-v12.18.1-linux-x64", "863f816967e297c9eb221ad3cf32521f7ac46fffc66750e60f159ed63809affa"), "12.18.1-windows_amd64": ("node-v12.18.1-win-x64.zip", "node-v12.18.1-win-x64", "93039ebfc7c5bfad168b015f77667757925070fff3ae84c3eb73348b3123a82a"), "12.18.2-darwin_amd64": ("node-v12.18.2-darwin-x64.tar.gz", "node-v12.18.2-darwin-x64", "6e6e7311943e4f3880db5038b8b8034a30469342fe436c8aaacf2997dfa305a6"), "12.18.2-linux_arm64": ("node-v12.18.2-linux-arm64.tar.xz", "node-v12.18.2-linux-arm64", "d7d3a05f36de9eb079b7b25e0fc1aaa0c960afdf36fb24b498f7303365eb945c"), "12.18.2-linux_amd64": ("node-v12.18.2-linux-x64.tar.xz", "node-v12.18.2-linux-x64", "b8dc634798ee783482c2ae1755bd7dff09d83fa7bb037cdc370b601d0a5e5cbb"), "12.18.2-windows_amd64": ("node-v12.18.2-win-x64.zip", "node-v12.18.2-win-x64", "91fdd5b5df16873c63541bc844c9eb66870d366b2076d114f9ab7528b5e2f9a3"), "12.18.3-darwin_amd64": ("node-v12.18.3-darwin-x64.tar.gz", "node-v12.18.3-darwin-x64", "af376caf114bdd5d7e566dbf7590e9077ffc01f9b2692eb2651f31d7219a30bb"), "12.18.3-linux_arm64": ("node-v12.18.3-linux-arm64.tar.xz", "node-v12.18.3-linux-arm64", "d330aab40029afc34f8b5d1abc2e67be233df4b31331cf08d538be2a666737bb"), "12.18.3-linux_amd64": ("node-v12.18.3-linux-x64.tar.xz", "node-v12.18.3-linux-x64", "b79e02e48d0a1ee4cd4ae138de97fda5413542f2a4f441a7d0e189697b8da563"), "12.18.3-windows_amd64": ("node-v12.18.3-win-x64.zip", "node-v12.18.3-win-x64", "1fcd30c09f0ac9fbecf45161519eff2cf621c199eef4663b1db41b3f2fef4041"), "13.0.0-darwin_amd64": ("node-v13.0.0-darwin-x64.tar.gz", "node-v13.0.0-darwin-x64", "612556a8c7e6b4cd08f6134b8afe5a05bf84c0121225fa9c542be1c98af04a35"), "13.0.0-linux_arm64": ("node-v13.0.0-linux-arm64.tar.xz", "node-v13.0.0-linux-arm64", "6ed882e17123861b5b81683de2b2c86be02c5916ef0beda04fd176329888fd12"), "13.0.0-linux_amd64": ("node-v13.0.0-linux-x64.tar.xz", "node-v13.0.0-linux-x64", "799d890f00a3a2a7415b813b286d32d38573df6525bc8ef80f40077cdd210d39"), "13.0.0-windows_amd64": ("node-v13.0.0-win-x64.zip", "node-v13.0.0-win-x64", "8ffcefde5e080d70790a9a2e1aab0724cc88b5526d5128b53fc59bf94f6ad5de"), "13.0.1-darwin_amd64": ("node-v13.0.1-darwin-x64.tar.gz", "node-v13.0.1-darwin-x64", "25621359a51ff218ecf4bb2ffc657815154230a967224f22b722840a2b9ad061"), "13.0.1-linux_arm64": ("node-v13.0.1-linux-arm64.tar.xz", "node-v13.0.1-linux-arm64", "ad6e051aede160d8be5cbab9c60a155b06a5696e8088d895e6eff3dd36f9a688"), "13.0.1-linux_amd64": ("node-v13.0.1-linux-x64.tar.xz", "node-v13.0.1-linux-x64", "d5657c19bb30b267bf2e0f2b61f6a96d8955aa30b69240f22d3fd2c65e123cf7"), "13.0.1-windows_amd64": ("node-v13.0.1-win-x64.zip", "node-v13.0.1-win-x64", "1a2552b630651e08e9027339f71a65fbe3944540f0875563ea25639a091e1f33"), "13.1.0-darwin_amd64": ("node-v13.1.0-darwin-x64.tar.gz", "node-v13.1.0-darwin-x64", "6501c1bcf2babb5b9c81dcff8b52021f726da8f6ee28df1637acade1a16c7d39"), "13.1.0-linux_arm64": ("node-v13.1.0-linux-arm64.tar.xz", "node-v13.1.0-linux-arm64", "646d597e6b0dc400429e46b703a5135c77bd71e653ea4c8254d0b60c17b6ec1d"), "13.1.0-linux_amd64": ("node-v13.1.0-linux-x64.tar.xz", "node-v13.1.0-linux-x64", "2eecb5a4b7975c3b406bee36b12c9a29e8bedf9553c88cad310b8f076db00881"), "13.1.0-windows_amd64": ("node-v13.1.0-win-x64.zip", "node-v13.1.0-win-x64", "d735e97bdeb7b74551b9d165c708a3fdea4dbb3801a65e70f6d6ae3539d48a03"), "13.2.0-darwin_amd64": ("node-v13.2.0-darwin-x64.tar.gz", "node-v13.2.0-darwin-x64", "2bcba358ef68ea21655728126c678063c60119e18e65d04f615d6b22dba8f7a5"), "13.2.0-linux_arm64": ("node-v13.2.0-linux-arm64.tar.xz", "node-v13.2.0-linux-arm64", "e6c4a5fe57585f69a20bd028275db31f43de421308e31d117f319b577210e527"), "13.2.0-linux_amd64": ("node-v13.2.0-linux-x64.tar.xz", "node-v13.2.0-linux-x64", "366df8a38b522a5899c3f48d8c9e359b3370495cf84867b2673dc10483adbdef"), "13.2.0-windows_amd64": ("node-v13.2.0-win-x64.zip", "node-v13.2.0-win-x64", "e2866a8f53c45bb544d7b00aed1e5fddbbd7071bd331b02e66a6ce7c38c6918c"), "13.3.0-darwin_amd64": ("node-v13.3.0-darwin-x64.tar.gz", "node-v13.3.0-darwin-x64", "187ea9028daa6d9abad9c1cbb4e12ba51427c3748da29eae616fa352c0f4cd49"), "13.3.0-linux_arm64": ("node-v13.3.0-linux-arm64.tar.xz", "node-v13.3.0-linux-arm64", "fb201a908bea36be828eee36a7cd898c67ad4ae6846982f393466e2b8b826c16"), "13.3.0-linux_amd64": ("node-v13.3.0-linux-x64.tar.xz", "node-v13.3.0-linux-x64", "b208393ae411bd55188e903171901765aaa8381c08155e4a7b34174737a1bc65"), "13.3.0-windows_amd64": ("node-v13.3.0-win-x64.zip", "node-v13.3.0-win-x64", "82e0f43aea81374a8028a7d3c9993245c4910ac95cd0f66ee5b29b940a6f3d93"), "13.4.0-darwin_amd64": ("node-v13.4.0-darwin-x64.tar.gz", "node-v13.4.0-darwin-x64", "4de08a89054416595228d6ff40fcf20c375d00556f2e95dfde8602cbb42c0b6e"), "13.4.0-linux_arm64": ("node-v13.4.0-linux-arm64.tar.xz", "node-v13.4.0-linux-arm64", "382d5fb2983ab55d495e42145e812b3859d2a311e426307fd373f47825d55fe9"), "13.4.0-linux_amd64": ("node-v13.4.0-linux-x64.tar.xz", "node-v13.4.0-linux-x64", "5cab49240c521efb80efd0a0bb3ba1071e5498c55ecbebd723d78648c91b1cc8"), "13.4.0-windows_amd64": ("node-v13.4.0-win-x64.zip", "node-v13.4.0-win-x64", "56de9ed20332cdf22bb9b048c3fb3977662ef2de9d2e8ac2d2a27d28e9be276f"), "13.5.0-darwin_amd64": ("node-v13.5.0-darwin-x64.tar.gz", "node-v13.5.0-darwin-x64", "3322c601dc032677e5b5f87f393d4b1d70073bcab24fe74378eff8eb49364001"), "13.5.0-linux_arm64": ("node-v13.5.0-linux-arm64.tar.xz", "node-v13.5.0-linux-arm64", "fe52f4e3a60a372138102da741e5b5d34310a74b3fc6f2000e4c254e3f0c4f51"), "13.5.0-linux_amd64": ("node-v13.5.0-linux-x64.tar.xz", "node-v13.5.0-linux-x64", "4d2b2cea13388658e95d8b2dc7ff918718155473ef6ef38928d92eb8cbbe210a"), "13.5.0-windows_amd64": ("node-v13.5.0-win-x64.zip", "node-v13.5.0-win-x64", "e286a84f2861b9f3c0290a9afbbecd09f303a39b2573af001ef8a4c1413eee7c"), "13.6.0-darwin_amd64": ("node-v13.6.0-darwin-x64.tar.gz", "node-v13.6.0-darwin-x64", "da13adb864777b322dda7af20410a9b0c63aa69de4b5574008d1e6910768bf69"), "13.6.0-linux_arm64": ("node-v13.6.0-linux-arm64.tar.xz", "node-v13.6.0-linux-arm64", "1f34ed8668207e03cb832763319a82b4c753839a3655207adc5bbe52f65e154a"), "13.6.0-linux_amd64": ("node-v13.6.0-linux-x64.tar.xz", "node-v13.6.0-linux-x64", "00f01315a867da16d1638f7a02966c608e344ac6c5b7d04d1fdae3138fa9d798"), "13.6.0-windows_amd64": ("node-v13.6.0-win-x64.zip", "node-v13.6.0-win-x64", "7fe37b34a4673a071bea52fcaf913ec422cf6fd79fd025bfb22de42ccc77f386"), "13.7.0-darwin_amd64": ("node-v13.7.0-darwin-x64.tar.gz", "node-v13.7.0-darwin-x64", "866ea9bdbd7b734c593af96b946397d9c7cb9c291aa8ea52a6a2af271b972169"), "13.7.0-linux_arm64": ("node-v13.7.0-linux-arm64.tar.xz", "node-v13.7.0-linux-arm64", "2823b199c7c4e6c547caf95139e28341444a5ffc52481a5ba704067291771579"), "13.7.0-linux_amd64": ("node-v13.7.0-linux-x64.tar.xz", "node-v13.7.0-linux-x64", "02578025b82de24f4cfb3ffeb3824990431d739d09220f2db9ef9f454f475470"), "13.7.0-windows_amd64": ("node-v13.7.0-win-x64.zip", "node-v13.7.0-win-x64", "26b41de81ead8f51de2964d7c7526533f46387ff436b61596e09d678bcd7503f"), "13.8.0-darwin_amd64": ("node-v13.8.0-darwin-x64.tar.gz", "node-v13.8.0-darwin-x64", "ae480e2b124cb55667763848b8ec0fde1bc35d5e0b76debe881034689a68eaea"), "13.8.0-linux_arm64": ("node-v13.8.0-linux-arm64.tar.xz", "node-v13.8.0-linux-arm64", "f1d4167a6911e42d836a5459c992cdaf35a03ab0700ea80831d7df5d706d1baf"), "13.8.0-linux_amd64": ("node-v13.8.0-linux-x64.tar.xz", "node-v13.8.0-linux-x64", "47a8cb675358f2ff534ad3d6709f14de0433f76d3af92cf389b8dcc78a1236ad"), "13.8.0-windows_amd64": ("node-v13.8.0-win-x64.zip", "node-v13.8.0-win-x64", "f198f3e4b120fc84b61d12e7222530c5bb9c6f864735bb41a8db1cf1b94a64c3"), "13.9.0-darwin_amd64": ("node-v13.9.0-darwin-x64.tar.gz", "node-v13.9.0-darwin-x64", "b2a5a539b9b2d1733bda301913c99d220968de801bf313b762fa932820ea797b"), "13.9.0-linux_arm64": ("node-v13.9.0-linux-arm64.tar.xz", "node-v13.9.0-linux-arm64", "c668afc06e4094b68ae758b823fc3244b34f0468fc0c2feee45278788989b8a1"), "13.9.0-linux_amd64": ("node-v13.9.0-linux-x64.tar.xz", "node-v13.9.0-linux-x64", "f1e093303468032a1ecb0e290e19b43bf7771d4efbf589560df0060149614272"), "13.9.0-windows_amd64": ("node-v13.9.0-win-x64.zip", "node-v13.9.0-win-x64", "ec0a55bb703906494e738cd3d09e3274b34f0a3fbe207b9e67502092ed017500"), "13.10.0-darwin_amd64": ("node-v13.10.0-darwin-x64.tar.gz", "node-v13.10.0-darwin-x64", "67269fb9061402e446bb61776be2e5d0ec330b5274326df77979698d05f503da"), "13.10.0-linux_arm64": ("node-v13.10.0-linux-arm64.tar.xz", "node-v13.10.0-linux-arm64", "adb145535d2e03fe508fa7a34897a130ba903d6f718a21cd29d1760e298f715b"), "13.10.0-linux_amd64": ("node-v13.10.0-linux-x64.tar.xz", "node-v13.10.0-linux-x64", "62081af005257d3db7ebd5a64b43f1a8e4a57bafd229be3acd7ce2704607eaac"), "13.10.0-windows_amd64": ("node-v13.10.0-win-x64.zip", "node-v13.10.0-win-x64", "d428b6d3e127716191fa6df630d03a25d3186fda1ede04a9a8d5c07e526dbb9e"), "13.10.1-darwin_amd64": ("node-v13.10.1-darwin-x64.tar.gz", "node-v13.10.1-darwin-x64", "a6a66fdc79e70267fc191f10ee045793240974e1268fdea6c2d28afbc1d635e8"), "13.10.1-linux_arm64": ("node-v13.10.1-linux-arm64.tar.xz", "node-v13.10.1-linux-arm64", "f73effcef784251e53b5e3938b8316c36bd49628c3588de7976e8569e560c12c"), "13.10.1-linux_amd64": ("node-v13.10.1-linux-x64.tar.xz", "node-v13.10.1-linux-x64", "69d69165282d88f321e751f03ee5d3370db65e5ca4c587af24994b12f31d4827"), "13.10.1-windows_amd64": ("node-v13.10.1-win-x64.zip", "node-v13.10.1-win-x64", "f9d0aac273a44dbd52dd8cdb3d6c684b68b860d128af58d77a0c08f39f51f229"), "13.11.0-darwin_amd64": ("node-v13.11.0-darwin-x64.tar.gz", "node-v13.11.0-darwin-x64", "2d87989fb1e0d425667c5ca9893cb3ecfb30cd3344d543870246d65f8d9b892f"), "13.11.0-linux_arm64": ("node-v13.11.0-linux-arm64.tar.xz", "node-v13.11.0-linux-arm64", "63ce9871b9802a1f021c84f282c63e1890524a32dc97d3e7a7ab8d52b4bde19e"), "13.11.0-linux_amd64": ("node-v13.11.0-linux-x64.tar.xz", "node-v13.11.0-linux-x64", "c127cf38f9a56d97646eb1fedb93712f304950c7143705de7180a701becc0fbb"), "13.11.0-windows_amd64": ("node-v13.11.0-win-x64.zip", "node-v13.11.0-win-x64", "dc93aa5a82988f741dca6f1869c7b1aeda6f339293d13a968279a6dc9fcc8dd0"), "13.12.0-darwin_amd64": ("node-v13.12.0-darwin-x64.tar.gz", "node-v13.12.0-darwin-x64", "1fe3103610e8eb66ae71872ea1b4e868a638292a4e7ad0e41976a9fe417a09c7"), "13.12.0-linux_arm64": ("node-v13.12.0-linux-arm64.tar.xz", "node-v13.12.0-linux-arm64", "2e8c12e575fcceb2d6f46eb3c50c6bfa98e91540bddaf91ca1c0fe739619ca0b"), "13.12.0-linux_amd64": ("node-v13.12.0-linux-x64.tar.xz", "node-v13.12.0-linux-x64", "95eb1188872e243323cbc31fc80048be3fdfdda91505c62c80c599281de357ed"), "13.12.0-windows_amd64": ("node-v13.12.0-win-x64.zip", "node-v13.12.0-win-x64", "de8445794ecbcfe895f4775417d1e2cc023e2212b1f5d4ff5cc0ed6875f7c911"), "13.13.0-darwin_amd64": ("node-v13.13.0-darwin-x64.tar.gz", "node-v13.13.0-darwin-x64", "28ae2abedafb250a9bbe706650fd79d2b25273f6445adcc1d85c777359dc5390"), "13.13.0-linux_arm64": ("node-v13.13.0-linux-arm64.tar.xz", "node-v13.13.0-linux-arm64", "eded8da4633134cae0766a2f6f3c2237f8e728df77895c85607acaca13216226"), "13.13.0-linux_amd64": ("node-v13.13.0-linux-x64.tar.xz", "node-v13.13.0-linux-x64", "41d60cda7422f53156711626d670f9b5079075b1ecc6736aea99319fe36c20a6"), "13.13.0-windows_amd64": ("node-v13.13.0-win-x64.zip", "node-v13.13.0-win-x64", "79f2a39c1047666f2bbf2efe53c069a38b8f6ef18d569bf338463aea1914b89d"), "13.14.0-darwin_amd64": ("node-v13.14.0-darwin-x64.tar.gz", "node-v13.14.0-darwin-x64", "a56eb353fecd45f731d74fc77c58dde052320c1bc272de9b03151fbaf962feaf"), "13.14.0-linux_arm64": ("node-v13.14.0-linux-arm64.tar.xz", "node-v13.14.0-linux-arm64", "e4736df097846bbe8195a185cc67ada3410a1f8993949e516bbf62b62198d2a7"), "13.14.0-linux_amd64": ("node-v13.14.0-linux-x64.tar.xz", "node-v13.14.0-linux-x64", "9ab808ba3872d58e827ea60a6e43a352f59361bc8eb36fe0327a587086b466f9"), "13.14.0-windows_amd64": ("node-v13.14.0-win-x64.zip", "node-v13.14.0-win-x64", "8c6e77fac5e911a2e70b6ca34804b3b59b6a3c685ab4e3b17756397df86063fa"), "14.0.0-darwin_amd64": ("node-v14.0.0-darwin-x64.tar.gz", "node-v14.0.0-darwin-x64", "4e50cec7aeef91c6d00d08a3bab938358da182984aa549c2aeab9868e3342f55"), "14.0.0-linux_arm64": ("node-v14.0.0-linux-arm64.tar.xz", "node-v14.0.0-linux-arm64", "29c612fcdb40133171959b269878138bbfe7723d46681f70e2017ee30134e7ad"), "14.0.0-linux_amd64": ("node-v14.0.0-linux-x64.tar.xz", "node-v14.0.0-linux-x64", "a2aaaa621074e1b56bb751bda53ce726319fac617587443371c0a7742481e5b6"), "14.0.0-windows_amd64": ("node-v14.0.0-win-x64.zip", "node-v14.0.0-win-x64", "e8f73d4f2e9935df929360c09ae932ceb316784a7450b256024af5d01fe29b75"), "14.1.0-darwin_amd64": ("node-v14.1.0-darwin-x64.tar.gz", "node-v14.1.0-darwin-x64", "7f08bd365df4e7a5625ad393257f48e8cd79f77391ab87a64426b0c6448dd226"), "14.1.0-linux_arm64": ("node-v14.1.0-linux-arm64.tar.xz", "node-v14.1.0-linux-arm64", "9dd3a4867f679f40075e2a364d3b3566702139274da9fcd59a182198ff7c7b52"), "14.1.0-linux_amd64": ("node-v14.1.0-linux-x64.tar.xz", "node-v14.1.0-linux-x64", "959fab0c8ae0830f1ab987699cd2941cab97169991630a2e0c99db7c144f9e42"), "14.1.0-windows_amd64": ("node-v14.1.0-win-x64.zip", "node-v14.1.0-win-x64", "1d3890d0d2f996cce57bcb0206e49b67233623e3cdb50eee77b8acc8f006b955"), "14.2.0-darwin_amd64": ("node-v14.2.0-darwin-x64.tar.gz", "node-v14.2.0-darwin-x64", "2447241aefe71dea8ba1552549e4df2e894d1ac12203630db3af63d4ae35c016"), "14.2.0-linux_arm64": ("node-v14.2.0-linux-arm64.tar.xz", "node-v14.2.0-linux-arm64", "4587d2c52cd348094bd46ee4ee8cdfeb549462ead9b4aadc9cfc3c5fc3ba7215"), "14.2.0-linux_amd64": ("node-v14.2.0-linux-x64.tar.xz", "node-v14.2.0-linux-x64", "468cbd92271da8c0cacaa3fa432a73a332e398bade8ad7359a94aa8ab3cc3cca"), "14.2.0-windows_amd64": ("node-v14.2.0-win-x64.zip", "node-v14.2.0-win-x64", "99085f45a894e257123d7c729113cc00ed1413df432dbdce5fe53867e7c53b11"), "14.3.0-darwin_amd64": ("node-v14.3.0-darwin-x64.tar.gz", "node-v14.3.0-darwin-x64", "fd6a44303646f28b7e7577de687c2681cb565bef534e84deef44202e7919d7f3"), "14.3.0-linux_arm64": ("node-v14.3.0-linux-arm64.tar.xz", "node-v14.3.0-linux-arm64", "53bb110ea135ae3c819f535373ce1b779e86c7aa49a9b93fc5f26969a72365d2"), "14.3.0-linux_amd64": ("node-v14.3.0-linux-x64.tar.xz", "node-v14.3.0-linux-x64", "17236db7b9447080b58c2e50937982c386fe8a60e644b8d7f23e546068a8acba"), "14.3.0-windows_amd64": ("node-v14.3.0-win-x64.zip", "node-v14.3.0-win-x64", "07bebc231dd8d773ab41cdcfbcb8b48e2336fbee20deb961b4300b9ba86afa04"), "14.4.0-darwin_amd64": ("node-v14.4.0-darwin-x64.tar.gz", "node-v14.4.0-darwin-x64", "d95eaa6950d67895b5cdd0e2f913d2c44034178234f0cb7436c3397b54f64023"), "14.4.0-linux_arm64": ("node-v14.4.0-linux-arm64.tar.xz", "node-v14.4.0-linux-arm64", "9c9f84589b7bc6a05ac12a137e5097a5adb20b5c63ae9e4e912942da2c06d99d"), "14.4.0-linux_amd64": ("node-v14.4.0-linux-x64.tar.xz", "node-v14.4.0-linux-x64", "d65a9a8a547bfe67c6c08dae733a3e5a846700d5377c5f150164cc6bb5f6a039"), "14.4.0-windows_amd64": ("node-v14.4.0-win-x64.zip", "node-v14.4.0-win-x64", "a4bac45af8252f6b677a79ed19be4913f4939c4509fb08b6f14f972597550bbe"), "14.5.0-darwin_amd64": ("node-v14.5.0-darwin-x64.tar.gz", "node-v14.5.0-darwin-x64", "47dfd88abcd4d6d6f7b7516c95645f9760ba9c93d04b51a92895584c945b2953"), "14.5.0-linux_arm64": ("node-v14.5.0-linux-arm64.tar.xz", "node-v14.5.0-linux-arm64", "c5ab67fbc73ea8858b4a989b6e92d6630decfc47c4703be7bcda3c6e39adff0b"), "14.5.0-linux_amd64": ("node-v14.5.0-linux-x64.tar.xz", "node-v14.5.0-linux-x64", "8b0235c318de87ecf8eec9a39e5c5df80757dbec571addda7123276dfcb34d5b"), "14.5.0-windows_amd64": ("node-v14.5.0-win-x64.zip", "node-v14.5.0-win-x64", "ab5728c85ece98210036fc9c38984fa2410a882dd99075b3d5bece58e4cc6ea2"), "14.6.0-darwin_amd64": ("node-v14.6.0-darwin-x64.tar.gz", "node-v14.6.0-darwin-x64", "7907a18605b900ce977ff4c7e67f7507f937f85738659865d31779c3b2990756"), "14.6.0-linux_arm64": ("node-v14.6.0-linux-arm64.tar.xz", "node-v14.6.0-linux-arm64", "853f2c99f0e5fa65e6f222821e29c9d1a49f2d358a97c1de080ddf5c74e4ec70"), "14.6.0-linux_amd64": ("node-v14.6.0-linux-x64.tar.xz", "node-v14.6.0-linux-x64", "b8a39b2dac8e200e96586356c5525d20b0b43dba8bf9f7eb4e8c2d5366be2bb2"), "14.6.0-windows_amd64": ("node-v14.6.0-win-x64.zip", "node-v14.6.0-win-x64", "57ea75a7ec70cc8158e6f9774f9728fb9e3d08212b1af3e206db2de46ca304ca"), "14.7.0-darwin_amd64": ("node-v14.7.0-darwin-x64.tar.gz", "node-v14.7.0-darwin-x64", "47c94ec84706fd6851db27af54abdab569941fcbfcdc28e386d8fa7d49c6a619"), "14.7.0-linux_arm64": ("node-v14.7.0-linux-arm64.tar.xz", "node-v14.7.0-linux-arm64", "12540328aeb5baa524a4e9c3b493b5eceb54cfa630f8bce64c19e674871e2f4b"), "14.7.0-linux_amd64": ("node-v14.7.0-linux-x64.tar.xz", "node-v14.7.0-linux-x64", "48929b03deb2915b64ba67355d2deffeed3c8df798b0c5f2b821ffc7a8116a23"), "14.7.0-windows_amd64": ("node-v14.7.0-win-x64.zip", "node-v14.7.0-win-x64", "a899693c9a31089a1eda14b1e613cf8cd60361e6e574b351551d832cf864c8f8"), "14.8.0-darwin_amd64": ("node-v14.8.0-darwin-x64.tar.gz", "node-v14.8.0-darwin-x64", "b6db32f2ff37475ae68502c76fc777a604cbc589bf57158fb4eed4db9ac5f62d"), "14.8.0-linux_arm64": ("node-v14.8.0-linux-arm64.tar.xz", "node-v14.8.0-linux-arm64", "0c66a6468c36552c00d45cff0eaa924240f3d2e625be0306f33f8b0d81af4224"), "14.8.0-linux_amd64": ("node-v14.8.0-linux-x64.tar.xz", "node-v14.8.0-linux-x64", "c7761fe5d56d045d1540b1f0bc8a20d7edf03e6fd695ee5fbffc1dd9416ccc75"), "14.8.0-windows_amd64": ("node-v14.8.0-win-x64.zip", "node-v14.8.0-win-x64", "848ca582bdf8b7fdc21a38d9f3887a45bdf6381b04549fc0f918852889157c9a")} +
node_urls + custom list of URLs to use to download NodeJS + +Each entry is a template for downloading a node distribution. + +The {version} parameter is substituted with the node_version attribute, +and {filename} with the matching entry from the node_repositories attribute. + List of stringsoptional + ["https://mirror.bazel.build/nodejs.org/dist/v{version}/{filename}", "https://nodejs.org/dist/v{version}/{filename}"] +
node_version + the specific version of NodeJS to install or, if vendored_node is specified, the vendored version of node + Stringoptional + "12.13.0" +
package_json + (ADVANCED, not recommended) + a list of labels, which indicate the package.json files that will be installed + when you manually run the package manager, e.g. with + bazel run @nodejs//:yarn_node_repositories or bazel run @nodejs//:npm_node_repositories install. + If you use bazel-managed dependencies, you should omit this attribute. + List of labelsoptional + [] +
vendored_node + the local path to a pre-installed NodeJS runtime. + +If set then also set node_version to the version that of node that is vendored. +Bazel will automatically turn on features such as --preserve-symlinks-main if they +are supported by the node version being used. + Labeloptional + None +
vendored_yarn + the local path to a pre-installed yarn tool + Labeloptional + None +
yarn_repositories + Custom list of yarn repositories to use. + +Dictionary mapping Yarn versions to their corresponding (filename, strip_prefix, sha256) tuples. + Dictionary: String -> List of stringsoptional + {"1.3.2": ("yarn-v1.3.2.tar.gz", "yarn-v1.3.2", "6cfe82e530ef0837212f13e45c1565ba53f5199eec2527b85ecbcd88bf26821d"), "1.5.1": ("yarn-v1.5.1.tar.gz", "yarn-v1.5.1", "cd31657232cf48d57fdbff55f38bfa058d2fb4950450bd34af72dac796af4de1"), "1.6.0": ("yarn-v1.6.0.tar.gz", "yarn-v1.6.0", "a57b2fdb2bfeeb083d45a883bc29af94d5e83a21c25f3fc001c295938e988509"), "1.9.2": ("yarn-v1.9.2.tar.gz", "yarn-v1.9.2", "3ad69cc7f68159a562c676e21998eb21b44138cae7e8fe0749a7d620cf940204"), "1.9.4": ("yarn-v1.9.4.tar.gz", "yarn-v1.9.4", "7667eb715077b4bad8e2a832e7084e0e6f1ba54d7280dc573c8f7031a7fb093e"), "1.12.1": ("yarn-v1.12.1.tar.gz", "yarn-v1.12.1", "09bea8f4ec41e9079fa03093d3b2db7ac5c5331852236d63815f8df42b3ba88d"), "1.12.3": ("yarn-v1.12.3.tar.gz", "yarn-v1.12.3", "02cd4b589ec22c4bdbd2bc5ebbfd99c5e99b07242ad68a539cb37896b93a24f2"), "1.13.0": ("yarn-v1.13.0.tar.gz", "yarn-v1.13.0", "125d40ebf621ebb08e3f66a618bd2cc5cd77fa317a312900a1ab4360ed38bf14"), "1.19.1": ("yarn-v1.19.1.tar.gz", "yarn-v1.19.1", "34293da6266f2aae9690d59c2d764056053ff7eebc56b80b8df05010c3da9343"), "1.22.4": ("yarn-v1.22.4.tar.gz", "yarn-v1.22.4", "bc5316aa110b2f564a71a3d6e235be55b98714660870c5b6b2d2d3f12587fb58")} +
yarn_urls + custom list of URLs to use to download Yarn + +Each entry is a template, similar to the node_urls attribute, using yarn_version and yarn_repositories in the substitutions. + List of stringsoptional + ["https://mirror.bazel.build/github.com/yarnpkg/yarn/releases/download/v{version}/{filename}", "https://github.com/yarnpkg/yarn/releases/download/v{version}/{filename}"] +
yarn_version + the specific version of Yarn to install + Stringoptional + "1.19.1" +
+ +

nodejs_binary

+ +

Runs some JavaScript code in NodeJS.

+ +
+nodejs_binary(name, configuration_env_vars, data, default_env_vars, entry_point, node_modules,
+              templated_args)
+
+ +

ATTRIBUTES

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionTypeMandatoryDefault
name + A unique name for this target. + Namerequired + +
configuration_env_vars + Pass these configuration environment variables to the resulting binary. + Chooses a subset of the configuration environment variables (taken from ctx.var), which also + includes anything specified via the --define flag. + Note, this can lead to different outputs produced by this rule. + List of stringsoptional + [] +
data + Runtime dependencies which may be loaded during execution. + List of labelsoptional + [] +
default_env_vars + Default environment variables that are added to configuration_env_vars. + +This is separate from the default of configuration_env_vars so that a user can set configuration_env_vars +without losing the defaults that should be set in most cases. + +The set of default environment variables is: + +- VERBOSE_LOGS: use by some rules & tools to turn on debug output in their logs +- NODE_DEBUG: used by node.js itself to print more logs +- RUNFILES_LIB_DEBUG: print diagnostic message from Bazel runfiles.bash helper + List of stringsoptional + ["VERBOSE_LOGS", "NODE_DEBUG", "RUNFILES_LIB_DEBUG"] +
entry_point + The script which should be executed first, usually containing a main function. + +If the entry JavaScript file belongs to the same package (as the BUILD file), +you can simply reference it by its relative name to the package directory: + + +
nodejs_binary(
+    name = "my_binary",
+    ...
+    entry_point = ":file.js",
+)
+ + +You can specify the entry point as a typescript file so long as you also include +the ts_library target in data: + + +
ts_library(
+    name = "main",
+    srcs = ["main.ts"],
+)
+
+nodejs_binary(
+    name = "bin",
+    data = [":main"]
+    entry_point = ":main.ts",
+)
+ + +The rule will use the corresponding .js output of the ts_library rule as the entry point. + +If the entry point target is a rule, it should produce a single JavaScript entry file that will be passed to the nodejs_binary rule. +For example: + + +
filegroup(
+    name = "entry_file",
+    srcs = ["main.js"],
+)
+
+nodejs_binary(
+    name = "my_binary",
+    entry_point = ":entry_file",
+)
+ + +The entry_point can also be a label in another workspace: + + +
nodejs_binary(
+    name = "history-server",
+    entry_point = "@npm//:node_modules/history-server/modules/cli.js",
+    data = ["@npm//history-server"],
+)
+ +
Labelrequired + +
node_modules + The npm packages which should be available to require() during + execution. + +This attribute is DEPRECATED. As of version 0.13.0 the recommended approach +to npm dependencies is to use fine grained npm dependencies which are setup +with the yarn_install or npm_install rules. For example, in targets +that used a //:node_modules filegroup, + + +
nodejs_binary(
+    name = "my_binary",
+    ...
+    node_modules = "//:node_modules",
+)
+ + +which specifies all files within the //:node_modules filegroup +to be inputs to the my_binary. Using fine grained npm dependencies, +my_binary is defined with only the npm dependencies that are +needed: + + +
nodejs_binary(
+    name = "my_binary",
+    ...
+    data = [
+        "@npm//foo",
+        "@npm//bar",
+        ...
+    ],
+)
+ + +In this case, only the foo and bar npm packages and their +transitive deps are includes as inputs to the my_binary target +which reduces the time required to setup the runfiles for this +target (see https://github.com/bazelbuild/bazel/issues/5153). + +The @npm external repository and the fine grained npm package +targets are setup using the yarn_install or npm_install rule +in your WORKSPACE file: + +yarn_install( + name = "npm", + package_json = "//:package.json", + yarn_lock = "//:yarn.lock", +) + +For other rules such as jasmine_node_test, fine grained +npm dependencies are specified in the deps attribute: + + +
jasmine_node_test(
+    name = "my_test",
+    ...
+    deps = [
+        "@npm//jasmine",
+        "@npm//foo",
+        "@npm//bar",
+        ...
+    ],
+)
+ +
Labeloptional + //:node_modules_none +
templated_args + Arguments which are passed to every execution of the program. + To pass a node startup option, prepend it with --node_options=, e.g. + --node_options=--preserve-symlinks. + +Subject to 'Make variable' substitution. See https://docs.bazel.build/versions/master/be/make-variables.html. + +1. Subject to predefined source/output path variables substitutions. + +The predefined variables execpath, execpaths, rootpath, rootpaths, location, and locations take +label parameters (e.g. $(execpath //foo:bar)) and substitute the file paths denoted by that label. + +See https://docs.bazel.build/versions/master/be/make-variables.html#predefined_label_variables for more info. + +NB: This $(location) substition returns the manifest file path which differs from the *_binary & *_test +args and genrule bazel substitions. This will be fixed in a future major release. +See docs string of expand_location_into_runfiles macro in internal/common/expand_into_runfiles.bzl +for more info. + +The recommended approach is to now use $(rootpath) where you previously used $(location). + +To get from a $(rootpath) to the absolute path that $$(rlocation $(location)) returned you can either use +$$(rlocation $(rootpath)) if you are in the templated_args of a nodejs_binary or nodejs_test: + +BUILD.bazel: + +
nodejs_test(
+    name = "my_test",
+    data = [":bootstrap.js"],
+    templated_args = ["--node_options=--require=$$(rlocation $(rootpath :bootstrap.js))"],
+)
+ + +or if you're in the context of a .js script you can pass the $(rootpath) as an argument to the script +and use the javascript runfiles helper to resolve to the absolute path: + +BUILD.bazel: + +
nodejs_test(
+    name = "my_test",
+    data = [":some_file"],
+    entry_point = ":my_test.js",
+    templated_args = ["$(rootpath :some_file)"],
+)
+ + +my_test.js + +
const runfiles = require(process.env['BAZEL_NODE_RUNFILES_HELPER']);
+const args = process.argv.slice(2);
+const some_file = runfiles.resolveWorkspaceRelative(args[0]);
+ + +NB: Bazel will error if it sees the single dollar sign $(rlocation path) in templated_args as it will try to +expand $(rlocation) since we now expand predefined & custom "make" variables such as $(COMPILATION_MODE), +$(BINDIR) & $(TARGET_CPU) using ctx.expand_make_variables. See https://docs.bazel.build/versions/master/be/make-variables.html. + +To prevent expansion of $(rlocation) write it as $$(rlocation). Bazel understands $$ to be +the string literal $ and the expansion results in $(rlocation) being passed as an arg instead +of being expanded. $(rlocation) is then evaluated by the bash node launcher script and it calls +the rlocation function in the runfiles.bash helper. For example, the templated arg +$$(rlocation $(rootpath //:some_file)) is expanded by Bazel to $(rlocation ./some_file) which +is then converted in bash to the absolute path of //:some_file in runfiles by the runfiles.bash helper +before being passed as an argument to the program. + +NB: nodejs_binary and nodejs_test will preserve the legacy behavior of $(rlocation) so users don't +need to update to $$(rlocation). This may be changed in the future. + +2. Subject to predefined variables & custom variable substitutions. + +Predefined "Make" variables such as $(COMPILATION_MODE) and $(TARGET_CPU) are expanded. +See https://docs.bazel.build/versions/master/be/make-variables.html#predefined_variables. + +Custom variables are also expanded including variables set through the Bazel CLI with --define=SOME_VAR=SOME_VALUE. +See https://docs.bazel.build/versions/master/be/make-variables.html#custom_variables. + +Predefined genrule variables are not supported in this context. +
List of stringsoptional + [] +
+ +

nodejs_test

+ +

Identical to nodejs_binary, except this can be used with bazel test as well. +When the binary returns zero exit code, the test passes; otherwise it fails.

+ +

nodejs_test is a convenient way to write a novel kind of test based on running +your own test runner. For example, the ts-api-guardian library has a way to +assert the public API of a TypeScript program, and uses nodejs_test here: +https://github.com/angular/angular/blob/master/tools/ts-api-guardian/index.bzl

+ +

If you just want to run a standard test using a test runner from npm, use the generated +*_test target created by npm_install/yarn_install, such as mocha_test. +Some test runners like Karma and Jasmine have custom rules with added features, e.g. jasmine_node_test.

+ +

Bazel always runs tests with a working directory set to your workspace root. +If your test needs to run in a different directory, you can write a process.chdir helper script +and invoke it before the test with a --require argument, like +templated_args = ["--node_options=--require=./$(rootpath chdir.js)"]. +See rules_nodejs/internal/node/test/chdir for an example.

+ +

To debug a Node.js test, we recommend saving a group of flags together in a “config”. +Put this in your tools/bazel.rc so it’s shared with your team:

+ +
# Enable debugging tests with --config=debug
+test:debug --test_arg=--node_options=--inspect-brk --test_output=streamed --test_strategy=exclusive --test_timeout=9999 --nocache_test_results
+ +

Now you can add --config=debug to any bazel test command line. +The runtime will pause before executing the program, allowing you to connect a +remote debugger.

+ +
+nodejs_test(name, configuration_env_vars, data, default_env_vars, entry_point, expected_exit_code,
+            node_modules, templated_args)
+
+ +

ATTRIBUTES

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionTypeMandatoryDefault
name + A unique name for this target. + Namerequired + +
configuration_env_vars + Pass these configuration environment variables to the resulting binary. + Chooses a subset of the configuration environment variables (taken from ctx.var), which also + includes anything specified via the --define flag. + Note, this can lead to different outputs produced by this rule. + List of stringsoptional + [] +
data + Runtime dependencies which may be loaded during execution. + List of labelsoptional + [] +
default_env_vars + Default environment variables that are added to configuration_env_vars. + +This is separate from the default of configuration_env_vars so that a user can set configuration_env_vars +without losing the defaults that should be set in most cases. + +The set of default environment variables is: + +- VERBOSE_LOGS: use by some rules & tools to turn on debug output in their logs +- NODE_DEBUG: used by node.js itself to print more logs +- RUNFILES_LIB_DEBUG: print diagnostic message from Bazel runfiles.bash helper + List of stringsoptional + ["VERBOSE_LOGS", "NODE_DEBUG", "RUNFILES_LIB_DEBUG"] +
entry_point + The script which should be executed first, usually containing a main function. + +If the entry JavaScript file belongs to the same package (as the BUILD file), +you can simply reference it by its relative name to the package directory: + + +
nodejs_binary(
+    name = "my_binary",
+    ...
+    entry_point = ":file.js",
+)
+ + +You can specify the entry point as a typescript file so long as you also include +the ts_library target in data: + + +
ts_library(
+    name = "main",
+    srcs = ["main.ts"],
+)
+
+nodejs_binary(
+    name = "bin",
+    data = [":main"]
+    entry_point = ":main.ts",
+)
+ + +The rule will use the corresponding .js output of the ts_library rule as the entry point. + +If the entry point target is a rule, it should produce a single JavaScript entry file that will be passed to the nodejs_binary rule. +For example: + + +
filegroup(
+    name = "entry_file",
+    srcs = ["main.js"],
+)
+
+nodejs_binary(
+    name = "my_binary",
+    entry_point = ":entry_file",
+)
+ + +The entry_point can also be a label in another workspace: + + +
nodejs_binary(
+    name = "history-server",
+    entry_point = "@npm//:node_modules/history-server/modules/cli.js",
+    data = ["@npm//history-server"],
+)
+ +
Labelrequired + +
expected_exit_code + The expected exit code for the test. Defaults to 0. + Integeroptional + 0 +
node_modules + The npm packages which should be available to require() during + execution. + +This attribute is DEPRECATED. As of version 0.13.0 the recommended approach +to npm dependencies is to use fine grained npm dependencies which are setup +with the yarn_install or npm_install rules. For example, in targets +that used a //:node_modules filegroup, + + +
nodejs_binary(
+    name = "my_binary",
+    ...
+    node_modules = "//:node_modules",
+)
+ + +which specifies all files within the //:node_modules filegroup +to be inputs to the my_binary. Using fine grained npm dependencies, +my_binary is defined with only the npm dependencies that are +needed: + + +
nodejs_binary(
+    name = "my_binary",
+    ...
+    data = [
+        "@npm//foo",
+        "@npm//bar",
+        ...
+    ],
+)
+ + +In this case, only the foo and bar npm packages and their +transitive deps are includes as inputs to the my_binary target +which reduces the time required to setup the runfiles for this +target (see https://github.com/bazelbuild/bazel/issues/5153). + +The @npm external repository and the fine grained npm package +targets are setup using the yarn_install or npm_install rule +in your WORKSPACE file: + +yarn_install( + name = "npm", + package_json = "//:package.json", + yarn_lock = "//:yarn.lock", +) + +For other rules such as jasmine_node_test, fine grained +npm dependencies are specified in the deps attribute: + + +
jasmine_node_test(
+    name = "my_test",
+    ...
+    deps = [
+        "@npm//jasmine",
+        "@npm//foo",
+        "@npm//bar",
+        ...
+    ],
+)
+ +
Labeloptional + //:node_modules_none +
templated_args + Arguments which are passed to every execution of the program. + To pass a node startup option, prepend it with --node_options=, e.g. + --node_options=--preserve-symlinks. + +Subject to 'Make variable' substitution. See https://docs.bazel.build/versions/master/be/make-variables.html. + +1. Subject to predefined source/output path variables substitutions. + +The predefined variables execpath, execpaths, rootpath, rootpaths, location, and locations take +label parameters (e.g. $(execpath //foo:bar)) and substitute the file paths denoted by that label. + +See https://docs.bazel.build/versions/master/be/make-variables.html#predefined_label_variables for more info. + +NB: This $(location) substition returns the manifest file path which differs from the *_binary & *_test +args and genrule bazel substitions. This will be fixed in a future major release. +See docs string of expand_location_into_runfiles macro in internal/common/expand_into_runfiles.bzl +for more info. + +The recommended approach is to now use $(rootpath) where you previously used $(location). + +To get from a $(rootpath) to the absolute path that $$(rlocation $(location)) returned you can either use +$$(rlocation $(rootpath)) if you are in the templated_args of a nodejs_binary or nodejs_test: + +BUILD.bazel: + +
nodejs_test(
+    name = "my_test",
+    data = [":bootstrap.js"],
+    templated_args = ["--node_options=--require=$$(rlocation $(rootpath :bootstrap.js))"],
+)
+ + +or if you're in the context of a .js script you can pass the $(rootpath) as an argument to the script +and use the javascript runfiles helper to resolve to the absolute path: + +BUILD.bazel: + +
nodejs_test(
+    name = "my_test",
+    data = [":some_file"],
+    entry_point = ":my_test.js",
+    templated_args = ["$(rootpath :some_file)"],
+)
+ + +my_test.js + +
const runfiles = require(process.env['BAZEL_NODE_RUNFILES_HELPER']);
+const args = process.argv.slice(2);
+const some_file = runfiles.resolveWorkspaceRelative(args[0]);
+ + +NB: Bazel will error if it sees the single dollar sign $(rlocation path) in templated_args as it will try to +expand $(rlocation) since we now expand predefined & custom "make" variables such as $(COMPILATION_MODE), +$(BINDIR) & $(TARGET_CPU) using ctx.expand_make_variables. See https://docs.bazel.build/versions/master/be/make-variables.html. + +To prevent expansion of $(rlocation) write it as $$(rlocation). Bazel understands $$ to be +the string literal $ and the expansion results in $(rlocation) being passed as an arg instead +of being expanded. $(rlocation) is then evaluated by the bash node launcher script and it calls +the rlocation function in the runfiles.bash helper. For example, the templated arg +$$(rlocation $(rootpath //:some_file)) is expanded by Bazel to $(rlocation ./some_file) which +is then converted in bash to the absolute path of //:some_file in runfiles by the runfiles.bash helper +before being passed as an argument to the program. + +NB: nodejs_binary and nodejs_test will preserve the legacy behavior of $(rlocation) so users don't +need to update to $$(rlocation). This may be changed in the future. + +2. Subject to predefined variables & custom variable substitutions. + +Predefined "Make" variables such as $(COMPILATION_MODE) and $(TARGET_CPU) are expanded. +See https://docs.bazel.build/versions/master/be/make-variables.html#predefined_variables. + +Custom variables are also expanded including variables set through the Bazel CLI with --define=SOME_VAR=SOME_VALUE. +See https://docs.bazel.build/versions/master/be/make-variables.html#custom_variables. + +Predefined genrule variables are not supported in this context. +
List of stringsoptional + [] +
+ +

npm_install

+ +

Runs npm install during workspace setup.

+ +

This rule will set the environment variable BAZEL_NPM_INSTALL to ‘1’ (unless it +set to another value in the environment attribute). Scripts may use to this to +check if yarn is being run by the npm_install repository rule.

+ +
+npm_install(name, args, data, environment, included_files, manual_build_file_contents, package_json,
+            package_lock_json, quiet, symlink_node_modules, timeout)
+
+ +

ATTRIBUTES

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionTypeMandatoryDefault
name + A unique name for this repository. + Namerequired + +
args + Arguments passed to npm install. + +See npm CLI docs https://docs.npmjs.com/cli/install.html for complete list of supported arguments. + List of stringsoptional + [] +
data + Data files required by this rule. + +If symlink_node_modules is True, this attribute is optional since the package manager +will run in your workspace folder. It is recommended, however, that all files that the +package manager depends on, such as .rc files or files used in postinstall, are added +symlink_node_modules is True so that the repository rule is rerun when any of these files +change. + +If symlink_node_modules is False, the package manager is run in the bazel external +repository so all files that the package manager depends on must be listed. + List of labelsoptional + [] +
environment + Environment variables to set before calling the package manager. + Dictionary: String -> Stringoptional + {} +
included_files + List of file extensions to be included in the npm package targets. + +For example, [".js", ".d.ts", ".proto", ".json", ""]. + +This option is useful to limit the number of files that are inputs +to actions that depend on npm package targets. See +https://github.com/bazelbuild/bazel/issues/5153. + +If set to an empty list then all files are included in the package targets. +If set to a list of extensions, only files with matching extensions are +included in the package targets. An empty string in the list is a special +string that denotes that files with no extensions such as README should +be included in the package targets. + +This attribute applies to both the coarse @wksp//:node_modules target +as well as the fine grained targets such as @wksp//foo. + List of stringsoptional + [] +
manual_build_file_contents + Experimental attribute that can be used to override the generated BUILD.bazel file and set its contents manually. + +Can be used to work-around a bazel performance issue if the +default @wksp//:node_modules target has too many files in it. +See https://github.com/bazelbuild/bazel/issues/5153. If +you are running into performance issues due to a large +node_modules target it is recommended to switch to using +fine grained npm dependencies. + Stringoptional + "" +
package_json + Labelrequired + +
package_lock_json + Labelrequired + +
quiet + If stdout and stderr should be printed to the terminal. + Booleanoptional + True +
timeout + Maximum duration of the package manager execution in seconds. + Integeroptional + 3600 +
+ +

pkg_npm

+ +

The pkg_npm rule creates a directory containing a publishable npm artifact.

+ +

Example:

+ +
load("@build_bazel_rules_nodejs//:index.bzl", "pkg_npm")
+
+pkg_npm(
+    name = "my_package",
+    srcs = ["package.json"],
+    deps = [":my_typescript_lib"],
+    substitutions = {"//internal/": "//"},
+)
+ +

You can use a pair of // BEGIN-INTERNAL ... // END-INTERNAL comments to mark regions of files that should be elided during publishing. +For example:

+ +
function doThing() {
+    // BEGIN-INTERNAL
+    // This is a secret internal-only comment
+    doInternalOnlyThing();
+    // END-INTERNAL
+}
+ +

With the Bazel stamping feature, pkg_npm will replace any placeholder version in your package with the actual version control tag. +See the stamping documentation

+ +

Usage:

+ +

pkg_npm yields three labels. Build the package directory using the default label:

+ +
$ bazel build :my_package
+Target //:my_package up-to-date:
+  bazel-out/fastbuild/bin/my_package
+$ ls -R bazel-out/fastbuild/bin/my_package
+ +

Dry-run of publishing to npm, calling npm pack (it builds the package first if needed):

+ +
$ bazel run :my_package.pack
+INFO: Running command line: bazel-out/fastbuild/bin/my_package.pack
+my-package-name-1.2.3.tgz
+$ tar -tzf my-package-name-1.2.3.tgz
+ +

Actually publish the package with npm publish (also builds first):

+ +
# Check login credentials
+$ bazel run @nodejs//:npm_node_repositories who
+# Publishes the package
+$ bazel run :my_package.publish
+ +

You can pass arguments to npm by escaping them from Bazel using a double-hyphen, for example:

+ +

bazel run my_package.publish -- --tag=next

+ +
+pkg_npm(name, deps, nested_packages, node_context_data, package_name, replace_with_version, srcs,
+        substitutions, vendor_external)
+
+ +

ATTRIBUTES

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionTypeMandatoryDefault
name + A unique name for this target. + Namerequired + +
deps + Other targets which produce files that should be included in the package, such as rollup_bundle + List of labelsoptional + [] +
nested_packages + Other pkg_npm rules whose content is copied into this package. + List of labelsoptional + [] +
node_context_data + Internal use only + The dependencies of this attribute must provide: NodeContextInfo + Labeloptional + @build_bazel_rules_nodejs//internal:node_context_data +
package_name + Optional package_name that this npm package may be imported as. + Stringoptional + "" +
replace_with_version + If set this value is replaced with the version stamp data. + See the section on stamping in the README. + Stringoptional + "0.0.0-PLACEHOLDER" +
srcs + Files inside this directory which are simply copied into the package. + List of labelsoptional + [] +
substitutions + Key-value pairs which are replaced in all the files while building the package. + Dictionary: String -> Stringoptional + {} +
vendor_external + External workspaces whose contents should be vendored into this workspace. + Avoids 'external/foo' path segments in the resulting package. + List of stringsoptional + [] +
+ +

pkg_web

+ +

Assembles a web application from source files.

+ +
+pkg_web(name, additional_root_paths, srcs)
+
+ +

ATTRIBUTES

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionTypeMandatoryDefault
name + A unique name for this target. + Namerequired + +
additional_root_paths + Path prefixes to strip off all srcs, in addition to the current package. Longest wins. + List of stringsoptional + [] +
srcs + Files which should be copied into the package + List of labelsoptional + [] +
+ +

yarn_install

+ +

Runs yarn install during workspace setup.

+ +

This rule will set the environment variable BAZEL_YARN_INSTALL to ‘1’ (unless it +set to another value in the environment attribute). Scripts may use to this to +check if yarn is being run by the yarn_install repository rule.

+ +
+yarn_install(name, args, data, environment, included_files, manual_build_file_contents,
+             package_json, quiet, symlink_node_modules, timeout, use_global_yarn_cache, yarn_lock)
+
+ +

ATTRIBUTES

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionTypeMandatoryDefault
name + A unique name for this repository. + Namerequired + +
args + Arguments passed to yarn install. + +See yarn CLI docs https://yarnpkg.com/en/docs/cli/install for complete list of supported arguments. + List of stringsoptional + [] +
data + Data files required by this rule. + +If symlink_node_modules is True, this attribute is optional since the package manager +will run in your workspace folder. It is recommended, however, that all files that the +package manager depends on, such as .rc files or files used in postinstall, are added +symlink_node_modules is True so that the repository rule is rerun when any of these files +change. + +If symlink_node_modules is False, the package manager is run in the bazel external +repository so all files that the package manager depends on must be listed. + List of labelsoptional + [] +
environment + Environment variables to set before calling the package manager. + Dictionary: String -> Stringoptional + {} +
included_files + List of file extensions to be included in the npm package targets. + +For example, [".js", ".d.ts", ".proto", ".json", ""]. + +This option is useful to limit the number of files that are inputs +to actions that depend on npm package targets. See +https://github.com/bazelbuild/bazel/issues/5153. + +If set to an empty list then all files are included in the package targets. +If set to a list of extensions, only files with matching extensions are +included in the package targets. An empty string in the list is a special +string that denotes that files with no extensions such as README should +be included in the package targets. + +This attribute applies to both the coarse @wksp//:node_modules target +as well as the fine grained targets such as @wksp//foo. + List of stringsoptional + [] +
manual_build_file_contents + Experimental attribute that can be used to override the generated BUILD.bazel file and set its contents manually. + +Can be used to work-around a bazel performance issue if the +default @wksp//:node_modules target has too many files in it. +See https://github.com/bazelbuild/bazel/issues/5153. If +you are running into performance issues due to a large +node_modules target it is recommended to switch to using +fine grained npm dependencies. + Stringoptional + "" +
package_json + Labelrequired + +
quiet + If stdout and stderr should be printed to the terminal. + Booleanoptional + True +
timeout + Maximum duration of the package manager execution in seconds. + Integeroptional + 3600 +
use_global_yarn_cache + Use the global yarn cache on the system. + +The cache lets you avoid downloading packages multiple times. +However, it can introduce non-hermeticity, and the yarn cache can +have bugs. + +Disabling this attribute causes every run of yarn to have a unique +cache_directory. + +If True, this rule will pass --mutex network to yarn to ensure that +the global cache can be shared by parallelized yarn_install rules. + +If False, this rule will pass --cache-folder /path/to/external/repository/__yarn_cache +to yarn so that the local cache is contained within the external repository. + Booleanoptional + True +
yarn_lock + Labelrequired + +
+ +

check_bazel_version

+ +
Verify the users Bazel version is at least the given one.
+
+ +

This can be used in rule implementations that depend on changes in Bazel, +to warn users about a mismatch between the rule and their installed Bazel +version.

+ +

This should not be used in users WORKSPACE files. To locally pin your +Bazel version, just create the .bazelversion file in your workspace.

+ +
+check_bazel_version(minimum_bazel_version, message)
+
+ +

PARAMETERS

+ + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
minimum_bazel_version + a string indicating the minimum version + + +
message + optional string to print to your users, could be used to help them update + + "" +
+ +

copy_to_bin

+ +

Copies a source file to bazel-bin at the same workspace-relative path.

+ +

e.g. /foo/bar/a.txt -> /foo/bar/a.txt</code>

+ +

This is useful to populate the output folder with all files needed at runtime, even +those which aren’t outputs of a Bazel rule.

+ +

This way you can run a binary in the output folder (execroot or runfiles_root) +without that program needing to rely on a runfiles helper library or be aware that +files are divided between the source tree and the output tree.

+ +
+copy_to_bin(name, srcs, kwargs)
+
+ +

PARAMETERS

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
name + Name of the rule. + + +
srcs + A List of Labels. File(s) to to copy. + + +
kwargs + further keyword arguments, e.g. visibility + + +
+ +

generated_file_test

+ +

Tests that a file generated by Bazel has identical content to a file in the workspace.

+ +

This is useful for testing, where a “snapshot” or “golden” file is checked in, +so that you can code review changes to the generated output.

+ +
+generated_file_test(name, generated, src, src_dbg, kwargs)
+
+ +

PARAMETERS

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
name + Name of the rule. + + +
generated + a Label of the output file generated by another rule + + +
src + Label of the source file in the workspace + + +
src_dbg + if the build uses --compilation_mode dbg then some rules will produce different output. + In this case you can specify what the dbg version of the output should look like + + None +
kwargs + extra arguments passed to the underlying nodejs_test or nodejs_binary + + +
+ +

npm_package_bin

+ +

Run an arbitrary npm package binary (e.g. a program under node_modules/.bin/*) under Bazel.

+ +

It must produce outputs. If you just want to run a program with bazel run, use the nodejs_binary rule.

+ +

This is like a genrule() except that it runs our launcher script that first +links the node_modules tree before running the program.

+ +

Bazel always runs actions with a working directory set to your workspace root. +If your tool needs to run in a different directory, you can write a process.chdir helper script +and invoke it before the action with a --require argument, like +args = ["--node_options=--require=./$(execpath chdir.js)"] +See rules_nodejs/internal/node/test/chdir for an example.

+ +

This is a great candidate to wrap with a macro, as documented: +https://docs.bazel.build/versions/master/skylark/macros.html#full-example

+ +
+npm_package_bin(tool, package, package_bin, data, outs, args, output_dir, kwargs)
+
+ +

PARAMETERS

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
tool + a label for a binary to run, like @npm//terser/bin:terser. This is the longer form of package/package_bin. + Note that you can also refer to a binary in your local workspace. + + None +
package + an npm package whose binary to run, like "terser". Assumes your node_modules are installed in a workspace called "npm" + + None +
package_bin + the "bin" entry from package that should be run. By default package_bin is the same string as package + + None +
data + similar to [genrule.srcs](https://docs.bazel.build/versions/master/be/general.html#genrule.srcs) + may also include targets that produce or reference npm packages which are needed by the tool + + [] +
outs + similar to [genrule.outs](https://docs.bazel.build/versions/master/be/general.html#genrule.outs) + + [] +
args + Command-line arguments to the tool. + + Subject to 'Make variable' substitution. See https://docs.bazel.build/versions/master/be/make-variables.html. + + 1. Predefined source/output path substitions is applied first: + + See https://docs.bazel.build/versions/master/be/make-variables.html#predefined_label_variables. + + Use $(execpath) $(execpaths) to expand labels to the execroot (where Bazel runs build actions). + + Use $(rootpath) $(rootpaths) to expand labels to the runfiles path that a built binary can use + to find its dependencies. + + Since npm_package_bin is used primarily for build actions, in most cases you'll want to + use $(execpath) or $(execpaths) to expand locations. + + Using $(location) and $(locations) expansions is not recommended as these are a synonyms + for either $(execpath) or $(rootpath) depending on the context. + + 2. "Make" variables are expanded second: + + Predefined "Make" variables such as $(COMPILATION_MODE) and $(TARGET_CPU) are expanded. + See https://docs.bazel.build/versions/master/be/make-variables.html#predefined_variables. + + Like genrule, you may also use some syntax sugar for locations. + + - $@: if you have only one output file, the location of the output + - $(@D): The output directory. If output_dir=False and there is only one file name in outs, this expands to the directory + containing that file. If there are multiple files, this instead expands to the package's root directory in the genfiles + tree, even if all generated files belong to the same subdirectory! If output_dir=True then this corresponds + to the output directory which is the $(RULEDIR)/{target_name}. + - $(RULEDIR): the root output directory of the rule, corresponding with its package + (can be used with output_dir=True or False) + + See https://docs.bazel.build/versions/master/be/make-variables.html#predefined_genrule_variables. + + Custom variables are also expanded including variables set through the Bazel CLI with --define=SOME_VAR=SOME_VALUE. + See https://docs.bazel.build/versions/master/be/make-variables.html#custom_variables. + + [] +
output_dir + set to True if you want the output to be a directory + Exactly one of outs, output_dir may be used. + If you output a directory, there can only be one output, which will be a directory named the same as the target. + + False +
kwargs + + +
+ +

params_file

+ +

Generates a UTF-8 encoded params file from a list of arguments.

+ +

Handles variable substitutions for args.

+ +
+params_file(name, out, args, data, newline, kwargs)
+
+ +

PARAMETERS

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
name + Name of the rule. + + +
out + Path of the output file, relative to this package. + + +
args + Arguments to concatenate into a params file. + + Subject to 'Make variable' substitution. See https://docs.bazel.build/versions/master/be/make-variables.html. + + 1. Subject to predefined source/output path variables substitutions. + + The predefined variables execpath, execpaths, rootpath, rootpaths, location, and locations take + label parameters (e.g. $(execpath //foo:bar)) and substitute the file paths denoted by that label. + + See https://docs.bazel.build/versions/master/be/make-variables.html#predefined_label_variables for more info. + + NB: This $(location) substition returns the manifest file path which differs from the *_binary & *_test + args and genrule bazel substitions. This will be fixed in a future major release. + See docs string of expand_location_into_runfiles macro in internal/common/expand_into_runfiles.bzl + for more info. + + 2. Subject to predefined variables & custom variable substitutions. + + Predefined "Make" variables such as $(COMPILATION_MODE) and $(TARGET_CPU) are expanded. + See https://docs.bazel.build/versions/master/be/make-variables.html#predefined_variables. + + Custom variables are also expanded including variables set through the Bazel CLI with --define=SOME_VAR=SOME_VALUE. + See https://docs.bazel.build/versions/master/be/make-variables.html#custom_variables. + + Predefined genrule variables are not supported in this context. + + [] +
data + Data for $(location) expansions in args. + + [] +
newline + Line endings to use. One of ["auto", "unix", "windows"]. + + "auto" for platform-determined + "unix" for LF + "windows" for CRLF + + "auto" +
kwargs + + +
+ +

DeclarationInfo

+ +
+DeclarationInfo(declarations, transitive_declarations, type_blacklisted_declarations)
+
+ +

The DeclarationInfo provider allows JS rules to communicate typing information. +TypeScript’s .d.ts files are used as the interop format for describing types. +package.json files are included as well, as TypeScript needs to read the “typings” property.

+ +

Do not create DeclarationInfo instances directly, instead use the declaration_info factory function.

+ +

Note: historically this was a subset of the string-typed “typescript” provider.

+ +

FIELDS

+ + + + + + + + + + + + + + + + + + + + + + +
NameDescription
declarations + A depset of typings files produced by this rule
transitive_declarations + A depset of typings files produced by this rule and all its transitive dependencies. +This prevents needing an aspect in rules that consume the typings, which improves performance.
type_blacklisted_declarations + A depset of .d.ts files that we should not use to infer JSCompiler types (via tsickle)
+ +

JSEcmaScriptModuleInfo

+ +
+JSEcmaScriptModuleInfo(direct_sources, sources)
+
+ +

JavaScript files (and sourcemaps) that are intended to be consumed by downstream tooling.

+ +

They should use modern syntax and ESModules. +These files should typically be named “foo.mjs”

+ +

Historical note: this was the typescript.es6_sources output

+ +

FIELDS

+ + + + + + + + + + + + + + + + + + +
NameDescription
direct_sources + Depset of direct JavaScript files and sourcemaps
sources + Depset of direct and transitive JavaScript files and sourcemaps
+ +

JSModuleInfo

+ +
+JSModuleInfo(direct_sources, sources)
+
+ +

JavaScript files and sourcemaps.

+ +

FIELDS

+ + + + + + + + + + + + + + + + + + +
NameDescription
direct_sources + Depset of direct JavaScript files and sourcemaps
sources + Depset of direct and transitive JavaScript files and sourcemaps
+ +

JSNamedModuleInfo

+ +
+JSNamedModuleInfo(direct_sources, sources)
+
+ +

JavaScript files whose module name is self-contained.

+ +

For example named AMD/UMD or goog.module format. +These files can be efficiently served with the concatjs bundler. +These outputs should be named “foo.umd.js” +(note that renaming it from “foo.js” doesn’t affect the module id)

+ +

Historical note: this was the typescript.es5_sources output.

+ +

FIELDS

+ + + + + + + + + + + + + + + + + + +
NameDescription
direct_sources + Depset of direct JavaScript files and sourcemaps
sources + Depset of direct and transitive JavaScript files and sourcemaps
+ +

LinkablePackageInfo

+ +
+LinkablePackageInfo(files, package_name, path, _tslibrary)
+
+ +

The LinkablePackageInfo provider provides information to the linker for linking pkg_npm built packages

+ +

FIELDS

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
files + Depset of files in this package (must all be contained within path)
package_name + The package name. + +Should be the same as name field in the package's package.json. + +In the future, the linker may validate that the names match the name in a package.json file.
path + The path to link to. + +Path must be relative to execroot/wksp. It can either an output dir path such as, + +bazel-out/<platform>-<build>/bin/path/to/package or +bazel-out/<platform>-<build>/bin/external/&llt;external_wksp>/path/to/package + +or a source file path such as, + +path/to/package or +external/<external_wksp>/path/to/package
_tslibrary + For internal use only
+ +

NodeContextInfo

+ +
+NodeContextInfo(stamp)
+
+ +

Provides data about the build context, like config_setting’s

+ +

FIELDS

+ + + + + + + + + + + + + + +
NameDescription
stamp + If stamping is enabled
+ +

NodeRuntimeDepsInfo

+ +
+NodeRuntimeDepsInfo(deps, pkgs)
+
+ +

Stores runtime dependencies of a nodejs_binary or nodejs_test

+ +

These are files that need to be found by the node module resolver at runtime.

+ +

Historically these files were passed using the Runfiles mechanism. +However runfiles has a big performance penalty of creating a symlink forest +with FS API calls for every file in node_modules. +It also causes there to be separate node_modules trees under each binary. This +prevents user-contributed modules passed as deps[] to a particular action from +being found by node module resolver, which expects everything in one tree.

+ +

In node, this resolution is done dynamically by assuming a node_modules +tree will exist on disk, so we assume node actions/binary/test executions will +do the same.

+ +

FIELDS

+ + + + + + + + + + + + + + + + + + +
NameDescription
deps + depset of runtime dependency labels
pkgs + list of labels of packages that provide NpmPackageInfo
+ +

NpmPackageInfo

+ +
+NpmPackageInfo(direct_sources, sources, workspace)
+
+ +

Provides information about npm dependencies

+ +

FIELDS

+ + + + + + + + + + + + + + + + + + + + + + +
NameDescription
direct_sources + Depset of direct source files in this npm package
sources + Depset of direct & transitive source files in this npm package and in its dependencies
workspace + The workspace name that this npm package is provided from
+ +

declaration_info

+ +

Constructs a DeclarationInfo including all transitive files needed to type-check from DeclarationInfo providers in a list of deps.

+ +
+declaration_info(declarations, deps)
+
+ +

PARAMETERS

+ + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
declarations + list of typings files + + +
deps + list of labels of dependencies where we should collect their DeclarationInfo to pass transitively + + [] +
+ +

js_ecma_script_module_info

+ +

Constructs a JSEcmaScriptModuleInfo including all transitive sources from JSEcmaScriptModuleInfo providers in a list of deps.

+ +

Returns a single JSEcmaScriptModuleInfo.

+ +
+js_ecma_script_module_info(sources, deps)
+
+ +

PARAMETERS

+ + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
sources + + +
deps + + [] +
+ +

js_module_info

+ +

Constructs a JSModuleInfo including all transitive sources from JSModuleInfo providers in a list of deps.

+ +

Returns a single JSModuleInfo.

+ +
+js_module_info(sources, deps)
+
+ +

PARAMETERS

+ + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
sources + + +
deps + + [] +
+ +

js_named_module_info

+ +

Constructs a JSNamedModuleInfo including all transitive sources from JSNamedModuleInfo providers in a list of deps.

+ +

Returns a single JSNamedModuleInfo.

+ +
+js_named_module_info(sources, deps)
+
+ +

PARAMETERS

+ + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
sources + + +
deps + + [] +
+ +

run_node

+ +

Helper to replace ctx.actions.run

+ +

This calls node programs with a node_modules directory in place

+ +
+run_node(ctx, inputs, arguments, executable, kwargs)
+
+ +

PARAMETERS

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
ctx + rule context from the calling rule implementation function + + +
inputs + list or depset of inputs to the action + + +
arguments + list or ctx.actions.Args object containing arguments to pass to the executable + + +
executable + stringy representation of the executable this action will run, eg eg. "my_executable" rather than ctx.executable.my_executable + + +
kwargs + all other args accepted by ctx.actions.run + + +
+ +

node_modules_aspect

+ +
+node_modules_aspect(name)
+
+ +

ASPECT ATTRIBUTES

+ + + + + + + + + + + + + + +
NameType
depsString
+ +

ATTRIBUTES

+ + + + + + + + + + + + + + + + + + + + +
NameDescriptionTypeMandatoryDefault
name + A unique name for this target. Namerequired
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/Built-ins.md b/docs/Built-ins.md index eb4527ff9c..4015ad55b1 100755 --- a/docs/Built-ins.md +++ b/docs/Built-ins.md @@ -1,88 +1,53 @@ --- title: Built-ins layout: default -stylesheet: docs +toc: true +nav: rule --- # Built-in rules -These rules are available without any npm installation, via the `WORKSPACE` install of the `build_bazel_rules_nodejs` workspace. This is necessary to bootstrap Bazel to run the package manager to download other rules from NPM. +These rules are available without any npm installation, via the WORKSPACE install of the build_bazel_rules_nodejs workspace. This is necessary to bootstrap Bazel to run the package manager to download other rules from NPM. -[name]: https://bazel.build/docs/build-ref.html#name -[label]: https://bazel.build/docs/build-ref.html#labels -[labels]: https://bazel.build/docs/build-ref.html#labels ## node_repositories To be run in user's WORKSPACE to install rules_nodejs dependencies. -This rule sets up node, npm, and yarn. +This rule sets up node, npm, and yarn. The versions of these tools can be specified in one of three ways + + +### Simplest Usage -The versions of these tools can be specified in one of three ways: -- Simplest Usage: Specify no explicit versions. This will download and use the latest NodeJS & Yarn that were available when the version of rules_nodejs you're using was released. -Note that you can skip calling `node_repositories` in your WORKSPACE file - if you later try to `yarn_install` or `npm_install`, +Note that you can skip calling node_repositories in your WORKSPACE file - if you later try to yarn_install or npm_install, we'll automatically select this simple usage for you. -- Forced version(s): -You can select the version of NodeJS and/or Yarn to download & use by specifying it when you call node_repositories, -using a value that matches a known version (see the default values) -- Using a custom version: -You can pass in a custom list of NodeJS and/or Yarn repositories and URLs for node_resositories to use. -- Using a local version: -To avoid downloads, you can check in vendored copies of NodeJS and/or Yarn and set vendored_node and or vendored_yarn -to point to those before calling node_repositories. You can also point to a location where node is installed on your computer, -but we don't recommend this because it leads to version skew between you, your coworkers, and your Continuous Integration environment. -It also ties your build to a single platform, preventing you from cross-compiling into a Linux docker image on Mac for example. - -See the [the repositories documentation](repositories.html) for how to use the resulting repositories. -## Creating dependency installation scripts for manually-managed dependencies - -You can optionally pass a `package_json` array to node_repositories. This lets you use Bazel's version of yarn or npm, yet always run the package manager yourself. -This is an advanced scenario you can use in place of the `npm_install` or `yarn_install` rules, but we don't recommend it, and might remove it in the future. - -Example: +### Forced version(s) -``` -load("@build_bazel_rules_nodejs//:index.bzl", "node_repositories") -node_repositories(package_json = ["//:package.json", "//subpkg:package.json"]) -``` - -Running `bazel run @nodejs//:yarn_node_repositories` in this repo would create `/node_modules` and `/subpkg/node_modules`. - -Note that the dependency installation scripts will run in each subpackage indicated by the `package_json` attribute. - - - -### Usage +You can select the version of NodeJS and/or Yarn to download & use by specifying it when you call node_repositories, +using a value that matches a known version (see the default values) -``` -node_repositories(name, node_repositories, node_urls, node_version, package_json, preserve_symlinks, vendored_node, vendored_yarn, yarn_repositories, yarn_urls, yarn_version) -``` +### Using a custom version +You can pass in a custom list of NodeJS and/or Yarn repositories and URLs for node_resositories to use. -#### `name` -(*[name], mandatory*): A unique name for this repository. -#### `node_repositories` -(*Dictionary: String -> List of strings*): Custom list of node repositories to use +#### Custom NodeJS versions -A dictionary mapping NodeJS versions to sets of hosts and their corresponding (filename, strip_prefix, sha256) tuples. -You should list a node binary for every platform users have, likely Mac, Windows, and Linux. - -For example, +To specify custom NodeJS versions, use the node_repositories attribute -```python +{% highlight python %} node_repositories( node_repositories = { "10.10.0-darwin_amd64": ("node-v10.10.0-darwin-x64.tar.gz", "node-v10.10.0-darwin-x64", "00b7a8426e076e9bf9d12ba2d571312e833fe962c70afafd10ad3682fdeeaa5e"), @@ -90,97 +55,37 @@ node_repositories( "10.10.0-windows_amd64": ("node-v10.10.0-win-x64.zip", "node-v10.10.0-win-x64", "70c46e6451798be9d052b700ce5dadccb75cf917f6bf0d6ed54344c856830cfb"), }, ) -``` - -Defaults to `{"8.0.0-darwin_amd64": ("node-v8.0.0-darwin-x64.tar.gz", "node-v8.0.0-darwin-x64", "6e4a66917e2c11d5adc537c899941c973ae586293352b8172a4f32be0b7f0300"), "8.0.0-linux_arm64": ("node-v8.0.0-linux-arm64.tar.xz", "node-v8.0.0-linux-arm64", "8d6eaefcc252055de54a666d4e00eec78caf2143cd7a13b63f109e9eb78a795e"), "8.0.0-linux_amd64": ("node-v8.0.0-linux-x64.tar.xz", "node-v8.0.0-linux-x64", "0a536bb83eeccca23626e5e5ead52563a641e4331c35e367662892921dc7e8a4"), "8.0.0-windows_amd64": ("node-v8.0.0-win-x64.zip", "node-v8.0.0-win-x64", "84410377118857674e0fb6e7bc7627ffb8cc67a72f162a050276b076e328a9bb"), "8.1.0-darwin_amd64": ("node-v8.1.0-darwin-x64.tar.gz", "node-v8.1.0-darwin-x64", "08af5f1a7441728cabf9b11af25da28ee1725903524968dd9621b885b13303c7"), "8.1.0-linux_arm64": ("node-v8.1.0-linux-arm64.tar.xz", "node-v8.1.0-linux-arm64", "adf2f517c9847cbb5904b282c0819526b5264c256477ed5e4b258584daa1a2ea"), "8.1.0-linux_amd64": ("node-v8.1.0-linux-x64.tar.xz", "node-v8.1.0-linux-x64", "1638a0083c6eee122cbbefdf39cb8bcc43cf19fedff331a0317b05fd38dcb6df"), "8.1.0-windows_amd64": ("node-v8.1.0-win-x64.zip", "node-v8.1.0-win-x64", "cee1fd1c828e8996824a2d9f9056dfae771b77c05b15ad015bc7f8800409215c"), "8.1.1-darwin_amd64": ("node-v8.1.1-darwin-x64.tar.gz", "node-v8.1.1-darwin-x64", "2f67890a5a46564672cfd4522cc00c7ac04d307e6a942ae1ad38b6aee94c29e2"), "8.1.1-linux_arm64": ("node-v8.1.1-linux-arm64.tar.xz", "node-v8.1.1-linux-arm64", "3971543f9d29f77ddb8f47a54e4b99422a822173599748ab7fcd9c35c8e25124"), "8.1.1-linux_amd64": ("node-v8.1.1-linux-x64.tar.xz", "node-v8.1.1-linux-x64", "6a735e77bdd21c92fe85ea5f9f567d0d6930fa33e0e111946b17cdb7efefb8d5"), "8.1.1-windows_amd64": ("node-v8.1.1-win-x64.zip", "node-v8.1.1-win-x64", "459f3b62e58f4fac3b9b5e49694855f338f3dcf2fcf955299ee2a47f7687625a"), "8.1.2-darwin_amd64": ("node-v8.1.2-darwin-x64.tar.gz", "node-v8.1.2-darwin-x64", "70f353449b19d6d36262f5e38f9cc23e80b2034c21ae48623a6a4890f513eb53"), "8.1.2-linux_arm64": ("node-v8.1.2-linux-arm64.tar.xz", "node-v8.1.2-linux-arm64", "d468ac671047a5a5edb6edd34a9a625645505551c35ef73e2102c504535a09d4"), "8.1.2-linux_amd64": ("node-v8.1.2-linux-x64.tar.xz", "node-v8.1.2-linux-x64", "f5dc173d3005fbcfd107c83a15d4dbff9a28ff53ab42c23344a572d84814ecfe"), "8.1.2-windows_amd64": ("node-v8.1.2-win-x64.zip", "node-v8.1.2-win-x64", "5463c812afeb498ad8ab9c396246e455d9353ab48ae409c82a2a45193e161f66"), "8.1.3-darwin_amd64": ("node-v8.1.3-darwin-x64.tar.gz", "node-v8.1.3-darwin-x64", "ae588038480a6acc57b6b04802fa876e0b602231e9846944dd1b4437e8c1205f"), "8.1.3-linux_arm64": ("node-v8.1.3-linux-arm64.tar.xz", "node-v8.1.3-linux-arm64", "cebc2edd89f20613a530509a2435ecc42757ce16032559ef174ebe84875a1536"), "8.1.3-linux_amd64": ("node-v8.1.3-linux-x64.tar.xz", "node-v8.1.3-linux-x64", "d41dc375ea7e33fadf0fb1bf89d9dfd222a2fb85633fba3d2cf48ac03522ba71"), "8.1.3-windows_amd64": ("node-v8.1.3-win-x64.zip", "node-v8.1.3-win-x64", "be582920c723124ebad48c968f539ef66b1f628d8b6f2338dc68a32f95104856"), "8.1.4-darwin_amd64": ("node-v8.1.4-darwin-x64.tar.gz", "node-v8.1.4-darwin-x64", "a24858a10dd4ca8ad55fd61a7472b4fe9140eb3fa347c41717360c3f29438748"), "8.1.4-linux_arm64": ("node-v8.1.4-linux-arm64.tar.xz", "node-v8.1.4-linux-arm64", "3553c617f594286fea7052678d04aec9e167adddf702b70431d88ce42573c339"), "8.1.4-linux_amd64": ("node-v8.1.4-linux-x64.tar.xz", "node-v8.1.4-linux-x64", "d82fe7ef7e0f8ca1c343f00e3e490996553507ec7d42034f5df034cc7908caaf"), "8.1.4-windows_amd64": ("node-v8.1.4-win-x64.zip", "node-v8.1.4-win-x64", "cc3689ffefc738f6256aab1713343c3c64c24ec997600c0a48243fb26f5e0bce"), "8.2.0-darwin_amd64": ("node-v8.2.0-darwin-x64.tar.gz", "node-v8.2.0-darwin-x64", "da5cca37ae0afdbff3a269bb3dc71ff0d86e282920286f71ae5eb6757cfa5356"), "8.2.0-linux_arm64": ("node-v8.2.0-linux-arm64.tar.xz", "node-v8.2.0-linux-arm64", "3298ae4ae67c4ad714bed23383fd08db5711b164a077a25fb6b282533e65cf77"), "8.2.0-linux_amd64": ("node-v8.2.0-linux-x64.tar.xz", "node-v8.2.0-linux-x64", "e8ceaac3ee4385d53bcebc552a7a6b545b09b9652f5ca1b254aae698fd9a25f9"), "8.2.0-windows_amd64": ("node-v8.2.0-win-x64.zip", "node-v8.2.0-win-x64", "6bc3cc580f0e8190e6a03d6a5967c861c29d6a6eb50f995b3afb7d60b8cee4e1"), "8.2.1-darwin_amd64": ("node-v8.2.1-darwin-x64.tar.gz", "node-v8.2.1-darwin-x64", "32d0923c147470d57f18f055014f5a9fe8a3919406010a2e80ba85952d3c9923"), "8.2.1-linux_arm64": ("node-v8.2.1-linux-arm64.tar.xz", "node-v8.2.1-linux-arm64", "9ed01737f37d410067beeb42066e51f6d0385677c7d0daeeaf2e32cb2aca854a"), "8.2.1-linux_amd64": ("node-v8.2.1-linux-x64.tar.xz", "node-v8.2.1-linux-x64", "abcddeb95cc4465953b1edb0922d20e9b0b3de83688fc8150b863117032a978a"), "8.2.1-windows_amd64": ("node-v8.2.1-win-x64.zip", "node-v8.2.1-win-x64", "37e84e54c67e3d1e52d657c04835b211c94631a0b358f4e7dc351618fdb6c083"), "8.3.0-darwin_amd64": ("node-v8.3.0-darwin-x64.tar.gz", "node-v8.3.0-darwin-x64", "a627354982a514e77e5c37ed5952edc81a7dd9c4f661fd919f192c21ae548654"), "8.3.0-linux_arm64": ("node-v8.3.0-linux-arm64.tar.xz", "node-v8.3.0-linux-arm64", "9e0dab4913585a1b8117bda03c4b5581d9140aec67bb4be0e0b6a4999b41b4ab"), "8.3.0-linux_amd64": ("node-v8.3.0-linux-x64.tar.xz", "node-v8.3.0-linux-x64", "ae377995c6e1af8e2a60c4a929f77562ebed9a2c6897cbd311a2c331f76b4e0f"), "8.3.0-windows_amd64": ("node-v8.3.0-win-x64.zip", "node-v8.3.0-win-x64", "e762fa218465e5aa0952336eee2c3e42e5b48390b36838ca7b6a243812e0b7e5"), "8.4.0-darwin_amd64": ("node-v8.4.0-darwin-x64.tar.gz", "node-v8.4.0-darwin-x64", "cc10ffbd11586bd27a7cc5e6e2d03fd3e0b341368387a03ee9a0117a0288599d"), "8.4.0-linux_arm64": ("node-v8.4.0-linux-arm64.tar.xz", "node-v8.4.0-linux-arm64", "0a811bbe4905fc879f3cbfc976e5a37cca05bbd609774abe4332b29fea75f073"), "8.4.0-linux_amd64": ("node-v8.4.0-linux-x64.tar.xz", "node-v8.4.0-linux-x64", "7fd86abad06f96cb2f889c2a0e25686a3de3e9a078ad946ded91ee4f28d8218a"), "8.4.0-windows_amd64": ("node-v8.4.0-win-x64.zip", "node-v8.4.0-win-x64", "0f60c99479f74d75c7239795c90698826ba8252019d4c23e82ed0d72ceb8974f"), "8.5.0-darwin_amd64": ("node-v8.5.0-darwin-x64.tar.gz", "node-v8.5.0-darwin-x64", "0c8d4c4d90f858a19a29fe1ae7f42b2b7f1a4d3caaa25bea2e08479c00ebbd5f"), "8.5.0-linux_arm64": ("node-v8.5.0-linux-arm64.tar.xz", "node-v8.5.0-linux-arm64", "e0decdebe73dba516d6c72401e337cee6277c6e00f817b0bf1c592360adfd4e6"), "8.5.0-linux_amd64": ("node-v8.5.0-linux-x64.tar.xz", "node-v8.5.0-linux-x64", "a9651fcc6259b4a944ebb72e6dd116602c7b26ddf939599b060d1d3e6ead8c36"), "8.5.0-windows_amd64": ("node-v8.5.0-win-x64.zip", "node-v8.5.0-win-x64", "c385d162c15a7a85d42755ee8c78c1c73bd251e2f7cbf82e5e20c824564aa9df"), "8.6.0-darwin_amd64": ("node-v8.6.0-darwin-x64.tar.gz", "node-v8.6.0-darwin-x64", "2c95f3194a92e8b37aab8895fbaeb1f5fabef3494600ef78a7b7e078dba9a7c9"), "8.6.0-linux_arm64": ("node-v8.6.0-linux-arm64.tar.xz", "node-v8.6.0-linux-arm64", "6848567ab32d04694120e18c20ef47d0f4163229634f236e4bdbb8d135f3204e"), "8.6.0-linux_amd64": ("node-v8.6.0-linux-x64.tar.xz", "node-v8.6.0-linux-x64", "e6f52c3ed7e2cc34ebddbc563434fdf043feb449a60f028101eb45227aec3444"), "8.6.0-windows_amd64": ("node-v8.6.0-win-x64.zip", "node-v8.6.0-win-x64", "08e9b29c47567517ca95ca01d5cdb255279be5463952f92da5c372a99d620b23"), "8.7.0-darwin_amd64": ("node-v8.7.0-darwin-x64.tar.gz", "node-v8.7.0-darwin-x64", "5e59798c1deafd671a35ef4dcdb9b97ce98f9255a056832dc98d454613e9ea08"), "8.7.0-linux_arm64": ("node-v8.7.0-linux-arm64.tar.xz", "node-v8.7.0-linux-arm64", "5a1a1907fbb6d90667ce70ad42602534f6cc6eda873d1c50a3259349aee73418"), "8.7.0-linux_amd64": ("node-v8.7.0-linux-x64.tar.xz", "node-v8.7.0-linux-x64", "9d6f649576cac74ef0b6634af8265156370cf8fdf3676f03e867347d3207675d"), "8.7.0-windows_amd64": ("node-v8.7.0-win-x64.zip", "node-v8.7.0-win-x64", "e95be435674e82ea7133c3268cb70044eabde2d0aef28b2a3df5c7d8d23cadcc"), "8.8.0-darwin_amd64": ("node-v8.8.0-darwin-x64.tar.gz", "node-v8.8.0-darwin-x64", "69a37e240fac48289a2a5bb75ab96091f8d6457eeaf23c0a5125250abe418176"), "8.8.0-linux_arm64": ("node-v8.8.0-linux-arm64.tar.xz", "node-v8.8.0-linux-arm64", "454617ff94882d9a81dca0840065fb5a928ff68e8e8efe7c1748d996ab757b2e"), "8.8.0-linux_amd64": ("node-v8.8.0-linux-x64.tar.xz", "node-v8.8.0-linux-x64", "4304c297f41085ac1f7a6a8e68496d9fd5aa3b92590e7c3c6015a23939767e72"), "8.8.0-windows_amd64": ("node-v8.8.0-win-x64.zip", "node-v8.8.0-win-x64", "a7a1fd2c5f5c967d7df70fdec1a8b2d2d2b1b411fcdd4f23bcf8c9c837a7c3cb"), "8.8.1-darwin_amd64": ("node-v8.8.1-darwin-x64.tar.gz", "node-v8.8.1-darwin-x64", "bf208e29418fb3efc836d3d32b62b9162f0f0b36a0665abc0990f4e292cfc84b"), "8.8.1-linux_arm64": ("node-v8.8.1-linux-arm64.tar.xz", "node-v8.8.1-linux-arm64", "ea8ad0286a31e7519e979fcf99e503845a95da640cd140be5cff418a68fa6263"), "8.8.1-linux_amd64": ("node-v8.8.1-linux-x64.tar.xz", "node-v8.8.1-linux-x64", "004bc95267ef5d5b928f560582f681a679bada2201bf221735a02f4956f67b09"), "8.8.1-windows_amd64": ("node-v8.8.1-win-x64.zip", "node-v8.8.1-win-x64", "a7e60a1a5f46ef309cbe74e423c17e69dd0a573f0c92c9e325caade3388d192a"), "8.9.0-darwin_amd64": ("node-v8.9.0-darwin-x64.tar.gz", "node-v8.9.0-darwin-x64", "aaf165348bc6d20012b048a88a8f3a35cba6799496e8f4c1246d85c524a84dbc"), "8.9.0-linux_arm64": ("node-v8.9.0-linux-arm64.tar.xz", "node-v8.9.0-linux-arm64", "30cb00ac1cf6b466b1f27e7ce41363a67a66dbb64227c2dc5e33d221b09fc579"), "8.9.0-linux_amd64": ("node-v8.9.0-linux-x64.tar.xz", "node-v8.9.0-linux-x64", "e92b91fa473f9ad805a1241907b6f1bd3f8ceac8426a8b4cb05428e62e243bdd"), "8.9.0-windows_amd64": ("node-v8.9.0-win-x64.zip", "node-v8.9.0-win-x64", "dd971e43ff003213b0be31c1a8ce3421f72e0db2a703bc254ac685be4f7f609e"), "8.9.1-darwin_amd64": ("node-v8.9.1-darwin-x64.tar.gz", "node-v8.9.1-darwin-x64", "05c992a6621d28d564b92bf3051a5dc0adf83839237c0d4653a8cdb8a1c73b94"), "8.9.1-linux_arm64": ("node-v8.9.1-linux-arm64.tar.xz", "node-v8.9.1-linux-arm64", "f774660980dcf931bf29847a5f26317823a063fa4a56f85f37c3222d77cce7c1"), "8.9.1-linux_amd64": ("node-v8.9.1-linux-x64.tar.xz", "node-v8.9.1-linux-x64", "8be82805f7c1ab3e64d4569fb9a90ded2de78dd27cadbb91bad1bf975dae1e2d"), "8.9.1-windows_amd64": ("node-v8.9.1-win-x64.zip", "node-v8.9.1-win-x64", "db89c6e041da359561fbe7da075bb4f9881a0f7d3e98c203e83732cfb283fa4a"), "8.9.2-darwin_amd64": ("node-v8.9.2-darwin-x64.tar.gz", "node-v8.9.2-darwin-x64", "ba03ae4c0ebd33e8661b5b241211ddb9f7e3b5b959d8cbd68f5941cb1ed5784d"), "8.9.2-linux_arm64": ("node-v8.9.2-linux-arm64.tar.xz", "node-v8.9.2-linux-arm64", "cc222b4f910ff27ff66ccc96d5c7e2117942bcd161ec253d83cf430146b79bdf"), "8.9.2-linux_amd64": ("node-v8.9.2-linux-x64.tar.xz", "node-v8.9.2-linux-x64", "d4065724e7f5f11e999f78de50fb0faac74341799cb0c0dafcbe87e0ecb0be86"), "8.9.2-windows_amd64": ("node-v8.9.2-win-x64.zip", "node-v8.9.2-win-x64", "2afa8b899c0dddea50dcf5dda66ae7b0ca32326dbf66c52f947c082e7c95d090"), "8.9.3-darwin_amd64": ("node-v8.9.3-darwin-x64.tar.gz", "node-v8.9.3-darwin-x64", "fa7962f25db420a374e9e60d8a410188bd690a2f0ce8d403aa9b09d9b7ae8c1f"), "8.9.3-linux_arm64": ("node-v8.9.3-linux-arm64.tar.xz", "node-v8.9.3-linux-arm64", "8860678ad0c24059380af254574e5a12371a2d5c92ca5e1ac7267314af7df04f"), "8.9.3-linux_amd64": ("node-v8.9.3-linux-x64.tar.xz", "node-v8.9.3-linux-x64", "86f3aa593315f0503d069e3f4805019583ab8d86c0244a83c795d1942e3f99b7"), "8.9.3-windows_amd64": ("node-v8.9.3-win-x64.zip", "node-v8.9.3-win-x64", "17dee0c06d088269123a27db3905a39a17a51cc0ea65435ae942c718f0f94403"), "8.9.4-darwin_amd64": ("node-v8.9.4-darwin-x64.tar.gz", "node-v8.9.4-darwin-x64", "ca50f7d2035eb805306e303b644bb1cde170ce2615e0a2c6e95fb80881c48c24"), "8.9.4-linux_arm64": ("node-v8.9.4-linux-arm64.tar.xz", "node-v8.9.4-linux-arm64", "7c0369a5dbc98d0989c208ca3ee1b6db4cba576343014fdbf7d36fd2659f7089"), "8.9.4-linux_amd64": ("node-v8.9.4-linux-x64.tar.xz", "node-v8.9.4-linux-x64", "68b94aac38cd5d87ab79c5b38306e34a20575f31a3ea788d117c20fffcca3370"), "8.9.4-windows_amd64": ("node-v8.9.4-win-x64.zip", "node-v8.9.4-win-x64", "48946e99ac4484e071df25741d2300f3a656f476c5ff3f8116a4746c07ebe3b7"), "8.10.0-darwin_amd64": ("node-v8.10.0-darwin-x64.tar.gz", "node-v8.10.0-darwin-x64", "7d77bd35bc781f02ba7383779da30bd529f21849b86f14d87e097497671b0271"), "8.10.0-linux_arm64": ("node-v8.10.0-linux-arm64.tar.xz", "node-v8.10.0-linux-arm64", "cbec410109664f75d3c988a43483576fc56f745e05e3884891df9c509fbb1b12"), "8.10.0-linux_amd64": ("node-v8.10.0-linux-x64.tar.xz", "node-v8.10.0-linux-x64", "92220638d661a43bd0fee2bf478cb283ead6524f231aabccf14c549ebc2bc338"), "8.10.0-windows_amd64": ("node-v8.10.0-win-x64.zip", "node-v8.10.0-win-x64", "936ada36cb6f09a5565571e15eb8006e45c5a513529c19e21d070acf0e50321b"), "8.11.0-darwin_amd64": ("node-v8.11.0-darwin-x64.tar.gz", "node-v8.11.0-darwin-x64", "408323335b8c691d75397c76ddd7b00490852652c78c813c586ba7eccc5c382b"), "8.11.0-linux_arm64": ("node-v8.11.0-linux-arm64.tar.xz", "node-v8.11.0-linux-arm64", "a28f599a14ca9ef4062fa1e605b69cd046f81d3fc9a7d6dde1856fb593004b3a"), "8.11.0-linux_amd64": ("node-v8.11.0-linux-x64.tar.xz", "node-v8.11.0-linux-x64", "180ef8c2a39c1696b9a05832883ed981ba11475ffa44ca77781a8d1c1954f944"), "8.11.0-windows_amd64": ("node-v8.11.0-win-x64.zip", "node-v8.11.0-win-x64", "55b9c8d48b59569117a63fdb26e1de05e792c37f563feb7d44b4cd59be96aff8"), "8.11.1-darwin_amd64": ("node-v8.11.1-darwin-x64.tar.gz", "node-v8.11.1-darwin-x64", "5c7b05899ff56910a2b8180f139d48612f349ac2c5d20f08dbbeffbed9e3a089"), "8.11.1-linux_arm64": ("node-v8.11.1-linux-arm64.tar.xz", "node-v8.11.1-linux-arm64", "ff518f33751baa8ea4f18853d446357c2edecd930a1526ac9b2eaa79baddc1bf"), "8.11.1-linux_amd64": ("node-v8.11.1-linux-x64.tar.xz", "node-v8.11.1-linux-x64", "6617e245fa0f7fbe0e373e71d543fea878315324ab31dc64b4eba10e42d04c11"), "8.11.1-windows_amd64": ("node-v8.11.1-win-x64.zip", "node-v8.11.1-win-x64", "7d49b59c2b5d73a14c138e8a215d558a64a5241cd5035d9824f608e7bba097b1"), "8.11.2-darwin_amd64": ("node-v8.11.2-darwin-x64.tar.gz", "node-v8.11.2-darwin-x64", "6bd619ab577a1256531e50e31924d99a094eb920de8b5bd060a056a2608282b9"), "8.11.2-linux_arm64": ("node-v8.11.2-linux-arm64.tar.xz", "node-v8.11.2-linux-arm64", "c8e9833402277c1a5a31b41cc31c9cedad68ba87c2ef78aed6a3ced81af9da7f"), "8.11.2-linux_amd64": ("node-v8.11.2-linux-x64.tar.xz", "node-v8.11.2-linux-x64", "213599127d24496cbf1cbb2a7c51060a3506d6b11132c59bb7f9f8a0edd210a7"), "8.11.2-windows_amd64": ("node-v8.11.2-win-x64.zip", "node-v8.11.2-win-x64", "bbac1f56e8001a093acb2942f8a43c3bf22aec58216f446b7bf01f6f822dfe3f"), "8.11.3-darwin_amd64": ("node-v8.11.3-darwin-x64.tar.gz", "node-v8.11.3-darwin-x64", "77fa26b4c2fc34bdf5a5dd1cd39c93b12087fbd25148c6f04bf409698ee48b86"), "8.11.3-linux_arm64": ("node-v8.11.3-linux-arm64.tar.xz", "node-v8.11.3-linux-arm64", "b8fddec18f20533929a07bc1d38ae63b1999a0252740094f0974b2cbea76eaa4"), "8.11.3-linux_amd64": ("node-v8.11.3-linux-x64.tar.xz", "node-v8.11.3-linux-x64", "08e2fcfea66746bd966ea3a89f26851f1238d96f86c33eaf6274f67fce58421a"), "8.11.3-windows_amd64": ("node-v8.11.3-win-x64.zip", "node-v8.11.3-win-x64", "91b779def1b21dcd1def7fc9671a869a1e2f989952e76fdc08a5d73570075f31"), "8.11.4-darwin_amd64": ("node-v8.11.4-darwin-x64.tar.gz", "node-v8.11.4-darwin-x64", "aa1de83b388581d0d9ec3276f4526ee67e17e0f1bc0deb5133f960ce5dc9f1ef"), "8.11.4-linux_arm64": ("node-v8.11.4-linux-arm64.tar.xz", "node-v8.11.4-linux-arm64", "46e90dd916ddbf88c866de300c1b2a26f9216b19abd92b29e89439f62fb6fc1c"), "8.11.4-linux_amd64": ("node-v8.11.4-linux-x64.tar.xz", "node-v8.11.4-linux-x64", "85ea7cbb5bf624e130585bfe3946e99c85ce5cb84c2aee474038bdbe912f908c"), "8.11.4-windows_amd64": ("node-v8.11.4-win-x64.zip", "node-v8.11.4-win-x64", "72a21e2fcd3703994f57cf707b92e7f939df99c3e0298102e7436849e4948536"), "8.12.0-darwin_amd64": ("node-v8.12.0-darwin-x64.tar.gz", "node-v8.12.0-darwin-x64", "ca131b84dfcf2b6f653a6521d31f7a108ad7d83f4d7e781945b2eca8172064aa"), "8.12.0-linux_arm64": ("node-v8.12.0-linux-arm64.tar.xz", "node-v8.12.0-linux-arm64", "0fbdcfd8cf0cb5e8f5beff84ba091fd47126ba44c628e3a351501419b211aa1a"), "8.12.0-linux_amd64": ("node-v8.12.0-linux-x64.tar.xz", "node-v8.12.0-linux-x64", "29a20479cd1e3a03396a4e74a1784ccdd1cf2f96928b56f6ffa4c8dae40c88f2"), "8.12.0-windows_amd64": ("node-v8.12.0-win-x64.zip", "node-v8.12.0-win-x64", "9b22c9b23148b61ea0052826b3ac0255b8a3a542c125272b8f014f15bf11b091"), "8.13.0-darwin_amd64": ("node-v8.13.0-darwin-x64.tar.gz", "node-v8.13.0-darwin-x64", "f6261c7a09a2c8bd77a8760a0e110410f508e5641ca132511b4883600f2d65f0"), "8.13.0-linux_arm64": ("node-v8.13.0-linux-arm64.tar.xz", "node-v8.13.0-linux-arm64", "e8e0daab515dfd0c2323b8e1274475f61c8ca1cf582dcc254583cbf8593425e3"), "8.13.0-linux_amd64": ("node-v8.13.0-linux-x64.tar.xz", "node-v8.13.0-linux-x64", "8fa1227b28113e25a8960d7fa6779a8c18bf20cfaafc9c5d0e46a3ee88373669"), "8.13.0-windows_amd64": ("node-v8.13.0-win-x64.zip", "node-v8.13.0-win-x64", "46293121d207350bd8d334efb67303337933c4dac886a840f88ff6059bff9443"), "8.14.0-darwin_amd64": ("node-v8.14.0-darwin-x64.tar.gz", "node-v8.14.0-darwin-x64", "1e9bb233bb3c3b01826f9d7e1b3ecf1047840ce96a3a7d1921ddcb569c467329"), "8.14.0-linux_arm64": ("node-v8.14.0-linux-arm64.tar.xz", "node-v8.14.0-linux-arm64", "fbcef89a60f1f40699589850f861fc84354a6f240610e2726c3743455dd82525"), "8.14.0-linux_amd64": ("node-v8.14.0-linux-x64.tar.xz", "node-v8.14.0-linux-x64", "a56d1af4d7da81504338b09809cf10b3144808d47d4117b9bd9a5a4ec4d5d9b9"), "8.14.0-windows_amd64": ("node-v8.14.0-win-x64.zip", "node-v8.14.0-win-x64", "d0be7c96a25c5d2b69f8a3510e9f4414643d5fe361b4509d455249e57f9a50af"), "8.14.1-darwin_amd64": ("node-v8.14.1-darwin-x64.tar.gz", "node-v8.14.1-darwin-x64", "d180a9b70de569e4c3d10c0c4a0af74e40dbca3e845df43ce1ec522bb4252eda"), "8.14.1-linux_arm64": ("node-v8.14.1-linux-arm64.tar.xz", "node-v8.14.1-linux-arm64", "488a66288052c6497133179e4546efb7fbaf105e432cd0d9aab3471901ab5e58"), "8.14.1-linux_amd64": ("node-v8.14.1-linux-x64.tar.xz", "node-v8.14.1-linux-x64", "1fec92a0110f692c68f7bdbec41b340c474bd77063323520786a7b9b00473daf"), "8.14.1-windows_amd64": ("node-v8.14.1-win-x64.zip", "node-v8.14.1-win-x64", "41793b873f98ceed632b24120ef44b2df89625f3dfa90eb9298dad698249167c"), "8.15.0-darwin_amd64": ("node-v8.15.0-darwin-x64.tar.gz", "node-v8.15.0-darwin-x64", "a393971136408f837fbc0f7d71a63754f91cfb1851d48bd612d8219eb61956f1"), "8.15.0-linux_arm64": ("node-v8.15.0-linux-arm64.tar.xz", "node-v8.15.0-linux-arm64", "5985c6dce65b1161ff41253da5aa4e64b8f10eb010a5d2712ea9b659f70179d7"), "8.15.0-linux_amd64": ("node-v8.15.0-linux-x64.tar.xz", "node-v8.15.0-linux-x64", "c1f0c5facdba78b5dec5136aec40dcb00b5c7cf404d9236a99c955994f91d969"), "8.15.0-windows_amd64": ("node-v8.15.0-win-x64.zip", "node-v8.15.0-win-x64", "13d8eab29c191bd16c69a70a556178a5adc988b243a036aaf3d5158861b60d8e"), "8.15.1-darwin_amd64": ("node-v8.15.1-darwin-x64.tar.gz", "node-v8.15.1-darwin-x64", "f3da0b4397150226c008a86c99d77dbb835dc62219d863654913a78332ab19a5"), "8.15.1-linux_arm64": ("node-v8.15.1-linux-arm64.tar.xz", "node-v8.15.1-linux-arm64", "69e000d78342c3d39583922c57947a906ad723789d6294951deb10cbe8709605"), "8.15.1-linux_amd64": ("node-v8.15.1-linux-x64.tar.xz", "node-v8.15.1-linux-x64", "5643b54c583eebaa40c1623b16cba4e3955ff5dfdd44036f6bafd761160c993d"), "8.15.1-windows_amd64": ("node-v8.15.1-win-x64.zip", "node-v8.15.1-win-x64", "f636fa578dc079bacc6c4bef13284ddb893c99f7640b96701c2690bd9c1431f5"), "8.16.0-darwin_amd64": ("node-v8.16.0-darwin-x64.tar.gz", "node-v8.16.0-darwin-x64", "a6710b8af0862fab0ccdba0549dbcdad76b5f99070652e64f6a85158038fc9a6"), "8.16.0-linux_arm64": ("node-v8.16.0-linux-arm64.tar.xz", "node-v8.16.0-linux-arm64", "4583d1cb44ff8b51cbf0402a78f2fe086c13a6c900c20c8be14e3b0e28e34335"), "8.16.0-linux_amd64": ("node-v8.16.0-linux-x64.tar.xz", "node-v8.16.0-linux-x64", "e538ffaaf2f808c084e70f1a1d2ff5559cff892cfd56e0bb67d00b0a95fc3a7a"), "8.16.0-windows_amd64": ("node-v8.16.0-win-x64.zip", "node-v8.16.0-win-x64", "d6baa929bacb78b347b29ebb0263220ea649ce82f3cdfd3f0b41ac725d1bbba5"), "8.16.1-darwin_amd64": ("node-v8.16.1-darwin-x64.tar.gz", "node-v8.16.1-darwin-x64", "ef1cb93f03bca4b9528e5d3226bdf8efa135e4b12285eee1e4760da06bac631a"), "8.16.1-linux_arm64": ("node-v8.16.1-linux-arm64.tar.xz", "node-v8.16.1-linux-arm64", "0c61c6ae8a70d96ab19848a09b2010d29b806f2dd79177da22c743fd5e352a98"), "8.16.1-linux_amd64": ("node-v8.16.1-linux-x64.tar.xz", "node-v8.16.1-linux-x64", "22a2580569c787ea83960bda0eae5dfaf1fe79382a52ad5fa5cd3accb93a1818"), "8.16.1-windows_amd64": ("node-v8.16.1-win-x64.zip", "node-v8.16.1-win-x64", "396dc41740bca0355d11865780e2af8e88eb17581cd2c445ccaf29b862901ab8"), "8.16.2-darwin_amd64": ("node-v8.16.2-darwin-x64.tar.gz", "node-v8.16.2-darwin-x64", "359331120e83f0707219398fc543b05eee9476446ecce549c20c4d9c7c103d29"), "8.16.2-linux_arm64": ("node-v8.16.2-linux-arm64.tar.xz", "node-v8.16.2-linux-arm64", "5afe366affb05136d25e99ec97a7a1ee1b690cc26df43567af0509f36b45e682"), "8.16.2-linux_amd64": ("node-v8.16.2-linux-x64.tar.xz", "node-v8.16.2-linux-x64", "88617a293f5828cc94ee99c94a43fbea12b989e34fe643fc14885a14748a8da6"), "8.16.2-windows_amd64": ("node-v8.16.2-win-x64.zip", "node-v8.16.2-win-x64", "98c615221500434155a8a5aff5fe96cd000400f3e76858ca97e6624f1d15eb73"), "8.17.0-darwin_amd64": ("node-v8.17.0-darwin-x64.tar.gz", "node-v8.17.0-darwin-x64", "3117430fc93e9865e4a1842616cc98767b5d6987fd9d727c8be4068714570e16"), "8.17.0-linux_arm64": ("node-v8.17.0-linux-arm64.tar.xz", "node-v8.17.0-linux-arm64", "8318d1ee0265d84025ecbea76aaecd732974a6f4ac8492ddd84231cee77ba948"), "8.17.0-linux_amd64": ("node-v8.17.0-linux-x64.tar.xz", "node-v8.17.0-linux-x64", "b7f6dd77fb173c8c7c30d61d0702eefc236bba74398538aa77bfa2bb47bddce6"), "8.17.0-windows_amd64": ("node-v8.17.0-win-x64.zip", "node-v8.17.0-win-x64", "e95a63e81b27e78872c0efb9dd5809403014dbf9896035cc17adf51a350f88fa"), "9.0.0-darwin_amd64": ("node-v9.0.0-darwin-x64.tar.gz", "node-v9.0.0-darwin-x64", "40fe905e492deadbf84c46baba413294e516fa844ed8e68adb4117f8acabe9a9"), "9.0.0-linux_arm64": ("node-v9.0.0-linux-arm64.tar.xz", "node-v9.0.0-linux-arm64", "0250e13705259dcf736ac4216833c2ade459e3ade94d89af68bd98ded1783cb6"), "9.0.0-linux_amd64": ("node-v9.0.0-linux-x64.tar.xz", "node-v9.0.0-linux-x64", "8313d2f6d69dbea4cb860803a156f093041cbe352a843c06f9f05cab1f30e9cc"), "9.0.0-windows_amd64": ("node-v9.0.0-win-x64.zip", "node-v9.0.0-win-x64", "d25901007e7c48da3af162bc1917d5bdd78c7e3b9cb64f16f90c38b59ef7b412"), "9.1.0-darwin_amd64": ("node-v9.1.0-darwin-x64.tar.gz", "node-v9.1.0-darwin-x64", "8e180de9b3f6a79f09a391c89de54920bbf5375337d3e13c5bfcbce85af711ab"), "9.1.0-linux_arm64": ("node-v9.1.0-linux-arm64.tar.xz", "node-v9.1.0-linux-arm64", "37d329fa06b22e30243c503b64d9666d56abb6c0ce903251d4b43e7ad0833fb3"), "9.1.0-linux_amd64": ("node-v9.1.0-linux-x64.tar.xz", "node-v9.1.0-linux-x64", "b796ed115c97acd23211c294129b0a834ff3a6a0f583111443b89d2b24e0d4d9"), "9.1.0-windows_amd64": ("node-v9.1.0-win-x64.zip", "node-v9.1.0-win-x64", "f2e76f536ff4fedd9884684f0b1979e04d0fd1c2a65d7d1a5a013de885dd07b3"), "9.2.0-darwin_amd64": ("node-v9.2.0-darwin-x64.tar.gz", "node-v9.2.0-darwin-x64", "42f78982b8614f099bc70819db40074ff7c1c49d4bac71eca5ffe4120452f289"), "9.2.0-linux_arm64": ("node-v9.2.0-linux-arm64.tar.xz", "node-v9.2.0-linux-arm64", "1b5c44160b7bfc9e5d63697d63c82330ae3e6094ab48449bd958ebe0baef73f0"), "9.2.0-linux_amd64": ("node-v9.2.0-linux-x64.tar.xz", "node-v9.2.0-linux-x64", "ded9cef0243bbe8ac5a417be0c6471bed6ed82367714ccb23f79a5be0ba2bd5d"), "9.2.0-windows_amd64": ("node-v9.2.0-win-x64.zip", "node-v9.2.0-win-x64", "5e7feb536547c715155d772f90857239b37897c1a1a664809fd84a7aeae1a724"), "9.2.1-darwin_amd64": ("node-v9.2.1-darwin-x64.tar.gz", "node-v9.2.1-darwin-x64", "4263f3da0280e2decd3a2ab97672e6f718acdf704664a3f1251e4ea267ccc971"), "9.2.1-linux_arm64": ("node-v9.2.1-linux-arm64.tar.xz", "node-v9.2.1-linux-arm64", "09d362e2ed5f4af5e5dc2253bb4523d7bcb92135bcc11d9eb89ad8336229b756"), "9.2.1-linux_amd64": ("node-v9.2.1-linux-x64.tar.xz", "node-v9.2.1-linux-x64", "548d2959939235ca56c98740f64b64058e43d1499d760603b7941b7c37ad10fe"), "9.2.1-windows_amd64": ("node-v9.2.1-win-x64.zip", "node-v9.2.1-win-x64", "7b48ef7c718fe5748844f93101f9276a88ae1cf3c4c228f85306a6a266471b5b"), "9.3.0-darwin_amd64": ("node-v9.3.0-darwin-x64.tar.gz", "node-v9.3.0-darwin-x64", "0539601e67e9be6995d4ba4abe565a748e25699060631369f59166d5de43d21a"), "9.3.0-linux_arm64": ("node-v9.3.0-linux-arm64.tar.xz", "node-v9.3.0-linux-arm64", "11300e878220962adade33238dd6e55928ad6d1362e0daa1f12e272137e68c0b"), "9.3.0-linux_amd64": ("node-v9.3.0-linux-x64.tar.xz", "node-v9.3.0-linux-x64", "0424dd6fa059fc32e0b73f460cb587b92b13c7b0af56331bbdc53a52e43f24ea"), "9.3.0-windows_amd64": ("node-v9.3.0-win-x64.zip", "node-v9.3.0-win-x64", "53bceda79c8d5dd8a185221a5ea2fc8f2b24ed7e0c9c91d18f6016b3624ff096"), "9.4.0-darwin_amd64": ("node-v9.4.0-darwin-x64.tar.gz", "node-v9.4.0-darwin-x64", "fa271c6012d517851603829af2131b92dc7b03d6f167dcd197cb83468a4971e8"), "9.4.0-linux_arm64": ("node-v9.4.0-linux-arm64.tar.xz", "node-v9.4.0-linux-arm64", "ceed69e91723cb902fcf70e790d34147a91241509257c77a62327871dfad04fa"), "9.4.0-linux_amd64": ("node-v9.4.0-linux-x64.tar.xz", "node-v9.4.0-linux-x64", "6d331d75a39fc5292dd128ad83f6dd14bbbdcb84ba0dfe793fade833be5de95a"), "9.4.0-windows_amd64": ("node-v9.4.0-win-x64.zip", "node-v9.4.0-win-x64", "89d49d73eb92483af0133c97e57a5b521c523960c130c76727daa3412af7d5d8"), "9.5.0-darwin_amd64": ("node-v9.5.0-darwin-x64.tar.gz", "node-v9.5.0-darwin-x64", "bc5c6eb21a90dbcaf90479838416c90524fe6d47e92c928ef57d7e96a54eb5fe"), "9.5.0-linux_arm64": ("node-v9.5.0-linux-arm64.tar.xz", "node-v9.5.0-linux-arm64", "d6a98a51c032963014f606acc80babb456f3dc4c041534ca565f573a2382b253"), "9.5.0-linux_amd64": ("node-v9.5.0-linux-x64.tar.xz", "node-v9.5.0-linux-x64", "76dd38bb5a16a610894353228ef020653f81209a2e509d38aee78ace4410599e"), "9.5.0-windows_amd64": ("node-v9.5.0-win-x64.zip", "node-v9.5.0-win-x64", "2fd1c3865a34827af6b5d799aee68e011a16a637276cbf71e923c8bedd010ee8"), "9.6.0-darwin_amd64": ("node-v9.6.0-darwin-x64.tar.gz", "node-v9.6.0-darwin-x64", "4f2001075b724791bf652b5432073aaaaec03cb00b17cda054ab0a05126035fe"), "9.6.0-linux_arm64": ("node-v9.6.0-linux-arm64.tar.xz", "node-v9.6.0-linux-arm64", "eb10815b1d21e8f5111b90c15b19050279b44666d08a12f26906271e9f6b02dd"), "9.6.0-linux_amd64": ("node-v9.6.0-linux-x64.tar.xz", "node-v9.6.0-linux-x64", "24b8670c819278135b4b8851d880615dee8458fdb5f5390ed0c88c383377f5d3"), "9.6.0-windows_amd64": ("node-v9.6.0-win-x64.zip", "node-v9.6.0-win-x64", "5f1da1ef6ba776449900c931e7acc3b60e47f3080425bf0e6a1c0c5a07dbd6fd"), "9.6.1-darwin_amd64": ("node-v9.6.1-darwin-x64.tar.gz", "node-v9.6.1-darwin-x64", "de486bc479817df2df1f91468e85e5da228a19101422c0c9a27153c1d0013c6d"), "9.6.1-linux_arm64": ("node-v9.6.1-linux-arm64.tar.xz", "node-v9.6.1-linux-arm64", "6246c85acab2dd92463fa1c456db31a24cd7b50b3fa556c4976c5a91473b8c8f"), "9.6.1-linux_amd64": ("node-v9.6.1-linux-x64.tar.xz", "node-v9.6.1-linux-x64", "d38f1707faccc54fae3cb201c25b02c4a3474d2c409c64f2a1d08925b238f8ad"), "9.6.1-windows_amd64": ("node-v9.6.1-win-x64.zip", "node-v9.6.1-win-x64", "c8176d317945ce6221473d70999ec7e725f1c9a7477e991bd7c729026c46dffb"), "9.7.0-darwin_amd64": ("node-v9.7.0-darwin-x64.tar.gz", "node-v9.7.0-darwin-x64", "9730cf3c4c5e228d4855c3362b63dbe59041202d89ae30d7f5ca42f60f742c5d"), "9.7.0-linux_arm64": ("node-v9.7.0-linux-arm64.tar.xz", "node-v9.7.0-linux-arm64", "18bec2bec5e2496f33b4d9d7f3bea7411cdb5d108f390b5c1949ddeda0e61125"), "9.7.0-linux_amd64": ("node-v9.7.0-linux-x64.tar.xz", "node-v9.7.0-linux-x64", "5c7549ceeebdc7ac5acdcae5fffbeb9585e3b9e2003e70e116d9f19c768f73d1"), "9.7.0-windows_amd64": ("node-v9.7.0-win-x64.zip", "node-v9.7.0-win-x64", "a17796c9c888e88a9a086dc1a22cdd872d8e948fbf1e988a8132fef716990530"), "9.7.1-darwin_amd64": ("node-v9.7.1-darwin-x64.tar.gz", "node-v9.7.1-darwin-x64", "9ee0fa891787865b1eccc63ef56134e7de8bbf67b660a1dde9e309305a1dc3b0"), "9.7.1-linux_arm64": ("node-v9.7.1-linux-arm64.tar.xz", "node-v9.7.1-linux-arm64", "d9143c23f7aa171449229abd456c8a9e07dc1033a1e791132b3387d439e2475d"), "9.7.1-linux_amd64": ("node-v9.7.1-linux-x64.tar.xz", "node-v9.7.1-linux-x64", "33b3ecd0a1de891a4a2f3586f1c6498c95c1ecc15864a6e3f4f7826792850d99"), "9.7.1-windows_amd64": ("node-v9.7.1-win-x64.zip", "node-v9.7.1-win-x64", "8590ff193e645d7f719e25d9519633376c72cfa1b36192031705e0065b7d69b2"), "9.8.0-darwin_amd64": ("node-v9.8.0-darwin-x64.tar.gz", "node-v9.8.0-darwin-x64", "c95326d6d8d01e5d4fbf0ca1b1e4fc0d800d00516f38532cc887e17c78f2af07"), "9.8.0-linux_arm64": ("node-v9.8.0-linux-arm64.tar.xz", "node-v9.8.0-linux-arm64", "f3537d06f010e77739be073003fca0b477efec8a72d503dc5a1d942a19973b07"), "9.8.0-linux_amd64": ("node-v9.8.0-linux-x64.tar.xz", "node-v9.8.0-linux-x64", "9f631739b0a9b96b8760c42869e88592db9c3fda2425202bd8b2d09e6371133a"), "9.8.0-windows_amd64": ("node-v9.8.0-win-x64.zip", "node-v9.8.0-win-x64", "dd3971c126907a033f2bc93fdd29327af3ff5b9d151b3b90eb5db1832fe6df9e"), "9.9.0-darwin_amd64": ("node-v9.9.0-darwin-x64.tar.gz", "node-v9.9.0-darwin-x64", "15e71817fe172119d6f9e0166ab869f12c67bdb7371d27a78b0621c408239692"), "9.9.0-linux_arm64": ("node-v9.9.0-linux-arm64.tar.xz", "node-v9.9.0-linux-arm64", "06feb32656c91c3963270de18d4a7befe52d2d8c0fd78fbbb7792a881ffeec7a"), "9.9.0-linux_amd64": ("node-v9.9.0-linux-x64.tar.xz", "node-v9.9.0-linux-x64", "457151b4e6f27222232742ce44de1df73768a251309dddbfca2b385052ee977f"), "9.9.0-windows_amd64": ("node-v9.9.0-win-x64.zip", "node-v9.9.0-win-x64", "5186747c7cab6ff153e725c42446727e460d54e6c62353d5dc550046f5c05653"), "9.10.0-darwin_amd64": ("node-v9.10.0-darwin-x64.tar.gz", "node-v9.10.0-darwin-x64", "c4b98cc2f3c00b770f24549de112902b56d57be7963a1047cd116b357bc61569"), "9.10.0-linux_arm64": ("node-v9.10.0-linux-arm64.tar.xz", "node-v9.10.0-linux-arm64", "ba1d682aa1d5a12eeb39e7f51e4c67c6122b24482869ca2547c6f094eae90658"), "9.10.0-linux_amd64": ("node-v9.10.0-linux-x64.tar.xz", "node-v9.10.0-linux-x64", "b9bfffc03ef0e2c97d463619911552c7f5b1b8699de07bb913990a8b33800cb9"), "9.10.0-windows_amd64": ("node-v9.10.0-win-x64.zip", "node-v9.10.0-win-x64", "3f159de87fd987e7bf30bbffce722e2e5133c44fc847883053359e9b08d6fa88"), "9.10.1-darwin_amd64": ("node-v9.10.1-darwin-x64.tar.gz", "node-v9.10.1-darwin-x64", "ae2d9dfdd3fdb6a6fe588e5479a768ee502968f6544ac8ad6133cb2e05726793"), "9.10.1-linux_arm64": ("node-v9.10.1-linux-arm64.tar.xz", "node-v9.10.1-linux-arm64", "9b084b30e48a3a145fcc6cb282a1b46145b703c13a5eaee40afc7f9d82ad697b"), "9.10.1-linux_amd64": ("node-v9.10.1-linux-x64.tar.xz", "node-v9.10.1-linux-x64", "fc810056be2a0665d0f67b42d25e1b8442bd885d4893b3256a7cfe676bd973de"), "9.10.1-windows_amd64": ("node-v9.10.1-win-x64.zip", "node-v9.10.1-win-x64", "43bf882dec1550e00a039f77190a3e2a778354577e542563be4b5c205de17df1"), "9.11.0-darwin_amd64": ("node-v9.11.0-darwin-x64.tar.gz", "node-v9.11.0-darwin-x64", "e562cfc01a4d8e62c1d86f59cef4f00439b4ad279c97f95f76a39f4b3530b8e5"), "9.11.0-linux_arm64": ("node-v9.11.0-linux-arm64.tar.xz", "node-v9.11.0-linux-arm64", "8df1dd7a1ec298900cf699a7ee8e5f0f478075d0e4c4fd3fb6e3a4ad3527545c"), "9.11.0-linux_amd64": ("node-v9.11.0-linux-x64.tar.xz", "node-v9.11.0-linux-x64", "a4349420b74804b3404a4eea27341297968f61998b01f6504dbbad603700e944"), "9.11.0-windows_amd64": ("node-v9.11.0-win-x64.zip", "node-v9.11.0-win-x64", "6e7f586ece923fd71e36d5db80b6a6d731a2b156464058cb2304f6c0192637cb"), "9.11.1-darwin_amd64": ("node-v9.11.1-darwin-x64.tar.gz", "node-v9.11.1-darwin-x64", "7b1fb394aa41a62b477e36df16644bd383cc9084808511f6cd318b835a06aac6"), "9.11.1-linux_arm64": ("node-v9.11.1-linux-arm64.tar.xz", "node-v9.11.1-linux-arm64", "dba2de106fbde2013a204ca9fafdfe67c0426b4e63d186f888e59432ad2dbb03"), "9.11.1-linux_amd64": ("node-v9.11.1-linux-x64.tar.xz", "node-v9.11.1-linux-x64", "4d27a95d5c2f1c8ef99118794c9c4903e63963418d3e16ca7576760cff39879b"), "9.11.1-windows_amd64": ("node-v9.11.1-win-x64.zip", "node-v9.11.1-win-x64", "0a3566d57ccb7fed95d18fc6c3bc1552a1b1e4753f9bc6c5d45e04f325e1ee53"), "9.11.2-darwin_amd64": ("node-v9.11.2-darwin-x64.tar.gz", "node-v9.11.2-darwin-x64", "340993096108d1dc0e0b598560d87ec645fc94b0fc83a423c36343f2da45f4b8"), "9.11.2-linux_arm64": ("node-v9.11.2-linux-arm64.tar.xz", "node-v9.11.2-linux-arm64", "9a713a6f4473425b83bf67e13e4b3c9f1f683c996b913f1f6854d208996367b6"), "9.11.2-linux_amd64": ("node-v9.11.2-linux-x64.tar.xz", "node-v9.11.2-linux-x64", "a2e7fe4ee3c4e3f31e00dff241c92c2ed779a9f36735578603d2be966f938a4b"), "9.11.2-windows_amd64": ("node-v9.11.2-win-x64.zip", "node-v9.11.2-win-x64", "051db8f4d3c0503e3082173f16b25e2362de8f9a5e509c403992b2069d826c25"), "10.0.0-darwin_amd64": ("node-v10.0.0-darwin-x64.tar.gz", "node-v10.0.0-darwin-x64", "37447fdb5f5cbcf1307ca1661ed67e6e911e0e988c0cb6d15f92eebb211dce88"), "10.0.0-linux_arm64": ("node-v10.0.0-linux-arm64.tar.xz", "node-v10.0.0-linux-arm64", "18f626a967d72294d969bdf000ca80ef483a8bb75482a2c4d14f5e0141626611"), "10.0.0-linux_amd64": ("node-v10.0.0-linux-x64.tar.xz", "node-v10.0.0-linux-x64", "d57c391daef40e706ca71abeaf9d53271c9d0fdb9cd18a80f6296b04dbaf2d5a"), "10.0.0-windows_amd64": ("node-v10.0.0-win-x64.zip", "node-v10.0.0-win-x64", "a95d88e2c28cbcbadb1fa431ec0b686f196dda00d4a25b0829450dc8f5214ec3"), "10.1.0-darwin_amd64": ("node-v10.1.0-darwin-x64.tar.gz", "node-v10.1.0-darwin-x64", "383ef526e27b92113f8dc0dad406b771f6ecaf9e3fddd4f5357590a3cf543d7b"), "10.1.0-linux_arm64": ("node-v10.1.0-linux-arm64.tar.xz", "node-v10.1.0-linux-arm64", "01e252589cf1ce61d2aaa316895001eb24c90a48b04a0e4896de252d2840ffe9"), "10.1.0-linux_amd64": ("node-v10.1.0-linux-x64.tar.xz", "node-v10.1.0-linux-x64", "cb5860c0d3249330d882fb8c6619c082cf3cda177536d4ed979388dde0034f22"), "10.1.0-windows_amd64": ("node-v10.1.0-win-x64.zip", "node-v10.1.0-win-x64", "8448bbd50731e98a4ed8bb4f3f3964170ff3a26418e9bcb3caf770faa9fb06d7"), "10.2.0-darwin_amd64": ("node-v10.2.0-darwin-x64.tar.gz", "node-v10.2.0-darwin-x64", "35fcc482d07218119ce5fde62620994324f03f8c4426dd680886c6844b62232a"), "10.2.0-linux_arm64": ("node-v10.2.0-linux-arm64.tar.xz", "node-v10.2.0-linux-arm64", "8f970be59a6a11f511a04ae1bd303746f0c5409498e062fb1d263d3c3c1093bd"), "10.2.0-linux_amd64": ("node-v10.2.0-linux-x64.tar.xz", "node-v10.2.0-linux-x64", "a6ef9adc824db795b36f81ad0856adc5c878395c4ce2af20f5ba7b76a1ca9982"), "10.2.0-windows_amd64": ("node-v10.2.0-win-x64.zip", "node-v10.2.0-win-x64", "7d7144d57b1b910d10f51d5445ae4306f10d3d9f45ca08b49e8777472993db51"), "10.2.1-darwin_amd64": ("node-v10.2.1-darwin-x64.tar.gz", "node-v10.2.1-darwin-x64", "6ffa149f67e8bd68d291d62591b6573146a65682affd99eefe2835a9c048d3ef"), "10.2.1-linux_arm64": ("node-v10.2.1-linux-arm64.tar.xz", "node-v10.2.1-linux-arm64", "6899cab91fd01af6b73183d23693120ff0de547601d01822b53647d0f5d934ee"), "10.2.1-linux_amd64": ("node-v10.2.1-linux-x64.tar.xz", "node-v10.2.1-linux-x64", "59ffaba5f54ea6a62ada1013a0cc1741c6e6fa790ab9ab2302a98932e7fb85d5"), "10.2.1-windows_amd64": ("node-v10.2.1-win-x64.zip", "node-v10.2.1-win-x64", "ebe78920d72b7a226a345653f3f718f99dc531add35157d37d229050f3685705"), "10.3.0-darwin_amd64": ("node-v10.3.0-darwin-x64.tar.gz", "node-v10.3.0-darwin-x64", "0bb5b7e3fe8cccda2abda958d1eb0408f1518a8b0cb58b75ade5d507cd5d6053"), "10.3.0-linux_arm64": ("node-v10.3.0-linux-arm64.tar.xz", "node-v10.3.0-linux-arm64", "6811b7b9807135902990508143605c0c758d07f7726092ed1b2e27cc60111bd0"), "10.3.0-linux_amd64": ("node-v10.3.0-linux-x64.tar.xz", "node-v10.3.0-linux-x64", "eb3c3e2585494699716ad3197c8eedf4003d3f110829b30c5a0dc34414c47423"), "10.3.0-windows_amd64": ("node-v10.3.0-win-x64.zip", "node-v10.3.0-win-x64", "65d586afb087406a2800d8e51f664c88b26d510f077b85a3b177a1bb79f73677"), "10.4.0-darwin_amd64": ("node-v10.4.0-darwin-x64.tar.gz", "node-v10.4.0-darwin-x64", "82b27983c990a6860e8d729e0b15acf9643ffca0eff282a926268849dfd2c3d2"), "10.4.0-linux_arm64": ("node-v10.4.0-linux-arm64.tar.xz", "node-v10.4.0-linux-arm64", "18d01e0937cdd05386f59f792613aac7b6614a37312ede0c299bd589584976e9"), "10.4.0-linux_amd64": ("node-v10.4.0-linux-x64.tar.xz", "node-v10.4.0-linux-x64", "ce2232578408f7d6bdc7d8bbb49d3416225fe68c52540ac23f4a6e0294d947f6"), "10.4.0-windows_amd64": ("node-v10.4.0-win-x64.zip", "node-v10.4.0-win-x64", "315fc4099902a71b634fee15e4e160a0780703c59a66e7e4542045f6f2b91451"), "10.4.1-darwin_amd64": ("node-v10.4.1-darwin-x64.tar.gz", "node-v10.4.1-darwin-x64", "c232241c97e1f4659186205d50b44132e62b61cdc517f1fb86905a21d03e9189"), "10.4.1-linux_arm64": ("node-v10.4.1-linux-arm64.tar.xz", "node-v10.4.1-linux-arm64", "c00b75a28eb69e4238c9d560f50da3652395ba7bfa6e325d5a2b0cd0926070f7"), "10.4.1-linux_amd64": ("node-v10.4.1-linux-x64.tar.xz", "node-v10.4.1-linux-x64", "6196daea2b291cdb865b3597e6b819b13068cb2c9dbf27cb150256c557a81082"), "10.4.1-windows_amd64": ("node-v10.4.1-win-x64.zip", "node-v10.4.1-win-x64", "70e0b9f0036f878884fdfc585c1001a439508d1d4e6448c4aced60274a2dc191"), "10.5.0-darwin_amd64": ("node-v10.5.0-darwin-x64.tar.gz", "node-v10.5.0-darwin-x64", "a85bda6ab91da8595e71736944cbd77c61afe05092217defd0fb74d9f77109f0"), "10.5.0-linux_arm64": ("node-v10.5.0-linux-arm64.tar.xz", "node-v10.5.0-linux-arm64", "28e6baa2a4ac5b0f0f5adf85489574038d0a4ca48efe76a4e5831b6b222652ba"), "10.5.0-linux_amd64": ("node-v10.5.0-linux-x64.tar.xz", "node-v10.5.0-linux-x64", "8b12be967f5962a8173dca235e1a6f642ee29dcf5fc27697004af898ffeca187"), "10.5.0-windows_amd64": ("node-v10.5.0-win-x64.zip", "node-v10.5.0-win-x64", "ce2b1f9976de64bcc0a5ce877edee0d29c4db1ebab5a7fd713afffd661e99e08"), "10.6.0-darwin_amd64": ("node-v10.6.0-darwin-x64.tar.gz", "node-v10.6.0-darwin-x64", "537efef0c6fd998502fa10baf82ee21edf513256cc73575991354e19442d0b69"), "10.6.0-linux_arm64": ("node-v10.6.0-linux-arm64.tar.xz", "node-v10.6.0-linux-arm64", "be37aade1c085093e276b5822a05233a1057bcafe77f5b9526dbdf622330c4bb"), "10.6.0-linux_amd64": ("node-v10.6.0-linux-x64.tar.xz", "node-v10.6.0-linux-x64", "cfd47380729f2451169b8900b3bd65e4b9db669d1d540613758cd2ededf7b5e6"), "10.6.0-windows_amd64": ("node-v10.6.0-win-x64.zip", "node-v10.6.0-win-x64", "0b58e0414d76e48432588910ea682f002ba69d7be88deb3355ceffb2fe472f6d"), "10.7.0-darwin_amd64": ("node-v10.7.0-darwin-x64.tar.gz", "node-v10.7.0-darwin-x64", "913473055605c8ae92f46923e6ac400133895aafe7766574fd46899bc6b0c5a4"), "10.7.0-linux_arm64": ("node-v10.7.0-linux-arm64.tar.xz", "node-v10.7.0-linux-arm64", "c23856b3123f9e2cfae3f8b0668019f83e9450ee78dede02a8d43031255b7ba0"), "10.7.0-linux_amd64": ("node-v10.7.0-linux-x64.tar.xz", "node-v10.7.0-linux-x64", "ad1d44cbe64ef44db5d8d42690a76dd186d6a6f71a3c3d38449757fe73135329"), "10.7.0-windows_amd64": ("node-v10.7.0-win-x64.zip", "node-v10.7.0-win-x64", "a0914d4c1fb82f51a03a4f57c66c9ce6a65ccd4f3237706042c55799843f4b14"), "10.8.0-darwin_amd64": ("node-v10.8.0-darwin-x64.tar.gz", "node-v10.8.0-darwin-x64", "b800d8b55c234b1f7d972e9464b00328a1caea5f86f94fdb5fc88ebbed7852b7"), "10.8.0-linux_arm64": ("node-v10.8.0-linux-arm64.tar.xz", "node-v10.8.0-linux-arm64", "0333da24d1fe54abac26b0a06437d3336c0fb4816b280507a9851ab3742ef2e4"), "10.8.0-linux_amd64": ("node-v10.8.0-linux-x64.tar.xz", "node-v10.8.0-linux-x64", "497f3b243d7374ee0fe9ab200b175868b172c3a22282cedc6d7fb0cad82471f0"), "10.8.0-windows_amd64": ("node-v10.8.0-win-x64.zip", "node-v10.8.0-win-x64", "f98575fb551d78691a6f74ca4f9c254bbd9fb62135e9ec0ab7ec8c40a03648b0"), "10.9.0-darwin_amd64": ("node-v10.9.0-darwin-x64.tar.gz", "node-v10.9.0-darwin-x64", "3c4fe75dacfcc495a432a7ba2dec9045cff359af2a5d7d0429c84a424ef686fc"), "10.9.0-linux_arm64": ("node-v10.9.0-linux-arm64.tar.xz", "node-v10.9.0-linux-arm64", "3d6aa717d98bbf901c5325a02a81048eb47212bdc44963ef8d59c6e52e987b7c"), "10.9.0-linux_amd64": ("node-v10.9.0-linux-x64.tar.xz", "node-v10.9.0-linux-x64", "c5acb8b7055ee0b6ac653dc4e458c5db45348cecc564b388f4ed1def84a329ff"), "10.9.0-windows_amd64": ("node-v10.9.0-win-x64.zip", "node-v10.9.0-win-x64", "6a75cdbb69d62ed242d6cbf0238a470bcbf628567ee339d4d098a5efcda2401e"), "10.10.0-darwin_amd64": ("node-v10.10.0-darwin-x64.tar.gz", "node-v10.10.0-darwin-x64", "00b7a8426e076e9bf9d12ba2d571312e833fe962c70afafd10ad3682fdeeaa5e"), "10.10.0-linux_arm64": ("node-v10.10.0-linux-arm64.tar.xz", "node-v10.10.0-linux-arm64", "7d57961d18ea70b4e99906d87f9de1a2defc45a36fcd8cd84295e9ae5c4281da"), "10.10.0-linux_amd64": ("node-v10.10.0-linux-x64.tar.xz", "node-v10.10.0-linux-x64", "686d2c7b7698097e67bcd68edc3d6b5d28d81f62436c7cf9e7779d134ec262a9"), "10.10.0-windows_amd64": ("node-v10.10.0-win-x64.zip", "node-v10.10.0-win-x64", "70c46e6451798be9d052b700ce5dadccb75cf917f6bf0d6ed54344c856830cfb"), "10.11.0-darwin_amd64": ("node-v10.11.0-darwin-x64.tar.gz", "node-v10.11.0-darwin-x64", "32ad850a0e5cfdefc32d4267707abad05bd5c9eabb047e8ed9bf97faeffc52b6"), "10.11.0-linux_arm64": ("node-v10.11.0-linux-arm64.tar.xz", "node-v10.11.0-linux-arm64", "289302470520fd63e2a92a878869061dda557fe1aabfea2bd5ff88f7af76d98d"), "10.11.0-linux_amd64": ("node-v10.11.0-linux-x64.tar.xz", "node-v10.11.0-linux-x64", "c2eab149e7f0712a6a3eb672a76d657b049a3b3ae0c2edc2e0571df5049fe82c"), "10.11.0-windows_amd64": ("node-v10.11.0-win-x64.zip", "node-v10.11.0-win-x64", "78b2a7a4305aa108b9a82ac7586d7200ab51428c2b882d1318fb44ca300a8609"), "10.12.0-darwin_amd64": ("node-v10.12.0-darwin-x64.tar.gz", "node-v10.12.0-darwin-x64", "f275c901b9aeaacea2bf22648329c2e9ade5e1ff63a446b83446d5d4e19464cc"), "10.12.0-linux_arm64": ("node-v10.12.0-linux-arm64.tar.xz", "node-v10.12.0-linux-arm64", "b327deca4e380559c8c1fbacb9e668b49127ea998de4c8fe83912838cf786786"), "10.12.0-linux_amd64": ("node-v10.12.0-linux-x64.tar.xz", "node-v10.12.0-linux-x64", "4eba2e9a6db95745b769915d58e57df6ca6724ec1f023f76556fce30ceca2367"), "10.12.0-windows_amd64": ("node-v10.12.0-win-x64.zip", "node-v10.12.0-win-x64", "44c938cf1409562d25d23b7c6bce110b53cd2a73774bed573b2979f0d88f51f8"), "10.13.0-darwin_amd64": ("node-v10.13.0-darwin-x64.tar.gz", "node-v10.13.0-darwin-x64", "815a5d18516934a3963ace9f0574f7d41f0c0ce9186a19be3d89e039e57598c5"), "10.13.0-linux_arm64": ("node-v10.13.0-linux-arm64.tar.xz", "node-v10.13.0-linux-arm64", "1537ebe64dc34a2a9b8ab6254213079789e9d59ed0ed26987afb1da37b6a8f87"), "10.13.0-linux_amd64": ("node-v10.13.0-linux-x64.tar.xz", "node-v10.13.0-linux-x64", "0dc6dba645550b66f8f00541a428c29da7c3cde32fb7eda2eb626a9db3bbf08d"), "10.13.0-windows_amd64": ("node-v10.13.0-win-x64.zip", "node-v10.13.0-win-x64", "eb09c9e9677f1919ec1ca78623c09b2a718ec5388b72b7662d5c41e5f628a52c"), "10.14.0-darwin_amd64": ("node-v10.14.0-darwin-x64.tar.gz", "node-v10.14.0-darwin-x64", "dd044aa0ddeb5e32fefa80a13b33bafe3f7e0536e15fe93c1e81b052c2f1965c"), "10.14.0-linux_arm64": ("node-v10.14.0-linux-arm64.tar.xz", "node-v10.14.0-linux-arm64", "4d80efe675c40d6d3af697e17e33cad8af1caf50655276ca99d0c4ca8e2f2cf2"), "10.14.0-linux_amd64": ("node-v10.14.0-linux-x64.tar.xz", "node-v10.14.0-linux-x64", "5f576f9893e0335f0c1b071a42fdf8b3e302577ad6ea38237aaef08ad0ca898e"), "10.14.0-windows_amd64": ("node-v10.14.0-win-x64.zip", "node-v10.14.0-win-x64", "a3acbbdbbdb6ff6d5ae6e6f5ccea55aef83cfa54f52c080538edc3ac6326797b"), "10.14.1-darwin_amd64": ("node-v10.14.1-darwin-x64.tar.gz", "node-v10.14.1-darwin-x64", "91ebe7d6da8a40c72618ac9d0b0a8e224ae01febd3f5595b43b1a58190dcacb1"), "10.14.1-linux_arm64": ("node-v10.14.1-linux-arm64.tar.xz", "node-v10.14.1-linux-arm64", "c1ca91356b007cc7624c7a9e00f3b7bed8dd10aba959be5f55e4ff13da334828"), "10.14.1-linux_amd64": ("node-v10.14.1-linux-x64.tar.xz", "node-v10.14.1-linux-x64", "b65e735cdf61fb80f114c498c8955efe8e096e4b3e173281d68aa9d2c05b0f97"), "10.14.1-windows_amd64": ("node-v10.14.1-win-x64.zip", "node-v10.14.1-win-x64", "7d51aa233ad290eb916a4c3134815204eb34ecb0a001dcecc5ea57333030f303"), "10.14.2-darwin_amd64": ("node-v10.14.2-darwin-x64.tar.gz", "node-v10.14.2-darwin-x64", "5306da5db576d9c984167b4693600a2e3074cc5a701961279837753fa2139baa"), "10.14.2-linux_arm64": ("node-v10.14.2-linux-arm64.tar.xz", "node-v10.14.2-linux-arm64", "8493b30c99d697b24fbaa5bfb3b43108ab3e334ab674188b7b7982fef903aa04"), "10.14.2-linux_amd64": ("node-v10.14.2-linux-x64.tar.xz", "node-v10.14.2-linux-x64", "e43de13bf7bee440a106a844c1bc3a2adb8829fd58b857702c8f1838fdd02a2a"), "10.14.2-windows_amd64": ("node-v10.14.2-win-x64.zip", "node-v10.14.2-win-x64", "45841fe5ffe87378c748dcb9799507f6192c34117409b2c6c18480d112a337de"), "10.15.0-darwin_amd64": ("node-v10.15.0-darwin-x64.tar.gz", "node-v10.15.0-darwin-x64", "353402461c898c569658d0a963790476f4d9828cc6c9286d81617ee8afcba4e8"), "10.15.0-linux_arm64": ("node-v10.15.0-linux-arm64.tar.xz", "node-v10.15.0-linux-arm64", "77aa4a02c5471b6eb7ba935cbc6829889a27115353cff7226a208c08b654e972"), "10.15.0-linux_amd64": ("node-v10.15.0-linux-x64.tar.xz", "node-v10.15.0-linux-x64", "4ee8503c1133797777880ebf75dcf6ae3f9b894c66fd2d5da507e407064c13b5"), "10.15.0-windows_amd64": ("node-v10.15.0-win-x64.zip", "node-v10.15.0-win-x64", "c1dbc9372ad789cd21727cb5f63b4a44ed3eae216763959cff8e68e68c6fcfe1"), "10.15.1-darwin_amd64": ("node-v10.15.1-darwin-x64.tar.gz", "node-v10.15.1-darwin-x64", "327dcef4b61dead1ae04d2743d3390a2b7e6cc6c389c62cfcfeb0486c5a9f181"), "10.15.1-linux_arm64": ("node-v10.15.1-linux-arm64.tar.xz", "node-v10.15.1-linux-arm64", "0fb6d24972fd991f476a942b1b21aca5059f93b9302318c5883120445ee6cd54"), "10.15.1-linux_amd64": ("node-v10.15.1-linux-x64.tar.xz", "node-v10.15.1-linux-x64", "77db68544c7812e925b82ccc41cd4669fdeb191cea8e20053e3f0e86889c4fce"), "10.15.1-windows_amd64": ("node-v10.15.1-win-x64.zip", "node-v10.15.1-win-x64", "bb5bdc9363e4050c94b3f82888141b81630230f86e520abb7dde49081f1292b9"), "10.15.2-darwin_amd64": ("node-v10.15.2-darwin-x64.tar.gz", "node-v10.15.2-darwin-x64", "8bbb6c15a0572f493d33ef044d06ccd0ff7ead8daa67f9a32df3e863277568e8"), "10.15.2-linux_arm64": ("node-v10.15.2-linux-arm64.tar.xz", "node-v10.15.2-linux-arm64", "2978e82d85654505d732b40dfa58f21276d99712d5d001101eaf87100d350139"), "10.15.2-linux_amd64": ("node-v10.15.2-linux-x64.tar.xz", "node-v10.15.2-linux-x64", "c10eece562cfeef1627f0d2bde7dc0be810948f6bf9a932e30a8c3b425652015"), "10.15.2-windows_amd64": ("node-v10.15.2-win-x64.zip", "node-v10.15.2-win-x64", "d97cf4788ccea6deef037ce27c91cc1a814644b878311b71811ab04d0bb8c47f"), "10.15.3-darwin_amd64": ("node-v10.15.3-darwin-x64.tar.gz", "node-v10.15.3-darwin-x64", "7a5eaa1f69614375a695ccb62017248e5dcc15b0b8edffa7db5b52997cf992ba"), "10.15.3-linux_arm64": ("node-v10.15.3-linux-arm64.tar.xz", "node-v10.15.3-linux-arm64", "3d7abbf64bffb07c55168ca0f1c17be12b0d93affe9b6cadd39724649215fab9"), "10.15.3-linux_amd64": ("node-v10.15.3-linux-x64.tar.xz", "node-v10.15.3-linux-x64", "faddbe418064baf2226c2fcbd038c3ef4ae6f936eb952a1138c7ff8cfe862438"), "10.15.3-windows_amd64": ("node-v10.15.3-win-x64.zip", "node-v10.15.3-win-x64", "93c881fdc0455a932dd5b506a7a03df27d9fe36155c1d3f351ebfa4e20bf1c0d"), "10.16.0-darwin_amd64": ("node-v10.16.0-darwin-x64.tar.gz", "node-v10.16.0-darwin-x64", "6c009df1b724026d84ae9a838c5b382662e30f6c5563a0995532f2bece39fa9c"), "10.16.0-linux_arm64": ("node-v10.16.0-linux-arm64.tar.xz", "node-v10.16.0-linux-arm64", "ae2e74ab2f5dbff96bf0b7d8457004bf3538233916f8834740bbe2d5a35442e5"), "10.16.0-linux_amd64": ("node-v10.16.0-linux-x64.tar.xz", "node-v10.16.0-linux-x64", "1827f5b99084740234de0c506f4dd2202a696ed60f76059696747c34339b9d48"), "10.16.0-windows_amd64": ("node-v10.16.0-win-x64.zip", "node-v10.16.0-win-x64", "aa22cb357f0fb54ccbc06b19b60e37eefea5d7dd9940912675d3ed988bf9a059"), "10.16.1-darwin_amd64": ("node-v10.16.1-darwin-x64.tar.gz", "node-v10.16.1-darwin-x64", "328e61fdacfe2f6f1a049d57e248b3eafc0345747831323a14fe1edf98d9b3bb"), "10.16.1-linux_arm64": ("node-v10.16.1-linux-arm64.tar.xz", "node-v10.16.1-linux-arm64", "c46ba1a8e9b9c0490ae81f8b2b13d332ed6f5c86d172fa817f749042ab329b93"), "10.16.1-linux_amd64": ("node-v10.16.1-linux-x64.tar.xz", "node-v10.16.1-linux-x64", "127d9b2f485523805208f867fc513842570b29b4d6831773eeb6dd403a22ba9d"), "10.16.1-windows_amd64": ("node-v10.16.1-win-x64.zip", "node-v10.16.1-win-x64", "1ff8b26670e1b935b51f4b795728f29845c31a3c38b3220b4fe71fb139bc5623"), "10.16.2-darwin_amd64": ("node-v10.16.2-darwin-x64.tar.gz", "node-v10.16.2-darwin-x64", "21ee8bdb04909f553e97af7c6e41009e15d06b886dd3e2ca8a92ce3e0a148a09"), "10.16.2-linux_arm64": ("node-v10.16.2-linux-arm64.tar.xz", "node-v10.16.2-linux-arm64", "5fb2b7d3c2b6b40e237cdc172eabfac2e485ee309ac2bcfbff413de1ed79a59e"), "10.16.2-linux_amd64": ("node-v10.16.2-linux-x64.tar.xz", "node-v10.16.2-linux-x64", "406718dc2f3164b3d1981c36b68b70ea448fbbac29cefbe23ff286b3cd55f264"), "10.16.2-windows_amd64": ("node-v10.16.2-win-x64.zip", "node-v10.16.2-win-x64", "01654dc79d82e9f3c89d01c8cf1cdce68d3a9118dbe968ee86a3ffd6ee153567"), "10.16.3-darwin_amd64": ("node-v10.16.3-darwin-x64.tar.gz", "node-v10.16.3-darwin-x64", "6febc571e1543c2845fa919c6d06b36a24e4e142c91aedbe28b6ff7d296119e4"), "10.16.3-linux_arm64": ("node-v10.16.3-linux-arm64.tar.xz", "node-v10.16.3-linux-arm64", "8ee77bad022bd460bf2867a97bf56ce7ddc4aa2ace067e45995fb1721a958428"), "10.16.3-linux_amd64": ("node-v10.16.3-linux-x64.tar.xz", "node-v10.16.3-linux-x64", "d2271fd8cf997fa7447d638dfa92749ff18ca4b0d796bf89f2a82bf7800d5506"), "10.16.3-windows_amd64": ("node-v10.16.3-win-x64.zip", "node-v10.16.3-win-x64", "19aa47de7c5950d7bd71a1e878013b98d93871cc311d7185f5472e6d3f633146"), "10.17.0-darwin_amd64": ("node-v10.17.0-darwin-x64.tar.gz", "node-v10.17.0-darwin-x64", "9b96140ad74b217f216c83ddf50d1f70a4296576f6edbbbfb65d0f478015d9df"), "10.17.0-linux_arm64": ("node-v10.17.0-linux-arm64.tar.xz", "node-v10.17.0-linux-arm64", "3ab8ee2b5c9aa4d060c68667ddef70cc2960e12bcfe4a0f2de7ebc0f008bf13d"), "10.17.0-linux_amd64": ("node-v10.17.0-linux-x64.tar.xz", "node-v10.17.0-linux-x64", "2b49cd296f969ef0ffb7922719ffa6542bedb89d6c959a47c023d11ce222f5d6"), "10.17.0-windows_amd64": ("node-v10.17.0-win-x64.zip", "node-v10.17.0-win-x64", "e84a1f3685219811bb4662eb3e3b55abd0c764c24cd2b224ba31b3f9f162baf6"), "10.18.0-darwin_amd64": ("node-v10.18.0-darwin-x64.tar.gz", "node-v10.18.0-darwin-x64", "a7af53e3363e8ab654b97387bc7cf352dddb324562404c1d35fe10cba3f27e0f"), "10.18.0-linux_arm64": ("node-v10.18.0-linux-arm64.tar.xz", "node-v10.18.0-linux-arm64", "b2b34dd43ea3979890663afa270e09e09c219f046e39e8e439eeda2821cc9643"), "10.18.0-linux_amd64": ("node-v10.18.0-linux-x64.tar.xz", "node-v10.18.0-linux-x64", "eac160acfc2c5b6fca021baa9943341fea50859f19c7ccbd56669b1fe04e691e"), "10.18.0-windows_amd64": ("node-v10.18.0-win-x64.zip", "node-v10.18.0-win-x64", "56afcc9c191dfc99017725be92ac1331e23afb1930913446eb91852cb02a8687"), "10.18.1-darwin_amd64": ("node-v10.18.1-darwin-x64.tar.gz", "node-v10.18.1-darwin-x64", "2b2d3379420e626eee393cabf1c90bc55957ff5bb067b82a74eb2f92147d6757"), "10.18.1-linux_arm64": ("node-v10.18.1-linux-arm64.tar.xz", "node-v10.18.1-linux-arm64", "9a6203697e0087a1c909961481d579c76777df1df622921e4ce16198851f30fe"), "10.18.1-linux_amd64": ("node-v10.18.1-linux-x64.tar.xz", "node-v10.18.1-linux-x64", "8cc40f45c2c62529b15e83a6bbe0ac1febf57af3c5720df68067c96c0fddbbdf"), "10.18.1-windows_amd64": ("node-v10.18.1-win-x64.zip", "node-v10.18.1-win-x64", "fb27bb95c27c72f2e25d0c41309b606b2ae48ba0d6094a19f206ad1df9dc5e19"), "10.19.0-darwin_amd64": ("node-v10.19.0-darwin-x64.tar.gz", "node-v10.19.0-darwin-x64", "b16328570651be44213a2303c1f9515fc506e0a96a273806f71ed000e3ca3cb3"), "10.19.0-linux_arm64": ("node-v10.19.0-linux-arm64.tar.xz", "node-v10.19.0-linux-arm64", "77bdbf859fc38e6e860efd479b0a7b7b6bd3e7cb05337e5cc5638251eb5d3a59"), "10.19.0-linux_amd64": ("node-v10.19.0-linux-x64.tar.xz", "node-v10.19.0-linux-x64", "34127c7c6b1ba02d6d4dc3a926f38a5fb88bb37fc7f051349005ce331c7a53c6"), "10.19.0-windows_amd64": ("node-v10.19.0-win-x64.zip", "node-v10.19.0-win-x64", "210efd45a7f79cf4c350d8f575f990becdd3833cd922796a4c83b27996f5679e"), "10.20.0-darwin_amd64": ("node-v10.20.0-darwin-x64.tar.gz", "node-v10.20.0-darwin-x64", "c153832774afcae89a82efb55ed80557d1a41e1880638ad57128a9a3762d212f"), "10.20.0-linux_arm64": ("node-v10.20.0-linux-arm64.tar.xz", "node-v10.20.0-linux-arm64", "f3567924d6b7f0fa55c4ee0a7330ec0dcaeec557982794796d6b312e7053c674"), "10.20.0-linux_amd64": ("node-v10.20.0-linux-x64.tar.xz", "node-v10.20.0-linux-x64", "c5721a89feecc0e98d42386e171cb763c077f782033ddc998819edcf9d93b691"), "10.20.0-windows_amd64": ("node-v10.20.0-win-x64.zip", "node-v10.20.0-win-x64", "d266313fa22885a6ec76eea521fb8a1131b4d9fb3a57afb045a98301aeb7d24e"), "10.20.1-darwin_amd64": ("node-v10.20.1-darwin-x64.tar.gz", "node-v10.20.1-darwin-x64", "6437e364cd93be246ffb67dd40775cbb467bb8d28d8af4413123f478bb6234b9"), "10.20.1-linux_arm64": ("node-v10.20.1-linux-arm64.tar.xz", "node-v10.20.1-linux-arm64", "e33cafff94a6308916530b4b724bbc138399484d96f71b1c23677596bec268d0"), "10.20.1-linux_amd64": ("node-v10.20.1-linux-x64.tar.xz", "node-v10.20.1-linux-x64", "5e0b1fbc6cf8c2c34dc33d880670ee1bc1c1e931099de3796a96143a962c92ee"), "10.20.1-windows_amd64": ("node-v10.20.1-win-x64.zip", "node-v10.20.1-win-x64", "5e4ec0936c51047c218c0c164cc80283cd36ecd40e0a6979281d395c1be8ee10"), "10.21.0-darwin_amd64": ("node-v10.21.0-darwin-x64.tar.gz", "node-v10.21.0-darwin-x64", "596900700c4a0de0303bb4c378a1abcd63f31efc848704c5fbc1230de628577a"), "10.21.0-linux_arm64": ("node-v10.21.0-linux-arm64.tar.xz", "node-v10.21.0-linux-arm64", "3af40706ff0da7fe0baa4683ead6c74445405a2553e7373e627f24d19d4ac100"), "10.21.0-linux_amd64": ("node-v10.21.0-linux-x64.tar.xz", "node-v10.21.0-linux-x64", "1d3296763e46540047099e4910812e81c4899c0595f2d82474e2099c1e1603e2"), "10.21.0-windows_amd64": ("node-v10.21.0-win-x64.zip", "node-v10.21.0-win-x64", "03dddcdaccdb40978ddf15d189acdc20409d9a666636db2595118690ff83ce82"), "10.22.0-darwin_amd64": ("node-v10.22.0-darwin-x64.tar.gz", "node-v10.22.0-darwin-x64", "c7583a297ba9c6cfc03688a32776155d02fabf9ff45847c63b12a68d400f1dc1"), "10.22.0-linux_arm64": ("node-v10.22.0-linux-arm64.tar.xz", "node-v10.22.0-linux-arm64", "abacc6f37e8dfbe398843c7dc7b9bb7153ff6e653ad50e85d73d86088da48372"), "10.22.0-linux_amd64": ("node-v10.22.0-linux-x64.tar.xz", "node-v10.22.0-linux-x64", "ddf33e038c593d6df36b1dd4b25c1b6fa8230c615e6312ad33e80ef863e4a74f"), "10.22.0-windows_amd64": ("node-v10.22.0-win-x64.zip", "node-v10.22.0-win-x64", "931c2907450790f89aa178fa84c1adbd1f7cb7ab0a34f8bfb4af25640e8d4e06"), "11.0.0-darwin_amd64": ("node-v11.0.0-darwin-x64.tar.gz", "node-v11.0.0-darwin-x64", "f70e12d246ba35e88c5c08a195215c5c913ce66c9d95d0bd21cc1d3e69904279"), "11.0.0-linux_arm64": ("node-v11.0.0-linux-arm64.tar.xz", "node-v11.0.0-linux-arm64", "0d0c7013fd00a8e713c36aa96bcc268eeadbad2ce48d87e19849d66f4c618cad"), "11.0.0-linux_amd64": ("node-v11.0.0-linux-x64.tar.xz", "node-v11.0.0-linux-x64", "418b1a73bcafbf5dd3bc787f0440c2b4123dfecc2b239f5651f0256cb5ab606d"), "11.0.0-windows_amd64": ("node-v11.0.0-win-x64.zip", "node-v11.0.0-win-x64", "4dd3ef7f5c8181be39cd45476b22ed34b6da2bf77377b699384d426702f8c969"), "11.1.0-darwin_amd64": ("node-v11.1.0-darwin-x64.tar.gz", "node-v11.1.0-darwin-x64", "5d6b84d2b0fd6afee07c371bc815a9e4b6671b85bedcb38815310bd0f884d3c8"), "11.1.0-linux_arm64": ("node-v11.1.0-linux-arm64.tar.xz", "node-v11.1.0-linux-arm64", "cbba27e1c90701fbb9db66cc2c6cc3049aaf08adb16cabd0cad970b74cdaf6d3"), "11.1.0-linux_amd64": ("node-v11.1.0-linux-x64.tar.xz", "node-v11.1.0-linux-x64", "c70419674d932452017556080264de2b6d1105c112647dd1dd495b739456dd91"), "11.1.0-windows_amd64": ("node-v11.1.0-win-x64.zip", "node-v11.1.0-win-x64", "985e4edc758cb5f77f85cddda0155616b92f163b8d3842c542b1c8a395068418"), "11.2.0-darwin_amd64": ("node-v11.2.0-darwin-x64.tar.gz", "node-v11.2.0-darwin-x64", "cd17fafcdb21ae80fb94e455e63567c70b3bceedf982b93ae9e4aea411f6a6ea"), "11.2.0-linux_arm64": ("node-v11.2.0-linux-arm64.tar.xz", "node-v11.2.0-linux-arm64", "3e6c47a29b85030b4305bdc2e15cbe37e1b54a2338ce1790637384ce349ed1fd"), "11.2.0-linux_amd64": ("node-v11.2.0-linux-x64.tar.xz", "node-v11.2.0-linux-x64", "629a603443c275f8ecd851994b81a9c02a36343dbcbafc279cbecb9ccd9cf906"), "11.2.0-windows_amd64": ("node-v11.2.0-win-x64.zip", "node-v11.2.0-win-x64", "3440b2880b4e3b78c9c18865df263317e7d3c3e179dad960d526004dc7e6ba9a"), "11.3.0-darwin_amd64": ("node-v11.3.0-darwin-x64.tar.gz", "node-v11.3.0-darwin-x64", "54acc7bdeffae79fdd73f959712305aee1d8d487d56813b43cae96d151ec79db"), "11.3.0-linux_arm64": ("node-v11.3.0-linux-arm64.tar.xz", "node-v11.3.0-linux-arm64", "642cc3fc94a856ad6d09e76eaf869672bef925308afdad398a58f18eeaf4e4b8"), "11.3.0-linux_amd64": ("node-v11.3.0-linux-x64.tar.xz", "node-v11.3.0-linux-x64", "d37fb7fae8a185409bccf106e91d8ffa3450115852795512fc62e6da0b5e3dbb"), "11.3.0-windows_amd64": ("node-v11.3.0-win-x64.zip", "node-v11.3.0-win-x64", "b801e908ec36a07f06df388845e22e0b7f3cede7a4030896712c8ee28cdb3f05"), "11.4.0-darwin_amd64": ("node-v11.4.0-darwin-x64.tar.gz", "node-v11.4.0-darwin-x64", "05a515146d5bc397625f442a6ecbbc7f0d071a2a7efbf1e2b2ed46d728bc7b30"), "11.4.0-linux_arm64": ("node-v11.4.0-linux-arm64.tar.xz", "node-v11.4.0-linux-arm64", "c32e752e74794a4254ae4caa892b7beb3be60dba6851e8e5d637febfb659ee3a"), "11.4.0-linux_amd64": ("node-v11.4.0-linux-x64.tar.xz", "node-v11.4.0-linux-x64", "24d9be161e7fb28e761801639cb452ff223269ed53d967e5745b5c6391eb3fbd"), "11.4.0-windows_amd64": ("node-v11.4.0-win-x64.zip", "node-v11.4.0-win-x64", "30b84ab0101c8916694e6cd6c0ccb5182e4555da5e06deb080e906ef5b3893df"), "11.5.0-darwin_amd64": ("node-v11.5.0-darwin-x64.tar.gz", "node-v11.5.0-darwin-x64", "741abd58ac67b4bf8d2ef991a7487ea17e421b2248688b93be0d2f34886c6aa2"), "11.5.0-linux_arm64": ("node-v11.5.0-linux-arm64.tar.xz", "node-v11.5.0-linux-arm64", "3f1436c1de70b2e34f7a63a5af7e6b106a8ebe9289b3f7d045ac4a4856570164"), "11.5.0-linux_amd64": ("node-v11.5.0-linux-x64.tar.xz", "node-v11.5.0-linux-x64", "ada54407b505b7e6f516c753f0e49220917dd11efa5ee892d3252bdd65d4a54c"), "11.5.0-windows_amd64": ("node-v11.5.0-win-x64.zip", "node-v11.5.0-win-x64", "3692939b1bbd7ee8b0a967429eef6b1d45078c2f4fc289aae261ca5bde5a0607"), "11.6.0-darwin_amd64": ("node-v11.6.0-darwin-x64.tar.gz", "node-v11.6.0-darwin-x64", "c880063b112c48130dba8f7b058de61959ae46fddcfa363715571b22c1cbeb26"), "11.6.0-linux_arm64": ("node-v11.6.0-linux-arm64.tar.xz", "node-v11.6.0-linux-arm64", "956016db41f4f96f8e005d36c738d7c833442d09a970462552eb214027e0268a"), "11.6.0-linux_amd64": ("node-v11.6.0-linux-x64.tar.xz", "node-v11.6.0-linux-x64", "2251a6c5b332e7ea69bbefba11950cb6c27ba50fa700468711f729da6a6f5324"), "11.6.0-windows_amd64": ("node-v11.6.0-win-x64.zip", "node-v11.6.0-win-x64", "d230828c1cc9863c9768106ffee0320ba42049b594bd2689e430b872e8f0b2dd"), "11.7.0-darwin_amd64": ("node-v11.7.0-darwin-x64.tar.gz", "node-v11.7.0-darwin-x64", "873b47e6fc97aef2f73b0e8dde641967b2a84a3b63d1697b9d8813e14fb3b01c"), "11.7.0-linux_arm64": ("node-v11.7.0-linux-arm64.tar.xz", "node-v11.7.0-linux-arm64", "82b9726c6b367a43530f868f61b1b2a05c942d3decdf9d2e18b4a9bdf353c223"), "11.7.0-linux_amd64": ("node-v11.7.0-linux-x64.tar.xz", "node-v11.7.0-linux-x64", "b2a0a7dde17fe0da5f86ce5fea3da2861d652a5e702e2177ee62813ff86451c0"), "11.7.0-windows_amd64": ("node-v11.7.0-win-x64.zip", "node-v11.7.0-win-x64", "00834d16532f24583bf56d2baab03904b0220154cc712344be95e4d05c6234dd"), "11.8.0-darwin_amd64": ("node-v11.8.0-darwin-x64.tar.gz", "node-v11.8.0-darwin-x64", "fbb26b38f408c2f2324a5821062c16103f54de16d24f9f24c4e270a3a41f4832"), "11.8.0-linux_arm64": ("node-v11.8.0-linux-arm64.tar.xz", "node-v11.8.0-linux-arm64", "42b190c686cb8bafbdbf418a6c20c6785a23ba0f1a1a85af44595057a3d5e25e"), "11.8.0-linux_amd64": ("node-v11.8.0-linux-x64.tar.xz", "node-v11.8.0-linux-x64", "85ca19c495d5cac6acf6ee4a3c8dfb4489fb67fefc184c61eb4513eb5ef99a88"), "11.8.0-windows_amd64": ("node-v11.8.0-win-x64.zip", "node-v11.8.0-win-x64", "cd4db1b9e7ac29ed81d433f2de85582902670a121961aa3f350533d5b2fd44c6"), "11.9.0-darwin_amd64": ("node-v11.9.0-darwin-x64.tar.gz", "node-v11.9.0-darwin-x64", "1df3dd99d174bb8cb61cc8e2aa419a4998c7ada9454123c34991ce30632f1ef8"), "11.9.0-linux_arm64": ("node-v11.9.0-linux-arm64.tar.xz", "node-v11.9.0-linux-arm64", "f39baa8d212e9676bfa7f1601f94d789c6dc6b35caf440df6ec815d238978457"), "11.9.0-linux_amd64": ("node-v11.9.0-linux-x64.tar.xz", "node-v11.9.0-linux-x64", "9bc461fb7f5fd3344301abfda834160d5397a4e289f9749ab03ba0b7e9a4c853"), "11.9.0-windows_amd64": ("node-v11.9.0-win-x64.zip", "node-v11.9.0-win-x64", "c62c01436f632858fea0194d4168b483e1aa485c3fc72247add4899a103c2677"), "11.10.0-darwin_amd64": ("node-v11.10.0-darwin-x64.tar.gz", "node-v11.10.0-darwin-x64", "1956528c6f3934a97508e36a4855c154f40f1923ccd61e296d5a85679103e3a1"), "11.10.0-linux_arm64": ("node-v11.10.0-linux-arm64.tar.xz", "node-v11.10.0-linux-arm64", "60ed6caa90d8188a55f0dbc63f4aef263fb4863e036d32989b820a2e40582c66"), "11.10.0-linux_amd64": ("node-v11.10.0-linux-x64.tar.xz", "node-v11.10.0-linux-x64", "fe4c617aaf88b5228bce0341d1c77bbae2622d69eaa17a15b7d4bcc60c4777c5"), "11.10.0-windows_amd64": ("node-v11.10.0-win-x64.zip", "node-v11.10.0-win-x64", "c39e711aebe678455fa74edf6d8f6184d6d93e20f160197799040a0c17005dba"), "11.10.1-darwin_amd64": ("node-v11.10.1-darwin-x64.tar.gz", "node-v11.10.1-darwin-x64", "dea52b86f6875efae26fbb6d0269d9769da7ca69408b74b6ab724d4b64004b07"), "11.10.1-linux_arm64": ("node-v11.10.1-linux-arm64.tar.xz", "node-v11.10.1-linux-arm64", "b116e57906ed73c970d64e7518b08c6de236575c5cd8bf09f4c1bd668524a014"), "11.10.1-linux_amd64": ("node-v11.10.1-linux-x64.tar.xz", "node-v11.10.1-linux-x64", "414216a7e47dbfb77141dce7a4452901ae2cdb4cd0deef3ab3ab49e0b2111f82"), "11.10.1-windows_amd64": ("node-v11.10.1-win-x64.zip", "node-v11.10.1-win-x64", "80cf14abacbc6b636bc192f4eee49421f082f21cdaa9c1ea5995c38f8c1375e5"), "11.11.0-darwin_amd64": ("node-v11.11.0-darwin-x64.tar.gz", "node-v11.11.0-darwin-x64", "6b7c8d93096bf065de0d0a42e8f027c424172c82df6f015d3149a5dbfa03c1cc"), "11.11.0-linux_arm64": ("node-v11.11.0-linux-arm64.tar.xz", "node-v11.11.0-linux-arm64", "febb698e74264ec0ecc738c86347e6bfb5d27e33ed492a031626df988a5fb4f3"), "11.11.0-linux_amd64": ("node-v11.11.0-linux-x64.tar.xz", "node-v11.11.0-linux-x64", "ee09c7712e741f84948f76a72b651bf088e516c3f38569b9e6f30c38c026c262"), "11.11.0-windows_amd64": ("node-v11.11.0-win-x64.zip", "node-v11.11.0-win-x64", "154a5b7ca7033382743c4752fa465a5d9902f4abed4263a38ea3f41ffa113910"), "11.12.0-darwin_amd64": ("node-v11.12.0-darwin-x64.tar.gz", "node-v11.12.0-darwin-x64", "93d68c1af41d02b262b3383d69b46eb326707ec010b321ad5655b91c4956e783"), "11.12.0-linux_arm64": ("node-v11.12.0-linux-arm64.tar.xz", "node-v11.12.0-linux-arm64", "9e89838e290c9bb478351bd403707d0b741ec56021c379c9f6da515a4cd1064a"), "11.12.0-linux_amd64": ("node-v11.12.0-linux-x64.tar.xz", "node-v11.12.0-linux-x64", "1c6bb93a24eda832708c1c10ec20316e1e4f30b3cfca9c5ee5d446762414b116"), "11.12.0-windows_amd64": ("node-v11.12.0-win-x64.zip", "node-v11.12.0-win-x64", "68e5bca1d6dd6b3de20870e7c593f9a890c48d2c9c83e15034baad6f7c0da426"), "11.13.0-darwin_amd64": ("node-v11.13.0-darwin-x64.tar.gz", "node-v11.13.0-darwin-x64", "c1a8f94b4778dad2d9f513cfdf9091810dc733a2daf4fa7e03d49ad133415b5d"), "11.13.0-linux_arm64": ("node-v11.13.0-linux-arm64.tar.xz", "node-v11.13.0-linux-arm64", "0edb29004fdbb5808331e765b4adde8b025a13d6619f49fec60a14582aba9ed7"), "11.13.0-linux_amd64": ("node-v11.13.0-linux-x64.tar.xz", "node-v11.13.0-linux-x64", "c2ae3caced5f181df282a6974ab3f5e232b5decb821aa8ea8fe758b0e0528223"), "11.13.0-windows_amd64": ("node-v11.13.0-win-x64.zip", "node-v11.13.0-win-x64", "f3dafd1f19841244f8f12952f9919c0a2857f6920b11f2a89554b061cd5a4525"), "11.14.0-darwin_amd64": ("node-v11.14.0-darwin-x64.tar.gz", "node-v11.14.0-darwin-x64", "37b8db4f6700a4b5aa3b6d4283538753953f6293aff99866aa9a81038848a4d9"), "11.14.0-linux_arm64": ("node-v11.14.0-linux-arm64.tar.xz", "node-v11.14.0-linux-arm64", "3d463f3b48e1060027f8a552657de6f3ee4724d718d546aa4ea5c301ee4ed083"), "11.14.0-linux_amd64": ("node-v11.14.0-linux-x64.tar.xz", "node-v11.14.0-linux-x64", "89e2cb0effa9bf075ee8bb6d92a6a50f7ccfdad03dd687f52ecdfab91230f9a1"), "11.14.0-windows_amd64": ("node-v11.14.0-win-x64.zip", "node-v11.14.0-win-x64", "58a5d3316c04335ff3da2ce66b89f3cce86b1d1ca878d1d6d68478160c66dc12"), "11.15.0-darwin_amd64": ("node-v11.15.0-darwin-x64.tar.gz", "node-v11.15.0-darwin-x64", "e953b657b1049e1de509a3fd0700cfeecd175f75a0d141d71393aa0d71fa29a9"), "11.15.0-linux_arm64": ("node-v11.15.0-linux-arm64.tar.xz", "node-v11.15.0-linux-arm64", "e458aa4c69da9ca2ae566c8eb56dc8b36d573b415bfd8eebca4ff2229fc4983d"), "11.15.0-linux_amd64": ("node-v11.15.0-linux-x64.tar.xz", "node-v11.15.0-linux-x64", "17424aef198fa322b93c79217ce7e8cdd264fed40383abbbd3e63c305ce1d7d8"), "11.15.0-windows_amd64": ("node-v11.15.0-win-x64.zip", "node-v11.15.0-win-x64", "f3cef50acf566724a5ec5df7697fb527d7339cafdae6c7c406a39358aee6cdf8"), "12.0.0-darwin_amd64": ("node-v12.0.0-darwin-x64.tar.gz", "node-v12.0.0-darwin-x64", "92c81a284e909424b50dd01e175260b75bbbdb487fdfe1885229817187ea76bc"), "12.0.0-linux_arm64": ("node-v12.0.0-linux-arm64.tar.xz", "node-v12.0.0-linux-arm64", "2ac36aa51f76654a8914d41a32bd5c3d3213cba14eea84abd9919d022b5694b4"), "12.0.0-linux_amd64": ("node-v12.0.0-linux-x64.tar.xz", "node-v12.0.0-linux-x64", "7a5609167265954cfb912e4dc8f36e5469335b6be1bb11d60d8427f92c03f5f9"), "12.0.0-windows_amd64": ("node-v12.0.0-win-x64.zip", "node-v12.0.0-win-x64", "96ab5f9f61d75daf3fb1072930b6e9249f15b77bc3b3dca516ae8439dc1500fb"), "12.1.0-darwin_amd64": ("node-v12.1.0-darwin-x64.tar.gz", "node-v12.1.0-darwin-x64", "57c592b13940aa44611aec08e7b425f35565a2c95c51736f433cb36eb65105b7"), "12.1.0-linux_arm64": ("node-v12.1.0-linux-arm64.tar.xz", "node-v12.1.0-linux-arm64", "67805a7976bef30d0e12211f18a99c6de405931e493fd32f451512473661ee10"), "12.1.0-linux_amd64": ("node-v12.1.0-linux-x64.tar.xz", "node-v12.1.0-linux-x64", "331c43176a20e705c6f4fdb61c69fee44dd3c2c93a20410be2c13b4f8515ef7b"), "12.1.0-windows_amd64": ("node-v12.1.0-win-x64.zip", "node-v12.1.0-win-x64", "6dc3ef4a6b4ce527f187270a1b0c5560771126df487ab9ddc4c3cd3b37d57eb6"), "12.2.0-darwin_amd64": ("node-v12.2.0-darwin-x64.tar.gz", "node-v12.2.0-darwin-x64", "c72ae8a2b989138c6e6e9b393812502df8c28546a016cf24e7a82dd27e3838af"), "12.2.0-linux_arm64": ("node-v12.2.0-linux-arm64.tar.xz", "node-v12.2.0-linux-arm64", "42e4a5c6ad0b402e281daf46a27a269249bdb8b4e31ff8869701aaddac2cc8c4"), "12.2.0-linux_amd64": ("node-v12.2.0-linux-x64.tar.xz", "node-v12.2.0-linux-x64", "89059969861606e2a435ff2619c4df6f41c040120e507d9c4f03374353357307"), "12.2.0-windows_amd64": ("node-v12.2.0-win-x64.zip", "node-v12.2.0-win-x64", "c1e7fb3c1c15d8f2ab5c1db9c9662097f9c682164b3f7397955ccce946442c97"), "12.3.0-darwin_amd64": ("node-v12.3.0-darwin-x64.tar.gz", "node-v12.3.0-darwin-x64", "4a9faa038fb4e6e930a0fecd9818a4820b4ca91d1c45a1c1279fe49cdbd28160"), "12.3.0-linux_arm64": ("node-v12.3.0-linux-arm64.tar.xz", "node-v12.3.0-linux-arm64", "3d6e7046b938ff1f2535bdcc892a82abf44d875d1e96779cc3ea9a074ccfa200"), "12.3.0-linux_amd64": ("node-v12.3.0-linux-x64.tar.xz", "node-v12.3.0-linux-x64", "2ce2c7a4d7fe3c560415e8dcbc5905a66a8bf28e2a2b2cff7e7a4eeb5753015d"), "12.3.0-windows_amd64": ("node-v12.3.0-win-x64.zip", "node-v12.3.0-win-x64", "b36c9f9809c90ce704465f066861314d6e33176a5d45da14c1519c3e4f35063e"), "12.3.1-darwin_amd64": ("node-v12.3.1-darwin-x64.tar.gz", "node-v12.3.1-darwin-x64", "b9c979f63a356090d8ff88ed141fd856ad853165c73633794a9d3a060334378e"), "12.3.1-linux_arm64": ("node-v12.3.1-linux-arm64.tar.xz", "node-v12.3.1-linux-arm64", "88df7f2e0c4a58661bb79b637daa417929efc6c4d6a77bba42a5127c5c383257"), "12.3.1-linux_amd64": ("node-v12.3.1-linux-x64.tar.xz", "node-v12.3.1-linux-x64", "46f52868c0643fe0d167ce24c3c873880c8e1494276c89c07114fb099da4f75a"), "12.3.1-windows_amd64": ("node-v12.3.1-win-x64.zip", "node-v12.3.1-win-x64", "aac3c4543f846c7ebf63e1498dec7955119dffffe65722bd8c6d2124ed4ecbd7"), "12.4.0-darwin_amd64": ("node-v12.4.0-darwin-x64.tar.gz", "node-v12.4.0-darwin-x64", "aaff97d59cda775165ef966ae74e70f55f3267e86d735ed3740ae9bf1d40531e"), "12.4.0-linux_arm64": ("node-v12.4.0-linux-arm64.tar.xz", "node-v12.4.0-linux-arm64", "bb2e7eabebdceb52424516dabce94cb37f55419e6ed19493916843a323c423cd"), "12.4.0-linux_amd64": ("node-v12.4.0-linux-x64.tar.xz", "node-v12.4.0-linux-x64", "9aec6a2a50c1791704a6069cbda6da62781361e44814d024e8bbaaf0deb41c5e"), "12.4.0-windows_amd64": ("node-v12.4.0-win-x64.zip", "node-v12.4.0-win-x64", "ec8623e2528a35d3219200308e7ed41e24d4f7cd96530a4e6ac2513e44f7fad1"), "12.5.0-darwin_amd64": ("node-v12.5.0-darwin-x64.tar.gz", "node-v12.5.0-darwin-x64", "a9ba9f584f015f1705063c10dd8d84d43f5b09dc7ecf4ee3968ab1ff1fe5d2b5"), "12.5.0-linux_arm64": ("node-v12.5.0-linux-arm64.tar.xz", "node-v12.5.0-linux-arm64", "d43b71a97f5484d13b655a8a0c1b1c0fc7e83b3719063cc362fe557d6e26bd69"), "12.5.0-linux_amd64": ("node-v12.5.0-linux-x64.tar.xz", "node-v12.5.0-linux-x64", "37c0c539aae69370f3c014cc4947748ce45ac5fa560f9b085724f22029834b27"), "12.5.0-windows_amd64": ("node-v12.5.0-win-x64.zip", "node-v12.5.0-win-x64", "f1b426fcd39ffdfec5d8ba60c6842cc11e9f49269cd49bc34c4fcee0517ddf66"), "12.6.0-darwin_amd64": ("node-v12.6.0-darwin-x64.tar.gz", "node-v12.6.0-darwin-x64", "004b7992a2621eb35a47c94d258510ca5744b5a8072364f235dc7e3d4bff7457"), "12.6.0-linux_arm64": ("node-v12.6.0-linux-arm64.tar.xz", "node-v12.6.0-linux-arm64", "b7a6580f0c5406b990b3c9f0d91297b103e38e2752b8b745c4d15310a9dd79d1"), "12.6.0-linux_amd64": ("node-v12.6.0-linux-x64.tar.xz", "node-v12.6.0-linux-x64", "1ac14567e2be5562df209900e28430bd11575d985a85e8a6df2743428570de33"), "12.6.0-windows_amd64": ("node-v12.6.0-win-x64.zip", "node-v12.6.0-win-x64", "0c5ac670c5bb0ea0d389bb7269cb84104702826f791a1d057eae02cdb9eed717"), "12.7.0-darwin_amd64": ("node-v12.7.0-darwin-x64.tar.gz", "node-v12.7.0-darwin-x64", "1a76bea7f7ed8c5c921852269ddd1300c9baba2f1e3f0377200a22c22cdea177"), "12.7.0-linux_arm64": ("node-v12.7.0-linux-arm64.tar.xz", "node-v12.7.0-linux-arm64", "abc4500eff8437503d475726b8ac2ed3463d2982bd66925a782f91b7d96e31de"), "12.7.0-linux_amd64": ("node-v12.7.0-linux-x64.tar.xz", "node-v12.7.0-linux-x64", "95867fdcfd4f821d84b3dd9fab5803fb29e093e911f2ab3c7111bcaf8bd5b9da"), "12.7.0-windows_amd64": ("node-v12.7.0-win-x64.zip", "node-v12.7.0-win-x64", "68802316ca4eb4d72ec5f9ff837752a6ec8cd73537ad7c346f30899ee523f4b7"), "12.8.0-darwin_amd64": ("node-v12.8.0-darwin-x64.tar.gz", "node-v12.8.0-darwin-x64", "5229571a1736befd6426dc0a6907be416e9f5c24695e3ef275ed2ba70f496499"), "12.8.0-linux_arm64": ("node-v12.8.0-linux-arm64.tar.xz", "node-v12.8.0-linux-arm64", "9f22aff38a8622b05821129f69dbe90695e01166f55c8d2a39b6c6a5aef8c6a8"), "12.8.0-linux_amd64": ("node-v12.8.0-linux-x64.tar.xz", "node-v12.8.0-linux-x64", "b6a9ab2e6e872375e0e27eda0698820a64495b31b1beab36cc54f9876b3a2052"), "12.8.0-windows_amd64": ("node-v12.8.0-win-x64.zip", "node-v12.8.0-win-x64", "b295aedebde069c4148534a9dfb2394ceba28cf367ddd8204a27d69c095a9e00"), "12.8.1-darwin_amd64": ("node-v12.8.1-darwin-x64.tar.gz", "node-v12.8.1-darwin-x64", "caccf8b409af342e35672cc766430587664f88d01dab622a5de44c8be1336e44"), "12.8.1-linux_arm64": ("node-v12.8.1-linux-arm64.tar.xz", "node-v12.8.1-linux-arm64", "3707240c402aae0b5879ce1ba17b32ebd224d47f5147639c6881a1b71ce65383"), "12.8.1-linux_amd64": ("node-v12.8.1-linux-x64.tar.xz", "node-v12.8.1-linux-x64", "1c7cf61cb8fa98a76d92445823d6dd1649e985899e16900b39eacdd8cd4094f3"), "12.8.1-windows_amd64": ("node-v12.8.1-win-x64.zip", "node-v12.8.1-win-x64", "c81ecaa03dc882dde36087c854e4831c13d3eb237f262f9ce74ccc6f156684da"), "12.9.0-darwin_amd64": ("node-v12.9.0-darwin-x64.tar.gz", "node-v12.9.0-darwin-x64", "24c1f0c93e485961446814662db942f1b309d843fb4ecbe50466d9857a51b343"), "12.9.0-linux_arm64": ("node-v12.9.0-linux-arm64.tar.xz", "node-v12.9.0-linux-arm64", "f7f6f102d097d64eba26f84f2760597f9831886ef7d0db3cba88459847f2743d"), "12.9.0-linux_amd64": ("node-v12.9.0-linux-x64.tar.xz", "node-v12.9.0-linux-x64", "7110bdd16e397870142ff0e8d92d4a4502d43ec047d970c843a9a4e5f9e79283"), "12.9.0-windows_amd64": ("node-v12.9.0-win-x64.zip", "node-v12.9.0-win-x64", "b5f05deb31ac04b9c3a487542daf151e01c05017403a56ba443da623f36b153b"), "12.9.1-darwin_amd64": ("node-v12.9.1-darwin-x64.tar.gz", "node-v12.9.1-darwin-x64", "9aaf29d30056e2233fd15dfac56eec12e8342d91bb6c13d54fb5e599383dddb9"), "12.9.1-linux_arm64": ("node-v12.9.1-linux-arm64.tar.xz", "node-v12.9.1-linux-arm64", "b6d986faf3a77b6c353c344645c93f2a0e0436c43865e6c215a24301a076a11f"), "12.9.1-linux_amd64": ("node-v12.9.1-linux-x64.tar.xz", "node-v12.9.1-linux-x64", "680a1263c9f5f91adadcada549f0a9c29f1b26d09658d2b501c334c3f63719e5"), "12.9.1-windows_amd64": ("node-v12.9.1-win-x64.zip", "node-v12.9.1-win-x64", "6a4e54bda091bd02dbd8ff1b9f6671e036297da012a53891e3834d4bf4bed297"), "12.10.0-darwin_amd64": ("node-v12.10.0-darwin-x64.tar.gz", "node-v12.10.0-darwin-x64", "4c16d1f6454f5dc3977ad00cea123792b8d4e1d6d1bf42bbc82a4202039a5971"), "12.10.0-linux_arm64": ("node-v12.10.0-linux-arm64.tar.xz", "node-v12.10.0-linux-arm64", "fa1afb9e8cfd964867351b6dac6cd918784ff309291612251c4745aeb0b10e02"), "12.10.0-linux_amd64": ("node-v12.10.0-linux-x64.tar.xz", "node-v12.10.0-linux-x64", "e8d2e6b62dd8183dc59a139a9ca3edc7c419a0d3d92e90fea9cb0ad52489843a"), "12.10.0-windows_amd64": ("node-v12.10.0-win-x64.zip", "node-v12.10.0-win-x64", "de341476711c71f82d06fabcc9874c1ff9e865fd7274334d64a67b1e31a53fd0"), "12.11.0-darwin_amd64": ("node-v12.11.0-darwin-x64.tar.gz", "node-v12.11.0-darwin-x64", "a0fd5c1c9e67099f52b73c732aa52a878c6ff67f50ff0e94c2c5628a87455130"), "12.11.0-linux_arm64": ("node-v12.11.0-linux-arm64.tar.xz", "node-v12.11.0-linux-arm64", "d1126439ff6d079b682a7cd6308cb226afd247e5cb0f7cc60cfb0e609a096622"), "12.11.0-linux_amd64": ("node-v12.11.0-linux-x64.tar.xz", "node-v12.11.0-linux-x64", "c0dc88110ac3ee095e3d09077545435b72d4cd52e35c43cd3fa666cff7446d46"), "12.11.0-windows_amd64": ("node-v12.11.0-win-x64.zip", "node-v12.11.0-win-x64", "457157358bd029196d47865dee66f8c263a3a4a5a8cdd1c0a8cf43ac45e9eda3"), "12.11.1-darwin_amd64": ("node-v12.11.1-darwin-x64.tar.gz", "node-v12.11.1-darwin-x64", "7dd24ee6d81668e65ce1b77b4bb4cdaf517d8f80bb19740d286606028506970b"), "12.11.1-linux_arm64": ("node-v12.11.1-linux-arm64.tar.xz", "node-v12.11.1-linux-arm64", "12777294258da80410fd7d5cbed46ead5d3cabacf376ee10ddb9e1a335b114e7"), "12.11.1-linux_amd64": ("node-v12.11.1-linux-x64.tar.xz", "node-v12.11.1-linux-x64", "00f7a0b59ff38c1c74d81732df925aa5ac5788b58412437327421f796878793d"), "12.11.1-windows_amd64": ("node-v12.11.1-win-x64.zip", "node-v12.11.1-win-x64", "0bab4473cd2ba03511b8859ddf2202bb012d5c541f9d57b555a5bbbf101fcb35"), "12.12.0-darwin_amd64": ("node-v12.12.0-darwin-x64.tar.gz", "node-v12.12.0-darwin-x64", "14a98237e8859bc22695719dbc2e9db5529a33ada0c6c377df4dc27b5622ffbb"), "12.12.0-linux_arm64": ("node-v12.12.0-linux-arm64.tar.xz", "node-v12.12.0-linux-arm64", "ad536aba218df64d8e901b28985f4c5f72f634bf903c449b0c84929f6940853c"), "12.12.0-linux_amd64": ("node-v12.12.0-linux-x64.tar.xz", "node-v12.12.0-linux-x64", "e3a38dfaf1233a3c43c2528869af52e74575781984369a5b705c89d84dfa3ac2"), "12.12.0-windows_amd64": ("node-v12.12.0-win-x64.zip", "node-v12.12.0-win-x64", "930e7bcd2ae5bcb1d4163c2adf09a392ed0e9a824b069d19daeb4f9f3430a195"), "12.13.0-darwin_amd64": ("node-v12.13.0-darwin-x64.tar.gz", "node-v12.13.0-darwin-x64", "49a7374670a111b033ce16611b20fd1aafd3296bbc662b184fe8fb26a29c22cc"), "12.13.0-linux_arm64": ("node-v12.13.0-linux-arm64.tar.xz", "node-v12.13.0-linux-arm64", "d65b3ce27639f15ae22941e3ff98a1c900aa9049fcc15518038615b0676037d5"), "12.13.0-linux_amd64": ("node-v12.13.0-linux-x64.tar.xz", "node-v12.13.0-linux-x64", "7a57ef2cb3036d7eacd50ae7ba07245a28336a93652641c065f747adb2a356d9"), "12.13.0-windows_amd64": ("node-v12.13.0-win-x64.zip", "node-v12.13.0-win-x64", "6f920cebeecb4957b4ef0def6d9b04c49d4582864f8d1a207ce8d0665865781a"), "12.13.1-darwin_amd64": ("node-v12.13.1-darwin-x64.tar.gz", "node-v12.13.1-darwin-x64", "12d14c7fbd98876a163a2b7e0aeb13657dc3e967e993efaf2dcacbe475a285e8"), "12.13.1-linux_arm64": ("node-v12.13.1-linux-arm64.tar.xz", "node-v12.13.1-linux-arm64", "3aef0178a8ab74c8e5c133e23d1896e53ed5c273415d165a0e72e005f5467cba"), "12.13.1-linux_amd64": ("node-v12.13.1-linux-x64.tar.xz", "node-v12.13.1-linux-x64", "aca06db37589966829b1ef0f163a5859b156a1d8e51b415bf47590f667c30a25"), "12.13.1-windows_amd64": ("node-v12.13.1-win-x64.zip", "node-v12.13.1-win-x64", "db33fb758ba49b96d073311ef9e9134b51bf96246ffd938909b2e02c65a6e890"), "12.14.0-darwin_amd64": ("node-v12.14.0-darwin-x64.tar.gz", "node-v12.14.0-darwin-x64", "5f3170b346b29e6902c0ca7e0993e3d1b4b650615348aa866de17ad965377048"), "12.14.0-linux_arm64": ("node-v12.14.0-linux-arm64.tar.xz", "node-v12.14.0-linux-arm64", "733b4f71ccdf114038bbe0f20574a1e8f4f60b53d39caf445f518745596eadda"), "12.14.0-linux_amd64": ("node-v12.14.0-linux-x64.tar.xz", "node-v12.14.0-linux-x64", "82ae74ee0a204de7ebf7767eaa8e382518d9b49668dcbb5bd7fd003154445d1f"), "12.14.0-windows_amd64": ("node-v12.14.0-win-x64.zip", "node-v12.14.0-win-x64", "526f4b01ffb270bdd8213b58b38843fa3c88f03c89b1898c641bc0e32607913e"), "12.14.1-darwin_amd64": ("node-v12.14.1-darwin-x64.tar.gz", "node-v12.14.1-darwin-x64", "0be10a28737527a1e5e3784d3ad844d742fe8b0718acd701fd48f718fd3af78f"), "12.14.1-linux_arm64": ("node-v12.14.1-linux-arm64.tar.xz", "node-v12.14.1-linux-arm64", "6cd28a5e6340f596aec8dbfd6720f444f011e6b9018622290a60dbd17f9baff6"), "12.14.1-linux_amd64": ("node-v12.14.1-linux-x64.tar.xz", "node-v12.14.1-linux-x64", "07cfcaa0aa9d0fcb6e99725408d9e0b07be03b844701588e3ab5dbc395b98e1b"), "12.14.1-windows_amd64": ("node-v12.14.1-win-x64.zip", "node-v12.14.1-win-x64", "1f96ccce3ba045ecea3f458e189500adb90b8bc1a34de5d82fc10a5bf66ce7e3"), "12.15.0-darwin_amd64": ("node-v12.15.0-darwin-x64.tar.gz", "node-v12.15.0-darwin-x64", "b6449cec39ac15b37abe4e59ef0eae50dcdfbf060c5276a01cc590f2a3372b7d"), "12.15.0-linux_arm64": ("node-v12.15.0-linux-arm64.tar.xz", "node-v12.15.0-linux-arm64", "c582cb65a0ec7f648618d3d33b4f87c374a3f930518b57eca1693828c965d6e5"), "12.15.0-linux_amd64": ("node-v12.15.0-linux-x64.tar.xz", "node-v12.15.0-linux-x64", "63df953deb091c1500e1044bef01d1953117970e757e74e90d915e1a4a0d1c9c"), "12.15.0-windows_amd64": ("node-v12.15.0-win-x64.zip", "node-v12.15.0-win-x64", "48b29cab597962f12b0aac081522e6192bc8642c582cd0fc1bf51557273888da"), "12.16.0-darwin_amd64": ("node-v12.16.0-darwin-x64.tar.gz", "node-v12.16.0-darwin-x64", "af3b9bbfdd9ae1b46390e7deeb77a2c1d8dbc6fb4171bbb0cfe8686fc1ecef1d"), "12.16.0-linux_arm64": ("node-v12.16.0-linux-arm64.tar.xz", "node-v12.16.0-linux-arm64", "f2d97187bd8d3175bf6266193107a030bfb827003d57ba6dd21de16aa622548d"), "12.16.0-linux_amd64": ("node-v12.16.0-linux-x64.tar.xz", "node-v12.16.0-linux-x64", "e8c38659540766db9d85bd7325ba8cce8ded56204f84507f73fdb41a26d9bd73"), "12.16.0-windows_amd64": ("node-v12.16.0-win-x64.zip", "node-v12.16.0-win-x64", "9a590dd064b491fbd40b366ae4a119fe6cef516a25fb4d78d7c2a64b37574da8"), "12.16.1-darwin_amd64": ("node-v12.16.1-darwin-x64.tar.gz", "node-v12.16.1-darwin-x64", "34895bce210ca4b3cf19cd480e6563588880dd7f5d798f3782e3650580d35920"), "12.16.1-linux_arm64": ("node-v12.16.1-linux-arm64.tar.xz", "node-v12.16.1-linux-arm64", "396c43ba507b8ec33c70cdc6f73b4a7c725bddb3f74a85a8b8ed77b436856fed"), "12.16.1-linux_amd64": ("node-v12.16.1-linux-x64.tar.xz", "node-v12.16.1-linux-x64", "b826753f14df9771609ffb8e7d2cc4cb395247cb704cf0cea0f04132d9cf3505"), "12.16.1-windows_amd64": ("node-v12.16.1-win-x64.zip", "node-v12.16.1-win-x64", "b93b73572c5e495154a9823d494de5729c77d1c83b041171154c4b5f3f76b590"), "12.16.2-darwin_amd64": ("node-v12.16.2-darwin-x64.tar.gz", "node-v12.16.2-darwin-x64", "483954e311a5ff649ddf32b473f635a58890790d284b5788bdd8d7ff850c6db2"), "12.16.2-linux_arm64": ("node-v12.16.2-linux-arm64.tar.xz", "node-v12.16.2-linux-arm64", "c88005467f6dcdb621d454b35ec39bb42e165c6a2e1cee74cabcdc01af307e81"), "12.16.2-linux_amd64": ("node-v12.16.2-linux-x64.tar.xz", "node-v12.16.2-linux-x64", "f94a6eb06e80ef2794ebf51a2baed0b89ed307d3196ab5579f16c0fa7cc62901"), "12.16.2-windows_amd64": ("node-v12.16.2-win-x64.zip", "node-v12.16.2-win-x64", "f34303a49384aee2e5daab5f248c5a719e850a9ebb19e7098fe2bfffb26efe03"), "12.16.3-darwin_amd64": ("node-v12.16.3-darwin-x64.tar.gz", "node-v12.16.3-darwin-x64", "0718812b3ab8e77e8d1354f4d10428ae99d78f721bdcceee527c4b592ea7fed0"), "12.16.3-linux_arm64": ("node-v12.16.3-linux-arm64.tar.xz", "node-v12.16.3-linux-arm64", "8311f513a7d1911200502dd3e00142cef56d600c851d5870f68d939802205b73"), "12.16.3-linux_amd64": ("node-v12.16.3-linux-x64.tar.xz", "node-v12.16.3-linux-x64", "1956e196e3c3c8ef5f0c45db76d7c1245af4ccdda2b7ab30a57ce91d6e165caa"), "12.16.3-windows_amd64": ("node-v12.16.3-win-x64.zip", "node-v12.16.3-win-x64", "d0bb0e0b1f1a948529ddd543e2cfe0bfe209eb843defc70217b3d2f84cbf3b78"), "12.17.0-darwin_amd64": ("node-v12.17.0-darwin-x64.tar.gz", "node-v12.17.0-darwin-x64", "8c3b9459462b8adaa10549f4da6a5ff5cdfaf7140a8a8020a87cc96d79022cc0"), "12.17.0-linux_arm64": ("node-v12.17.0-linux-arm64.tar.xz", "node-v12.17.0-linux-arm64", "54a0dbb203ff1700341d258cefa304bd31044bf0226e9e59a0de1128418cb5aa"), "12.17.0-linux_amd64": ("node-v12.17.0-linux-x64.tar.xz", "node-v12.17.0-linux-x64", "988653492a4f422fb112421c5c9d1c140146b665b480c2b24c66fffdd0b88a88"), "12.17.0-windows_amd64": ("node-v12.17.0-win-x64.zip", "node-v12.17.0-win-x64", "f3a64dc6ad48577f1f81521aa144c028beb7e353d0fcd05d7b420a72a84f50fc"), "12.18.0-darwin_amd64": ("node-v12.18.0-darwin-x64.tar.gz", "node-v12.18.0-darwin-x64", "11fe50e670315d2d3c46317d23f7a019f46a3d08b534fbadee9a1bc3d4f81852"), "12.18.0-linux_arm64": ("node-v12.18.0-linux-arm64.tar.xz", "node-v12.18.0-linux-arm64", "51b301102984ff73a74894396b774d00259bb3bb8c1de7c82674713acec7a214"), "12.18.0-linux_amd64": ("node-v12.18.0-linux-x64.tar.xz", "node-v12.18.0-linux-x64", "2febc2506c298048bfddf896056be6191c1f08716876d960a4990bd63a7fe05a"), "12.18.0-windows_amd64": ("node-v12.18.0-win-x64.zip", "node-v12.18.0-win-x64", "ca73a989eba5e863971cb600e5520cb4c5edf9c600fe8f76d9e4771ad03b5d08"), "12.18.1-darwin_amd64": ("node-v12.18.1-darwin-x64.tar.gz", "node-v12.18.1-darwin-x64", "80e1d644fe78838da47cd16de234b612c20e06ffe14447125db9622e381ed1ba"), "12.18.1-linux_arm64": ("node-v12.18.1-linux-arm64.tar.xz", "node-v12.18.1-linux-arm64", "b6683e6e887c6c44a3fe9ff419e80d36eaafed39eb2c2d1b04ee54b440a03217"), "12.18.1-linux_amd64": ("node-v12.18.1-linux-x64.tar.xz", "node-v12.18.1-linux-x64", "863f816967e297c9eb221ad3cf32521f7ac46fffc66750e60f159ed63809affa"), "12.18.1-windows_amd64": ("node-v12.18.1-win-x64.zip", "node-v12.18.1-win-x64", "93039ebfc7c5bfad168b015f77667757925070fff3ae84c3eb73348b3123a82a"), "12.18.2-darwin_amd64": ("node-v12.18.2-darwin-x64.tar.gz", "node-v12.18.2-darwin-x64", "6e6e7311943e4f3880db5038b8b8034a30469342fe436c8aaacf2997dfa305a6"), "12.18.2-linux_arm64": ("node-v12.18.2-linux-arm64.tar.xz", "node-v12.18.2-linux-arm64", "d7d3a05f36de9eb079b7b25e0fc1aaa0c960afdf36fb24b498f7303365eb945c"), "12.18.2-linux_amd64": ("node-v12.18.2-linux-x64.tar.xz", "node-v12.18.2-linux-x64", "b8dc634798ee783482c2ae1755bd7dff09d83fa7bb037cdc370b601d0a5e5cbb"), "12.18.2-windows_amd64": ("node-v12.18.2-win-x64.zip", "node-v12.18.2-win-x64", "91fdd5b5df16873c63541bc844c9eb66870d366b2076d114f9ab7528b5e2f9a3"), "12.18.3-darwin_amd64": ("node-v12.18.3-darwin-x64.tar.gz", "node-v12.18.3-darwin-x64", "af376caf114bdd5d7e566dbf7590e9077ffc01f9b2692eb2651f31d7219a30bb"), "12.18.3-linux_arm64": ("node-v12.18.3-linux-arm64.tar.xz", "node-v12.18.3-linux-arm64", "d330aab40029afc34f8b5d1abc2e67be233df4b31331cf08d538be2a666737bb"), "12.18.3-linux_amd64": ("node-v12.18.3-linux-x64.tar.xz", "node-v12.18.3-linux-x64", "b79e02e48d0a1ee4cd4ae138de97fda5413542f2a4f441a7d0e189697b8da563"), "12.18.3-windows_amd64": ("node-v12.18.3-win-x64.zip", "node-v12.18.3-win-x64", "1fcd30c09f0ac9fbecf45161519eff2cf621c199eef4663b1db41b3f2fef4041"), "13.0.0-darwin_amd64": ("node-v13.0.0-darwin-x64.tar.gz", "node-v13.0.0-darwin-x64", "612556a8c7e6b4cd08f6134b8afe5a05bf84c0121225fa9c542be1c98af04a35"), "13.0.0-linux_arm64": ("node-v13.0.0-linux-arm64.tar.xz", "node-v13.0.0-linux-arm64", "6ed882e17123861b5b81683de2b2c86be02c5916ef0beda04fd176329888fd12"), "13.0.0-linux_amd64": ("node-v13.0.0-linux-x64.tar.xz", "node-v13.0.0-linux-x64", "799d890f00a3a2a7415b813b286d32d38573df6525bc8ef80f40077cdd210d39"), "13.0.0-windows_amd64": ("node-v13.0.0-win-x64.zip", "node-v13.0.0-win-x64", "8ffcefde5e080d70790a9a2e1aab0724cc88b5526d5128b53fc59bf94f6ad5de"), "13.0.1-darwin_amd64": ("node-v13.0.1-darwin-x64.tar.gz", "node-v13.0.1-darwin-x64", "25621359a51ff218ecf4bb2ffc657815154230a967224f22b722840a2b9ad061"), "13.0.1-linux_arm64": ("node-v13.0.1-linux-arm64.tar.xz", "node-v13.0.1-linux-arm64", "ad6e051aede160d8be5cbab9c60a155b06a5696e8088d895e6eff3dd36f9a688"), "13.0.1-linux_amd64": ("node-v13.0.1-linux-x64.tar.xz", "node-v13.0.1-linux-x64", "d5657c19bb30b267bf2e0f2b61f6a96d8955aa30b69240f22d3fd2c65e123cf7"), "13.0.1-windows_amd64": ("node-v13.0.1-win-x64.zip", "node-v13.0.1-win-x64", "1a2552b630651e08e9027339f71a65fbe3944540f0875563ea25639a091e1f33"), "13.1.0-darwin_amd64": ("node-v13.1.0-darwin-x64.tar.gz", "node-v13.1.0-darwin-x64", "6501c1bcf2babb5b9c81dcff8b52021f726da8f6ee28df1637acade1a16c7d39"), "13.1.0-linux_arm64": ("node-v13.1.0-linux-arm64.tar.xz", "node-v13.1.0-linux-arm64", "646d597e6b0dc400429e46b703a5135c77bd71e653ea4c8254d0b60c17b6ec1d"), "13.1.0-linux_amd64": ("node-v13.1.0-linux-x64.tar.xz", "node-v13.1.0-linux-x64", "2eecb5a4b7975c3b406bee36b12c9a29e8bedf9553c88cad310b8f076db00881"), "13.1.0-windows_amd64": ("node-v13.1.0-win-x64.zip", "node-v13.1.0-win-x64", "d735e97bdeb7b74551b9d165c708a3fdea4dbb3801a65e70f6d6ae3539d48a03"), "13.2.0-darwin_amd64": ("node-v13.2.0-darwin-x64.tar.gz", "node-v13.2.0-darwin-x64", "2bcba358ef68ea21655728126c678063c60119e18e65d04f615d6b22dba8f7a5"), "13.2.0-linux_arm64": ("node-v13.2.0-linux-arm64.tar.xz", "node-v13.2.0-linux-arm64", "e6c4a5fe57585f69a20bd028275db31f43de421308e31d117f319b577210e527"), "13.2.0-linux_amd64": ("node-v13.2.0-linux-x64.tar.xz", "node-v13.2.0-linux-x64", "366df8a38b522a5899c3f48d8c9e359b3370495cf84867b2673dc10483adbdef"), "13.2.0-windows_amd64": ("node-v13.2.0-win-x64.zip", "node-v13.2.0-win-x64", "e2866a8f53c45bb544d7b00aed1e5fddbbd7071bd331b02e66a6ce7c38c6918c"), "13.3.0-darwin_amd64": ("node-v13.3.0-darwin-x64.tar.gz", "node-v13.3.0-darwin-x64", "187ea9028daa6d9abad9c1cbb4e12ba51427c3748da29eae616fa352c0f4cd49"), "13.3.0-linux_arm64": ("node-v13.3.0-linux-arm64.tar.xz", "node-v13.3.0-linux-arm64", "fb201a908bea36be828eee36a7cd898c67ad4ae6846982f393466e2b8b826c16"), "13.3.0-linux_amd64": ("node-v13.3.0-linux-x64.tar.xz", "node-v13.3.0-linux-x64", "b208393ae411bd55188e903171901765aaa8381c08155e4a7b34174737a1bc65"), "13.3.0-windows_amd64": ("node-v13.3.0-win-x64.zip", "node-v13.3.0-win-x64", "82e0f43aea81374a8028a7d3c9993245c4910ac95cd0f66ee5b29b940a6f3d93"), "13.4.0-darwin_amd64": ("node-v13.4.0-darwin-x64.tar.gz", "node-v13.4.0-darwin-x64", "4de08a89054416595228d6ff40fcf20c375d00556f2e95dfde8602cbb42c0b6e"), "13.4.0-linux_arm64": ("node-v13.4.0-linux-arm64.tar.xz", "node-v13.4.0-linux-arm64", "382d5fb2983ab55d495e42145e812b3859d2a311e426307fd373f47825d55fe9"), "13.4.0-linux_amd64": ("node-v13.4.0-linux-x64.tar.xz", "node-v13.4.0-linux-x64", "5cab49240c521efb80efd0a0bb3ba1071e5498c55ecbebd723d78648c91b1cc8"), "13.4.0-windows_amd64": ("node-v13.4.0-win-x64.zip", "node-v13.4.0-win-x64", "56de9ed20332cdf22bb9b048c3fb3977662ef2de9d2e8ac2d2a27d28e9be276f"), "13.5.0-darwin_amd64": ("node-v13.5.0-darwin-x64.tar.gz", "node-v13.5.0-darwin-x64", "3322c601dc032677e5b5f87f393d4b1d70073bcab24fe74378eff8eb49364001"), "13.5.0-linux_arm64": ("node-v13.5.0-linux-arm64.tar.xz", "node-v13.5.0-linux-arm64", "fe52f4e3a60a372138102da741e5b5d34310a74b3fc6f2000e4c254e3f0c4f51"), "13.5.0-linux_amd64": ("node-v13.5.0-linux-x64.tar.xz", "node-v13.5.0-linux-x64", "4d2b2cea13388658e95d8b2dc7ff918718155473ef6ef38928d92eb8cbbe210a"), "13.5.0-windows_amd64": ("node-v13.5.0-win-x64.zip", "node-v13.5.0-win-x64", "e286a84f2861b9f3c0290a9afbbecd09f303a39b2573af001ef8a4c1413eee7c"), "13.6.0-darwin_amd64": ("node-v13.6.0-darwin-x64.tar.gz", "node-v13.6.0-darwin-x64", "da13adb864777b322dda7af20410a9b0c63aa69de4b5574008d1e6910768bf69"), "13.6.0-linux_arm64": ("node-v13.6.0-linux-arm64.tar.xz", "node-v13.6.0-linux-arm64", "1f34ed8668207e03cb832763319a82b4c753839a3655207adc5bbe52f65e154a"), "13.6.0-linux_amd64": ("node-v13.6.0-linux-x64.tar.xz", "node-v13.6.0-linux-x64", "00f01315a867da16d1638f7a02966c608e344ac6c5b7d04d1fdae3138fa9d798"), "13.6.0-windows_amd64": ("node-v13.6.0-win-x64.zip", "node-v13.6.0-win-x64", "7fe37b34a4673a071bea52fcaf913ec422cf6fd79fd025bfb22de42ccc77f386"), "13.7.0-darwin_amd64": ("node-v13.7.0-darwin-x64.tar.gz", "node-v13.7.0-darwin-x64", "866ea9bdbd7b734c593af96b946397d9c7cb9c291aa8ea52a6a2af271b972169"), "13.7.0-linux_arm64": ("node-v13.7.0-linux-arm64.tar.xz", "node-v13.7.0-linux-arm64", "2823b199c7c4e6c547caf95139e28341444a5ffc52481a5ba704067291771579"), "13.7.0-linux_amd64": ("node-v13.7.0-linux-x64.tar.xz", "node-v13.7.0-linux-x64", "02578025b82de24f4cfb3ffeb3824990431d739d09220f2db9ef9f454f475470"), "13.7.0-windows_amd64": ("node-v13.7.0-win-x64.zip", "node-v13.7.0-win-x64", "26b41de81ead8f51de2964d7c7526533f46387ff436b61596e09d678bcd7503f"), "13.8.0-darwin_amd64": ("node-v13.8.0-darwin-x64.tar.gz", "node-v13.8.0-darwin-x64", "ae480e2b124cb55667763848b8ec0fde1bc35d5e0b76debe881034689a68eaea"), "13.8.0-linux_arm64": ("node-v13.8.0-linux-arm64.tar.xz", "node-v13.8.0-linux-arm64", "f1d4167a6911e42d836a5459c992cdaf35a03ab0700ea80831d7df5d706d1baf"), "13.8.0-linux_amd64": ("node-v13.8.0-linux-x64.tar.xz", "node-v13.8.0-linux-x64", "47a8cb675358f2ff534ad3d6709f14de0433f76d3af92cf389b8dcc78a1236ad"), "13.8.0-windows_amd64": ("node-v13.8.0-win-x64.zip", "node-v13.8.0-win-x64", "f198f3e4b120fc84b61d12e7222530c5bb9c6f864735bb41a8db1cf1b94a64c3"), "13.9.0-darwin_amd64": ("node-v13.9.0-darwin-x64.tar.gz", "node-v13.9.0-darwin-x64", "b2a5a539b9b2d1733bda301913c99d220968de801bf313b762fa932820ea797b"), "13.9.0-linux_arm64": ("node-v13.9.0-linux-arm64.tar.xz", "node-v13.9.0-linux-arm64", "c668afc06e4094b68ae758b823fc3244b34f0468fc0c2feee45278788989b8a1"), "13.9.0-linux_amd64": ("node-v13.9.0-linux-x64.tar.xz", "node-v13.9.0-linux-x64", "f1e093303468032a1ecb0e290e19b43bf7771d4efbf589560df0060149614272"), "13.9.0-windows_amd64": ("node-v13.9.0-win-x64.zip", "node-v13.9.0-win-x64", "ec0a55bb703906494e738cd3d09e3274b34f0a3fbe207b9e67502092ed017500"), "13.10.0-darwin_amd64": ("node-v13.10.0-darwin-x64.tar.gz", "node-v13.10.0-darwin-x64", "67269fb9061402e446bb61776be2e5d0ec330b5274326df77979698d05f503da"), "13.10.0-linux_arm64": ("node-v13.10.0-linux-arm64.tar.xz", "node-v13.10.0-linux-arm64", "adb145535d2e03fe508fa7a34897a130ba903d6f718a21cd29d1760e298f715b"), "13.10.0-linux_amd64": ("node-v13.10.0-linux-x64.tar.xz", "node-v13.10.0-linux-x64", "62081af005257d3db7ebd5a64b43f1a8e4a57bafd229be3acd7ce2704607eaac"), "13.10.0-windows_amd64": ("node-v13.10.0-win-x64.zip", "node-v13.10.0-win-x64", "d428b6d3e127716191fa6df630d03a25d3186fda1ede04a9a8d5c07e526dbb9e"), "13.10.1-darwin_amd64": ("node-v13.10.1-darwin-x64.tar.gz", "node-v13.10.1-darwin-x64", "a6a66fdc79e70267fc191f10ee045793240974e1268fdea6c2d28afbc1d635e8"), "13.10.1-linux_arm64": ("node-v13.10.1-linux-arm64.tar.xz", "node-v13.10.1-linux-arm64", "f73effcef784251e53b5e3938b8316c36bd49628c3588de7976e8569e560c12c"), "13.10.1-linux_amd64": ("node-v13.10.1-linux-x64.tar.xz", "node-v13.10.1-linux-x64", "69d69165282d88f321e751f03ee5d3370db65e5ca4c587af24994b12f31d4827"), "13.10.1-windows_amd64": ("node-v13.10.1-win-x64.zip", "node-v13.10.1-win-x64", "f9d0aac273a44dbd52dd8cdb3d6c684b68b860d128af58d77a0c08f39f51f229"), "13.11.0-darwin_amd64": ("node-v13.11.0-darwin-x64.tar.gz", "node-v13.11.0-darwin-x64", "2d87989fb1e0d425667c5ca9893cb3ecfb30cd3344d543870246d65f8d9b892f"), "13.11.0-linux_arm64": ("node-v13.11.0-linux-arm64.tar.xz", "node-v13.11.0-linux-arm64", "63ce9871b9802a1f021c84f282c63e1890524a32dc97d3e7a7ab8d52b4bde19e"), "13.11.0-linux_amd64": ("node-v13.11.0-linux-x64.tar.xz", "node-v13.11.0-linux-x64", "c127cf38f9a56d97646eb1fedb93712f304950c7143705de7180a701becc0fbb"), "13.11.0-windows_amd64": ("node-v13.11.0-win-x64.zip", "node-v13.11.0-win-x64", "dc93aa5a82988f741dca6f1869c7b1aeda6f339293d13a968279a6dc9fcc8dd0"), "13.12.0-darwin_amd64": ("node-v13.12.0-darwin-x64.tar.gz", "node-v13.12.0-darwin-x64", "1fe3103610e8eb66ae71872ea1b4e868a638292a4e7ad0e41976a9fe417a09c7"), "13.12.0-linux_arm64": ("node-v13.12.0-linux-arm64.tar.xz", "node-v13.12.0-linux-arm64", "2e8c12e575fcceb2d6f46eb3c50c6bfa98e91540bddaf91ca1c0fe739619ca0b"), "13.12.0-linux_amd64": ("node-v13.12.0-linux-x64.tar.xz", "node-v13.12.0-linux-x64", "95eb1188872e243323cbc31fc80048be3fdfdda91505c62c80c599281de357ed"), "13.12.0-windows_amd64": ("node-v13.12.0-win-x64.zip", "node-v13.12.0-win-x64", "de8445794ecbcfe895f4775417d1e2cc023e2212b1f5d4ff5cc0ed6875f7c911"), "13.13.0-darwin_amd64": ("node-v13.13.0-darwin-x64.tar.gz", "node-v13.13.0-darwin-x64", "28ae2abedafb250a9bbe706650fd79d2b25273f6445adcc1d85c777359dc5390"), "13.13.0-linux_arm64": ("node-v13.13.0-linux-arm64.tar.xz", "node-v13.13.0-linux-arm64", "eded8da4633134cae0766a2f6f3c2237f8e728df77895c85607acaca13216226"), "13.13.0-linux_amd64": ("node-v13.13.0-linux-x64.tar.xz", "node-v13.13.0-linux-x64", "41d60cda7422f53156711626d670f9b5079075b1ecc6736aea99319fe36c20a6"), "13.13.0-windows_amd64": ("node-v13.13.0-win-x64.zip", "node-v13.13.0-win-x64", "79f2a39c1047666f2bbf2efe53c069a38b8f6ef18d569bf338463aea1914b89d"), "13.14.0-darwin_amd64": ("node-v13.14.0-darwin-x64.tar.gz", "node-v13.14.0-darwin-x64", "a56eb353fecd45f731d74fc77c58dde052320c1bc272de9b03151fbaf962feaf"), "13.14.0-linux_arm64": ("node-v13.14.0-linux-arm64.tar.xz", "node-v13.14.0-linux-arm64", "e4736df097846bbe8195a185cc67ada3410a1f8993949e516bbf62b62198d2a7"), "13.14.0-linux_amd64": ("node-v13.14.0-linux-x64.tar.xz", "node-v13.14.0-linux-x64", "9ab808ba3872d58e827ea60a6e43a352f59361bc8eb36fe0327a587086b466f9"), "13.14.0-windows_amd64": ("node-v13.14.0-win-x64.zip", "node-v13.14.0-win-x64", "8c6e77fac5e911a2e70b6ca34804b3b59b6a3c685ab4e3b17756397df86063fa"), "14.0.0-darwin_amd64": ("node-v14.0.0-darwin-x64.tar.gz", "node-v14.0.0-darwin-x64", "4e50cec7aeef91c6d00d08a3bab938358da182984aa549c2aeab9868e3342f55"), "14.0.0-linux_arm64": ("node-v14.0.0-linux-arm64.tar.xz", "node-v14.0.0-linux-arm64", "29c612fcdb40133171959b269878138bbfe7723d46681f70e2017ee30134e7ad"), "14.0.0-linux_amd64": ("node-v14.0.0-linux-x64.tar.xz", "node-v14.0.0-linux-x64", "a2aaaa621074e1b56bb751bda53ce726319fac617587443371c0a7742481e5b6"), "14.0.0-windows_amd64": ("node-v14.0.0-win-x64.zip", "node-v14.0.0-win-x64", "e8f73d4f2e9935df929360c09ae932ceb316784a7450b256024af5d01fe29b75"), "14.1.0-darwin_amd64": ("node-v14.1.0-darwin-x64.tar.gz", "node-v14.1.0-darwin-x64", "7f08bd365df4e7a5625ad393257f48e8cd79f77391ab87a64426b0c6448dd226"), "14.1.0-linux_arm64": ("node-v14.1.0-linux-arm64.tar.xz", "node-v14.1.0-linux-arm64", "9dd3a4867f679f40075e2a364d3b3566702139274da9fcd59a182198ff7c7b52"), "14.1.0-linux_amd64": ("node-v14.1.0-linux-x64.tar.xz", "node-v14.1.0-linux-x64", "959fab0c8ae0830f1ab987699cd2941cab97169991630a2e0c99db7c144f9e42"), "14.1.0-windows_amd64": ("node-v14.1.0-win-x64.zip", "node-v14.1.0-win-x64", "1d3890d0d2f996cce57bcb0206e49b67233623e3cdb50eee77b8acc8f006b955"), "14.2.0-darwin_amd64": ("node-v14.2.0-darwin-x64.tar.gz", "node-v14.2.0-darwin-x64", "2447241aefe71dea8ba1552549e4df2e894d1ac12203630db3af63d4ae35c016"), "14.2.0-linux_arm64": ("node-v14.2.0-linux-arm64.tar.xz", "node-v14.2.0-linux-arm64", "4587d2c52cd348094bd46ee4ee8cdfeb549462ead9b4aadc9cfc3c5fc3ba7215"), "14.2.0-linux_amd64": ("node-v14.2.0-linux-x64.tar.xz", "node-v14.2.0-linux-x64", "468cbd92271da8c0cacaa3fa432a73a332e398bade8ad7359a94aa8ab3cc3cca"), "14.2.0-windows_amd64": ("node-v14.2.0-win-x64.zip", "node-v14.2.0-win-x64", "99085f45a894e257123d7c729113cc00ed1413df432dbdce5fe53867e7c53b11"), "14.3.0-darwin_amd64": ("node-v14.3.0-darwin-x64.tar.gz", "node-v14.3.0-darwin-x64", "fd6a44303646f28b7e7577de687c2681cb565bef534e84deef44202e7919d7f3"), "14.3.0-linux_arm64": ("node-v14.3.0-linux-arm64.tar.xz", "node-v14.3.0-linux-arm64", "53bb110ea135ae3c819f535373ce1b779e86c7aa49a9b93fc5f26969a72365d2"), "14.3.0-linux_amd64": ("node-v14.3.0-linux-x64.tar.xz", "node-v14.3.0-linux-x64", "17236db7b9447080b58c2e50937982c386fe8a60e644b8d7f23e546068a8acba"), "14.3.0-windows_amd64": ("node-v14.3.0-win-x64.zip", "node-v14.3.0-win-x64", "07bebc231dd8d773ab41cdcfbcb8b48e2336fbee20deb961b4300b9ba86afa04"), "14.4.0-darwin_amd64": ("node-v14.4.0-darwin-x64.tar.gz", "node-v14.4.0-darwin-x64", "d95eaa6950d67895b5cdd0e2f913d2c44034178234f0cb7436c3397b54f64023"), "14.4.0-linux_arm64": ("node-v14.4.0-linux-arm64.tar.xz", "node-v14.4.0-linux-arm64", "9c9f84589b7bc6a05ac12a137e5097a5adb20b5c63ae9e4e912942da2c06d99d"), "14.4.0-linux_amd64": ("node-v14.4.0-linux-x64.tar.xz", "node-v14.4.0-linux-x64", "d65a9a8a547bfe67c6c08dae733a3e5a846700d5377c5f150164cc6bb5f6a039"), "14.4.0-windows_amd64": ("node-v14.4.0-win-x64.zip", "node-v14.4.0-win-x64", "a4bac45af8252f6b677a79ed19be4913f4939c4509fb08b6f14f972597550bbe"), "14.5.0-darwin_amd64": ("node-v14.5.0-darwin-x64.tar.gz", "node-v14.5.0-darwin-x64", "47dfd88abcd4d6d6f7b7516c95645f9760ba9c93d04b51a92895584c945b2953"), "14.5.0-linux_arm64": ("node-v14.5.0-linux-arm64.tar.xz", "node-v14.5.0-linux-arm64", "c5ab67fbc73ea8858b4a989b6e92d6630decfc47c4703be7bcda3c6e39adff0b"), "14.5.0-linux_amd64": ("node-v14.5.0-linux-x64.tar.xz", "node-v14.5.0-linux-x64", "8b0235c318de87ecf8eec9a39e5c5df80757dbec571addda7123276dfcb34d5b"), "14.5.0-windows_amd64": ("node-v14.5.0-win-x64.zip", "node-v14.5.0-win-x64", "ab5728c85ece98210036fc9c38984fa2410a882dd99075b3d5bece58e4cc6ea2"), "14.6.0-darwin_amd64": ("node-v14.6.0-darwin-x64.tar.gz", "node-v14.6.0-darwin-x64", "7907a18605b900ce977ff4c7e67f7507f937f85738659865d31779c3b2990756"), "14.6.0-linux_arm64": ("node-v14.6.0-linux-arm64.tar.xz", "node-v14.6.0-linux-arm64", "853f2c99f0e5fa65e6f222821e29c9d1a49f2d358a97c1de080ddf5c74e4ec70"), "14.6.0-linux_amd64": ("node-v14.6.0-linux-x64.tar.xz", "node-v14.6.0-linux-x64", "b8a39b2dac8e200e96586356c5525d20b0b43dba8bf9f7eb4e8c2d5366be2bb2"), "14.6.0-windows_amd64": ("node-v14.6.0-win-x64.zip", "node-v14.6.0-win-x64", "57ea75a7ec70cc8158e6f9774f9728fb9e3d08212b1af3e206db2de46ca304ca"), "14.7.0-darwin_amd64": ("node-v14.7.0-darwin-x64.tar.gz", "node-v14.7.0-darwin-x64", "47c94ec84706fd6851db27af54abdab569941fcbfcdc28e386d8fa7d49c6a619"), "14.7.0-linux_arm64": ("node-v14.7.0-linux-arm64.tar.xz", "node-v14.7.0-linux-arm64", "12540328aeb5baa524a4e9c3b493b5eceb54cfa630f8bce64c19e674871e2f4b"), "14.7.0-linux_amd64": ("node-v14.7.0-linux-x64.tar.xz", "node-v14.7.0-linux-x64", "48929b03deb2915b64ba67355d2deffeed3c8df798b0c5f2b821ffc7a8116a23"), "14.7.0-windows_amd64": ("node-v14.7.0-win-x64.zip", "node-v14.7.0-win-x64", "a899693c9a31089a1eda14b1e613cf8cd60361e6e574b351551d832cf864c8f8"), "14.8.0-darwin_amd64": ("node-v14.8.0-darwin-x64.tar.gz", "node-v14.8.0-darwin-x64", "b6db32f2ff37475ae68502c76fc777a604cbc589bf57158fb4eed4db9ac5f62d"), "14.8.0-linux_arm64": ("node-v14.8.0-linux-arm64.tar.xz", "node-v14.8.0-linux-arm64", "0c66a6468c36552c00d45cff0eaa924240f3d2e625be0306f33f8b0d81af4224"), "14.8.0-linux_amd64": ("node-v14.8.0-linux-x64.tar.xz", "node-v14.8.0-linux-x64", "c7761fe5d56d045d1540b1f0bc8a20d7edf03e6fd695ee5fbffc1dd9416ccc75"), "14.8.0-windows_amd64": ("node-v14.8.0-win-x64.zip", "node-v14.8.0-win-x64", "848ca582bdf8b7fdc21a38d9f3887a45bdf6381b04549fc0f918852889157c9a")}` +{% endhighlight %} -#### `node_urls` -(*List of strings*): custom list of URLs to use to download NodeJS +These can be mapped to a custom download URL, using node_urls -Each entry is a template for downloading a node distribution. - -The `{version}` parameter is substituted with the `node_version` attribute, -and `{filename}` with the matching entry from the `node_repositories` attribute. - -For example, given - -```python +{% highlight python %} node_repositories( node_version = "10.10.0", node_repositories = {"10.10.0-darwin_amd64": ("node-v10.10.0-darwin-x64.tar.gz", "node-v10.10.0-darwin-x64", "00b7a8426e076e9bf9d12ba2d571312e833fe962c70afafd10ad3682fdeeaa5e")}, node_urls = ["https://mycorpproxy/mirror/node/v{version}/{filename}"], ) -``` +{% endhighlight %} -A Mac client will try to download node from `https://mycorpproxy/mirror/node/v10.10.0/node-v10.10.0-darwin-x64.tar.gz` -and expect that file to have sha256sum `00b7a8426e076e9bf9d12ba2d571312e833fe962c70afafd10ad3682fdeeaa5e` +A Mac client will try to download node from https://mycorpproxy/mirror/node/v10.10.0/node-v10.10.0-darwin-x64.tar.gz +and expect that file to have sha256sum 00b7a8426e076e9bf9d12ba2d571312e833fe962c70afafd10ad3682fdeeaa5e -Defaults to `["https://mirror.bazel.build/nodejs.org/dist/v{version}/{filename}", "https://nodejs.org/dist/v{version}/{filename}"]` -#### `node_version` -(*String*): the specific version of NodeJS to install or, if vendored_node is specified, the vendored version of node - -Defaults to `"12.13.0"` - -#### `package_json` -(*[labels]*): (ADVANCED, not recommended) - a list of labels, which indicate the package.json files that will be installed - when you manually run the package manager, e.g. with - `bazel run @nodejs//:yarn_node_repositories` or `bazel run @nodejs//:npm_node_repositories install`. - If you use bazel-managed dependencies, you should omit this attribute. - -Defaults to `[]` - -#### `preserve_symlinks` -(*Boolean*): Turn on --node_options=--preserve-symlinks for nodejs_binary and nodejs_test rules. - -When this option is turned on, node will preserve the symlinked path for resolves instead of the default -behavior of resolving to the real path. This means that all required files must be in be included in your -runfiles as it prevents the default behavior of potentially resolving outside of the runfiles. For example, -all required files need to be included in your node_modules filegroup. This option is desirable as it gives -a stronger guarantee of hermeticity which is required for remote execution. - -Defaults to `True` - -#### `vendored_node` -(*[label]*): the local path to a pre-installed NodeJS runtime. - -If set then also set node_version to the version that of node that is vendored. -Bazel will automatically turn on features such as --preserve-symlinks-main if they -are supported by the node version being used. - -Defaults to `None` - -#### `vendored_yarn` -(*[label]*): the local path to a pre-installed yarn tool - -Defaults to `None` - -#### `yarn_repositories` -(*Dictionary: String -> List of strings*): Custom list of yarn repositories to use. - -Dictionary mapping Yarn versions to their corresponding (filename, strip_prefix, sha256) tuples. +#### Custom Yarn versions -For example, +To specify custom Yarn versions, use the yarn_repositories attribute -```python +{% highlight python %} node_repositories( yarn_repositories = { "1.12.1": ("yarn-v1.12.1.tar.gz", "yarn-v1.12.1", "09bea8f4ec41e9079fa03093d3b2db7ac5c5331852236d63815f8df42b3ba88d"), }, ) -``` +{% endhighlight %} -Defaults to `{"1.3.2": ("yarn-v1.3.2.tar.gz", "yarn-v1.3.2", "6cfe82e530ef0837212f13e45c1565ba53f5199eec2527b85ecbcd88bf26821d"), "1.5.1": ("yarn-v1.5.1.tar.gz", "yarn-v1.5.1", "cd31657232cf48d57fdbff55f38bfa058d2fb4950450bd34af72dac796af4de1"), "1.6.0": ("yarn-v1.6.0.tar.gz", "yarn-v1.6.0", "a57b2fdb2bfeeb083d45a883bc29af94d5e83a21c25f3fc001c295938e988509"), "1.9.2": ("yarn-v1.9.2.tar.gz", "yarn-v1.9.2", "3ad69cc7f68159a562c676e21998eb21b44138cae7e8fe0749a7d620cf940204"), "1.9.4": ("yarn-v1.9.4.tar.gz", "yarn-v1.9.4", "7667eb715077b4bad8e2a832e7084e0e6f1ba54d7280dc573c8f7031a7fb093e"), "1.12.1": ("yarn-v1.12.1.tar.gz", "yarn-v1.12.1", "09bea8f4ec41e9079fa03093d3b2db7ac5c5331852236d63815f8df42b3ba88d"), "1.12.3": ("yarn-v1.12.3.tar.gz", "yarn-v1.12.3", "02cd4b589ec22c4bdbd2bc5ebbfd99c5e99b07242ad68a539cb37896b93a24f2"), "1.13.0": ("yarn-v1.13.0.tar.gz", "yarn-v1.13.0", "125d40ebf621ebb08e3f66a618bd2cc5cd77fa317a312900a1ab4360ed38bf14"), "1.19.1": ("yarn-v1.19.1.tar.gz", "yarn-v1.19.1", "34293da6266f2aae9690d59c2d764056053ff7eebc56b80b8df05010c3da9343"), "1.22.4": ("yarn-v1.22.4.tar.gz", "yarn-v1.22.4", "bc5316aa110b2f564a71a3d6e235be55b98714660870c5b6b2d2d3f12587fb58")}` +Like node_urls, the yarn_urls attribute can be used to provide a list of custom URLs to use to download yarn -#### `yarn_urls` -(*List of strings*): custom list of URLs to use to download Yarn - -Each entry is a template, similar to the `node_urls` attribute, using `yarn_version` and `yarn_repositories` in the substitutions. - -For example, - -```python +{% highlight python %} node_repositories( yarn_repositories = { "1.12.1": ("yarn-v1.12.1.tar.gz", "yarn-v1.12.1", "09bea8f4ec41e9079fa03093d3b2db7ac5c5331852236d63815f8df42b3ba88d"), @@ -190,80 +95,305 @@ node_repositories( "https://github.com/yarnpkg/yarn/releases/download/v{version}/{filename}", ], ) -``` +{% endhighlight %} -Will download yarn from https://github.com/yarnpkg/yarn/releases/download/v1.2.1/yarn-v1.12.1.tar.gz` -and expect the file to have sha256sum `09bea8f4ec41e9079fa03093d3b2db7ac5c5331852236d63815f8df42b3ba88d`. +Will download yarn from https://github.com/yarnpkg/yarn/releases/download/v1.2.1/yarn-v1.12.1.tar.gz +and expect the file to have sha256sum 09bea8f4ec41e9079fa03093d3b2db7ac5c5331852236d63815f8df42b3ba88d. -Defaults to `["https://mirror.bazel.build/github.com/yarnpkg/yarn/releases/download/v{version}/{filename}", "https://github.com/yarnpkg/yarn/releases/download/v{version}/{filename}"]` -#### `yarn_version` -(*String*): the specific version of Yarn to install +### Using a local version -Defaults to `"1.19.1"` +To avoid downloads, you can check in vendored copies of NodeJS and/or Yarn and set vendored_node and or vendored_yarn +to point to those before calling node_repositories. You can also point to a location where node is installed on your computer, +but we don't recommend this because it leads to version skew between you, your coworkers, and your Continuous Integration environment. +It also ties your build to a single platform, preventing you from cross-compiling into a Linux docker image on Mac for example. +See the [the repositories documentation](repositories.html) for how to use the resulting repositories. -## nodejs_binary -Runs some JavaScript code in NodeJS. +## Creating dependency installation scripts for manually-managed dependencies +You can optionally pass a package_json array to node_repositories. This lets you use Bazel's version of yarn or npm, yet always run the package manager yourself. +This is an advanced scenario you can use in place of the npm_install or yarn_install` rules, but we don't recommend it, and might remove it in the future. -### Usage +{% highlight python %} +load("@build_bazel_rules_nodejs//:index.bzl", "node_repositories") +node_repositories(package_json = ["//:package.json", "//subpkg:package.json"]) +{% endhighlight %} + +Running bazel run @nodejs//:yarn_node_repositories in this repo would create /node_modules and /subpkg/node_modules. + +Note that the dependency installation scripts will run in each subpackage indicated by the package_json attribute. + + +
+node_repositories(name, node_repositories, node_urls, node_version, package_json, preserve_symlinks,
+                  vendored_node, vendored_yarn, yarn_repositories, yarn_urls, yarn_version)
+
+ +**ATTRIBUTES** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionTypeMandatoryDefault
name + A unique name for this repository. + Namerequired + +
node_repositories + Custom list of node repositories to use -``` -nodejs_binary(name, configuration_env_vars, data, default_env_vars, entry_point, node_modules, templated_args) -``` +A dictionary mapping NodeJS versions to sets of hosts and their corresponding (filename, strip_prefix, sha256) tuples. +You should list a node binary for every platform users have, likely Mac, Windows, and Linux. + Dictionary: String -> List of stringsoptional + {"8.0.0-darwin_amd64": ("node-v8.0.0-darwin-x64.tar.gz", "node-v8.0.0-darwin-x64", "6e4a66917e2c11d5adc537c899941c973ae586293352b8172a4f32be0b7f0300"), "8.0.0-linux_arm64": ("node-v8.0.0-linux-arm64.tar.xz", "node-v8.0.0-linux-arm64", "8d6eaefcc252055de54a666d4e00eec78caf2143cd7a13b63f109e9eb78a795e"), "8.0.0-linux_amd64": ("node-v8.0.0-linux-x64.tar.xz", "node-v8.0.0-linux-x64", "0a536bb83eeccca23626e5e5ead52563a641e4331c35e367662892921dc7e8a4"), "8.0.0-windows_amd64": ("node-v8.0.0-win-x64.zip", "node-v8.0.0-win-x64", "84410377118857674e0fb6e7bc7627ffb8cc67a72f162a050276b076e328a9bb"), "8.1.0-darwin_amd64": ("node-v8.1.0-darwin-x64.tar.gz", "node-v8.1.0-darwin-x64", "08af5f1a7441728cabf9b11af25da28ee1725903524968dd9621b885b13303c7"), "8.1.0-linux_arm64": ("node-v8.1.0-linux-arm64.tar.xz", "node-v8.1.0-linux-arm64", "adf2f517c9847cbb5904b282c0819526b5264c256477ed5e4b258584daa1a2ea"), "8.1.0-linux_amd64": ("node-v8.1.0-linux-x64.tar.xz", "node-v8.1.0-linux-x64", "1638a0083c6eee122cbbefdf39cb8bcc43cf19fedff331a0317b05fd38dcb6df"), "8.1.0-windows_amd64": ("node-v8.1.0-win-x64.zip", "node-v8.1.0-win-x64", "cee1fd1c828e8996824a2d9f9056dfae771b77c05b15ad015bc7f8800409215c"), "8.1.1-darwin_amd64": ("node-v8.1.1-darwin-x64.tar.gz", "node-v8.1.1-darwin-x64", "2f67890a5a46564672cfd4522cc00c7ac04d307e6a942ae1ad38b6aee94c29e2"), "8.1.1-linux_arm64": ("node-v8.1.1-linux-arm64.tar.xz", "node-v8.1.1-linux-arm64", "3971543f9d29f77ddb8f47a54e4b99422a822173599748ab7fcd9c35c8e25124"), "8.1.1-linux_amd64": ("node-v8.1.1-linux-x64.tar.xz", "node-v8.1.1-linux-x64", "6a735e77bdd21c92fe85ea5f9f567d0d6930fa33e0e111946b17cdb7efefb8d5"), "8.1.1-windows_amd64": ("node-v8.1.1-win-x64.zip", "node-v8.1.1-win-x64", "459f3b62e58f4fac3b9b5e49694855f338f3dcf2fcf955299ee2a47f7687625a"), "8.1.2-darwin_amd64": ("node-v8.1.2-darwin-x64.tar.gz", "node-v8.1.2-darwin-x64", "70f353449b19d6d36262f5e38f9cc23e80b2034c21ae48623a6a4890f513eb53"), "8.1.2-linux_arm64": ("node-v8.1.2-linux-arm64.tar.xz", "node-v8.1.2-linux-arm64", "d468ac671047a5a5edb6edd34a9a625645505551c35ef73e2102c504535a09d4"), "8.1.2-linux_amd64": ("node-v8.1.2-linux-x64.tar.xz", "node-v8.1.2-linux-x64", "f5dc173d3005fbcfd107c83a15d4dbff9a28ff53ab42c23344a572d84814ecfe"), "8.1.2-windows_amd64": ("node-v8.1.2-win-x64.zip", "node-v8.1.2-win-x64", "5463c812afeb498ad8ab9c396246e455d9353ab48ae409c82a2a45193e161f66"), "8.1.3-darwin_amd64": ("node-v8.1.3-darwin-x64.tar.gz", "node-v8.1.3-darwin-x64", "ae588038480a6acc57b6b04802fa876e0b602231e9846944dd1b4437e8c1205f"), "8.1.3-linux_arm64": ("node-v8.1.3-linux-arm64.tar.xz", "node-v8.1.3-linux-arm64", "cebc2edd89f20613a530509a2435ecc42757ce16032559ef174ebe84875a1536"), "8.1.3-linux_amd64": ("node-v8.1.3-linux-x64.tar.xz", "node-v8.1.3-linux-x64", "d41dc375ea7e33fadf0fb1bf89d9dfd222a2fb85633fba3d2cf48ac03522ba71"), "8.1.3-windows_amd64": ("node-v8.1.3-win-x64.zip", "node-v8.1.3-win-x64", "be582920c723124ebad48c968f539ef66b1f628d8b6f2338dc68a32f95104856"), "8.1.4-darwin_amd64": ("node-v8.1.4-darwin-x64.tar.gz", "node-v8.1.4-darwin-x64", "a24858a10dd4ca8ad55fd61a7472b4fe9140eb3fa347c41717360c3f29438748"), "8.1.4-linux_arm64": ("node-v8.1.4-linux-arm64.tar.xz", "node-v8.1.4-linux-arm64", "3553c617f594286fea7052678d04aec9e167adddf702b70431d88ce42573c339"), "8.1.4-linux_amd64": ("node-v8.1.4-linux-x64.tar.xz", "node-v8.1.4-linux-x64", "d82fe7ef7e0f8ca1c343f00e3e490996553507ec7d42034f5df034cc7908caaf"), "8.1.4-windows_amd64": ("node-v8.1.4-win-x64.zip", "node-v8.1.4-win-x64", "cc3689ffefc738f6256aab1713343c3c64c24ec997600c0a48243fb26f5e0bce"), "8.2.0-darwin_amd64": ("node-v8.2.0-darwin-x64.tar.gz", "node-v8.2.0-darwin-x64", "da5cca37ae0afdbff3a269bb3dc71ff0d86e282920286f71ae5eb6757cfa5356"), "8.2.0-linux_arm64": ("node-v8.2.0-linux-arm64.tar.xz", "node-v8.2.0-linux-arm64", "3298ae4ae67c4ad714bed23383fd08db5711b164a077a25fb6b282533e65cf77"), "8.2.0-linux_amd64": ("node-v8.2.0-linux-x64.tar.xz", "node-v8.2.0-linux-x64", "e8ceaac3ee4385d53bcebc552a7a6b545b09b9652f5ca1b254aae698fd9a25f9"), "8.2.0-windows_amd64": ("node-v8.2.0-win-x64.zip", "node-v8.2.0-win-x64", "6bc3cc580f0e8190e6a03d6a5967c861c29d6a6eb50f995b3afb7d60b8cee4e1"), "8.2.1-darwin_amd64": ("node-v8.2.1-darwin-x64.tar.gz", "node-v8.2.1-darwin-x64", "32d0923c147470d57f18f055014f5a9fe8a3919406010a2e80ba85952d3c9923"), "8.2.1-linux_arm64": ("node-v8.2.1-linux-arm64.tar.xz", "node-v8.2.1-linux-arm64", "9ed01737f37d410067beeb42066e51f6d0385677c7d0daeeaf2e32cb2aca854a"), "8.2.1-linux_amd64": ("node-v8.2.1-linux-x64.tar.xz", "node-v8.2.1-linux-x64", "abcddeb95cc4465953b1edb0922d20e9b0b3de83688fc8150b863117032a978a"), "8.2.1-windows_amd64": ("node-v8.2.1-win-x64.zip", "node-v8.2.1-win-x64", "37e84e54c67e3d1e52d657c04835b211c94631a0b358f4e7dc351618fdb6c083"), "8.3.0-darwin_amd64": ("node-v8.3.0-darwin-x64.tar.gz", "node-v8.3.0-darwin-x64", "a627354982a514e77e5c37ed5952edc81a7dd9c4f661fd919f192c21ae548654"), "8.3.0-linux_arm64": ("node-v8.3.0-linux-arm64.tar.xz", "node-v8.3.0-linux-arm64", "9e0dab4913585a1b8117bda03c4b5581d9140aec67bb4be0e0b6a4999b41b4ab"), "8.3.0-linux_amd64": ("node-v8.3.0-linux-x64.tar.xz", "node-v8.3.0-linux-x64", "ae377995c6e1af8e2a60c4a929f77562ebed9a2c6897cbd311a2c331f76b4e0f"), "8.3.0-windows_amd64": ("node-v8.3.0-win-x64.zip", "node-v8.3.0-win-x64", "e762fa218465e5aa0952336eee2c3e42e5b48390b36838ca7b6a243812e0b7e5"), "8.4.0-darwin_amd64": ("node-v8.4.0-darwin-x64.tar.gz", "node-v8.4.0-darwin-x64", "cc10ffbd11586bd27a7cc5e6e2d03fd3e0b341368387a03ee9a0117a0288599d"), "8.4.0-linux_arm64": ("node-v8.4.0-linux-arm64.tar.xz", "node-v8.4.0-linux-arm64", "0a811bbe4905fc879f3cbfc976e5a37cca05bbd609774abe4332b29fea75f073"), "8.4.0-linux_amd64": ("node-v8.4.0-linux-x64.tar.xz", "node-v8.4.0-linux-x64", "7fd86abad06f96cb2f889c2a0e25686a3de3e9a078ad946ded91ee4f28d8218a"), "8.4.0-windows_amd64": ("node-v8.4.0-win-x64.zip", "node-v8.4.0-win-x64", "0f60c99479f74d75c7239795c90698826ba8252019d4c23e82ed0d72ceb8974f"), "8.5.0-darwin_amd64": ("node-v8.5.0-darwin-x64.tar.gz", "node-v8.5.0-darwin-x64", "0c8d4c4d90f858a19a29fe1ae7f42b2b7f1a4d3caaa25bea2e08479c00ebbd5f"), "8.5.0-linux_arm64": ("node-v8.5.0-linux-arm64.tar.xz", "node-v8.5.0-linux-arm64", "e0decdebe73dba516d6c72401e337cee6277c6e00f817b0bf1c592360adfd4e6"), "8.5.0-linux_amd64": ("node-v8.5.0-linux-x64.tar.xz", "node-v8.5.0-linux-x64", "a9651fcc6259b4a944ebb72e6dd116602c7b26ddf939599b060d1d3e6ead8c36"), "8.5.0-windows_amd64": ("node-v8.5.0-win-x64.zip", "node-v8.5.0-win-x64", "c385d162c15a7a85d42755ee8c78c1c73bd251e2f7cbf82e5e20c824564aa9df"), "8.6.0-darwin_amd64": ("node-v8.6.0-darwin-x64.tar.gz", "node-v8.6.0-darwin-x64", "2c95f3194a92e8b37aab8895fbaeb1f5fabef3494600ef78a7b7e078dba9a7c9"), "8.6.0-linux_arm64": ("node-v8.6.0-linux-arm64.tar.xz", "node-v8.6.0-linux-arm64", "6848567ab32d04694120e18c20ef47d0f4163229634f236e4bdbb8d135f3204e"), "8.6.0-linux_amd64": ("node-v8.6.0-linux-x64.tar.xz", "node-v8.6.0-linux-x64", "e6f52c3ed7e2cc34ebddbc563434fdf043feb449a60f028101eb45227aec3444"), "8.6.0-windows_amd64": ("node-v8.6.0-win-x64.zip", "node-v8.6.0-win-x64", "08e9b29c47567517ca95ca01d5cdb255279be5463952f92da5c372a99d620b23"), "8.7.0-darwin_amd64": ("node-v8.7.0-darwin-x64.tar.gz", "node-v8.7.0-darwin-x64", "5e59798c1deafd671a35ef4dcdb9b97ce98f9255a056832dc98d454613e9ea08"), "8.7.0-linux_arm64": ("node-v8.7.0-linux-arm64.tar.xz", "node-v8.7.0-linux-arm64", "5a1a1907fbb6d90667ce70ad42602534f6cc6eda873d1c50a3259349aee73418"), "8.7.0-linux_amd64": ("node-v8.7.0-linux-x64.tar.xz", "node-v8.7.0-linux-x64", "9d6f649576cac74ef0b6634af8265156370cf8fdf3676f03e867347d3207675d"), "8.7.0-windows_amd64": ("node-v8.7.0-win-x64.zip", "node-v8.7.0-win-x64", "e95be435674e82ea7133c3268cb70044eabde2d0aef28b2a3df5c7d8d23cadcc"), "8.8.0-darwin_amd64": ("node-v8.8.0-darwin-x64.tar.gz", "node-v8.8.0-darwin-x64", "69a37e240fac48289a2a5bb75ab96091f8d6457eeaf23c0a5125250abe418176"), "8.8.0-linux_arm64": ("node-v8.8.0-linux-arm64.tar.xz", "node-v8.8.0-linux-arm64", "454617ff94882d9a81dca0840065fb5a928ff68e8e8efe7c1748d996ab757b2e"), "8.8.0-linux_amd64": ("node-v8.8.0-linux-x64.tar.xz", "node-v8.8.0-linux-x64", "4304c297f41085ac1f7a6a8e68496d9fd5aa3b92590e7c3c6015a23939767e72"), "8.8.0-windows_amd64": ("node-v8.8.0-win-x64.zip", "node-v8.8.0-win-x64", "a7a1fd2c5f5c967d7df70fdec1a8b2d2d2b1b411fcdd4f23bcf8c9c837a7c3cb"), "8.8.1-darwin_amd64": ("node-v8.8.1-darwin-x64.tar.gz", "node-v8.8.1-darwin-x64", "bf208e29418fb3efc836d3d32b62b9162f0f0b36a0665abc0990f4e292cfc84b"), "8.8.1-linux_arm64": ("node-v8.8.1-linux-arm64.tar.xz", "node-v8.8.1-linux-arm64", "ea8ad0286a31e7519e979fcf99e503845a95da640cd140be5cff418a68fa6263"), "8.8.1-linux_amd64": ("node-v8.8.1-linux-x64.tar.xz", "node-v8.8.1-linux-x64", "004bc95267ef5d5b928f560582f681a679bada2201bf221735a02f4956f67b09"), "8.8.1-windows_amd64": ("node-v8.8.1-win-x64.zip", "node-v8.8.1-win-x64", "a7e60a1a5f46ef309cbe74e423c17e69dd0a573f0c92c9e325caade3388d192a"), "8.9.0-darwin_amd64": ("node-v8.9.0-darwin-x64.tar.gz", "node-v8.9.0-darwin-x64", "aaf165348bc6d20012b048a88a8f3a35cba6799496e8f4c1246d85c524a84dbc"), "8.9.0-linux_arm64": ("node-v8.9.0-linux-arm64.tar.xz", "node-v8.9.0-linux-arm64", "30cb00ac1cf6b466b1f27e7ce41363a67a66dbb64227c2dc5e33d221b09fc579"), "8.9.0-linux_amd64": ("node-v8.9.0-linux-x64.tar.xz", "node-v8.9.0-linux-x64", "e92b91fa473f9ad805a1241907b6f1bd3f8ceac8426a8b4cb05428e62e243bdd"), "8.9.0-windows_amd64": ("node-v8.9.0-win-x64.zip", "node-v8.9.0-win-x64", "dd971e43ff003213b0be31c1a8ce3421f72e0db2a703bc254ac685be4f7f609e"), "8.9.1-darwin_amd64": ("node-v8.9.1-darwin-x64.tar.gz", "node-v8.9.1-darwin-x64", "05c992a6621d28d564b92bf3051a5dc0adf83839237c0d4653a8cdb8a1c73b94"), "8.9.1-linux_arm64": ("node-v8.9.1-linux-arm64.tar.xz", "node-v8.9.1-linux-arm64", "f774660980dcf931bf29847a5f26317823a063fa4a56f85f37c3222d77cce7c1"), "8.9.1-linux_amd64": ("node-v8.9.1-linux-x64.tar.xz", "node-v8.9.1-linux-x64", "8be82805f7c1ab3e64d4569fb9a90ded2de78dd27cadbb91bad1bf975dae1e2d"), "8.9.1-windows_amd64": ("node-v8.9.1-win-x64.zip", "node-v8.9.1-win-x64", "db89c6e041da359561fbe7da075bb4f9881a0f7d3e98c203e83732cfb283fa4a"), "8.9.2-darwin_amd64": ("node-v8.9.2-darwin-x64.tar.gz", "node-v8.9.2-darwin-x64", "ba03ae4c0ebd33e8661b5b241211ddb9f7e3b5b959d8cbd68f5941cb1ed5784d"), "8.9.2-linux_arm64": ("node-v8.9.2-linux-arm64.tar.xz", "node-v8.9.2-linux-arm64", "cc222b4f910ff27ff66ccc96d5c7e2117942bcd161ec253d83cf430146b79bdf"), "8.9.2-linux_amd64": ("node-v8.9.2-linux-x64.tar.xz", "node-v8.9.2-linux-x64", "d4065724e7f5f11e999f78de50fb0faac74341799cb0c0dafcbe87e0ecb0be86"), "8.9.2-windows_amd64": ("node-v8.9.2-win-x64.zip", "node-v8.9.2-win-x64", "2afa8b899c0dddea50dcf5dda66ae7b0ca32326dbf66c52f947c082e7c95d090"), "8.9.3-darwin_amd64": ("node-v8.9.3-darwin-x64.tar.gz", "node-v8.9.3-darwin-x64", "fa7962f25db420a374e9e60d8a410188bd690a2f0ce8d403aa9b09d9b7ae8c1f"), "8.9.3-linux_arm64": ("node-v8.9.3-linux-arm64.tar.xz", "node-v8.9.3-linux-arm64", "8860678ad0c24059380af254574e5a12371a2d5c92ca5e1ac7267314af7df04f"), "8.9.3-linux_amd64": ("node-v8.9.3-linux-x64.tar.xz", "node-v8.9.3-linux-x64", "86f3aa593315f0503d069e3f4805019583ab8d86c0244a83c795d1942e3f99b7"), "8.9.3-windows_amd64": ("node-v8.9.3-win-x64.zip", "node-v8.9.3-win-x64", "17dee0c06d088269123a27db3905a39a17a51cc0ea65435ae942c718f0f94403"), "8.9.4-darwin_amd64": ("node-v8.9.4-darwin-x64.tar.gz", "node-v8.9.4-darwin-x64", "ca50f7d2035eb805306e303b644bb1cde170ce2615e0a2c6e95fb80881c48c24"), "8.9.4-linux_arm64": ("node-v8.9.4-linux-arm64.tar.xz", "node-v8.9.4-linux-arm64", "7c0369a5dbc98d0989c208ca3ee1b6db4cba576343014fdbf7d36fd2659f7089"), "8.9.4-linux_amd64": ("node-v8.9.4-linux-x64.tar.xz", "node-v8.9.4-linux-x64", "68b94aac38cd5d87ab79c5b38306e34a20575f31a3ea788d117c20fffcca3370"), "8.9.4-windows_amd64": ("node-v8.9.4-win-x64.zip", "node-v8.9.4-win-x64", "48946e99ac4484e071df25741d2300f3a656f476c5ff3f8116a4746c07ebe3b7"), "8.10.0-darwin_amd64": ("node-v8.10.0-darwin-x64.tar.gz", "node-v8.10.0-darwin-x64", "7d77bd35bc781f02ba7383779da30bd529f21849b86f14d87e097497671b0271"), "8.10.0-linux_arm64": ("node-v8.10.0-linux-arm64.tar.xz", "node-v8.10.0-linux-arm64", "cbec410109664f75d3c988a43483576fc56f745e05e3884891df9c509fbb1b12"), "8.10.0-linux_amd64": ("node-v8.10.0-linux-x64.tar.xz", "node-v8.10.0-linux-x64", "92220638d661a43bd0fee2bf478cb283ead6524f231aabccf14c549ebc2bc338"), "8.10.0-windows_amd64": ("node-v8.10.0-win-x64.zip", "node-v8.10.0-win-x64", "936ada36cb6f09a5565571e15eb8006e45c5a513529c19e21d070acf0e50321b"), "8.11.0-darwin_amd64": ("node-v8.11.0-darwin-x64.tar.gz", "node-v8.11.0-darwin-x64", "408323335b8c691d75397c76ddd7b00490852652c78c813c586ba7eccc5c382b"), "8.11.0-linux_arm64": ("node-v8.11.0-linux-arm64.tar.xz", "node-v8.11.0-linux-arm64", "a28f599a14ca9ef4062fa1e605b69cd046f81d3fc9a7d6dde1856fb593004b3a"), "8.11.0-linux_amd64": ("node-v8.11.0-linux-x64.tar.xz", "node-v8.11.0-linux-x64", "180ef8c2a39c1696b9a05832883ed981ba11475ffa44ca77781a8d1c1954f944"), "8.11.0-windows_amd64": ("node-v8.11.0-win-x64.zip", "node-v8.11.0-win-x64", "55b9c8d48b59569117a63fdb26e1de05e792c37f563feb7d44b4cd59be96aff8"), "8.11.1-darwin_amd64": ("node-v8.11.1-darwin-x64.tar.gz", "node-v8.11.1-darwin-x64", "5c7b05899ff56910a2b8180f139d48612f349ac2c5d20f08dbbeffbed9e3a089"), "8.11.1-linux_arm64": ("node-v8.11.1-linux-arm64.tar.xz", "node-v8.11.1-linux-arm64", "ff518f33751baa8ea4f18853d446357c2edecd930a1526ac9b2eaa79baddc1bf"), "8.11.1-linux_amd64": ("node-v8.11.1-linux-x64.tar.xz", "node-v8.11.1-linux-x64", "6617e245fa0f7fbe0e373e71d543fea878315324ab31dc64b4eba10e42d04c11"), "8.11.1-windows_amd64": ("node-v8.11.1-win-x64.zip", "node-v8.11.1-win-x64", "7d49b59c2b5d73a14c138e8a215d558a64a5241cd5035d9824f608e7bba097b1"), "8.11.2-darwin_amd64": ("node-v8.11.2-darwin-x64.tar.gz", "node-v8.11.2-darwin-x64", "6bd619ab577a1256531e50e31924d99a094eb920de8b5bd060a056a2608282b9"), "8.11.2-linux_arm64": ("node-v8.11.2-linux-arm64.tar.xz", "node-v8.11.2-linux-arm64", "c8e9833402277c1a5a31b41cc31c9cedad68ba87c2ef78aed6a3ced81af9da7f"), "8.11.2-linux_amd64": ("node-v8.11.2-linux-x64.tar.xz", "node-v8.11.2-linux-x64", "213599127d24496cbf1cbb2a7c51060a3506d6b11132c59bb7f9f8a0edd210a7"), "8.11.2-windows_amd64": ("node-v8.11.2-win-x64.zip", "node-v8.11.2-win-x64", "bbac1f56e8001a093acb2942f8a43c3bf22aec58216f446b7bf01f6f822dfe3f"), "8.11.3-darwin_amd64": ("node-v8.11.3-darwin-x64.tar.gz", "node-v8.11.3-darwin-x64", "77fa26b4c2fc34bdf5a5dd1cd39c93b12087fbd25148c6f04bf409698ee48b86"), "8.11.3-linux_arm64": ("node-v8.11.3-linux-arm64.tar.xz", "node-v8.11.3-linux-arm64", "b8fddec18f20533929a07bc1d38ae63b1999a0252740094f0974b2cbea76eaa4"), "8.11.3-linux_amd64": ("node-v8.11.3-linux-x64.tar.xz", "node-v8.11.3-linux-x64", "08e2fcfea66746bd966ea3a89f26851f1238d96f86c33eaf6274f67fce58421a"), "8.11.3-windows_amd64": ("node-v8.11.3-win-x64.zip", "node-v8.11.3-win-x64", "91b779def1b21dcd1def7fc9671a869a1e2f989952e76fdc08a5d73570075f31"), "8.11.4-darwin_amd64": ("node-v8.11.4-darwin-x64.tar.gz", "node-v8.11.4-darwin-x64", "aa1de83b388581d0d9ec3276f4526ee67e17e0f1bc0deb5133f960ce5dc9f1ef"), "8.11.4-linux_arm64": ("node-v8.11.4-linux-arm64.tar.xz", "node-v8.11.4-linux-arm64", "46e90dd916ddbf88c866de300c1b2a26f9216b19abd92b29e89439f62fb6fc1c"), "8.11.4-linux_amd64": ("node-v8.11.4-linux-x64.tar.xz", "node-v8.11.4-linux-x64", "85ea7cbb5bf624e130585bfe3946e99c85ce5cb84c2aee474038bdbe912f908c"), "8.11.4-windows_amd64": ("node-v8.11.4-win-x64.zip", "node-v8.11.4-win-x64", "72a21e2fcd3703994f57cf707b92e7f939df99c3e0298102e7436849e4948536"), "8.12.0-darwin_amd64": ("node-v8.12.0-darwin-x64.tar.gz", "node-v8.12.0-darwin-x64", "ca131b84dfcf2b6f653a6521d31f7a108ad7d83f4d7e781945b2eca8172064aa"), "8.12.0-linux_arm64": ("node-v8.12.0-linux-arm64.tar.xz", "node-v8.12.0-linux-arm64", "0fbdcfd8cf0cb5e8f5beff84ba091fd47126ba44c628e3a351501419b211aa1a"), "8.12.0-linux_amd64": ("node-v8.12.0-linux-x64.tar.xz", "node-v8.12.0-linux-x64", "29a20479cd1e3a03396a4e74a1784ccdd1cf2f96928b56f6ffa4c8dae40c88f2"), "8.12.0-windows_amd64": ("node-v8.12.0-win-x64.zip", "node-v8.12.0-win-x64", "9b22c9b23148b61ea0052826b3ac0255b8a3a542c125272b8f014f15bf11b091"), "8.13.0-darwin_amd64": ("node-v8.13.0-darwin-x64.tar.gz", "node-v8.13.0-darwin-x64", "f6261c7a09a2c8bd77a8760a0e110410f508e5641ca132511b4883600f2d65f0"), "8.13.0-linux_arm64": ("node-v8.13.0-linux-arm64.tar.xz", "node-v8.13.0-linux-arm64", "e8e0daab515dfd0c2323b8e1274475f61c8ca1cf582dcc254583cbf8593425e3"), "8.13.0-linux_amd64": ("node-v8.13.0-linux-x64.tar.xz", "node-v8.13.0-linux-x64", "8fa1227b28113e25a8960d7fa6779a8c18bf20cfaafc9c5d0e46a3ee88373669"), "8.13.0-windows_amd64": ("node-v8.13.0-win-x64.zip", "node-v8.13.0-win-x64", "46293121d207350bd8d334efb67303337933c4dac886a840f88ff6059bff9443"), "8.14.0-darwin_amd64": ("node-v8.14.0-darwin-x64.tar.gz", "node-v8.14.0-darwin-x64", "1e9bb233bb3c3b01826f9d7e1b3ecf1047840ce96a3a7d1921ddcb569c467329"), "8.14.0-linux_arm64": ("node-v8.14.0-linux-arm64.tar.xz", "node-v8.14.0-linux-arm64", "fbcef89a60f1f40699589850f861fc84354a6f240610e2726c3743455dd82525"), "8.14.0-linux_amd64": ("node-v8.14.0-linux-x64.tar.xz", "node-v8.14.0-linux-x64", "a56d1af4d7da81504338b09809cf10b3144808d47d4117b9bd9a5a4ec4d5d9b9"), "8.14.0-windows_amd64": ("node-v8.14.0-win-x64.zip", "node-v8.14.0-win-x64", "d0be7c96a25c5d2b69f8a3510e9f4414643d5fe361b4509d455249e57f9a50af"), "8.14.1-darwin_amd64": ("node-v8.14.1-darwin-x64.tar.gz", "node-v8.14.1-darwin-x64", "d180a9b70de569e4c3d10c0c4a0af74e40dbca3e845df43ce1ec522bb4252eda"), "8.14.1-linux_arm64": ("node-v8.14.1-linux-arm64.tar.xz", "node-v8.14.1-linux-arm64", "488a66288052c6497133179e4546efb7fbaf105e432cd0d9aab3471901ab5e58"), "8.14.1-linux_amd64": ("node-v8.14.1-linux-x64.tar.xz", "node-v8.14.1-linux-x64", "1fec92a0110f692c68f7bdbec41b340c474bd77063323520786a7b9b00473daf"), "8.14.1-windows_amd64": ("node-v8.14.1-win-x64.zip", "node-v8.14.1-win-x64", "41793b873f98ceed632b24120ef44b2df89625f3dfa90eb9298dad698249167c"), "8.15.0-darwin_amd64": ("node-v8.15.0-darwin-x64.tar.gz", "node-v8.15.0-darwin-x64", "a393971136408f837fbc0f7d71a63754f91cfb1851d48bd612d8219eb61956f1"), "8.15.0-linux_arm64": ("node-v8.15.0-linux-arm64.tar.xz", "node-v8.15.0-linux-arm64", "5985c6dce65b1161ff41253da5aa4e64b8f10eb010a5d2712ea9b659f70179d7"), "8.15.0-linux_amd64": ("node-v8.15.0-linux-x64.tar.xz", "node-v8.15.0-linux-x64", "c1f0c5facdba78b5dec5136aec40dcb00b5c7cf404d9236a99c955994f91d969"), "8.15.0-windows_amd64": ("node-v8.15.0-win-x64.zip", "node-v8.15.0-win-x64", "13d8eab29c191bd16c69a70a556178a5adc988b243a036aaf3d5158861b60d8e"), "8.15.1-darwin_amd64": ("node-v8.15.1-darwin-x64.tar.gz", "node-v8.15.1-darwin-x64", "f3da0b4397150226c008a86c99d77dbb835dc62219d863654913a78332ab19a5"), "8.15.1-linux_arm64": ("node-v8.15.1-linux-arm64.tar.xz", "node-v8.15.1-linux-arm64", "69e000d78342c3d39583922c57947a906ad723789d6294951deb10cbe8709605"), "8.15.1-linux_amd64": ("node-v8.15.1-linux-x64.tar.xz", "node-v8.15.1-linux-x64", "5643b54c583eebaa40c1623b16cba4e3955ff5dfdd44036f6bafd761160c993d"), "8.15.1-windows_amd64": ("node-v8.15.1-win-x64.zip", "node-v8.15.1-win-x64", "f636fa578dc079bacc6c4bef13284ddb893c99f7640b96701c2690bd9c1431f5"), "8.16.0-darwin_amd64": ("node-v8.16.0-darwin-x64.tar.gz", "node-v8.16.0-darwin-x64", "a6710b8af0862fab0ccdba0549dbcdad76b5f99070652e64f6a85158038fc9a6"), "8.16.0-linux_arm64": ("node-v8.16.0-linux-arm64.tar.xz", "node-v8.16.0-linux-arm64", "4583d1cb44ff8b51cbf0402a78f2fe086c13a6c900c20c8be14e3b0e28e34335"), "8.16.0-linux_amd64": ("node-v8.16.0-linux-x64.tar.xz", "node-v8.16.0-linux-x64", "e538ffaaf2f808c084e70f1a1d2ff5559cff892cfd56e0bb67d00b0a95fc3a7a"), "8.16.0-windows_amd64": ("node-v8.16.0-win-x64.zip", "node-v8.16.0-win-x64", "d6baa929bacb78b347b29ebb0263220ea649ce82f3cdfd3f0b41ac725d1bbba5"), "8.16.1-darwin_amd64": ("node-v8.16.1-darwin-x64.tar.gz", "node-v8.16.1-darwin-x64", "ef1cb93f03bca4b9528e5d3226bdf8efa135e4b12285eee1e4760da06bac631a"), "8.16.1-linux_arm64": ("node-v8.16.1-linux-arm64.tar.xz", "node-v8.16.1-linux-arm64", "0c61c6ae8a70d96ab19848a09b2010d29b806f2dd79177da22c743fd5e352a98"), "8.16.1-linux_amd64": ("node-v8.16.1-linux-x64.tar.xz", "node-v8.16.1-linux-x64", "22a2580569c787ea83960bda0eae5dfaf1fe79382a52ad5fa5cd3accb93a1818"), "8.16.1-windows_amd64": ("node-v8.16.1-win-x64.zip", "node-v8.16.1-win-x64", "396dc41740bca0355d11865780e2af8e88eb17581cd2c445ccaf29b862901ab8"), "8.16.2-darwin_amd64": ("node-v8.16.2-darwin-x64.tar.gz", "node-v8.16.2-darwin-x64", "359331120e83f0707219398fc543b05eee9476446ecce549c20c4d9c7c103d29"), "8.16.2-linux_arm64": ("node-v8.16.2-linux-arm64.tar.xz", "node-v8.16.2-linux-arm64", "5afe366affb05136d25e99ec97a7a1ee1b690cc26df43567af0509f36b45e682"), "8.16.2-linux_amd64": ("node-v8.16.2-linux-x64.tar.xz", "node-v8.16.2-linux-x64", "88617a293f5828cc94ee99c94a43fbea12b989e34fe643fc14885a14748a8da6"), "8.16.2-windows_amd64": ("node-v8.16.2-win-x64.zip", "node-v8.16.2-win-x64", "98c615221500434155a8a5aff5fe96cd000400f3e76858ca97e6624f1d15eb73"), "8.17.0-darwin_amd64": ("node-v8.17.0-darwin-x64.tar.gz", "node-v8.17.0-darwin-x64", "3117430fc93e9865e4a1842616cc98767b5d6987fd9d727c8be4068714570e16"), "8.17.0-linux_arm64": ("node-v8.17.0-linux-arm64.tar.xz", "node-v8.17.0-linux-arm64", "8318d1ee0265d84025ecbea76aaecd732974a6f4ac8492ddd84231cee77ba948"), "8.17.0-linux_amd64": ("node-v8.17.0-linux-x64.tar.xz", "node-v8.17.0-linux-x64", "b7f6dd77fb173c8c7c30d61d0702eefc236bba74398538aa77bfa2bb47bddce6"), "8.17.0-windows_amd64": ("node-v8.17.0-win-x64.zip", "node-v8.17.0-win-x64", "e95a63e81b27e78872c0efb9dd5809403014dbf9896035cc17adf51a350f88fa"), "9.0.0-darwin_amd64": ("node-v9.0.0-darwin-x64.tar.gz", "node-v9.0.0-darwin-x64", "40fe905e492deadbf84c46baba413294e516fa844ed8e68adb4117f8acabe9a9"), "9.0.0-linux_arm64": ("node-v9.0.0-linux-arm64.tar.xz", "node-v9.0.0-linux-arm64", "0250e13705259dcf736ac4216833c2ade459e3ade94d89af68bd98ded1783cb6"), "9.0.0-linux_amd64": ("node-v9.0.0-linux-x64.tar.xz", "node-v9.0.0-linux-x64", "8313d2f6d69dbea4cb860803a156f093041cbe352a843c06f9f05cab1f30e9cc"), "9.0.0-windows_amd64": ("node-v9.0.0-win-x64.zip", "node-v9.0.0-win-x64", "d25901007e7c48da3af162bc1917d5bdd78c7e3b9cb64f16f90c38b59ef7b412"), "9.1.0-darwin_amd64": ("node-v9.1.0-darwin-x64.tar.gz", "node-v9.1.0-darwin-x64", "8e180de9b3f6a79f09a391c89de54920bbf5375337d3e13c5bfcbce85af711ab"), "9.1.0-linux_arm64": ("node-v9.1.0-linux-arm64.tar.xz", "node-v9.1.0-linux-arm64", "37d329fa06b22e30243c503b64d9666d56abb6c0ce903251d4b43e7ad0833fb3"), "9.1.0-linux_amd64": ("node-v9.1.0-linux-x64.tar.xz", "node-v9.1.0-linux-x64", "b796ed115c97acd23211c294129b0a834ff3a6a0f583111443b89d2b24e0d4d9"), "9.1.0-windows_amd64": ("node-v9.1.0-win-x64.zip", "node-v9.1.0-win-x64", "f2e76f536ff4fedd9884684f0b1979e04d0fd1c2a65d7d1a5a013de885dd07b3"), "9.2.0-darwin_amd64": ("node-v9.2.0-darwin-x64.tar.gz", "node-v9.2.0-darwin-x64", "42f78982b8614f099bc70819db40074ff7c1c49d4bac71eca5ffe4120452f289"), "9.2.0-linux_arm64": ("node-v9.2.0-linux-arm64.tar.xz", "node-v9.2.0-linux-arm64", "1b5c44160b7bfc9e5d63697d63c82330ae3e6094ab48449bd958ebe0baef73f0"), "9.2.0-linux_amd64": ("node-v9.2.0-linux-x64.tar.xz", "node-v9.2.0-linux-x64", "ded9cef0243bbe8ac5a417be0c6471bed6ed82367714ccb23f79a5be0ba2bd5d"), "9.2.0-windows_amd64": ("node-v9.2.0-win-x64.zip", "node-v9.2.0-win-x64", "5e7feb536547c715155d772f90857239b37897c1a1a664809fd84a7aeae1a724"), "9.2.1-darwin_amd64": ("node-v9.2.1-darwin-x64.tar.gz", "node-v9.2.1-darwin-x64", "4263f3da0280e2decd3a2ab97672e6f718acdf704664a3f1251e4ea267ccc971"), "9.2.1-linux_arm64": ("node-v9.2.1-linux-arm64.tar.xz", "node-v9.2.1-linux-arm64", "09d362e2ed5f4af5e5dc2253bb4523d7bcb92135bcc11d9eb89ad8336229b756"), "9.2.1-linux_amd64": ("node-v9.2.1-linux-x64.tar.xz", "node-v9.2.1-linux-x64", "548d2959939235ca56c98740f64b64058e43d1499d760603b7941b7c37ad10fe"), "9.2.1-windows_amd64": ("node-v9.2.1-win-x64.zip", "node-v9.2.1-win-x64", "7b48ef7c718fe5748844f93101f9276a88ae1cf3c4c228f85306a6a266471b5b"), "9.3.0-darwin_amd64": ("node-v9.3.0-darwin-x64.tar.gz", "node-v9.3.0-darwin-x64", "0539601e67e9be6995d4ba4abe565a748e25699060631369f59166d5de43d21a"), "9.3.0-linux_arm64": ("node-v9.3.0-linux-arm64.tar.xz", "node-v9.3.0-linux-arm64", "11300e878220962adade33238dd6e55928ad6d1362e0daa1f12e272137e68c0b"), "9.3.0-linux_amd64": ("node-v9.3.0-linux-x64.tar.xz", "node-v9.3.0-linux-x64", "0424dd6fa059fc32e0b73f460cb587b92b13c7b0af56331bbdc53a52e43f24ea"), "9.3.0-windows_amd64": ("node-v9.3.0-win-x64.zip", "node-v9.3.0-win-x64", "53bceda79c8d5dd8a185221a5ea2fc8f2b24ed7e0c9c91d18f6016b3624ff096"), "9.4.0-darwin_amd64": ("node-v9.4.0-darwin-x64.tar.gz", "node-v9.4.0-darwin-x64", "fa271c6012d517851603829af2131b92dc7b03d6f167dcd197cb83468a4971e8"), "9.4.0-linux_arm64": ("node-v9.4.0-linux-arm64.tar.xz", "node-v9.4.0-linux-arm64", "ceed69e91723cb902fcf70e790d34147a91241509257c77a62327871dfad04fa"), "9.4.0-linux_amd64": ("node-v9.4.0-linux-x64.tar.xz", "node-v9.4.0-linux-x64", "6d331d75a39fc5292dd128ad83f6dd14bbbdcb84ba0dfe793fade833be5de95a"), "9.4.0-windows_amd64": ("node-v9.4.0-win-x64.zip", "node-v9.4.0-win-x64", "89d49d73eb92483af0133c97e57a5b521c523960c130c76727daa3412af7d5d8"), "9.5.0-darwin_amd64": ("node-v9.5.0-darwin-x64.tar.gz", "node-v9.5.0-darwin-x64", "bc5c6eb21a90dbcaf90479838416c90524fe6d47e92c928ef57d7e96a54eb5fe"), "9.5.0-linux_arm64": ("node-v9.5.0-linux-arm64.tar.xz", "node-v9.5.0-linux-arm64", "d6a98a51c032963014f606acc80babb456f3dc4c041534ca565f573a2382b253"), "9.5.0-linux_amd64": ("node-v9.5.0-linux-x64.tar.xz", "node-v9.5.0-linux-x64", "76dd38bb5a16a610894353228ef020653f81209a2e509d38aee78ace4410599e"), "9.5.0-windows_amd64": ("node-v9.5.0-win-x64.zip", "node-v9.5.0-win-x64", "2fd1c3865a34827af6b5d799aee68e011a16a637276cbf71e923c8bedd010ee8"), "9.6.0-darwin_amd64": ("node-v9.6.0-darwin-x64.tar.gz", "node-v9.6.0-darwin-x64", "4f2001075b724791bf652b5432073aaaaec03cb00b17cda054ab0a05126035fe"), "9.6.0-linux_arm64": ("node-v9.6.0-linux-arm64.tar.xz", "node-v9.6.0-linux-arm64", "eb10815b1d21e8f5111b90c15b19050279b44666d08a12f26906271e9f6b02dd"), "9.6.0-linux_amd64": ("node-v9.6.0-linux-x64.tar.xz", "node-v9.6.0-linux-x64", "24b8670c819278135b4b8851d880615dee8458fdb5f5390ed0c88c383377f5d3"), "9.6.0-windows_amd64": ("node-v9.6.0-win-x64.zip", "node-v9.6.0-win-x64", "5f1da1ef6ba776449900c931e7acc3b60e47f3080425bf0e6a1c0c5a07dbd6fd"), "9.6.1-darwin_amd64": ("node-v9.6.1-darwin-x64.tar.gz", "node-v9.6.1-darwin-x64", "de486bc479817df2df1f91468e85e5da228a19101422c0c9a27153c1d0013c6d"), "9.6.1-linux_arm64": ("node-v9.6.1-linux-arm64.tar.xz", "node-v9.6.1-linux-arm64", "6246c85acab2dd92463fa1c456db31a24cd7b50b3fa556c4976c5a91473b8c8f"), "9.6.1-linux_amd64": ("node-v9.6.1-linux-x64.tar.xz", "node-v9.6.1-linux-x64", "d38f1707faccc54fae3cb201c25b02c4a3474d2c409c64f2a1d08925b238f8ad"), "9.6.1-windows_amd64": ("node-v9.6.1-win-x64.zip", "node-v9.6.1-win-x64", "c8176d317945ce6221473d70999ec7e725f1c9a7477e991bd7c729026c46dffb"), "9.7.0-darwin_amd64": ("node-v9.7.0-darwin-x64.tar.gz", "node-v9.7.0-darwin-x64", "9730cf3c4c5e228d4855c3362b63dbe59041202d89ae30d7f5ca42f60f742c5d"), "9.7.0-linux_arm64": ("node-v9.7.0-linux-arm64.tar.xz", "node-v9.7.0-linux-arm64", "18bec2bec5e2496f33b4d9d7f3bea7411cdb5d108f390b5c1949ddeda0e61125"), "9.7.0-linux_amd64": ("node-v9.7.0-linux-x64.tar.xz", "node-v9.7.0-linux-x64", "5c7549ceeebdc7ac5acdcae5fffbeb9585e3b9e2003e70e116d9f19c768f73d1"), "9.7.0-windows_amd64": ("node-v9.7.0-win-x64.zip", "node-v9.7.0-win-x64", "a17796c9c888e88a9a086dc1a22cdd872d8e948fbf1e988a8132fef716990530"), "9.7.1-darwin_amd64": ("node-v9.7.1-darwin-x64.tar.gz", "node-v9.7.1-darwin-x64", "9ee0fa891787865b1eccc63ef56134e7de8bbf67b660a1dde9e309305a1dc3b0"), "9.7.1-linux_arm64": ("node-v9.7.1-linux-arm64.tar.xz", "node-v9.7.1-linux-arm64", "d9143c23f7aa171449229abd456c8a9e07dc1033a1e791132b3387d439e2475d"), "9.7.1-linux_amd64": ("node-v9.7.1-linux-x64.tar.xz", "node-v9.7.1-linux-x64", "33b3ecd0a1de891a4a2f3586f1c6498c95c1ecc15864a6e3f4f7826792850d99"), "9.7.1-windows_amd64": ("node-v9.7.1-win-x64.zip", "node-v9.7.1-win-x64", "8590ff193e645d7f719e25d9519633376c72cfa1b36192031705e0065b7d69b2"), "9.8.0-darwin_amd64": ("node-v9.8.0-darwin-x64.tar.gz", "node-v9.8.0-darwin-x64", "c95326d6d8d01e5d4fbf0ca1b1e4fc0d800d00516f38532cc887e17c78f2af07"), "9.8.0-linux_arm64": ("node-v9.8.0-linux-arm64.tar.xz", "node-v9.8.0-linux-arm64", "f3537d06f010e77739be073003fca0b477efec8a72d503dc5a1d942a19973b07"), "9.8.0-linux_amd64": ("node-v9.8.0-linux-x64.tar.xz", "node-v9.8.0-linux-x64", "9f631739b0a9b96b8760c42869e88592db9c3fda2425202bd8b2d09e6371133a"), "9.8.0-windows_amd64": ("node-v9.8.0-win-x64.zip", "node-v9.8.0-win-x64", "dd3971c126907a033f2bc93fdd29327af3ff5b9d151b3b90eb5db1832fe6df9e"), "9.9.0-darwin_amd64": ("node-v9.9.0-darwin-x64.tar.gz", "node-v9.9.0-darwin-x64", "15e71817fe172119d6f9e0166ab869f12c67bdb7371d27a78b0621c408239692"), "9.9.0-linux_arm64": ("node-v9.9.0-linux-arm64.tar.xz", "node-v9.9.0-linux-arm64", "06feb32656c91c3963270de18d4a7befe52d2d8c0fd78fbbb7792a881ffeec7a"), "9.9.0-linux_amd64": ("node-v9.9.0-linux-x64.tar.xz", "node-v9.9.0-linux-x64", "457151b4e6f27222232742ce44de1df73768a251309dddbfca2b385052ee977f"), "9.9.0-windows_amd64": ("node-v9.9.0-win-x64.zip", "node-v9.9.0-win-x64", "5186747c7cab6ff153e725c42446727e460d54e6c62353d5dc550046f5c05653"), "9.10.0-darwin_amd64": ("node-v9.10.0-darwin-x64.tar.gz", "node-v9.10.0-darwin-x64", "c4b98cc2f3c00b770f24549de112902b56d57be7963a1047cd116b357bc61569"), "9.10.0-linux_arm64": ("node-v9.10.0-linux-arm64.tar.xz", "node-v9.10.0-linux-arm64", "ba1d682aa1d5a12eeb39e7f51e4c67c6122b24482869ca2547c6f094eae90658"), "9.10.0-linux_amd64": ("node-v9.10.0-linux-x64.tar.xz", "node-v9.10.0-linux-x64", "b9bfffc03ef0e2c97d463619911552c7f5b1b8699de07bb913990a8b33800cb9"), "9.10.0-windows_amd64": ("node-v9.10.0-win-x64.zip", "node-v9.10.0-win-x64", "3f159de87fd987e7bf30bbffce722e2e5133c44fc847883053359e9b08d6fa88"), "9.10.1-darwin_amd64": ("node-v9.10.1-darwin-x64.tar.gz", "node-v9.10.1-darwin-x64", "ae2d9dfdd3fdb6a6fe588e5479a768ee502968f6544ac8ad6133cb2e05726793"), "9.10.1-linux_arm64": ("node-v9.10.1-linux-arm64.tar.xz", "node-v9.10.1-linux-arm64", "9b084b30e48a3a145fcc6cb282a1b46145b703c13a5eaee40afc7f9d82ad697b"), "9.10.1-linux_amd64": ("node-v9.10.1-linux-x64.tar.xz", "node-v9.10.1-linux-x64", "fc810056be2a0665d0f67b42d25e1b8442bd885d4893b3256a7cfe676bd973de"), "9.10.1-windows_amd64": ("node-v9.10.1-win-x64.zip", "node-v9.10.1-win-x64", "43bf882dec1550e00a039f77190a3e2a778354577e542563be4b5c205de17df1"), "9.11.0-darwin_amd64": ("node-v9.11.0-darwin-x64.tar.gz", "node-v9.11.0-darwin-x64", "e562cfc01a4d8e62c1d86f59cef4f00439b4ad279c97f95f76a39f4b3530b8e5"), "9.11.0-linux_arm64": ("node-v9.11.0-linux-arm64.tar.xz", "node-v9.11.0-linux-arm64", "8df1dd7a1ec298900cf699a7ee8e5f0f478075d0e4c4fd3fb6e3a4ad3527545c"), "9.11.0-linux_amd64": ("node-v9.11.0-linux-x64.tar.xz", "node-v9.11.0-linux-x64", "a4349420b74804b3404a4eea27341297968f61998b01f6504dbbad603700e944"), "9.11.0-windows_amd64": ("node-v9.11.0-win-x64.zip", "node-v9.11.0-win-x64", "6e7f586ece923fd71e36d5db80b6a6d731a2b156464058cb2304f6c0192637cb"), "9.11.1-darwin_amd64": ("node-v9.11.1-darwin-x64.tar.gz", "node-v9.11.1-darwin-x64", "7b1fb394aa41a62b477e36df16644bd383cc9084808511f6cd318b835a06aac6"), "9.11.1-linux_arm64": ("node-v9.11.1-linux-arm64.tar.xz", "node-v9.11.1-linux-arm64", "dba2de106fbde2013a204ca9fafdfe67c0426b4e63d186f888e59432ad2dbb03"), "9.11.1-linux_amd64": ("node-v9.11.1-linux-x64.tar.xz", "node-v9.11.1-linux-x64", "4d27a95d5c2f1c8ef99118794c9c4903e63963418d3e16ca7576760cff39879b"), "9.11.1-windows_amd64": ("node-v9.11.1-win-x64.zip", "node-v9.11.1-win-x64", "0a3566d57ccb7fed95d18fc6c3bc1552a1b1e4753f9bc6c5d45e04f325e1ee53"), "9.11.2-darwin_amd64": ("node-v9.11.2-darwin-x64.tar.gz", "node-v9.11.2-darwin-x64", "340993096108d1dc0e0b598560d87ec645fc94b0fc83a423c36343f2da45f4b8"), "9.11.2-linux_arm64": ("node-v9.11.2-linux-arm64.tar.xz", "node-v9.11.2-linux-arm64", "9a713a6f4473425b83bf67e13e4b3c9f1f683c996b913f1f6854d208996367b6"), "9.11.2-linux_amd64": ("node-v9.11.2-linux-x64.tar.xz", "node-v9.11.2-linux-x64", "a2e7fe4ee3c4e3f31e00dff241c92c2ed779a9f36735578603d2be966f938a4b"), "9.11.2-windows_amd64": ("node-v9.11.2-win-x64.zip", "node-v9.11.2-win-x64", "051db8f4d3c0503e3082173f16b25e2362de8f9a5e509c403992b2069d826c25"), "10.0.0-darwin_amd64": ("node-v10.0.0-darwin-x64.tar.gz", "node-v10.0.0-darwin-x64", "37447fdb5f5cbcf1307ca1661ed67e6e911e0e988c0cb6d15f92eebb211dce88"), "10.0.0-linux_arm64": ("node-v10.0.0-linux-arm64.tar.xz", "node-v10.0.0-linux-arm64", "18f626a967d72294d969bdf000ca80ef483a8bb75482a2c4d14f5e0141626611"), "10.0.0-linux_amd64": ("node-v10.0.0-linux-x64.tar.xz", "node-v10.0.0-linux-x64", "d57c391daef40e706ca71abeaf9d53271c9d0fdb9cd18a80f6296b04dbaf2d5a"), "10.0.0-windows_amd64": ("node-v10.0.0-win-x64.zip", "node-v10.0.0-win-x64", "a95d88e2c28cbcbadb1fa431ec0b686f196dda00d4a25b0829450dc8f5214ec3"), "10.1.0-darwin_amd64": ("node-v10.1.0-darwin-x64.tar.gz", "node-v10.1.0-darwin-x64", "383ef526e27b92113f8dc0dad406b771f6ecaf9e3fddd4f5357590a3cf543d7b"), "10.1.0-linux_arm64": ("node-v10.1.0-linux-arm64.tar.xz", "node-v10.1.0-linux-arm64", "01e252589cf1ce61d2aaa316895001eb24c90a48b04a0e4896de252d2840ffe9"), "10.1.0-linux_amd64": ("node-v10.1.0-linux-x64.tar.xz", "node-v10.1.0-linux-x64", "cb5860c0d3249330d882fb8c6619c082cf3cda177536d4ed979388dde0034f22"), "10.1.0-windows_amd64": ("node-v10.1.0-win-x64.zip", "node-v10.1.0-win-x64", "8448bbd50731e98a4ed8bb4f3f3964170ff3a26418e9bcb3caf770faa9fb06d7"), "10.2.0-darwin_amd64": ("node-v10.2.0-darwin-x64.tar.gz", "node-v10.2.0-darwin-x64", "35fcc482d07218119ce5fde62620994324f03f8c4426dd680886c6844b62232a"), "10.2.0-linux_arm64": ("node-v10.2.0-linux-arm64.tar.xz", "node-v10.2.0-linux-arm64", "8f970be59a6a11f511a04ae1bd303746f0c5409498e062fb1d263d3c3c1093bd"), "10.2.0-linux_amd64": ("node-v10.2.0-linux-x64.tar.xz", "node-v10.2.0-linux-x64", "a6ef9adc824db795b36f81ad0856adc5c878395c4ce2af20f5ba7b76a1ca9982"), "10.2.0-windows_amd64": ("node-v10.2.0-win-x64.zip", "node-v10.2.0-win-x64", "7d7144d57b1b910d10f51d5445ae4306f10d3d9f45ca08b49e8777472993db51"), "10.2.1-darwin_amd64": ("node-v10.2.1-darwin-x64.tar.gz", "node-v10.2.1-darwin-x64", "6ffa149f67e8bd68d291d62591b6573146a65682affd99eefe2835a9c048d3ef"), "10.2.1-linux_arm64": ("node-v10.2.1-linux-arm64.tar.xz", "node-v10.2.1-linux-arm64", "6899cab91fd01af6b73183d23693120ff0de547601d01822b53647d0f5d934ee"), "10.2.1-linux_amd64": ("node-v10.2.1-linux-x64.tar.xz", "node-v10.2.1-linux-x64", "59ffaba5f54ea6a62ada1013a0cc1741c6e6fa790ab9ab2302a98932e7fb85d5"), "10.2.1-windows_amd64": ("node-v10.2.1-win-x64.zip", "node-v10.2.1-win-x64", "ebe78920d72b7a226a345653f3f718f99dc531add35157d37d229050f3685705"), "10.3.0-darwin_amd64": ("node-v10.3.0-darwin-x64.tar.gz", "node-v10.3.0-darwin-x64", "0bb5b7e3fe8cccda2abda958d1eb0408f1518a8b0cb58b75ade5d507cd5d6053"), "10.3.0-linux_arm64": ("node-v10.3.0-linux-arm64.tar.xz", "node-v10.3.0-linux-arm64", "6811b7b9807135902990508143605c0c758d07f7726092ed1b2e27cc60111bd0"), "10.3.0-linux_amd64": ("node-v10.3.0-linux-x64.tar.xz", "node-v10.3.0-linux-x64", "eb3c3e2585494699716ad3197c8eedf4003d3f110829b30c5a0dc34414c47423"), "10.3.0-windows_amd64": ("node-v10.3.0-win-x64.zip", "node-v10.3.0-win-x64", "65d586afb087406a2800d8e51f664c88b26d510f077b85a3b177a1bb79f73677"), "10.4.0-darwin_amd64": ("node-v10.4.0-darwin-x64.tar.gz", "node-v10.4.0-darwin-x64", "82b27983c990a6860e8d729e0b15acf9643ffca0eff282a926268849dfd2c3d2"), "10.4.0-linux_arm64": ("node-v10.4.0-linux-arm64.tar.xz", "node-v10.4.0-linux-arm64", "18d01e0937cdd05386f59f792613aac7b6614a37312ede0c299bd589584976e9"), "10.4.0-linux_amd64": ("node-v10.4.0-linux-x64.tar.xz", "node-v10.4.0-linux-x64", "ce2232578408f7d6bdc7d8bbb49d3416225fe68c52540ac23f4a6e0294d947f6"), "10.4.0-windows_amd64": ("node-v10.4.0-win-x64.zip", "node-v10.4.0-win-x64", "315fc4099902a71b634fee15e4e160a0780703c59a66e7e4542045f6f2b91451"), "10.4.1-darwin_amd64": ("node-v10.4.1-darwin-x64.tar.gz", "node-v10.4.1-darwin-x64", "c232241c97e1f4659186205d50b44132e62b61cdc517f1fb86905a21d03e9189"), "10.4.1-linux_arm64": ("node-v10.4.1-linux-arm64.tar.xz", "node-v10.4.1-linux-arm64", "c00b75a28eb69e4238c9d560f50da3652395ba7bfa6e325d5a2b0cd0926070f7"), "10.4.1-linux_amd64": ("node-v10.4.1-linux-x64.tar.xz", "node-v10.4.1-linux-x64", "6196daea2b291cdb865b3597e6b819b13068cb2c9dbf27cb150256c557a81082"), "10.4.1-windows_amd64": ("node-v10.4.1-win-x64.zip", "node-v10.4.1-win-x64", "70e0b9f0036f878884fdfc585c1001a439508d1d4e6448c4aced60274a2dc191"), "10.5.0-darwin_amd64": ("node-v10.5.0-darwin-x64.tar.gz", "node-v10.5.0-darwin-x64", "a85bda6ab91da8595e71736944cbd77c61afe05092217defd0fb74d9f77109f0"), "10.5.0-linux_arm64": ("node-v10.5.0-linux-arm64.tar.xz", "node-v10.5.0-linux-arm64", "28e6baa2a4ac5b0f0f5adf85489574038d0a4ca48efe76a4e5831b6b222652ba"), "10.5.0-linux_amd64": ("node-v10.5.0-linux-x64.tar.xz", "node-v10.5.0-linux-x64", "8b12be967f5962a8173dca235e1a6f642ee29dcf5fc27697004af898ffeca187"), "10.5.0-windows_amd64": ("node-v10.5.0-win-x64.zip", "node-v10.5.0-win-x64", "ce2b1f9976de64bcc0a5ce877edee0d29c4db1ebab5a7fd713afffd661e99e08"), "10.6.0-darwin_amd64": ("node-v10.6.0-darwin-x64.tar.gz", "node-v10.6.0-darwin-x64", "537efef0c6fd998502fa10baf82ee21edf513256cc73575991354e19442d0b69"), "10.6.0-linux_arm64": ("node-v10.6.0-linux-arm64.tar.xz", "node-v10.6.0-linux-arm64", "be37aade1c085093e276b5822a05233a1057bcafe77f5b9526dbdf622330c4bb"), "10.6.0-linux_amd64": ("node-v10.6.0-linux-x64.tar.xz", "node-v10.6.0-linux-x64", "cfd47380729f2451169b8900b3bd65e4b9db669d1d540613758cd2ededf7b5e6"), "10.6.0-windows_amd64": ("node-v10.6.0-win-x64.zip", "node-v10.6.0-win-x64", "0b58e0414d76e48432588910ea682f002ba69d7be88deb3355ceffb2fe472f6d"), "10.7.0-darwin_amd64": ("node-v10.7.0-darwin-x64.tar.gz", "node-v10.7.0-darwin-x64", "913473055605c8ae92f46923e6ac400133895aafe7766574fd46899bc6b0c5a4"), "10.7.0-linux_arm64": ("node-v10.7.0-linux-arm64.tar.xz", "node-v10.7.0-linux-arm64", "c23856b3123f9e2cfae3f8b0668019f83e9450ee78dede02a8d43031255b7ba0"), "10.7.0-linux_amd64": ("node-v10.7.0-linux-x64.tar.xz", "node-v10.7.0-linux-x64", "ad1d44cbe64ef44db5d8d42690a76dd186d6a6f71a3c3d38449757fe73135329"), "10.7.0-windows_amd64": ("node-v10.7.0-win-x64.zip", "node-v10.7.0-win-x64", "a0914d4c1fb82f51a03a4f57c66c9ce6a65ccd4f3237706042c55799843f4b14"), "10.8.0-darwin_amd64": ("node-v10.8.0-darwin-x64.tar.gz", "node-v10.8.0-darwin-x64", "b800d8b55c234b1f7d972e9464b00328a1caea5f86f94fdb5fc88ebbed7852b7"), "10.8.0-linux_arm64": ("node-v10.8.0-linux-arm64.tar.xz", "node-v10.8.0-linux-arm64", "0333da24d1fe54abac26b0a06437d3336c0fb4816b280507a9851ab3742ef2e4"), "10.8.0-linux_amd64": ("node-v10.8.0-linux-x64.tar.xz", "node-v10.8.0-linux-x64", "497f3b243d7374ee0fe9ab200b175868b172c3a22282cedc6d7fb0cad82471f0"), "10.8.0-windows_amd64": ("node-v10.8.0-win-x64.zip", "node-v10.8.0-win-x64", "f98575fb551d78691a6f74ca4f9c254bbd9fb62135e9ec0ab7ec8c40a03648b0"), "10.9.0-darwin_amd64": ("node-v10.9.0-darwin-x64.tar.gz", "node-v10.9.0-darwin-x64", "3c4fe75dacfcc495a432a7ba2dec9045cff359af2a5d7d0429c84a424ef686fc"), "10.9.0-linux_arm64": ("node-v10.9.0-linux-arm64.tar.xz", "node-v10.9.0-linux-arm64", "3d6aa717d98bbf901c5325a02a81048eb47212bdc44963ef8d59c6e52e987b7c"), "10.9.0-linux_amd64": ("node-v10.9.0-linux-x64.tar.xz", "node-v10.9.0-linux-x64", "c5acb8b7055ee0b6ac653dc4e458c5db45348cecc564b388f4ed1def84a329ff"), "10.9.0-windows_amd64": ("node-v10.9.0-win-x64.zip", "node-v10.9.0-win-x64", "6a75cdbb69d62ed242d6cbf0238a470bcbf628567ee339d4d098a5efcda2401e"), "10.10.0-darwin_amd64": ("node-v10.10.0-darwin-x64.tar.gz", "node-v10.10.0-darwin-x64", "00b7a8426e076e9bf9d12ba2d571312e833fe962c70afafd10ad3682fdeeaa5e"), "10.10.0-linux_arm64": ("node-v10.10.0-linux-arm64.tar.xz", "node-v10.10.0-linux-arm64", "7d57961d18ea70b4e99906d87f9de1a2defc45a36fcd8cd84295e9ae5c4281da"), "10.10.0-linux_amd64": ("node-v10.10.0-linux-x64.tar.xz", "node-v10.10.0-linux-x64", "686d2c7b7698097e67bcd68edc3d6b5d28d81f62436c7cf9e7779d134ec262a9"), "10.10.0-windows_amd64": ("node-v10.10.0-win-x64.zip", "node-v10.10.0-win-x64", "70c46e6451798be9d052b700ce5dadccb75cf917f6bf0d6ed54344c856830cfb"), "10.11.0-darwin_amd64": ("node-v10.11.0-darwin-x64.tar.gz", "node-v10.11.0-darwin-x64", "32ad850a0e5cfdefc32d4267707abad05bd5c9eabb047e8ed9bf97faeffc52b6"), "10.11.0-linux_arm64": ("node-v10.11.0-linux-arm64.tar.xz", "node-v10.11.0-linux-arm64", "289302470520fd63e2a92a878869061dda557fe1aabfea2bd5ff88f7af76d98d"), "10.11.0-linux_amd64": ("node-v10.11.0-linux-x64.tar.xz", "node-v10.11.0-linux-x64", "c2eab149e7f0712a6a3eb672a76d657b049a3b3ae0c2edc2e0571df5049fe82c"), "10.11.0-windows_amd64": ("node-v10.11.0-win-x64.zip", "node-v10.11.0-win-x64", "78b2a7a4305aa108b9a82ac7586d7200ab51428c2b882d1318fb44ca300a8609"), "10.12.0-darwin_amd64": ("node-v10.12.0-darwin-x64.tar.gz", "node-v10.12.0-darwin-x64", "f275c901b9aeaacea2bf22648329c2e9ade5e1ff63a446b83446d5d4e19464cc"), "10.12.0-linux_arm64": ("node-v10.12.0-linux-arm64.tar.xz", "node-v10.12.0-linux-arm64", "b327deca4e380559c8c1fbacb9e668b49127ea998de4c8fe83912838cf786786"), "10.12.0-linux_amd64": ("node-v10.12.0-linux-x64.tar.xz", "node-v10.12.0-linux-x64", "4eba2e9a6db95745b769915d58e57df6ca6724ec1f023f76556fce30ceca2367"), "10.12.0-windows_amd64": ("node-v10.12.0-win-x64.zip", "node-v10.12.0-win-x64", "44c938cf1409562d25d23b7c6bce110b53cd2a73774bed573b2979f0d88f51f8"), "10.13.0-darwin_amd64": ("node-v10.13.0-darwin-x64.tar.gz", "node-v10.13.0-darwin-x64", "815a5d18516934a3963ace9f0574f7d41f0c0ce9186a19be3d89e039e57598c5"), "10.13.0-linux_arm64": ("node-v10.13.0-linux-arm64.tar.xz", "node-v10.13.0-linux-arm64", "1537ebe64dc34a2a9b8ab6254213079789e9d59ed0ed26987afb1da37b6a8f87"), "10.13.0-linux_amd64": ("node-v10.13.0-linux-x64.tar.xz", "node-v10.13.0-linux-x64", "0dc6dba645550b66f8f00541a428c29da7c3cde32fb7eda2eb626a9db3bbf08d"), "10.13.0-windows_amd64": ("node-v10.13.0-win-x64.zip", "node-v10.13.0-win-x64", "eb09c9e9677f1919ec1ca78623c09b2a718ec5388b72b7662d5c41e5f628a52c"), "10.14.0-darwin_amd64": ("node-v10.14.0-darwin-x64.tar.gz", "node-v10.14.0-darwin-x64", "dd044aa0ddeb5e32fefa80a13b33bafe3f7e0536e15fe93c1e81b052c2f1965c"), "10.14.0-linux_arm64": ("node-v10.14.0-linux-arm64.tar.xz", "node-v10.14.0-linux-arm64", "4d80efe675c40d6d3af697e17e33cad8af1caf50655276ca99d0c4ca8e2f2cf2"), "10.14.0-linux_amd64": ("node-v10.14.0-linux-x64.tar.xz", "node-v10.14.0-linux-x64", "5f576f9893e0335f0c1b071a42fdf8b3e302577ad6ea38237aaef08ad0ca898e"), "10.14.0-windows_amd64": ("node-v10.14.0-win-x64.zip", "node-v10.14.0-win-x64", "a3acbbdbbdb6ff6d5ae6e6f5ccea55aef83cfa54f52c080538edc3ac6326797b"), "10.14.1-darwin_amd64": ("node-v10.14.1-darwin-x64.tar.gz", "node-v10.14.1-darwin-x64", "91ebe7d6da8a40c72618ac9d0b0a8e224ae01febd3f5595b43b1a58190dcacb1"), "10.14.1-linux_arm64": ("node-v10.14.1-linux-arm64.tar.xz", "node-v10.14.1-linux-arm64", "c1ca91356b007cc7624c7a9e00f3b7bed8dd10aba959be5f55e4ff13da334828"), "10.14.1-linux_amd64": ("node-v10.14.1-linux-x64.tar.xz", "node-v10.14.1-linux-x64", "b65e735cdf61fb80f114c498c8955efe8e096e4b3e173281d68aa9d2c05b0f97"), "10.14.1-windows_amd64": ("node-v10.14.1-win-x64.zip", "node-v10.14.1-win-x64", "7d51aa233ad290eb916a4c3134815204eb34ecb0a001dcecc5ea57333030f303"), "10.14.2-darwin_amd64": ("node-v10.14.2-darwin-x64.tar.gz", "node-v10.14.2-darwin-x64", "5306da5db576d9c984167b4693600a2e3074cc5a701961279837753fa2139baa"), "10.14.2-linux_arm64": ("node-v10.14.2-linux-arm64.tar.xz", "node-v10.14.2-linux-arm64", "8493b30c99d697b24fbaa5bfb3b43108ab3e334ab674188b7b7982fef903aa04"), "10.14.2-linux_amd64": ("node-v10.14.2-linux-x64.tar.xz", "node-v10.14.2-linux-x64", "e43de13bf7bee440a106a844c1bc3a2adb8829fd58b857702c8f1838fdd02a2a"), "10.14.2-windows_amd64": ("node-v10.14.2-win-x64.zip", "node-v10.14.2-win-x64", "45841fe5ffe87378c748dcb9799507f6192c34117409b2c6c18480d112a337de"), "10.15.0-darwin_amd64": ("node-v10.15.0-darwin-x64.tar.gz", "node-v10.15.0-darwin-x64", "353402461c898c569658d0a963790476f4d9828cc6c9286d81617ee8afcba4e8"), "10.15.0-linux_arm64": ("node-v10.15.0-linux-arm64.tar.xz", "node-v10.15.0-linux-arm64", "77aa4a02c5471b6eb7ba935cbc6829889a27115353cff7226a208c08b654e972"), "10.15.0-linux_amd64": ("node-v10.15.0-linux-x64.tar.xz", "node-v10.15.0-linux-x64", "4ee8503c1133797777880ebf75dcf6ae3f9b894c66fd2d5da507e407064c13b5"), "10.15.0-windows_amd64": ("node-v10.15.0-win-x64.zip", "node-v10.15.0-win-x64", "c1dbc9372ad789cd21727cb5f63b4a44ed3eae216763959cff8e68e68c6fcfe1"), "10.15.1-darwin_amd64": ("node-v10.15.1-darwin-x64.tar.gz", "node-v10.15.1-darwin-x64", "327dcef4b61dead1ae04d2743d3390a2b7e6cc6c389c62cfcfeb0486c5a9f181"), "10.15.1-linux_arm64": ("node-v10.15.1-linux-arm64.tar.xz", "node-v10.15.1-linux-arm64", "0fb6d24972fd991f476a942b1b21aca5059f93b9302318c5883120445ee6cd54"), "10.15.1-linux_amd64": ("node-v10.15.1-linux-x64.tar.xz", "node-v10.15.1-linux-x64", "77db68544c7812e925b82ccc41cd4669fdeb191cea8e20053e3f0e86889c4fce"), "10.15.1-windows_amd64": ("node-v10.15.1-win-x64.zip", "node-v10.15.1-win-x64", "bb5bdc9363e4050c94b3f82888141b81630230f86e520abb7dde49081f1292b9"), "10.15.2-darwin_amd64": ("node-v10.15.2-darwin-x64.tar.gz", "node-v10.15.2-darwin-x64", "8bbb6c15a0572f493d33ef044d06ccd0ff7ead8daa67f9a32df3e863277568e8"), "10.15.2-linux_arm64": ("node-v10.15.2-linux-arm64.tar.xz", "node-v10.15.2-linux-arm64", "2978e82d85654505d732b40dfa58f21276d99712d5d001101eaf87100d350139"), "10.15.2-linux_amd64": ("node-v10.15.2-linux-x64.tar.xz", "node-v10.15.2-linux-x64", "c10eece562cfeef1627f0d2bde7dc0be810948f6bf9a932e30a8c3b425652015"), "10.15.2-windows_amd64": ("node-v10.15.2-win-x64.zip", "node-v10.15.2-win-x64", "d97cf4788ccea6deef037ce27c91cc1a814644b878311b71811ab04d0bb8c47f"), "10.15.3-darwin_amd64": ("node-v10.15.3-darwin-x64.tar.gz", "node-v10.15.3-darwin-x64", "7a5eaa1f69614375a695ccb62017248e5dcc15b0b8edffa7db5b52997cf992ba"), "10.15.3-linux_arm64": ("node-v10.15.3-linux-arm64.tar.xz", "node-v10.15.3-linux-arm64", "3d7abbf64bffb07c55168ca0f1c17be12b0d93affe9b6cadd39724649215fab9"), "10.15.3-linux_amd64": ("node-v10.15.3-linux-x64.tar.xz", "node-v10.15.3-linux-x64", "faddbe418064baf2226c2fcbd038c3ef4ae6f936eb952a1138c7ff8cfe862438"), "10.15.3-windows_amd64": ("node-v10.15.3-win-x64.zip", "node-v10.15.3-win-x64", "93c881fdc0455a932dd5b506a7a03df27d9fe36155c1d3f351ebfa4e20bf1c0d"), "10.16.0-darwin_amd64": ("node-v10.16.0-darwin-x64.tar.gz", "node-v10.16.0-darwin-x64", "6c009df1b724026d84ae9a838c5b382662e30f6c5563a0995532f2bece39fa9c"), "10.16.0-linux_arm64": ("node-v10.16.0-linux-arm64.tar.xz", "node-v10.16.0-linux-arm64", "ae2e74ab2f5dbff96bf0b7d8457004bf3538233916f8834740bbe2d5a35442e5"), "10.16.0-linux_amd64": ("node-v10.16.0-linux-x64.tar.xz", "node-v10.16.0-linux-x64", "1827f5b99084740234de0c506f4dd2202a696ed60f76059696747c34339b9d48"), "10.16.0-windows_amd64": ("node-v10.16.0-win-x64.zip", "node-v10.16.0-win-x64", "aa22cb357f0fb54ccbc06b19b60e37eefea5d7dd9940912675d3ed988bf9a059"), "10.16.1-darwin_amd64": ("node-v10.16.1-darwin-x64.tar.gz", "node-v10.16.1-darwin-x64", "328e61fdacfe2f6f1a049d57e248b3eafc0345747831323a14fe1edf98d9b3bb"), "10.16.1-linux_arm64": ("node-v10.16.1-linux-arm64.tar.xz", "node-v10.16.1-linux-arm64", "c46ba1a8e9b9c0490ae81f8b2b13d332ed6f5c86d172fa817f749042ab329b93"), "10.16.1-linux_amd64": ("node-v10.16.1-linux-x64.tar.xz", "node-v10.16.1-linux-x64", "127d9b2f485523805208f867fc513842570b29b4d6831773eeb6dd403a22ba9d"), "10.16.1-windows_amd64": ("node-v10.16.1-win-x64.zip", "node-v10.16.1-win-x64", "1ff8b26670e1b935b51f4b795728f29845c31a3c38b3220b4fe71fb139bc5623"), "10.16.2-darwin_amd64": ("node-v10.16.2-darwin-x64.tar.gz", "node-v10.16.2-darwin-x64", "21ee8bdb04909f553e97af7c6e41009e15d06b886dd3e2ca8a92ce3e0a148a09"), "10.16.2-linux_arm64": ("node-v10.16.2-linux-arm64.tar.xz", "node-v10.16.2-linux-arm64", "5fb2b7d3c2b6b40e237cdc172eabfac2e485ee309ac2bcfbff413de1ed79a59e"), "10.16.2-linux_amd64": ("node-v10.16.2-linux-x64.tar.xz", "node-v10.16.2-linux-x64", "406718dc2f3164b3d1981c36b68b70ea448fbbac29cefbe23ff286b3cd55f264"), "10.16.2-windows_amd64": ("node-v10.16.2-win-x64.zip", "node-v10.16.2-win-x64", "01654dc79d82e9f3c89d01c8cf1cdce68d3a9118dbe968ee86a3ffd6ee153567"), "10.16.3-darwin_amd64": ("node-v10.16.3-darwin-x64.tar.gz", "node-v10.16.3-darwin-x64", "6febc571e1543c2845fa919c6d06b36a24e4e142c91aedbe28b6ff7d296119e4"), "10.16.3-linux_arm64": ("node-v10.16.3-linux-arm64.tar.xz", "node-v10.16.3-linux-arm64", "8ee77bad022bd460bf2867a97bf56ce7ddc4aa2ace067e45995fb1721a958428"), "10.16.3-linux_amd64": ("node-v10.16.3-linux-x64.tar.xz", "node-v10.16.3-linux-x64", "d2271fd8cf997fa7447d638dfa92749ff18ca4b0d796bf89f2a82bf7800d5506"), "10.16.3-windows_amd64": ("node-v10.16.3-win-x64.zip", "node-v10.16.3-win-x64", "19aa47de7c5950d7bd71a1e878013b98d93871cc311d7185f5472e6d3f633146"), "10.17.0-darwin_amd64": ("node-v10.17.0-darwin-x64.tar.gz", "node-v10.17.0-darwin-x64", "9b96140ad74b217f216c83ddf50d1f70a4296576f6edbbbfb65d0f478015d9df"), "10.17.0-linux_arm64": ("node-v10.17.0-linux-arm64.tar.xz", "node-v10.17.0-linux-arm64", "3ab8ee2b5c9aa4d060c68667ddef70cc2960e12bcfe4a0f2de7ebc0f008bf13d"), "10.17.0-linux_amd64": ("node-v10.17.0-linux-x64.tar.xz", "node-v10.17.0-linux-x64", "2b49cd296f969ef0ffb7922719ffa6542bedb89d6c959a47c023d11ce222f5d6"), "10.17.0-windows_amd64": ("node-v10.17.0-win-x64.zip", "node-v10.17.0-win-x64", "e84a1f3685219811bb4662eb3e3b55abd0c764c24cd2b224ba31b3f9f162baf6"), "10.18.0-darwin_amd64": ("node-v10.18.0-darwin-x64.tar.gz", "node-v10.18.0-darwin-x64", "a7af53e3363e8ab654b97387bc7cf352dddb324562404c1d35fe10cba3f27e0f"), "10.18.0-linux_arm64": ("node-v10.18.0-linux-arm64.tar.xz", "node-v10.18.0-linux-arm64", "b2b34dd43ea3979890663afa270e09e09c219f046e39e8e439eeda2821cc9643"), "10.18.0-linux_amd64": ("node-v10.18.0-linux-x64.tar.xz", "node-v10.18.0-linux-x64", "eac160acfc2c5b6fca021baa9943341fea50859f19c7ccbd56669b1fe04e691e"), "10.18.0-windows_amd64": ("node-v10.18.0-win-x64.zip", "node-v10.18.0-win-x64", "56afcc9c191dfc99017725be92ac1331e23afb1930913446eb91852cb02a8687"), "10.18.1-darwin_amd64": ("node-v10.18.1-darwin-x64.tar.gz", "node-v10.18.1-darwin-x64", "2b2d3379420e626eee393cabf1c90bc55957ff5bb067b82a74eb2f92147d6757"), "10.18.1-linux_arm64": ("node-v10.18.1-linux-arm64.tar.xz", "node-v10.18.1-linux-arm64", "9a6203697e0087a1c909961481d579c76777df1df622921e4ce16198851f30fe"), "10.18.1-linux_amd64": ("node-v10.18.1-linux-x64.tar.xz", "node-v10.18.1-linux-x64", "8cc40f45c2c62529b15e83a6bbe0ac1febf57af3c5720df68067c96c0fddbbdf"), "10.18.1-windows_amd64": ("node-v10.18.1-win-x64.zip", "node-v10.18.1-win-x64", "fb27bb95c27c72f2e25d0c41309b606b2ae48ba0d6094a19f206ad1df9dc5e19"), "10.19.0-darwin_amd64": ("node-v10.19.0-darwin-x64.tar.gz", "node-v10.19.0-darwin-x64", "b16328570651be44213a2303c1f9515fc506e0a96a273806f71ed000e3ca3cb3"), "10.19.0-linux_arm64": ("node-v10.19.0-linux-arm64.tar.xz", "node-v10.19.0-linux-arm64", "77bdbf859fc38e6e860efd479b0a7b7b6bd3e7cb05337e5cc5638251eb5d3a59"), "10.19.0-linux_amd64": ("node-v10.19.0-linux-x64.tar.xz", "node-v10.19.0-linux-x64", "34127c7c6b1ba02d6d4dc3a926f38a5fb88bb37fc7f051349005ce331c7a53c6"), "10.19.0-windows_amd64": ("node-v10.19.0-win-x64.zip", "node-v10.19.0-win-x64", "210efd45a7f79cf4c350d8f575f990becdd3833cd922796a4c83b27996f5679e"), "10.20.0-darwin_amd64": ("node-v10.20.0-darwin-x64.tar.gz", "node-v10.20.0-darwin-x64", "c153832774afcae89a82efb55ed80557d1a41e1880638ad57128a9a3762d212f"), "10.20.0-linux_arm64": ("node-v10.20.0-linux-arm64.tar.xz", "node-v10.20.0-linux-arm64", "f3567924d6b7f0fa55c4ee0a7330ec0dcaeec557982794796d6b312e7053c674"), "10.20.0-linux_amd64": ("node-v10.20.0-linux-x64.tar.xz", "node-v10.20.0-linux-x64", "c5721a89feecc0e98d42386e171cb763c077f782033ddc998819edcf9d93b691"), "10.20.0-windows_amd64": ("node-v10.20.0-win-x64.zip", "node-v10.20.0-win-x64", "d266313fa22885a6ec76eea521fb8a1131b4d9fb3a57afb045a98301aeb7d24e"), "10.20.1-darwin_amd64": ("node-v10.20.1-darwin-x64.tar.gz", "node-v10.20.1-darwin-x64", "6437e364cd93be246ffb67dd40775cbb467bb8d28d8af4413123f478bb6234b9"), "10.20.1-linux_arm64": ("node-v10.20.1-linux-arm64.tar.xz", "node-v10.20.1-linux-arm64", "e33cafff94a6308916530b4b724bbc138399484d96f71b1c23677596bec268d0"), "10.20.1-linux_amd64": ("node-v10.20.1-linux-x64.tar.xz", "node-v10.20.1-linux-x64", "5e0b1fbc6cf8c2c34dc33d880670ee1bc1c1e931099de3796a96143a962c92ee"), "10.20.1-windows_amd64": ("node-v10.20.1-win-x64.zip", "node-v10.20.1-win-x64", "5e4ec0936c51047c218c0c164cc80283cd36ecd40e0a6979281d395c1be8ee10"), "10.21.0-darwin_amd64": ("node-v10.21.0-darwin-x64.tar.gz", "node-v10.21.0-darwin-x64", "596900700c4a0de0303bb4c378a1abcd63f31efc848704c5fbc1230de628577a"), "10.21.0-linux_arm64": ("node-v10.21.0-linux-arm64.tar.xz", "node-v10.21.0-linux-arm64", "3af40706ff0da7fe0baa4683ead6c74445405a2553e7373e627f24d19d4ac100"), "10.21.0-linux_amd64": ("node-v10.21.0-linux-x64.tar.xz", "node-v10.21.0-linux-x64", "1d3296763e46540047099e4910812e81c4899c0595f2d82474e2099c1e1603e2"), "10.21.0-windows_amd64": ("node-v10.21.0-win-x64.zip", "node-v10.21.0-win-x64", "03dddcdaccdb40978ddf15d189acdc20409d9a666636db2595118690ff83ce82"), "10.22.0-darwin_amd64": ("node-v10.22.0-darwin-x64.tar.gz", "node-v10.22.0-darwin-x64", "c7583a297ba9c6cfc03688a32776155d02fabf9ff45847c63b12a68d400f1dc1"), "10.22.0-linux_arm64": ("node-v10.22.0-linux-arm64.tar.xz", "node-v10.22.0-linux-arm64", "abacc6f37e8dfbe398843c7dc7b9bb7153ff6e653ad50e85d73d86088da48372"), "10.22.0-linux_amd64": ("node-v10.22.0-linux-x64.tar.xz", "node-v10.22.0-linux-x64", "ddf33e038c593d6df36b1dd4b25c1b6fa8230c615e6312ad33e80ef863e4a74f"), "10.22.0-windows_amd64": ("node-v10.22.0-win-x64.zip", "node-v10.22.0-win-x64", "931c2907450790f89aa178fa84c1adbd1f7cb7ab0a34f8bfb4af25640e8d4e06"), "11.0.0-darwin_amd64": ("node-v11.0.0-darwin-x64.tar.gz", "node-v11.0.0-darwin-x64", "f70e12d246ba35e88c5c08a195215c5c913ce66c9d95d0bd21cc1d3e69904279"), "11.0.0-linux_arm64": ("node-v11.0.0-linux-arm64.tar.xz", "node-v11.0.0-linux-arm64", "0d0c7013fd00a8e713c36aa96bcc268eeadbad2ce48d87e19849d66f4c618cad"), "11.0.0-linux_amd64": ("node-v11.0.0-linux-x64.tar.xz", "node-v11.0.0-linux-x64", "418b1a73bcafbf5dd3bc787f0440c2b4123dfecc2b239f5651f0256cb5ab606d"), "11.0.0-windows_amd64": ("node-v11.0.0-win-x64.zip", "node-v11.0.0-win-x64", "4dd3ef7f5c8181be39cd45476b22ed34b6da2bf77377b699384d426702f8c969"), "11.1.0-darwin_amd64": ("node-v11.1.0-darwin-x64.tar.gz", "node-v11.1.0-darwin-x64", "5d6b84d2b0fd6afee07c371bc815a9e4b6671b85bedcb38815310bd0f884d3c8"), "11.1.0-linux_arm64": ("node-v11.1.0-linux-arm64.tar.xz", "node-v11.1.0-linux-arm64", "cbba27e1c90701fbb9db66cc2c6cc3049aaf08adb16cabd0cad970b74cdaf6d3"), "11.1.0-linux_amd64": ("node-v11.1.0-linux-x64.tar.xz", "node-v11.1.0-linux-x64", "c70419674d932452017556080264de2b6d1105c112647dd1dd495b739456dd91"), "11.1.0-windows_amd64": ("node-v11.1.0-win-x64.zip", "node-v11.1.0-win-x64", "985e4edc758cb5f77f85cddda0155616b92f163b8d3842c542b1c8a395068418"), "11.2.0-darwin_amd64": ("node-v11.2.0-darwin-x64.tar.gz", "node-v11.2.0-darwin-x64", "cd17fafcdb21ae80fb94e455e63567c70b3bceedf982b93ae9e4aea411f6a6ea"), "11.2.0-linux_arm64": ("node-v11.2.0-linux-arm64.tar.xz", "node-v11.2.0-linux-arm64", "3e6c47a29b85030b4305bdc2e15cbe37e1b54a2338ce1790637384ce349ed1fd"), "11.2.0-linux_amd64": ("node-v11.2.0-linux-x64.tar.xz", "node-v11.2.0-linux-x64", "629a603443c275f8ecd851994b81a9c02a36343dbcbafc279cbecb9ccd9cf906"), "11.2.0-windows_amd64": ("node-v11.2.0-win-x64.zip", "node-v11.2.0-win-x64", "3440b2880b4e3b78c9c18865df263317e7d3c3e179dad960d526004dc7e6ba9a"), "11.3.0-darwin_amd64": ("node-v11.3.0-darwin-x64.tar.gz", "node-v11.3.0-darwin-x64", "54acc7bdeffae79fdd73f959712305aee1d8d487d56813b43cae96d151ec79db"), "11.3.0-linux_arm64": ("node-v11.3.0-linux-arm64.tar.xz", "node-v11.3.0-linux-arm64", "642cc3fc94a856ad6d09e76eaf869672bef925308afdad398a58f18eeaf4e4b8"), "11.3.0-linux_amd64": ("node-v11.3.0-linux-x64.tar.xz", "node-v11.3.0-linux-x64", "d37fb7fae8a185409bccf106e91d8ffa3450115852795512fc62e6da0b5e3dbb"), "11.3.0-windows_amd64": ("node-v11.3.0-win-x64.zip", "node-v11.3.0-win-x64", "b801e908ec36a07f06df388845e22e0b7f3cede7a4030896712c8ee28cdb3f05"), "11.4.0-darwin_amd64": ("node-v11.4.0-darwin-x64.tar.gz", "node-v11.4.0-darwin-x64", "05a515146d5bc397625f442a6ecbbc7f0d071a2a7efbf1e2b2ed46d728bc7b30"), "11.4.0-linux_arm64": ("node-v11.4.0-linux-arm64.tar.xz", "node-v11.4.0-linux-arm64", "c32e752e74794a4254ae4caa892b7beb3be60dba6851e8e5d637febfb659ee3a"), "11.4.0-linux_amd64": ("node-v11.4.0-linux-x64.tar.xz", "node-v11.4.0-linux-x64", "24d9be161e7fb28e761801639cb452ff223269ed53d967e5745b5c6391eb3fbd"), "11.4.0-windows_amd64": ("node-v11.4.0-win-x64.zip", "node-v11.4.0-win-x64", "30b84ab0101c8916694e6cd6c0ccb5182e4555da5e06deb080e906ef5b3893df"), "11.5.0-darwin_amd64": ("node-v11.5.0-darwin-x64.tar.gz", "node-v11.5.0-darwin-x64", "741abd58ac67b4bf8d2ef991a7487ea17e421b2248688b93be0d2f34886c6aa2"), "11.5.0-linux_arm64": ("node-v11.5.0-linux-arm64.tar.xz", "node-v11.5.0-linux-arm64", "3f1436c1de70b2e34f7a63a5af7e6b106a8ebe9289b3f7d045ac4a4856570164"), "11.5.0-linux_amd64": ("node-v11.5.0-linux-x64.tar.xz", "node-v11.5.0-linux-x64", "ada54407b505b7e6f516c753f0e49220917dd11efa5ee892d3252bdd65d4a54c"), "11.5.0-windows_amd64": ("node-v11.5.0-win-x64.zip", "node-v11.5.0-win-x64", "3692939b1bbd7ee8b0a967429eef6b1d45078c2f4fc289aae261ca5bde5a0607"), "11.6.0-darwin_amd64": ("node-v11.6.0-darwin-x64.tar.gz", "node-v11.6.0-darwin-x64", "c880063b112c48130dba8f7b058de61959ae46fddcfa363715571b22c1cbeb26"), "11.6.0-linux_arm64": ("node-v11.6.0-linux-arm64.tar.xz", "node-v11.6.0-linux-arm64", "956016db41f4f96f8e005d36c738d7c833442d09a970462552eb214027e0268a"), "11.6.0-linux_amd64": ("node-v11.6.0-linux-x64.tar.xz", "node-v11.6.0-linux-x64", "2251a6c5b332e7ea69bbefba11950cb6c27ba50fa700468711f729da6a6f5324"), "11.6.0-windows_amd64": ("node-v11.6.0-win-x64.zip", "node-v11.6.0-win-x64", "d230828c1cc9863c9768106ffee0320ba42049b594bd2689e430b872e8f0b2dd"), "11.7.0-darwin_amd64": ("node-v11.7.0-darwin-x64.tar.gz", "node-v11.7.0-darwin-x64", "873b47e6fc97aef2f73b0e8dde641967b2a84a3b63d1697b9d8813e14fb3b01c"), "11.7.0-linux_arm64": ("node-v11.7.0-linux-arm64.tar.xz", "node-v11.7.0-linux-arm64", "82b9726c6b367a43530f868f61b1b2a05c942d3decdf9d2e18b4a9bdf353c223"), "11.7.0-linux_amd64": ("node-v11.7.0-linux-x64.tar.xz", "node-v11.7.0-linux-x64", "b2a0a7dde17fe0da5f86ce5fea3da2861d652a5e702e2177ee62813ff86451c0"), "11.7.0-windows_amd64": ("node-v11.7.0-win-x64.zip", "node-v11.7.0-win-x64", "00834d16532f24583bf56d2baab03904b0220154cc712344be95e4d05c6234dd"), "11.8.0-darwin_amd64": ("node-v11.8.0-darwin-x64.tar.gz", "node-v11.8.0-darwin-x64", "fbb26b38f408c2f2324a5821062c16103f54de16d24f9f24c4e270a3a41f4832"), "11.8.0-linux_arm64": ("node-v11.8.0-linux-arm64.tar.xz", "node-v11.8.0-linux-arm64", "42b190c686cb8bafbdbf418a6c20c6785a23ba0f1a1a85af44595057a3d5e25e"), "11.8.0-linux_amd64": ("node-v11.8.0-linux-x64.tar.xz", "node-v11.8.0-linux-x64", "85ca19c495d5cac6acf6ee4a3c8dfb4489fb67fefc184c61eb4513eb5ef99a88"), "11.8.0-windows_amd64": ("node-v11.8.0-win-x64.zip", "node-v11.8.0-win-x64", "cd4db1b9e7ac29ed81d433f2de85582902670a121961aa3f350533d5b2fd44c6"), "11.9.0-darwin_amd64": ("node-v11.9.0-darwin-x64.tar.gz", "node-v11.9.0-darwin-x64", "1df3dd99d174bb8cb61cc8e2aa419a4998c7ada9454123c34991ce30632f1ef8"), "11.9.0-linux_arm64": ("node-v11.9.0-linux-arm64.tar.xz", "node-v11.9.0-linux-arm64", "f39baa8d212e9676bfa7f1601f94d789c6dc6b35caf440df6ec815d238978457"), "11.9.0-linux_amd64": ("node-v11.9.0-linux-x64.tar.xz", "node-v11.9.0-linux-x64", "9bc461fb7f5fd3344301abfda834160d5397a4e289f9749ab03ba0b7e9a4c853"), "11.9.0-windows_amd64": ("node-v11.9.0-win-x64.zip", "node-v11.9.0-win-x64", "c62c01436f632858fea0194d4168b483e1aa485c3fc72247add4899a103c2677"), "11.10.0-darwin_amd64": ("node-v11.10.0-darwin-x64.tar.gz", "node-v11.10.0-darwin-x64", "1956528c6f3934a97508e36a4855c154f40f1923ccd61e296d5a85679103e3a1"), "11.10.0-linux_arm64": ("node-v11.10.0-linux-arm64.tar.xz", "node-v11.10.0-linux-arm64", "60ed6caa90d8188a55f0dbc63f4aef263fb4863e036d32989b820a2e40582c66"), "11.10.0-linux_amd64": ("node-v11.10.0-linux-x64.tar.xz", "node-v11.10.0-linux-x64", "fe4c617aaf88b5228bce0341d1c77bbae2622d69eaa17a15b7d4bcc60c4777c5"), "11.10.0-windows_amd64": ("node-v11.10.0-win-x64.zip", "node-v11.10.0-win-x64", "c39e711aebe678455fa74edf6d8f6184d6d93e20f160197799040a0c17005dba"), "11.10.1-darwin_amd64": ("node-v11.10.1-darwin-x64.tar.gz", "node-v11.10.1-darwin-x64", "dea52b86f6875efae26fbb6d0269d9769da7ca69408b74b6ab724d4b64004b07"), "11.10.1-linux_arm64": ("node-v11.10.1-linux-arm64.tar.xz", "node-v11.10.1-linux-arm64", "b116e57906ed73c970d64e7518b08c6de236575c5cd8bf09f4c1bd668524a014"), "11.10.1-linux_amd64": ("node-v11.10.1-linux-x64.tar.xz", "node-v11.10.1-linux-x64", "414216a7e47dbfb77141dce7a4452901ae2cdb4cd0deef3ab3ab49e0b2111f82"), "11.10.1-windows_amd64": ("node-v11.10.1-win-x64.zip", "node-v11.10.1-win-x64", "80cf14abacbc6b636bc192f4eee49421f082f21cdaa9c1ea5995c38f8c1375e5"), "11.11.0-darwin_amd64": ("node-v11.11.0-darwin-x64.tar.gz", "node-v11.11.0-darwin-x64", "6b7c8d93096bf065de0d0a42e8f027c424172c82df6f015d3149a5dbfa03c1cc"), "11.11.0-linux_arm64": ("node-v11.11.0-linux-arm64.tar.xz", "node-v11.11.0-linux-arm64", "febb698e74264ec0ecc738c86347e6bfb5d27e33ed492a031626df988a5fb4f3"), "11.11.0-linux_amd64": ("node-v11.11.0-linux-x64.tar.xz", "node-v11.11.0-linux-x64", "ee09c7712e741f84948f76a72b651bf088e516c3f38569b9e6f30c38c026c262"), "11.11.0-windows_amd64": ("node-v11.11.0-win-x64.zip", "node-v11.11.0-win-x64", "154a5b7ca7033382743c4752fa465a5d9902f4abed4263a38ea3f41ffa113910"), "11.12.0-darwin_amd64": ("node-v11.12.0-darwin-x64.tar.gz", "node-v11.12.0-darwin-x64", "93d68c1af41d02b262b3383d69b46eb326707ec010b321ad5655b91c4956e783"), "11.12.0-linux_arm64": ("node-v11.12.0-linux-arm64.tar.xz", "node-v11.12.0-linux-arm64", "9e89838e290c9bb478351bd403707d0b741ec56021c379c9f6da515a4cd1064a"), "11.12.0-linux_amd64": ("node-v11.12.0-linux-x64.tar.xz", "node-v11.12.0-linux-x64", "1c6bb93a24eda832708c1c10ec20316e1e4f30b3cfca9c5ee5d446762414b116"), "11.12.0-windows_amd64": ("node-v11.12.0-win-x64.zip", "node-v11.12.0-win-x64", "68e5bca1d6dd6b3de20870e7c593f9a890c48d2c9c83e15034baad6f7c0da426"), "11.13.0-darwin_amd64": ("node-v11.13.0-darwin-x64.tar.gz", "node-v11.13.0-darwin-x64", "c1a8f94b4778dad2d9f513cfdf9091810dc733a2daf4fa7e03d49ad133415b5d"), "11.13.0-linux_arm64": ("node-v11.13.0-linux-arm64.tar.xz", "node-v11.13.0-linux-arm64", "0edb29004fdbb5808331e765b4adde8b025a13d6619f49fec60a14582aba9ed7"), "11.13.0-linux_amd64": ("node-v11.13.0-linux-x64.tar.xz", "node-v11.13.0-linux-x64", "c2ae3caced5f181df282a6974ab3f5e232b5decb821aa8ea8fe758b0e0528223"), "11.13.0-windows_amd64": ("node-v11.13.0-win-x64.zip", "node-v11.13.0-win-x64", "f3dafd1f19841244f8f12952f9919c0a2857f6920b11f2a89554b061cd5a4525"), "11.14.0-darwin_amd64": ("node-v11.14.0-darwin-x64.tar.gz", "node-v11.14.0-darwin-x64", "37b8db4f6700a4b5aa3b6d4283538753953f6293aff99866aa9a81038848a4d9"), "11.14.0-linux_arm64": ("node-v11.14.0-linux-arm64.tar.xz", "node-v11.14.0-linux-arm64", "3d463f3b48e1060027f8a552657de6f3ee4724d718d546aa4ea5c301ee4ed083"), "11.14.0-linux_amd64": ("node-v11.14.0-linux-x64.tar.xz", "node-v11.14.0-linux-x64", "89e2cb0effa9bf075ee8bb6d92a6a50f7ccfdad03dd687f52ecdfab91230f9a1"), "11.14.0-windows_amd64": ("node-v11.14.0-win-x64.zip", "node-v11.14.0-win-x64", "58a5d3316c04335ff3da2ce66b89f3cce86b1d1ca878d1d6d68478160c66dc12"), "11.15.0-darwin_amd64": ("node-v11.15.0-darwin-x64.tar.gz", "node-v11.15.0-darwin-x64", "e953b657b1049e1de509a3fd0700cfeecd175f75a0d141d71393aa0d71fa29a9"), "11.15.0-linux_arm64": ("node-v11.15.0-linux-arm64.tar.xz", "node-v11.15.0-linux-arm64", "e458aa4c69da9ca2ae566c8eb56dc8b36d573b415bfd8eebca4ff2229fc4983d"), "11.15.0-linux_amd64": ("node-v11.15.0-linux-x64.tar.xz", "node-v11.15.0-linux-x64", "17424aef198fa322b93c79217ce7e8cdd264fed40383abbbd3e63c305ce1d7d8"), "11.15.0-windows_amd64": ("node-v11.15.0-win-x64.zip", "node-v11.15.0-win-x64", "f3cef50acf566724a5ec5df7697fb527d7339cafdae6c7c406a39358aee6cdf8"), "12.0.0-darwin_amd64": ("node-v12.0.0-darwin-x64.tar.gz", "node-v12.0.0-darwin-x64", "92c81a284e909424b50dd01e175260b75bbbdb487fdfe1885229817187ea76bc"), "12.0.0-linux_arm64": ("node-v12.0.0-linux-arm64.tar.xz", "node-v12.0.0-linux-arm64", "2ac36aa51f76654a8914d41a32bd5c3d3213cba14eea84abd9919d022b5694b4"), "12.0.0-linux_amd64": ("node-v12.0.0-linux-x64.tar.xz", "node-v12.0.0-linux-x64", "7a5609167265954cfb912e4dc8f36e5469335b6be1bb11d60d8427f92c03f5f9"), "12.0.0-windows_amd64": ("node-v12.0.0-win-x64.zip", "node-v12.0.0-win-x64", "96ab5f9f61d75daf3fb1072930b6e9249f15b77bc3b3dca516ae8439dc1500fb"), "12.1.0-darwin_amd64": ("node-v12.1.0-darwin-x64.tar.gz", "node-v12.1.0-darwin-x64", "57c592b13940aa44611aec08e7b425f35565a2c95c51736f433cb36eb65105b7"), "12.1.0-linux_arm64": ("node-v12.1.0-linux-arm64.tar.xz", "node-v12.1.0-linux-arm64", "67805a7976bef30d0e12211f18a99c6de405931e493fd32f451512473661ee10"), "12.1.0-linux_amd64": ("node-v12.1.0-linux-x64.tar.xz", "node-v12.1.0-linux-x64", "331c43176a20e705c6f4fdb61c69fee44dd3c2c93a20410be2c13b4f8515ef7b"), "12.1.0-windows_amd64": ("node-v12.1.0-win-x64.zip", "node-v12.1.0-win-x64", "6dc3ef4a6b4ce527f187270a1b0c5560771126df487ab9ddc4c3cd3b37d57eb6"), "12.2.0-darwin_amd64": ("node-v12.2.0-darwin-x64.tar.gz", "node-v12.2.0-darwin-x64", "c72ae8a2b989138c6e6e9b393812502df8c28546a016cf24e7a82dd27e3838af"), "12.2.0-linux_arm64": ("node-v12.2.0-linux-arm64.tar.xz", "node-v12.2.0-linux-arm64", "42e4a5c6ad0b402e281daf46a27a269249bdb8b4e31ff8869701aaddac2cc8c4"), "12.2.0-linux_amd64": ("node-v12.2.0-linux-x64.tar.xz", "node-v12.2.0-linux-x64", "89059969861606e2a435ff2619c4df6f41c040120e507d9c4f03374353357307"), "12.2.0-windows_amd64": ("node-v12.2.0-win-x64.zip", "node-v12.2.0-win-x64", "c1e7fb3c1c15d8f2ab5c1db9c9662097f9c682164b3f7397955ccce946442c97"), "12.3.0-darwin_amd64": ("node-v12.3.0-darwin-x64.tar.gz", "node-v12.3.0-darwin-x64", "4a9faa038fb4e6e930a0fecd9818a4820b4ca91d1c45a1c1279fe49cdbd28160"), "12.3.0-linux_arm64": ("node-v12.3.0-linux-arm64.tar.xz", "node-v12.3.0-linux-arm64", "3d6e7046b938ff1f2535bdcc892a82abf44d875d1e96779cc3ea9a074ccfa200"), "12.3.0-linux_amd64": ("node-v12.3.0-linux-x64.tar.xz", "node-v12.3.0-linux-x64", "2ce2c7a4d7fe3c560415e8dcbc5905a66a8bf28e2a2b2cff7e7a4eeb5753015d"), "12.3.0-windows_amd64": ("node-v12.3.0-win-x64.zip", "node-v12.3.0-win-x64", "b36c9f9809c90ce704465f066861314d6e33176a5d45da14c1519c3e4f35063e"), "12.3.1-darwin_amd64": ("node-v12.3.1-darwin-x64.tar.gz", "node-v12.3.1-darwin-x64", "b9c979f63a356090d8ff88ed141fd856ad853165c73633794a9d3a060334378e"), "12.3.1-linux_arm64": ("node-v12.3.1-linux-arm64.tar.xz", "node-v12.3.1-linux-arm64", "88df7f2e0c4a58661bb79b637daa417929efc6c4d6a77bba42a5127c5c383257"), "12.3.1-linux_amd64": ("node-v12.3.1-linux-x64.tar.xz", "node-v12.3.1-linux-x64", "46f52868c0643fe0d167ce24c3c873880c8e1494276c89c07114fb099da4f75a"), "12.3.1-windows_amd64": ("node-v12.3.1-win-x64.zip", "node-v12.3.1-win-x64", "aac3c4543f846c7ebf63e1498dec7955119dffffe65722bd8c6d2124ed4ecbd7"), "12.4.0-darwin_amd64": ("node-v12.4.0-darwin-x64.tar.gz", "node-v12.4.0-darwin-x64", "aaff97d59cda775165ef966ae74e70f55f3267e86d735ed3740ae9bf1d40531e"), "12.4.0-linux_arm64": ("node-v12.4.0-linux-arm64.tar.xz", "node-v12.4.0-linux-arm64", "bb2e7eabebdceb52424516dabce94cb37f55419e6ed19493916843a323c423cd"), "12.4.0-linux_amd64": ("node-v12.4.0-linux-x64.tar.xz", "node-v12.4.0-linux-x64", "9aec6a2a50c1791704a6069cbda6da62781361e44814d024e8bbaaf0deb41c5e"), "12.4.0-windows_amd64": ("node-v12.4.0-win-x64.zip", "node-v12.4.0-win-x64", "ec8623e2528a35d3219200308e7ed41e24d4f7cd96530a4e6ac2513e44f7fad1"), "12.5.0-darwin_amd64": ("node-v12.5.0-darwin-x64.tar.gz", "node-v12.5.0-darwin-x64", "a9ba9f584f015f1705063c10dd8d84d43f5b09dc7ecf4ee3968ab1ff1fe5d2b5"), "12.5.0-linux_arm64": ("node-v12.5.0-linux-arm64.tar.xz", "node-v12.5.0-linux-arm64", "d43b71a97f5484d13b655a8a0c1b1c0fc7e83b3719063cc362fe557d6e26bd69"), "12.5.0-linux_amd64": ("node-v12.5.0-linux-x64.tar.xz", "node-v12.5.0-linux-x64", "37c0c539aae69370f3c014cc4947748ce45ac5fa560f9b085724f22029834b27"), "12.5.0-windows_amd64": ("node-v12.5.0-win-x64.zip", "node-v12.5.0-win-x64", "f1b426fcd39ffdfec5d8ba60c6842cc11e9f49269cd49bc34c4fcee0517ddf66"), "12.6.0-darwin_amd64": ("node-v12.6.0-darwin-x64.tar.gz", "node-v12.6.0-darwin-x64", "004b7992a2621eb35a47c94d258510ca5744b5a8072364f235dc7e3d4bff7457"), "12.6.0-linux_arm64": ("node-v12.6.0-linux-arm64.tar.xz", "node-v12.6.0-linux-arm64", "b7a6580f0c5406b990b3c9f0d91297b103e38e2752b8b745c4d15310a9dd79d1"), "12.6.0-linux_amd64": ("node-v12.6.0-linux-x64.tar.xz", "node-v12.6.0-linux-x64", "1ac14567e2be5562df209900e28430bd11575d985a85e8a6df2743428570de33"), "12.6.0-windows_amd64": ("node-v12.6.0-win-x64.zip", "node-v12.6.0-win-x64", "0c5ac670c5bb0ea0d389bb7269cb84104702826f791a1d057eae02cdb9eed717"), "12.7.0-darwin_amd64": ("node-v12.7.0-darwin-x64.tar.gz", "node-v12.7.0-darwin-x64", "1a76bea7f7ed8c5c921852269ddd1300c9baba2f1e3f0377200a22c22cdea177"), "12.7.0-linux_arm64": ("node-v12.7.0-linux-arm64.tar.xz", "node-v12.7.0-linux-arm64", "abc4500eff8437503d475726b8ac2ed3463d2982bd66925a782f91b7d96e31de"), "12.7.0-linux_amd64": ("node-v12.7.0-linux-x64.tar.xz", "node-v12.7.0-linux-x64", "95867fdcfd4f821d84b3dd9fab5803fb29e093e911f2ab3c7111bcaf8bd5b9da"), "12.7.0-windows_amd64": ("node-v12.7.0-win-x64.zip", "node-v12.7.0-win-x64", "68802316ca4eb4d72ec5f9ff837752a6ec8cd73537ad7c346f30899ee523f4b7"), "12.8.0-darwin_amd64": ("node-v12.8.0-darwin-x64.tar.gz", "node-v12.8.0-darwin-x64", "5229571a1736befd6426dc0a6907be416e9f5c24695e3ef275ed2ba70f496499"), "12.8.0-linux_arm64": ("node-v12.8.0-linux-arm64.tar.xz", "node-v12.8.0-linux-arm64", "9f22aff38a8622b05821129f69dbe90695e01166f55c8d2a39b6c6a5aef8c6a8"), "12.8.0-linux_amd64": ("node-v12.8.0-linux-x64.tar.xz", "node-v12.8.0-linux-x64", "b6a9ab2e6e872375e0e27eda0698820a64495b31b1beab36cc54f9876b3a2052"), "12.8.0-windows_amd64": ("node-v12.8.0-win-x64.zip", "node-v12.8.0-win-x64", "b295aedebde069c4148534a9dfb2394ceba28cf367ddd8204a27d69c095a9e00"), "12.8.1-darwin_amd64": ("node-v12.8.1-darwin-x64.tar.gz", "node-v12.8.1-darwin-x64", "caccf8b409af342e35672cc766430587664f88d01dab622a5de44c8be1336e44"), "12.8.1-linux_arm64": ("node-v12.8.1-linux-arm64.tar.xz", "node-v12.8.1-linux-arm64", "3707240c402aae0b5879ce1ba17b32ebd224d47f5147639c6881a1b71ce65383"), "12.8.1-linux_amd64": ("node-v12.8.1-linux-x64.tar.xz", "node-v12.8.1-linux-x64", "1c7cf61cb8fa98a76d92445823d6dd1649e985899e16900b39eacdd8cd4094f3"), "12.8.1-windows_amd64": ("node-v12.8.1-win-x64.zip", "node-v12.8.1-win-x64", "c81ecaa03dc882dde36087c854e4831c13d3eb237f262f9ce74ccc6f156684da"), "12.9.0-darwin_amd64": ("node-v12.9.0-darwin-x64.tar.gz", "node-v12.9.0-darwin-x64", "24c1f0c93e485961446814662db942f1b309d843fb4ecbe50466d9857a51b343"), "12.9.0-linux_arm64": ("node-v12.9.0-linux-arm64.tar.xz", "node-v12.9.0-linux-arm64", "f7f6f102d097d64eba26f84f2760597f9831886ef7d0db3cba88459847f2743d"), "12.9.0-linux_amd64": ("node-v12.9.0-linux-x64.tar.xz", "node-v12.9.0-linux-x64", "7110bdd16e397870142ff0e8d92d4a4502d43ec047d970c843a9a4e5f9e79283"), "12.9.0-windows_amd64": ("node-v12.9.0-win-x64.zip", "node-v12.9.0-win-x64", "b5f05deb31ac04b9c3a487542daf151e01c05017403a56ba443da623f36b153b"), "12.9.1-darwin_amd64": ("node-v12.9.1-darwin-x64.tar.gz", "node-v12.9.1-darwin-x64", "9aaf29d30056e2233fd15dfac56eec12e8342d91bb6c13d54fb5e599383dddb9"), "12.9.1-linux_arm64": ("node-v12.9.1-linux-arm64.tar.xz", "node-v12.9.1-linux-arm64", "b6d986faf3a77b6c353c344645c93f2a0e0436c43865e6c215a24301a076a11f"), "12.9.1-linux_amd64": ("node-v12.9.1-linux-x64.tar.xz", "node-v12.9.1-linux-x64", "680a1263c9f5f91adadcada549f0a9c29f1b26d09658d2b501c334c3f63719e5"), "12.9.1-windows_amd64": ("node-v12.9.1-win-x64.zip", "node-v12.9.1-win-x64", "6a4e54bda091bd02dbd8ff1b9f6671e036297da012a53891e3834d4bf4bed297"), "12.10.0-darwin_amd64": ("node-v12.10.0-darwin-x64.tar.gz", "node-v12.10.0-darwin-x64", "4c16d1f6454f5dc3977ad00cea123792b8d4e1d6d1bf42bbc82a4202039a5971"), "12.10.0-linux_arm64": ("node-v12.10.0-linux-arm64.tar.xz", "node-v12.10.0-linux-arm64", "fa1afb9e8cfd964867351b6dac6cd918784ff309291612251c4745aeb0b10e02"), "12.10.0-linux_amd64": ("node-v12.10.0-linux-x64.tar.xz", "node-v12.10.0-linux-x64", "e8d2e6b62dd8183dc59a139a9ca3edc7c419a0d3d92e90fea9cb0ad52489843a"), "12.10.0-windows_amd64": ("node-v12.10.0-win-x64.zip", "node-v12.10.0-win-x64", "de341476711c71f82d06fabcc9874c1ff9e865fd7274334d64a67b1e31a53fd0"), "12.11.0-darwin_amd64": ("node-v12.11.0-darwin-x64.tar.gz", "node-v12.11.0-darwin-x64", "a0fd5c1c9e67099f52b73c732aa52a878c6ff67f50ff0e94c2c5628a87455130"), "12.11.0-linux_arm64": ("node-v12.11.0-linux-arm64.tar.xz", "node-v12.11.0-linux-arm64", "d1126439ff6d079b682a7cd6308cb226afd247e5cb0f7cc60cfb0e609a096622"), "12.11.0-linux_amd64": ("node-v12.11.0-linux-x64.tar.xz", "node-v12.11.0-linux-x64", "c0dc88110ac3ee095e3d09077545435b72d4cd52e35c43cd3fa666cff7446d46"), "12.11.0-windows_amd64": ("node-v12.11.0-win-x64.zip", "node-v12.11.0-win-x64", "457157358bd029196d47865dee66f8c263a3a4a5a8cdd1c0a8cf43ac45e9eda3"), "12.11.1-darwin_amd64": ("node-v12.11.1-darwin-x64.tar.gz", "node-v12.11.1-darwin-x64", "7dd24ee6d81668e65ce1b77b4bb4cdaf517d8f80bb19740d286606028506970b"), "12.11.1-linux_arm64": ("node-v12.11.1-linux-arm64.tar.xz", "node-v12.11.1-linux-arm64", "12777294258da80410fd7d5cbed46ead5d3cabacf376ee10ddb9e1a335b114e7"), "12.11.1-linux_amd64": ("node-v12.11.1-linux-x64.tar.xz", "node-v12.11.1-linux-x64", "00f7a0b59ff38c1c74d81732df925aa5ac5788b58412437327421f796878793d"), "12.11.1-windows_amd64": ("node-v12.11.1-win-x64.zip", "node-v12.11.1-win-x64", "0bab4473cd2ba03511b8859ddf2202bb012d5c541f9d57b555a5bbbf101fcb35"), "12.12.0-darwin_amd64": ("node-v12.12.0-darwin-x64.tar.gz", "node-v12.12.0-darwin-x64", "14a98237e8859bc22695719dbc2e9db5529a33ada0c6c377df4dc27b5622ffbb"), "12.12.0-linux_arm64": ("node-v12.12.0-linux-arm64.tar.xz", "node-v12.12.0-linux-arm64", "ad536aba218df64d8e901b28985f4c5f72f634bf903c449b0c84929f6940853c"), "12.12.0-linux_amd64": ("node-v12.12.0-linux-x64.tar.xz", "node-v12.12.0-linux-x64", "e3a38dfaf1233a3c43c2528869af52e74575781984369a5b705c89d84dfa3ac2"), "12.12.0-windows_amd64": ("node-v12.12.0-win-x64.zip", "node-v12.12.0-win-x64", "930e7bcd2ae5bcb1d4163c2adf09a392ed0e9a824b069d19daeb4f9f3430a195"), "12.13.0-darwin_amd64": ("node-v12.13.0-darwin-x64.tar.gz", "node-v12.13.0-darwin-x64", "49a7374670a111b033ce16611b20fd1aafd3296bbc662b184fe8fb26a29c22cc"), "12.13.0-linux_arm64": ("node-v12.13.0-linux-arm64.tar.xz", "node-v12.13.0-linux-arm64", "d65b3ce27639f15ae22941e3ff98a1c900aa9049fcc15518038615b0676037d5"), "12.13.0-linux_amd64": ("node-v12.13.0-linux-x64.tar.xz", "node-v12.13.0-linux-x64", "7a57ef2cb3036d7eacd50ae7ba07245a28336a93652641c065f747adb2a356d9"), "12.13.0-windows_amd64": ("node-v12.13.0-win-x64.zip", "node-v12.13.0-win-x64", "6f920cebeecb4957b4ef0def6d9b04c49d4582864f8d1a207ce8d0665865781a"), "12.13.1-darwin_amd64": ("node-v12.13.1-darwin-x64.tar.gz", "node-v12.13.1-darwin-x64", "12d14c7fbd98876a163a2b7e0aeb13657dc3e967e993efaf2dcacbe475a285e8"), "12.13.1-linux_arm64": ("node-v12.13.1-linux-arm64.tar.xz", "node-v12.13.1-linux-arm64", "3aef0178a8ab74c8e5c133e23d1896e53ed5c273415d165a0e72e005f5467cba"), "12.13.1-linux_amd64": ("node-v12.13.1-linux-x64.tar.xz", "node-v12.13.1-linux-x64", "aca06db37589966829b1ef0f163a5859b156a1d8e51b415bf47590f667c30a25"), "12.13.1-windows_amd64": ("node-v12.13.1-win-x64.zip", "node-v12.13.1-win-x64", "db33fb758ba49b96d073311ef9e9134b51bf96246ffd938909b2e02c65a6e890"), "12.14.0-darwin_amd64": ("node-v12.14.0-darwin-x64.tar.gz", "node-v12.14.0-darwin-x64", "5f3170b346b29e6902c0ca7e0993e3d1b4b650615348aa866de17ad965377048"), "12.14.0-linux_arm64": ("node-v12.14.0-linux-arm64.tar.xz", "node-v12.14.0-linux-arm64", "733b4f71ccdf114038bbe0f20574a1e8f4f60b53d39caf445f518745596eadda"), "12.14.0-linux_amd64": ("node-v12.14.0-linux-x64.tar.xz", "node-v12.14.0-linux-x64", "82ae74ee0a204de7ebf7767eaa8e382518d9b49668dcbb5bd7fd003154445d1f"), "12.14.0-windows_amd64": ("node-v12.14.0-win-x64.zip", "node-v12.14.0-win-x64", "526f4b01ffb270bdd8213b58b38843fa3c88f03c89b1898c641bc0e32607913e"), "12.14.1-darwin_amd64": ("node-v12.14.1-darwin-x64.tar.gz", "node-v12.14.1-darwin-x64", "0be10a28737527a1e5e3784d3ad844d742fe8b0718acd701fd48f718fd3af78f"), "12.14.1-linux_arm64": ("node-v12.14.1-linux-arm64.tar.xz", "node-v12.14.1-linux-arm64", "6cd28a5e6340f596aec8dbfd6720f444f011e6b9018622290a60dbd17f9baff6"), "12.14.1-linux_amd64": ("node-v12.14.1-linux-x64.tar.xz", "node-v12.14.1-linux-x64", "07cfcaa0aa9d0fcb6e99725408d9e0b07be03b844701588e3ab5dbc395b98e1b"), "12.14.1-windows_amd64": ("node-v12.14.1-win-x64.zip", "node-v12.14.1-win-x64", "1f96ccce3ba045ecea3f458e189500adb90b8bc1a34de5d82fc10a5bf66ce7e3"), "12.15.0-darwin_amd64": ("node-v12.15.0-darwin-x64.tar.gz", "node-v12.15.0-darwin-x64", "b6449cec39ac15b37abe4e59ef0eae50dcdfbf060c5276a01cc590f2a3372b7d"), "12.15.0-linux_arm64": ("node-v12.15.0-linux-arm64.tar.xz", "node-v12.15.0-linux-arm64", "c582cb65a0ec7f648618d3d33b4f87c374a3f930518b57eca1693828c965d6e5"), "12.15.0-linux_amd64": ("node-v12.15.0-linux-x64.tar.xz", "node-v12.15.0-linux-x64", "63df953deb091c1500e1044bef01d1953117970e757e74e90d915e1a4a0d1c9c"), "12.15.0-windows_amd64": ("node-v12.15.0-win-x64.zip", "node-v12.15.0-win-x64", "48b29cab597962f12b0aac081522e6192bc8642c582cd0fc1bf51557273888da"), "12.16.0-darwin_amd64": ("node-v12.16.0-darwin-x64.tar.gz", "node-v12.16.0-darwin-x64", "af3b9bbfdd9ae1b46390e7deeb77a2c1d8dbc6fb4171bbb0cfe8686fc1ecef1d"), "12.16.0-linux_arm64": ("node-v12.16.0-linux-arm64.tar.xz", "node-v12.16.0-linux-arm64", "f2d97187bd8d3175bf6266193107a030bfb827003d57ba6dd21de16aa622548d"), "12.16.0-linux_amd64": ("node-v12.16.0-linux-x64.tar.xz", "node-v12.16.0-linux-x64", "e8c38659540766db9d85bd7325ba8cce8ded56204f84507f73fdb41a26d9bd73"), "12.16.0-windows_amd64": ("node-v12.16.0-win-x64.zip", "node-v12.16.0-win-x64", "9a590dd064b491fbd40b366ae4a119fe6cef516a25fb4d78d7c2a64b37574da8"), "12.16.1-darwin_amd64": ("node-v12.16.1-darwin-x64.tar.gz", "node-v12.16.1-darwin-x64", "34895bce210ca4b3cf19cd480e6563588880dd7f5d798f3782e3650580d35920"), "12.16.1-linux_arm64": ("node-v12.16.1-linux-arm64.tar.xz", "node-v12.16.1-linux-arm64", "396c43ba507b8ec33c70cdc6f73b4a7c725bddb3f74a85a8b8ed77b436856fed"), "12.16.1-linux_amd64": ("node-v12.16.1-linux-x64.tar.xz", "node-v12.16.1-linux-x64", "b826753f14df9771609ffb8e7d2cc4cb395247cb704cf0cea0f04132d9cf3505"), "12.16.1-windows_amd64": ("node-v12.16.1-win-x64.zip", "node-v12.16.1-win-x64", "b93b73572c5e495154a9823d494de5729c77d1c83b041171154c4b5f3f76b590"), "12.16.2-darwin_amd64": ("node-v12.16.2-darwin-x64.tar.gz", "node-v12.16.2-darwin-x64", "483954e311a5ff649ddf32b473f635a58890790d284b5788bdd8d7ff850c6db2"), "12.16.2-linux_arm64": ("node-v12.16.2-linux-arm64.tar.xz", "node-v12.16.2-linux-arm64", "c88005467f6dcdb621d454b35ec39bb42e165c6a2e1cee74cabcdc01af307e81"), "12.16.2-linux_amd64": ("node-v12.16.2-linux-x64.tar.xz", "node-v12.16.2-linux-x64", "f94a6eb06e80ef2794ebf51a2baed0b89ed307d3196ab5579f16c0fa7cc62901"), "12.16.2-windows_amd64": ("node-v12.16.2-win-x64.zip", "node-v12.16.2-win-x64", "f34303a49384aee2e5daab5f248c5a719e850a9ebb19e7098fe2bfffb26efe03"), "12.16.3-darwin_amd64": ("node-v12.16.3-darwin-x64.tar.gz", "node-v12.16.3-darwin-x64", "0718812b3ab8e77e8d1354f4d10428ae99d78f721bdcceee527c4b592ea7fed0"), "12.16.3-linux_arm64": ("node-v12.16.3-linux-arm64.tar.xz", "node-v12.16.3-linux-arm64", "8311f513a7d1911200502dd3e00142cef56d600c851d5870f68d939802205b73"), "12.16.3-linux_amd64": ("node-v12.16.3-linux-x64.tar.xz", "node-v12.16.3-linux-x64", "1956e196e3c3c8ef5f0c45db76d7c1245af4ccdda2b7ab30a57ce91d6e165caa"), "12.16.3-windows_amd64": ("node-v12.16.3-win-x64.zip", "node-v12.16.3-win-x64", "d0bb0e0b1f1a948529ddd543e2cfe0bfe209eb843defc70217b3d2f84cbf3b78"), "12.17.0-darwin_amd64": ("node-v12.17.0-darwin-x64.tar.gz", "node-v12.17.0-darwin-x64", "8c3b9459462b8adaa10549f4da6a5ff5cdfaf7140a8a8020a87cc96d79022cc0"), "12.17.0-linux_arm64": ("node-v12.17.0-linux-arm64.tar.xz", "node-v12.17.0-linux-arm64", "54a0dbb203ff1700341d258cefa304bd31044bf0226e9e59a0de1128418cb5aa"), "12.17.0-linux_amd64": ("node-v12.17.0-linux-x64.tar.xz", "node-v12.17.0-linux-x64", "988653492a4f422fb112421c5c9d1c140146b665b480c2b24c66fffdd0b88a88"), "12.17.0-windows_amd64": ("node-v12.17.0-win-x64.zip", "node-v12.17.0-win-x64", "f3a64dc6ad48577f1f81521aa144c028beb7e353d0fcd05d7b420a72a84f50fc"), "12.18.0-darwin_amd64": ("node-v12.18.0-darwin-x64.tar.gz", "node-v12.18.0-darwin-x64", "11fe50e670315d2d3c46317d23f7a019f46a3d08b534fbadee9a1bc3d4f81852"), "12.18.0-linux_arm64": ("node-v12.18.0-linux-arm64.tar.xz", "node-v12.18.0-linux-arm64", "51b301102984ff73a74894396b774d00259bb3bb8c1de7c82674713acec7a214"), "12.18.0-linux_amd64": ("node-v12.18.0-linux-x64.tar.xz", "node-v12.18.0-linux-x64", "2febc2506c298048bfddf896056be6191c1f08716876d960a4990bd63a7fe05a"), "12.18.0-windows_amd64": ("node-v12.18.0-win-x64.zip", "node-v12.18.0-win-x64", "ca73a989eba5e863971cb600e5520cb4c5edf9c600fe8f76d9e4771ad03b5d08"), "12.18.1-darwin_amd64": ("node-v12.18.1-darwin-x64.tar.gz", "node-v12.18.1-darwin-x64", "80e1d644fe78838da47cd16de234b612c20e06ffe14447125db9622e381ed1ba"), "12.18.1-linux_arm64": ("node-v12.18.1-linux-arm64.tar.xz", "node-v12.18.1-linux-arm64", "b6683e6e887c6c44a3fe9ff419e80d36eaafed39eb2c2d1b04ee54b440a03217"), "12.18.1-linux_amd64": ("node-v12.18.1-linux-x64.tar.xz", "node-v12.18.1-linux-x64", "863f816967e297c9eb221ad3cf32521f7ac46fffc66750e60f159ed63809affa"), "12.18.1-windows_amd64": ("node-v12.18.1-win-x64.zip", "node-v12.18.1-win-x64", "93039ebfc7c5bfad168b015f77667757925070fff3ae84c3eb73348b3123a82a"), "12.18.2-darwin_amd64": ("node-v12.18.2-darwin-x64.tar.gz", "node-v12.18.2-darwin-x64", "6e6e7311943e4f3880db5038b8b8034a30469342fe436c8aaacf2997dfa305a6"), "12.18.2-linux_arm64": ("node-v12.18.2-linux-arm64.tar.xz", "node-v12.18.2-linux-arm64", "d7d3a05f36de9eb079b7b25e0fc1aaa0c960afdf36fb24b498f7303365eb945c"), "12.18.2-linux_amd64": ("node-v12.18.2-linux-x64.tar.xz", "node-v12.18.2-linux-x64", "b8dc634798ee783482c2ae1755bd7dff09d83fa7bb037cdc370b601d0a5e5cbb"), "12.18.2-windows_amd64": ("node-v12.18.2-win-x64.zip", "node-v12.18.2-win-x64", "91fdd5b5df16873c63541bc844c9eb66870d366b2076d114f9ab7528b5e2f9a3"), "12.18.3-darwin_amd64": ("node-v12.18.3-darwin-x64.tar.gz", "node-v12.18.3-darwin-x64", "af376caf114bdd5d7e566dbf7590e9077ffc01f9b2692eb2651f31d7219a30bb"), "12.18.3-linux_arm64": ("node-v12.18.3-linux-arm64.tar.xz", "node-v12.18.3-linux-arm64", "d330aab40029afc34f8b5d1abc2e67be233df4b31331cf08d538be2a666737bb"), "12.18.3-linux_amd64": ("node-v12.18.3-linux-x64.tar.xz", "node-v12.18.3-linux-x64", "b79e02e48d0a1ee4cd4ae138de97fda5413542f2a4f441a7d0e189697b8da563"), "12.18.3-windows_amd64": ("node-v12.18.3-win-x64.zip", "node-v12.18.3-win-x64", "1fcd30c09f0ac9fbecf45161519eff2cf621c199eef4663b1db41b3f2fef4041"), "13.0.0-darwin_amd64": ("node-v13.0.0-darwin-x64.tar.gz", "node-v13.0.0-darwin-x64", "612556a8c7e6b4cd08f6134b8afe5a05bf84c0121225fa9c542be1c98af04a35"), "13.0.0-linux_arm64": ("node-v13.0.0-linux-arm64.tar.xz", "node-v13.0.0-linux-arm64", "6ed882e17123861b5b81683de2b2c86be02c5916ef0beda04fd176329888fd12"), "13.0.0-linux_amd64": ("node-v13.0.0-linux-x64.tar.xz", "node-v13.0.0-linux-x64", "799d890f00a3a2a7415b813b286d32d38573df6525bc8ef80f40077cdd210d39"), "13.0.0-windows_amd64": ("node-v13.0.0-win-x64.zip", "node-v13.0.0-win-x64", "8ffcefde5e080d70790a9a2e1aab0724cc88b5526d5128b53fc59bf94f6ad5de"), "13.0.1-darwin_amd64": ("node-v13.0.1-darwin-x64.tar.gz", "node-v13.0.1-darwin-x64", "25621359a51ff218ecf4bb2ffc657815154230a967224f22b722840a2b9ad061"), "13.0.1-linux_arm64": ("node-v13.0.1-linux-arm64.tar.xz", "node-v13.0.1-linux-arm64", "ad6e051aede160d8be5cbab9c60a155b06a5696e8088d895e6eff3dd36f9a688"), "13.0.1-linux_amd64": ("node-v13.0.1-linux-x64.tar.xz", "node-v13.0.1-linux-x64", "d5657c19bb30b267bf2e0f2b61f6a96d8955aa30b69240f22d3fd2c65e123cf7"), "13.0.1-windows_amd64": ("node-v13.0.1-win-x64.zip", "node-v13.0.1-win-x64", "1a2552b630651e08e9027339f71a65fbe3944540f0875563ea25639a091e1f33"), "13.1.0-darwin_amd64": ("node-v13.1.0-darwin-x64.tar.gz", "node-v13.1.0-darwin-x64", "6501c1bcf2babb5b9c81dcff8b52021f726da8f6ee28df1637acade1a16c7d39"), "13.1.0-linux_arm64": ("node-v13.1.0-linux-arm64.tar.xz", "node-v13.1.0-linux-arm64", "646d597e6b0dc400429e46b703a5135c77bd71e653ea4c8254d0b60c17b6ec1d"), "13.1.0-linux_amd64": ("node-v13.1.0-linux-x64.tar.xz", "node-v13.1.0-linux-x64", "2eecb5a4b7975c3b406bee36b12c9a29e8bedf9553c88cad310b8f076db00881"), "13.1.0-windows_amd64": ("node-v13.1.0-win-x64.zip", "node-v13.1.0-win-x64", "d735e97bdeb7b74551b9d165c708a3fdea4dbb3801a65e70f6d6ae3539d48a03"), "13.2.0-darwin_amd64": ("node-v13.2.0-darwin-x64.tar.gz", "node-v13.2.0-darwin-x64", "2bcba358ef68ea21655728126c678063c60119e18e65d04f615d6b22dba8f7a5"), "13.2.0-linux_arm64": ("node-v13.2.0-linux-arm64.tar.xz", "node-v13.2.0-linux-arm64", "e6c4a5fe57585f69a20bd028275db31f43de421308e31d117f319b577210e527"), "13.2.0-linux_amd64": ("node-v13.2.0-linux-x64.tar.xz", "node-v13.2.0-linux-x64", "366df8a38b522a5899c3f48d8c9e359b3370495cf84867b2673dc10483adbdef"), "13.2.0-windows_amd64": ("node-v13.2.0-win-x64.zip", "node-v13.2.0-win-x64", "e2866a8f53c45bb544d7b00aed1e5fddbbd7071bd331b02e66a6ce7c38c6918c"), "13.3.0-darwin_amd64": ("node-v13.3.0-darwin-x64.tar.gz", "node-v13.3.0-darwin-x64", "187ea9028daa6d9abad9c1cbb4e12ba51427c3748da29eae616fa352c0f4cd49"), "13.3.0-linux_arm64": ("node-v13.3.0-linux-arm64.tar.xz", "node-v13.3.0-linux-arm64", "fb201a908bea36be828eee36a7cd898c67ad4ae6846982f393466e2b8b826c16"), "13.3.0-linux_amd64": ("node-v13.3.0-linux-x64.tar.xz", "node-v13.3.0-linux-x64", "b208393ae411bd55188e903171901765aaa8381c08155e4a7b34174737a1bc65"), "13.3.0-windows_amd64": ("node-v13.3.0-win-x64.zip", "node-v13.3.0-win-x64", "82e0f43aea81374a8028a7d3c9993245c4910ac95cd0f66ee5b29b940a6f3d93"), "13.4.0-darwin_amd64": ("node-v13.4.0-darwin-x64.tar.gz", "node-v13.4.0-darwin-x64", "4de08a89054416595228d6ff40fcf20c375d00556f2e95dfde8602cbb42c0b6e"), "13.4.0-linux_arm64": ("node-v13.4.0-linux-arm64.tar.xz", "node-v13.4.0-linux-arm64", "382d5fb2983ab55d495e42145e812b3859d2a311e426307fd373f47825d55fe9"), "13.4.0-linux_amd64": ("node-v13.4.0-linux-x64.tar.xz", "node-v13.4.0-linux-x64", "5cab49240c521efb80efd0a0bb3ba1071e5498c55ecbebd723d78648c91b1cc8"), "13.4.0-windows_amd64": ("node-v13.4.0-win-x64.zip", "node-v13.4.0-win-x64", "56de9ed20332cdf22bb9b048c3fb3977662ef2de9d2e8ac2d2a27d28e9be276f"), "13.5.0-darwin_amd64": ("node-v13.5.0-darwin-x64.tar.gz", "node-v13.5.0-darwin-x64", "3322c601dc032677e5b5f87f393d4b1d70073bcab24fe74378eff8eb49364001"), "13.5.0-linux_arm64": ("node-v13.5.0-linux-arm64.tar.xz", "node-v13.5.0-linux-arm64", "fe52f4e3a60a372138102da741e5b5d34310a74b3fc6f2000e4c254e3f0c4f51"), "13.5.0-linux_amd64": ("node-v13.5.0-linux-x64.tar.xz", "node-v13.5.0-linux-x64", "4d2b2cea13388658e95d8b2dc7ff918718155473ef6ef38928d92eb8cbbe210a"), "13.5.0-windows_amd64": ("node-v13.5.0-win-x64.zip", "node-v13.5.0-win-x64", "e286a84f2861b9f3c0290a9afbbecd09f303a39b2573af001ef8a4c1413eee7c"), "13.6.0-darwin_amd64": ("node-v13.6.0-darwin-x64.tar.gz", "node-v13.6.0-darwin-x64", "da13adb864777b322dda7af20410a9b0c63aa69de4b5574008d1e6910768bf69"), "13.6.0-linux_arm64": ("node-v13.6.0-linux-arm64.tar.xz", "node-v13.6.0-linux-arm64", "1f34ed8668207e03cb832763319a82b4c753839a3655207adc5bbe52f65e154a"), "13.6.0-linux_amd64": ("node-v13.6.0-linux-x64.tar.xz", "node-v13.6.0-linux-x64", "00f01315a867da16d1638f7a02966c608e344ac6c5b7d04d1fdae3138fa9d798"), "13.6.0-windows_amd64": ("node-v13.6.0-win-x64.zip", "node-v13.6.0-win-x64", "7fe37b34a4673a071bea52fcaf913ec422cf6fd79fd025bfb22de42ccc77f386"), "13.7.0-darwin_amd64": ("node-v13.7.0-darwin-x64.tar.gz", "node-v13.7.0-darwin-x64", "866ea9bdbd7b734c593af96b946397d9c7cb9c291aa8ea52a6a2af271b972169"), "13.7.0-linux_arm64": ("node-v13.7.0-linux-arm64.tar.xz", "node-v13.7.0-linux-arm64", "2823b199c7c4e6c547caf95139e28341444a5ffc52481a5ba704067291771579"), "13.7.0-linux_amd64": ("node-v13.7.0-linux-x64.tar.xz", "node-v13.7.0-linux-x64", "02578025b82de24f4cfb3ffeb3824990431d739d09220f2db9ef9f454f475470"), "13.7.0-windows_amd64": ("node-v13.7.0-win-x64.zip", "node-v13.7.0-win-x64", "26b41de81ead8f51de2964d7c7526533f46387ff436b61596e09d678bcd7503f"), "13.8.0-darwin_amd64": ("node-v13.8.0-darwin-x64.tar.gz", "node-v13.8.0-darwin-x64", "ae480e2b124cb55667763848b8ec0fde1bc35d5e0b76debe881034689a68eaea"), "13.8.0-linux_arm64": ("node-v13.8.0-linux-arm64.tar.xz", "node-v13.8.0-linux-arm64", "f1d4167a6911e42d836a5459c992cdaf35a03ab0700ea80831d7df5d706d1baf"), "13.8.0-linux_amd64": ("node-v13.8.0-linux-x64.tar.xz", "node-v13.8.0-linux-x64", "47a8cb675358f2ff534ad3d6709f14de0433f76d3af92cf389b8dcc78a1236ad"), "13.8.0-windows_amd64": ("node-v13.8.0-win-x64.zip", "node-v13.8.0-win-x64", "f198f3e4b120fc84b61d12e7222530c5bb9c6f864735bb41a8db1cf1b94a64c3"), "13.9.0-darwin_amd64": ("node-v13.9.0-darwin-x64.tar.gz", "node-v13.9.0-darwin-x64", "b2a5a539b9b2d1733bda301913c99d220968de801bf313b762fa932820ea797b"), "13.9.0-linux_arm64": ("node-v13.9.0-linux-arm64.tar.xz", "node-v13.9.0-linux-arm64", "c668afc06e4094b68ae758b823fc3244b34f0468fc0c2feee45278788989b8a1"), "13.9.0-linux_amd64": ("node-v13.9.0-linux-x64.tar.xz", "node-v13.9.0-linux-x64", "f1e093303468032a1ecb0e290e19b43bf7771d4efbf589560df0060149614272"), "13.9.0-windows_amd64": ("node-v13.9.0-win-x64.zip", "node-v13.9.0-win-x64", "ec0a55bb703906494e738cd3d09e3274b34f0a3fbe207b9e67502092ed017500"), "13.10.0-darwin_amd64": ("node-v13.10.0-darwin-x64.tar.gz", "node-v13.10.0-darwin-x64", "67269fb9061402e446bb61776be2e5d0ec330b5274326df77979698d05f503da"), "13.10.0-linux_arm64": ("node-v13.10.0-linux-arm64.tar.xz", "node-v13.10.0-linux-arm64", "adb145535d2e03fe508fa7a34897a130ba903d6f718a21cd29d1760e298f715b"), "13.10.0-linux_amd64": ("node-v13.10.0-linux-x64.tar.xz", "node-v13.10.0-linux-x64", "62081af005257d3db7ebd5a64b43f1a8e4a57bafd229be3acd7ce2704607eaac"), "13.10.0-windows_amd64": ("node-v13.10.0-win-x64.zip", "node-v13.10.0-win-x64", "d428b6d3e127716191fa6df630d03a25d3186fda1ede04a9a8d5c07e526dbb9e"), "13.10.1-darwin_amd64": ("node-v13.10.1-darwin-x64.tar.gz", "node-v13.10.1-darwin-x64", "a6a66fdc79e70267fc191f10ee045793240974e1268fdea6c2d28afbc1d635e8"), "13.10.1-linux_arm64": ("node-v13.10.1-linux-arm64.tar.xz", "node-v13.10.1-linux-arm64", "f73effcef784251e53b5e3938b8316c36bd49628c3588de7976e8569e560c12c"), "13.10.1-linux_amd64": ("node-v13.10.1-linux-x64.tar.xz", "node-v13.10.1-linux-x64", "69d69165282d88f321e751f03ee5d3370db65e5ca4c587af24994b12f31d4827"), "13.10.1-windows_amd64": ("node-v13.10.1-win-x64.zip", "node-v13.10.1-win-x64", "f9d0aac273a44dbd52dd8cdb3d6c684b68b860d128af58d77a0c08f39f51f229"), "13.11.0-darwin_amd64": ("node-v13.11.0-darwin-x64.tar.gz", "node-v13.11.0-darwin-x64", "2d87989fb1e0d425667c5ca9893cb3ecfb30cd3344d543870246d65f8d9b892f"), "13.11.0-linux_arm64": ("node-v13.11.0-linux-arm64.tar.xz", "node-v13.11.0-linux-arm64", "63ce9871b9802a1f021c84f282c63e1890524a32dc97d3e7a7ab8d52b4bde19e"), "13.11.0-linux_amd64": ("node-v13.11.0-linux-x64.tar.xz", "node-v13.11.0-linux-x64", "c127cf38f9a56d97646eb1fedb93712f304950c7143705de7180a701becc0fbb"), "13.11.0-windows_amd64": ("node-v13.11.0-win-x64.zip", "node-v13.11.0-win-x64", "dc93aa5a82988f741dca6f1869c7b1aeda6f339293d13a968279a6dc9fcc8dd0"), "13.12.0-darwin_amd64": ("node-v13.12.0-darwin-x64.tar.gz", "node-v13.12.0-darwin-x64", "1fe3103610e8eb66ae71872ea1b4e868a638292a4e7ad0e41976a9fe417a09c7"), "13.12.0-linux_arm64": ("node-v13.12.0-linux-arm64.tar.xz", "node-v13.12.0-linux-arm64", "2e8c12e575fcceb2d6f46eb3c50c6bfa98e91540bddaf91ca1c0fe739619ca0b"), "13.12.0-linux_amd64": ("node-v13.12.0-linux-x64.tar.xz", "node-v13.12.0-linux-x64", "95eb1188872e243323cbc31fc80048be3fdfdda91505c62c80c599281de357ed"), "13.12.0-windows_amd64": ("node-v13.12.0-win-x64.zip", "node-v13.12.0-win-x64", "de8445794ecbcfe895f4775417d1e2cc023e2212b1f5d4ff5cc0ed6875f7c911"), "13.13.0-darwin_amd64": ("node-v13.13.0-darwin-x64.tar.gz", "node-v13.13.0-darwin-x64", "28ae2abedafb250a9bbe706650fd79d2b25273f6445adcc1d85c777359dc5390"), "13.13.0-linux_arm64": ("node-v13.13.0-linux-arm64.tar.xz", "node-v13.13.0-linux-arm64", "eded8da4633134cae0766a2f6f3c2237f8e728df77895c85607acaca13216226"), "13.13.0-linux_amd64": ("node-v13.13.0-linux-x64.tar.xz", "node-v13.13.0-linux-x64", "41d60cda7422f53156711626d670f9b5079075b1ecc6736aea99319fe36c20a6"), "13.13.0-windows_amd64": ("node-v13.13.0-win-x64.zip", "node-v13.13.0-win-x64", "79f2a39c1047666f2bbf2efe53c069a38b8f6ef18d569bf338463aea1914b89d"), "13.14.0-darwin_amd64": ("node-v13.14.0-darwin-x64.tar.gz", "node-v13.14.0-darwin-x64", "a56eb353fecd45f731d74fc77c58dde052320c1bc272de9b03151fbaf962feaf"), "13.14.0-linux_arm64": ("node-v13.14.0-linux-arm64.tar.xz", "node-v13.14.0-linux-arm64", "e4736df097846bbe8195a185cc67ada3410a1f8993949e516bbf62b62198d2a7"), "13.14.0-linux_amd64": ("node-v13.14.0-linux-x64.tar.xz", "node-v13.14.0-linux-x64", "9ab808ba3872d58e827ea60a6e43a352f59361bc8eb36fe0327a587086b466f9"), "13.14.0-windows_amd64": ("node-v13.14.0-win-x64.zip", "node-v13.14.0-win-x64", "8c6e77fac5e911a2e70b6ca34804b3b59b6a3c685ab4e3b17756397df86063fa"), "14.0.0-darwin_amd64": ("node-v14.0.0-darwin-x64.tar.gz", "node-v14.0.0-darwin-x64", "4e50cec7aeef91c6d00d08a3bab938358da182984aa549c2aeab9868e3342f55"), "14.0.0-linux_arm64": ("node-v14.0.0-linux-arm64.tar.xz", "node-v14.0.0-linux-arm64", "29c612fcdb40133171959b269878138bbfe7723d46681f70e2017ee30134e7ad"), "14.0.0-linux_amd64": ("node-v14.0.0-linux-x64.tar.xz", "node-v14.0.0-linux-x64", "a2aaaa621074e1b56bb751bda53ce726319fac617587443371c0a7742481e5b6"), "14.0.0-windows_amd64": ("node-v14.0.0-win-x64.zip", "node-v14.0.0-win-x64", "e8f73d4f2e9935df929360c09ae932ceb316784a7450b256024af5d01fe29b75"), "14.1.0-darwin_amd64": ("node-v14.1.0-darwin-x64.tar.gz", "node-v14.1.0-darwin-x64", "7f08bd365df4e7a5625ad393257f48e8cd79f77391ab87a64426b0c6448dd226"), "14.1.0-linux_arm64": ("node-v14.1.0-linux-arm64.tar.xz", "node-v14.1.0-linux-arm64", "9dd3a4867f679f40075e2a364d3b3566702139274da9fcd59a182198ff7c7b52"), "14.1.0-linux_amd64": ("node-v14.1.0-linux-x64.tar.xz", "node-v14.1.0-linux-x64", "959fab0c8ae0830f1ab987699cd2941cab97169991630a2e0c99db7c144f9e42"), "14.1.0-windows_amd64": ("node-v14.1.0-win-x64.zip", "node-v14.1.0-win-x64", "1d3890d0d2f996cce57bcb0206e49b67233623e3cdb50eee77b8acc8f006b955"), "14.2.0-darwin_amd64": ("node-v14.2.0-darwin-x64.tar.gz", "node-v14.2.0-darwin-x64", "2447241aefe71dea8ba1552549e4df2e894d1ac12203630db3af63d4ae35c016"), "14.2.0-linux_arm64": ("node-v14.2.0-linux-arm64.tar.xz", "node-v14.2.0-linux-arm64", "4587d2c52cd348094bd46ee4ee8cdfeb549462ead9b4aadc9cfc3c5fc3ba7215"), "14.2.0-linux_amd64": ("node-v14.2.0-linux-x64.tar.xz", "node-v14.2.0-linux-x64", "468cbd92271da8c0cacaa3fa432a73a332e398bade8ad7359a94aa8ab3cc3cca"), "14.2.0-windows_amd64": ("node-v14.2.0-win-x64.zip", "node-v14.2.0-win-x64", "99085f45a894e257123d7c729113cc00ed1413df432dbdce5fe53867e7c53b11"), "14.3.0-darwin_amd64": ("node-v14.3.0-darwin-x64.tar.gz", "node-v14.3.0-darwin-x64", "fd6a44303646f28b7e7577de687c2681cb565bef534e84deef44202e7919d7f3"), "14.3.0-linux_arm64": ("node-v14.3.0-linux-arm64.tar.xz", "node-v14.3.0-linux-arm64", "53bb110ea135ae3c819f535373ce1b779e86c7aa49a9b93fc5f26969a72365d2"), "14.3.0-linux_amd64": ("node-v14.3.0-linux-x64.tar.xz", "node-v14.3.0-linux-x64", "17236db7b9447080b58c2e50937982c386fe8a60e644b8d7f23e546068a8acba"), "14.3.0-windows_amd64": ("node-v14.3.0-win-x64.zip", "node-v14.3.0-win-x64", "07bebc231dd8d773ab41cdcfbcb8b48e2336fbee20deb961b4300b9ba86afa04"), "14.4.0-darwin_amd64": ("node-v14.4.0-darwin-x64.tar.gz", "node-v14.4.0-darwin-x64", "d95eaa6950d67895b5cdd0e2f913d2c44034178234f0cb7436c3397b54f64023"), "14.4.0-linux_arm64": ("node-v14.4.0-linux-arm64.tar.xz", "node-v14.4.0-linux-arm64", "9c9f84589b7bc6a05ac12a137e5097a5adb20b5c63ae9e4e912942da2c06d99d"), "14.4.0-linux_amd64": ("node-v14.4.0-linux-x64.tar.xz", "node-v14.4.0-linux-x64", "d65a9a8a547bfe67c6c08dae733a3e5a846700d5377c5f150164cc6bb5f6a039"), "14.4.0-windows_amd64": ("node-v14.4.0-win-x64.zip", "node-v14.4.0-win-x64", "a4bac45af8252f6b677a79ed19be4913f4939c4509fb08b6f14f972597550bbe"), "14.5.0-darwin_amd64": ("node-v14.5.0-darwin-x64.tar.gz", "node-v14.5.0-darwin-x64", "47dfd88abcd4d6d6f7b7516c95645f9760ba9c93d04b51a92895584c945b2953"), "14.5.0-linux_arm64": ("node-v14.5.0-linux-arm64.tar.xz", "node-v14.5.0-linux-arm64", "c5ab67fbc73ea8858b4a989b6e92d6630decfc47c4703be7bcda3c6e39adff0b"), "14.5.0-linux_amd64": ("node-v14.5.0-linux-x64.tar.xz", "node-v14.5.0-linux-x64", "8b0235c318de87ecf8eec9a39e5c5df80757dbec571addda7123276dfcb34d5b"), "14.5.0-windows_amd64": ("node-v14.5.0-win-x64.zip", "node-v14.5.0-win-x64", "ab5728c85ece98210036fc9c38984fa2410a882dd99075b3d5bece58e4cc6ea2"), "14.6.0-darwin_amd64": ("node-v14.6.0-darwin-x64.tar.gz", "node-v14.6.0-darwin-x64", "7907a18605b900ce977ff4c7e67f7507f937f85738659865d31779c3b2990756"), "14.6.0-linux_arm64": ("node-v14.6.0-linux-arm64.tar.xz", "node-v14.6.0-linux-arm64", "853f2c99f0e5fa65e6f222821e29c9d1a49f2d358a97c1de080ddf5c74e4ec70"), "14.6.0-linux_amd64": ("node-v14.6.0-linux-x64.tar.xz", "node-v14.6.0-linux-x64", "b8a39b2dac8e200e96586356c5525d20b0b43dba8bf9f7eb4e8c2d5366be2bb2"), "14.6.0-windows_amd64": ("node-v14.6.0-win-x64.zip", "node-v14.6.0-win-x64", "57ea75a7ec70cc8158e6f9774f9728fb9e3d08212b1af3e206db2de46ca304ca"), "14.7.0-darwin_amd64": ("node-v14.7.0-darwin-x64.tar.gz", "node-v14.7.0-darwin-x64", "47c94ec84706fd6851db27af54abdab569941fcbfcdc28e386d8fa7d49c6a619"), "14.7.0-linux_arm64": ("node-v14.7.0-linux-arm64.tar.xz", "node-v14.7.0-linux-arm64", "12540328aeb5baa524a4e9c3b493b5eceb54cfa630f8bce64c19e674871e2f4b"), "14.7.0-linux_amd64": ("node-v14.7.0-linux-x64.tar.xz", "node-v14.7.0-linux-x64", "48929b03deb2915b64ba67355d2deffeed3c8df798b0c5f2b821ffc7a8116a23"), "14.7.0-windows_amd64": ("node-v14.7.0-win-x64.zip", "node-v14.7.0-win-x64", "a899693c9a31089a1eda14b1e613cf8cd60361e6e574b351551d832cf864c8f8"), "14.8.0-darwin_amd64": ("node-v14.8.0-darwin-x64.tar.gz", "node-v14.8.0-darwin-x64", "b6db32f2ff37475ae68502c76fc777a604cbc589bf57158fb4eed4db9ac5f62d"), "14.8.0-linux_arm64": ("node-v14.8.0-linux-arm64.tar.xz", "node-v14.8.0-linux-arm64", "0c66a6468c36552c00d45cff0eaa924240f3d2e625be0306f33f8b0d81af4224"), "14.8.0-linux_amd64": ("node-v14.8.0-linux-x64.tar.xz", "node-v14.8.0-linux-x64", "c7761fe5d56d045d1540b1f0bc8a20d7edf03e6fd695ee5fbffc1dd9416ccc75"), "14.8.0-windows_amd64": ("node-v14.8.0-win-x64.zip", "node-v14.8.0-win-x64", "848ca582bdf8b7fdc21a38d9f3887a45bdf6381b04549fc0f918852889157c9a")} +
node_urls + custom list of URLs to use to download NodeJS +Each entry is a template for downloading a node distribution. +The {version} parameter is substituted with the node_version attribute, +and {filename} with the matching entry from the node_repositories attribute. + List of stringsoptional + ["https://mirror.bazel.build/nodejs.org/dist/v{version}/{filename}", "https://nodejs.org/dist/v{version}/{filename}"] +
node_version + the specific version of NodeJS to install or, if vendored_node is specified, the vendored version of node + Stringoptional + "12.13.0" +
package_json + (ADVANCED, not recommended) + a list of labels, which indicate the package.json files that will be installed + when you manually run the package manager, e.g. with + bazel run @nodejs//:yarn_node_repositories or bazel run @nodejs//:npm_node_repositories install. + If you use bazel-managed dependencies, you should omit this attribute. + List of labelsoptional + [] +
vendored_node + the local path to a pre-installed NodeJS runtime. -#### `configuration_env_vars` -(*List of strings*): Pass these configuration environment variables to the resulting binary. - Chooses a subset of the configuration environment variables (taken from `ctx.var`), which also - includes anything specified via the --define flag. - Note, this can lead to different outputs produced by this rule. +If set then also set node_version to the version that of node that is vendored. +Bazel will automatically turn on features such as --preserve-symlinks-main if they +are supported by the node version being used. + Labeloptional + None +
vendored_yarn + the local path to a pre-installed yarn tool + Labeloptional + None +
yarn_repositories + Custom list of yarn repositories to use. + +Dictionary mapping Yarn versions to their corresponding (filename, strip_prefix, sha256) tuples. + Dictionary: String -> List of stringsoptional + {"1.3.2": ("yarn-v1.3.2.tar.gz", "yarn-v1.3.2", "6cfe82e530ef0837212f13e45c1565ba53f5199eec2527b85ecbcd88bf26821d"), "1.5.1": ("yarn-v1.5.1.tar.gz", "yarn-v1.5.1", "cd31657232cf48d57fdbff55f38bfa058d2fb4950450bd34af72dac796af4de1"), "1.6.0": ("yarn-v1.6.0.tar.gz", "yarn-v1.6.0", "a57b2fdb2bfeeb083d45a883bc29af94d5e83a21c25f3fc001c295938e988509"), "1.9.2": ("yarn-v1.9.2.tar.gz", "yarn-v1.9.2", "3ad69cc7f68159a562c676e21998eb21b44138cae7e8fe0749a7d620cf940204"), "1.9.4": ("yarn-v1.9.4.tar.gz", "yarn-v1.9.4", "7667eb715077b4bad8e2a832e7084e0e6f1ba54d7280dc573c8f7031a7fb093e"), "1.12.1": ("yarn-v1.12.1.tar.gz", "yarn-v1.12.1", "09bea8f4ec41e9079fa03093d3b2db7ac5c5331852236d63815f8df42b3ba88d"), "1.12.3": ("yarn-v1.12.3.tar.gz", "yarn-v1.12.3", "02cd4b589ec22c4bdbd2bc5ebbfd99c5e99b07242ad68a539cb37896b93a24f2"), "1.13.0": ("yarn-v1.13.0.tar.gz", "yarn-v1.13.0", "125d40ebf621ebb08e3f66a618bd2cc5cd77fa317a312900a1ab4360ed38bf14"), "1.19.1": ("yarn-v1.19.1.tar.gz", "yarn-v1.19.1", "34293da6266f2aae9690d59c2d764056053ff7eebc56b80b8df05010c3da9343"), "1.22.4": ("yarn-v1.22.4.tar.gz", "yarn-v1.22.4", "bc5316aa110b2f564a71a3d6e235be55b98714660870c5b6b2d2d3f12587fb58")} +
yarn_urls + custom list of URLs to use to download Yarn + +Each entry is a template, similar to the node_urls attribute, using yarn_version and yarn_repositories in the substitutions. + List of stringsoptional + ["https://mirror.bazel.build/github.com/yarnpkg/yarn/releases/download/v{version}/{filename}", "https://github.com/yarnpkg/yarn/releases/download/v{version}/{filename}"] +
yarn_version + the specific version of Yarn to install + Stringoptional + "1.19.1" +
-Defaults to `[]` -#### `data` -(*[labels]*): Runtime dependencies which may be loaded during execution. -Defaults to `[]` +## nodejs_binary -#### `default_env_vars` -(*List of strings*): Default environment variables that are added to `configuration_env_vars`. +Runs some JavaScript code in NodeJS. -This is separate from the default of `configuration_env_vars` so that a user can set `configuration_env_vars` +
+nodejs_binary(name, configuration_env_vars, data, default_env_vars, entry_point, node_modules,
+              templated_args)
+
+ +**ATTRIBUTES** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionTypeMandatoryDefault
name + A unique name for this target. + Namerequired + +
configuration_env_vars + Pass these configuration environment variables to the resulting binary. + Chooses a subset of the configuration environment variables (taken from ctx.var), which also + includes anything specified via the --define flag. + Note, this can lead to different outputs produced by this rule. + List of stringsoptional + [] +
data + Runtime dependencies which may be loaded during execution. + List of labelsoptional + [] +
default_env_vars + Default environment variables that are added to configuration_env_vars. + +This is separate from the default of configuration_env_vars so that a user can set configuration_env_vars without losing the defaults that should be set in most cases. The set of default environment variables is: -- `VERBOSE_LOGS`: use by some rules & tools to turn on debug output in their logs -- `NODE_DEBUG`: used by node.js itself to print more logs -- `RUNFILES_LIB_DEBUG`: print diagnostic message from Bazel runfiles.bash helper - -Defaults to `["VERBOSE_LOGS", "NODE_DEBUG", "RUNFILES_LIB_DEBUG"]` - -#### `entry_point` -(*[label], mandatory*): The script which should be executed first, usually containing a main function. +- VERBOSE_LOGS: use by some rules & tools to turn on debug output in their logs +- NODE_DEBUG: used by node.js itself to print more logs +- RUNFILES_LIB_DEBUG: print diagnostic message from Bazel runfiles.bash helper + List of stringsoptional + ["VERBOSE_LOGS", "NODE_DEBUG", "RUNFILES_LIB_DEBUG"] +
entry_point + The script which should be executed first, usually containing a main function. If the entry JavaScript file belongs to the same package (as the BUILD file), you can simply reference it by its relative name to the package directory: -``` +{% highlight python %} nodejs_binary( name = "my_binary", ... entry_point = ":file.js", ) -``` +{% endhighlight %} You can specify the entry point as a typescript file so long as you also include the ts_library target in data: -``` +{% highlight python %} ts_library( name = "main", srcs = ["main.ts"], @@ -274,14 +404,14 @@ nodejs_binary( data = [":main"] entry_point = ":main.ts", ) -``` +{% endhighlight %} -The rule will use the corresponding `.js` output of the ts_library rule as the entry point. +The rule will use the corresponding .js output of the ts_library rule as the entry point. If the entry point target is a rule, it should produce a single JavaScript entry file that will be passed to the nodejs_binary rule. For example: -``` +{% highlight python %} filegroup( name = "entry_file", srcs = ["main.js"], @@ -291,41 +421,49 @@ nodejs_binary( name = "my_binary", entry_point = ":entry_file", ) -``` +{% endhighlight %} The entry_point can also be a label in another workspace: -``` +{% highlight python %} nodejs_binary( name = "history-server", entry_point = "@npm//:node_modules/history-server/modules/cli.js", data = ["@npm//history-server"], ) -``` - -#### `node_modules` -(*[label]*): The npm packages which should be available to `require()` during +{% endhighlight %} + Labelrequired + +
node_modules + The npm packages which should be available to require() during execution. This attribute is DEPRECATED. As of version 0.13.0 the recommended approach to npm dependencies is to use fine grained npm dependencies which are setup -with the `yarn_install` or `npm_install` rules. For example, in targets -that used a `//:node_modules` filegroup, +with the yarn_install or npm_install rules. For example, in targets +that used a //:node_modules filegroup, -``` +{% highlight python %} nodejs_binary( name = "my_binary", ... node_modules = "//:node_modules", ) -``` +{% endhighlight %} -which specifies all files within the `//:node_modules` filegroup -to be inputs to the `my_binary`. Using fine grained npm dependencies, -`my_binary` is defined with only the npm dependencies that are +which specifies all files within the //:node_modules filegroup +to be inputs to the my_binary. Using fine grained npm dependencies, +my_binary is defined with only the npm dependencies that are needed: -``` +{% highlight python %} nodejs_binary( name = "my_binary", ... @@ -335,15 +473,15 @@ nodejs_binary( ... ], ) -``` +{% endhighlight %} -In this case, only the `foo` and `bar` npm packages and their -transitive deps are includes as inputs to the `my_binary` target +In this case, only the foo and bar npm packages and their +transitive deps are includes as inputs to the my_binary target which reduces the time required to setup the runfiles for this target (see https://github.com/bazelbuild/bazel/issues/5153). The @npm external repository and the fine grained npm package -targets are setup using the `yarn_install` or `npm_install` rule +targets are setup using the yarn_install or npm_install rule in your WORKSPACE file: yarn_install( @@ -352,10 +490,10 @@ yarn_install( yarn_lock = "//:yarn.lock", ) -For other rules such as `jasmine_node_test`, fine grained -npm dependencies are specified in the `deps` attribute: +For other rules such as jasmine_node_test, fine grained +npm dependencies are specified in the deps attribute: -``` +{% highlight python %} jasmine_node_test( name = "my_test", ... @@ -366,77 +504,83 @@ jasmine_node_test( ... ], ) -``` - -Defaults to `//:node_modules_none` - -#### `templated_args` -(*List of strings*): Arguments which are passed to every execution of the program. - To pass a node startup option, prepend it with `--node_options=`, e.g. - `--node_options=--preserve-symlinks`. +{% endhighlight %} + Labeloptional + //:node_modules_none +
templated_args + Arguments which are passed to every execution of the program. + To pass a node startup option, prepend it with --node_options=, e.g. + --node_options=--preserve-symlinks. Subject to 'Make variable' substitution. See https://docs.bazel.build/versions/master/be/make-variables.html. 1. Subject to predefined source/output path variables substitutions. -The predefined variables `execpath`, `execpaths`, `rootpath`, `rootpaths`, `location`, and `locations` take -label parameters (e.g. `$(execpath //foo:bar)`) and substitute the file paths denoted by that label. +The predefined variables execpath, execpaths, rootpath, rootpaths, location, and locations take +label parameters (e.g. $(execpath //foo:bar)) and substitute the file paths denoted by that label. See https://docs.bazel.build/versions/master/be/make-variables.html#predefined_label_variables for more info. NB: This $(location) substition returns the manifest file path which differs from the *_binary & *_test args and genrule bazel substitions. This will be fixed in a future major release. -See docs string of `expand_location_into_runfiles` macro in `internal/common/expand_into_runfiles.bzl` +See docs string of expand_location_into_runfiles macro in internal/common/expand_into_runfiles.bzl for more info. -The recommended approach is to now use `$(rootpath)` where you previously used $(location). +The recommended approach is to now use $(rootpath) where you previously used $(location). -To get from a `$(rootpath)` to the absolute path that `$$(rlocation $(location))` returned you can either use -`$$(rlocation $(rootpath))` if you are in the `templated_args` of a `nodejs_binary` or `nodejs_test`: +To get from a $(rootpath) to the absolute path that $$(rlocation $(location)) returned you can either use +$$(rlocation $(rootpath)) if you are in the templated_args of a nodejs_binary or nodejs_test: BUILD.bazel: -``` +{% highlight python %} nodejs_test( name = "my_test", data = [":bootstrap.js"], templated_args = ["--node_options=--require=$$(rlocation $(rootpath :bootstrap.js))"], ) -``` +{% endhighlight %} or if you're in the context of a .js script you can pass the $(rootpath) as an argument to the script and use the javascript runfiles helper to resolve to the absolute path: BUILD.bazel: -``` +{% highlight python %} nodejs_test( name = "my_test", data = [":some_file"], entry_point = ":my_test.js", templated_args = ["$(rootpath :some_file)"], ) -``` +{% endhighlight %} my_test.js -``` +{% highlight python %} const runfiles = require(process.env['BAZEL_NODE_RUNFILES_HELPER']); const args = process.argv.slice(2); const some_file = runfiles.resolveWorkspaceRelative(args[0]); -``` - -NB: Bazel will error if it sees the single dollar sign $(rlocation path) in `templated_args` as it will try to -expand `$(rlocation)` since we now expand predefined & custom "make" variables such as `$(COMPILATION_MODE)`, -`$(BINDIR)` & `$(TARGET_CPU)` using `ctx.expand_make_variables`. See https://docs.bazel.build/versions/master/be/make-variables.html. - -To prevent expansion of `$(rlocation)` write it as `$$(rlocation)`. Bazel understands `$$` to be -the string literal `$` and the expansion results in `$(rlocation)` being passed as an arg instead -of being expanded. `$(rlocation)` is then evaluated by the bash node launcher script and it calls -the `rlocation` function in the runfiles.bash helper. For example, the templated arg -`$$(rlocation $(rootpath //:some_file))` is expanded by Bazel to `$(rlocation ./some_file)` which -is then converted in bash to the absolute path of `//:some_file` in runfiles by the runfiles.bash helper +{% endhighlight %} + +NB: Bazel will error if it sees the single dollar sign $(rlocation path) in templated_args as it will try to +expand $(rlocation) since we now expand predefined & custom "make" variables such as $(COMPILATION_MODE), +$(BINDIR) & $(TARGET_CPU) using ctx.expand_make_variables. See https://docs.bazel.build/versions/master/be/make-variables.html. + +To prevent expansion of $(rlocation) write it as $$(rlocation). Bazel understands $$ to be +the string literal $ and the expansion results in $(rlocation) being passed as an arg instead +of being expanded. $(rlocation) is then evaluated by the bash node launcher script and it calls +the rlocation function in the runfiles.bash helper. For example, the templated arg +$$(rlocation $(rootpath //:some_file)) is expanded by Bazel to $(rlocation ./some_file) which +is then converted in bash to the absolute path of //:some_file in runfiles by the runfiles.bash helper before being passed as an argument to the program. -NB: nodejs_binary and nodejs_test will preserve the legacy behavior of `$(rlocation)` so users don't -need to update to `$$(rlocation)`. This may be changed in the future. +NB: nodejs_binary and nodejs_test will preserve the legacy behavior of $(rlocation) so users don't +need to update to $$(rlocation). This may be changed in the future. 2. Subject to predefined variables & custom variable substitutions. @@ -447,100 +591,145 @@ Custom variables are also expanded including variables set through the Bazel CLI See https://docs.bazel.build/versions/master/be/make-variables.html#custom_variables. Predefined genrule variables are not supported in this context. + List of stringsoptional + [] +
-Defaults to `[]` ## nodejs_test -Identical to `nodejs_binary`, except this can be used with `bazel test` as well. +Identical to nodejs_binary, except this can be used with bazel test as well. When the binary returns zero exit code, the test passes; otherwise it fails. -`nodejs_test` is a convenient way to write a novel kind of test based on running -your own test runner. For example, the `ts-api-guardian` library has a way to -assert the public API of a TypeScript program, and uses `nodejs_test` here: +nodejs_test is a convenient way to write a novel kind of test based on running +your own test runner. For example, the ts-api-guardian library has a way to +assert the public API of a TypeScript program, and uses nodejs_test here: https://github.com/angular/angular/blob/master/tools/ts-api-guardian/index.bzl If you just want to run a standard test using a test runner from npm, use the generated -*_test target created by npm_install/yarn_install, such as `mocha_test`. -Some test runners like Karma and Jasmine have custom rules with added features, e.g. `jasmine_node_test`. +*_test target created by npm_install/yarn_install, such as mocha_test. +Some test runners like Karma and Jasmine have custom rules with added features, e.g. jasmine_node_test. Bazel always runs tests with a working directory set to your workspace root. -If your test needs to run in a different directory, you can write a `process.chdir` helper script -and invoke it before the test with a `--require` argument, like -`templated_args = ["--node_options=--require=./$(rootpath chdir.js)"]`. +If your test needs to run in a different directory, you can write a process.chdir helper script +and invoke it before the test with a --require argument, like +templated_args = ["--node_options=--require=./$(rootpath chdir.js)"]. See rules_nodejs/internal/node/test/chdir for an example. To debug a Node.js test, we recommend saving a group of flags together in a "config". -Put this in your `tools/bazel.rc` so it's shared with your team: -``` +Put this in your tools/bazel.rc so it's shared with your team: +{% highlight python %} # Enable debugging tests with --config=debug test:debug --test_arg=--node_options=--inspect-brk --test_output=streamed --test_strategy=exclusive --test_timeout=9999 --nocache_test_results -``` +{% endhighlight %} -Now you can add `--config=debug` to any `bazel test` command line. +Now you can add --config=debug to any bazel test command line. The runtime will pause before executing the program, allowing you to connect a remote debugger. - -### Usage - -``` -nodejs_test(name, configuration_env_vars, data, default_env_vars, entry_point, expected_exit_code, node_modules, templated_args) -``` - - - -#### `name` -(*[name], mandatory*): A unique name for this target. - -#### `configuration_env_vars` -(*List of strings*): Pass these configuration environment variables to the resulting binary. - Chooses a subset of the configuration environment variables (taken from `ctx.var`), which also +
+nodejs_test(name, configuration_env_vars, data, default_env_vars, entry_point, expected_exit_code,
+            node_modules, templated_args)
+
+ +**ATTRIBUTES** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionTypeMandatoryDefault
name + A unique name for this target. + Namerequired + +
configuration_env_vars + Pass these configuration environment variables to the resulting binary. + Chooses a subset of the configuration environment variables (taken from ctx.var), which also includes anything specified via the --define flag. Note, this can lead to different outputs produced by this rule. - -Defaults to `[]` - -#### `data` -(*[labels]*): Runtime dependencies which may be loaded during execution. - -Defaults to `[]` - -#### `default_env_vars` -(*List of strings*): Default environment variables that are added to `configuration_env_vars`. - -This is separate from the default of `configuration_env_vars` so that a user can set `configuration_env_vars` + List of stringsoptional + [] +
data + Runtime dependencies which may be loaded during execution. + List of labelsoptional + [] +
default_env_vars + Default environment variables that are added to configuration_env_vars. + +This is separate from the default of configuration_env_vars so that a user can set configuration_env_vars without losing the defaults that should be set in most cases. The set of default environment variables is: -- `VERBOSE_LOGS`: use by some rules & tools to turn on debug output in their logs -- `NODE_DEBUG`: used by node.js itself to print more logs -- `RUNFILES_LIB_DEBUG`: print diagnostic message from Bazel runfiles.bash helper - -Defaults to `["VERBOSE_LOGS", "NODE_DEBUG", "RUNFILES_LIB_DEBUG"]` - -#### `entry_point` -(*[label], mandatory*): The script which should be executed first, usually containing a main function. +- VERBOSE_LOGS: use by some rules & tools to turn on debug output in their logs +- NODE_DEBUG: used by node.js itself to print more logs +- RUNFILES_LIB_DEBUG: print diagnostic message from Bazel runfiles.bash helper + List of stringsoptional + ["VERBOSE_LOGS", "NODE_DEBUG", "RUNFILES_LIB_DEBUG"] +
entry_point + The script which should be executed first, usually containing a main function. If the entry JavaScript file belongs to the same package (as the BUILD file), you can simply reference it by its relative name to the package directory: -``` +{% highlight python %} nodejs_binary( name = "my_binary", ... entry_point = ":file.js", ) -``` +{% endhighlight %} You can specify the entry point as a typescript file so long as you also include the ts_library target in data: -``` +{% highlight python %} ts_library( name = "main", srcs = ["main.ts"], @@ -551,14 +740,14 @@ nodejs_binary( data = [":main"] entry_point = ":main.ts", ) -``` +{% endhighlight %} -The rule will use the corresponding `.js` output of the ts_library rule as the entry point. +The rule will use the corresponding .js output of the ts_library rule as the entry point. If the entry point target is a rule, it should produce a single JavaScript entry file that will be passed to the nodejs_binary rule. For example: -``` +{% highlight python %} filegroup( name = "entry_file", srcs = ["main.js"], @@ -568,46 +757,60 @@ nodejs_binary( name = "my_binary", entry_point = ":entry_file", ) -``` +{% endhighlight %} The entry_point can also be a label in another workspace: -``` +{% highlight python %} nodejs_binary( name = "history-server", entry_point = "@npm//:node_modules/history-server/modules/cli.js", data = ["@npm//history-server"], ) -``` - -#### `expected_exit_code` -(*Integer*): The expected exit code for the test. Defaults to 0. - -Defaults to `0` - -#### `node_modules` -(*[label]*): The npm packages which should be available to `require()` during +{% endhighlight %} + Labelrequired + +
expected_exit_code + The expected exit code for the test. Defaults to 0. + Integeroptional + 0 +
node_modules + The npm packages which should be available to require() during execution. This attribute is DEPRECATED. As of version 0.13.0 the recommended approach to npm dependencies is to use fine grained npm dependencies which are setup -with the `yarn_install` or `npm_install` rules. For example, in targets -that used a `//:node_modules` filegroup, +with the yarn_install or npm_install rules. For example, in targets +that used a //:node_modules filegroup, -``` +{% highlight python %} nodejs_binary( name = "my_binary", ... node_modules = "//:node_modules", ) -``` +{% endhighlight %} -which specifies all files within the `//:node_modules` filegroup -to be inputs to the `my_binary`. Using fine grained npm dependencies, -`my_binary` is defined with only the npm dependencies that are +which specifies all files within the //:node_modules filegroup +to be inputs to the my_binary. Using fine grained npm dependencies, +my_binary is defined with only the npm dependencies that are needed: -``` +{% highlight python %} nodejs_binary( name = "my_binary", ... @@ -617,15 +820,15 @@ nodejs_binary( ... ], ) -``` +{% endhighlight %} -In this case, only the `foo` and `bar` npm packages and their -transitive deps are includes as inputs to the `my_binary` target +In this case, only the foo and bar npm packages and their +transitive deps are includes as inputs to the my_binary target which reduces the time required to setup the runfiles for this target (see https://github.com/bazelbuild/bazel/issues/5153). The @npm external repository and the fine grained npm package -targets are setup using the `yarn_install` or `npm_install` rule +targets are setup using the yarn_install or npm_install rule in your WORKSPACE file: yarn_install( @@ -634,10 +837,10 @@ yarn_install( yarn_lock = "//:yarn.lock", ) -For other rules such as `jasmine_node_test`, fine grained -npm dependencies are specified in the `deps` attribute: +For other rules such as jasmine_node_test, fine grained +npm dependencies are specified in the deps attribute: -``` +{% highlight python %} jasmine_node_test( name = "my_test", ... @@ -648,77 +851,83 @@ jasmine_node_test( ... ], ) -``` - -Defaults to `//:node_modules_none` - -#### `templated_args` -(*List of strings*): Arguments which are passed to every execution of the program. - To pass a node startup option, prepend it with `--node_options=`, e.g. - `--node_options=--preserve-symlinks`. +{% endhighlight %} + Labeloptional + //:node_modules_none +
templated_args + Arguments which are passed to every execution of the program. + To pass a node startup option, prepend it with --node_options=, e.g. + --node_options=--preserve-symlinks. Subject to 'Make variable' substitution. See https://docs.bazel.build/versions/master/be/make-variables.html. 1. Subject to predefined source/output path variables substitutions. -The predefined variables `execpath`, `execpaths`, `rootpath`, `rootpaths`, `location`, and `locations` take -label parameters (e.g. `$(execpath //foo:bar)`) and substitute the file paths denoted by that label. +The predefined variables execpath, execpaths, rootpath, rootpaths, location, and locations take +label parameters (e.g. $(execpath //foo:bar)) and substitute the file paths denoted by that label. See https://docs.bazel.build/versions/master/be/make-variables.html#predefined_label_variables for more info. NB: This $(location) substition returns the manifest file path which differs from the *_binary & *_test args and genrule bazel substitions. This will be fixed in a future major release. -See docs string of `expand_location_into_runfiles` macro in `internal/common/expand_into_runfiles.bzl` +See docs string of expand_location_into_runfiles macro in internal/common/expand_into_runfiles.bzl for more info. -The recommended approach is to now use `$(rootpath)` where you previously used $(location). +The recommended approach is to now use $(rootpath) where you previously used $(location). -To get from a `$(rootpath)` to the absolute path that `$$(rlocation $(location))` returned you can either use -`$$(rlocation $(rootpath))` if you are in the `templated_args` of a `nodejs_binary` or `nodejs_test`: +To get from a $(rootpath) to the absolute path that $$(rlocation $(location)) returned you can either use +$$(rlocation $(rootpath)) if you are in the templated_args of a nodejs_binary or nodejs_test: BUILD.bazel: -``` +{% highlight python %} nodejs_test( name = "my_test", data = [":bootstrap.js"], templated_args = ["--node_options=--require=$$(rlocation $(rootpath :bootstrap.js))"], ) -``` +{% endhighlight %} or if you're in the context of a .js script you can pass the $(rootpath) as an argument to the script and use the javascript runfiles helper to resolve to the absolute path: BUILD.bazel: -``` +{% highlight python %} nodejs_test( name = "my_test", data = [":some_file"], entry_point = ":my_test.js", templated_args = ["$(rootpath :some_file)"], ) -``` +{% endhighlight %} my_test.js -``` +{% highlight python %} const runfiles = require(process.env['BAZEL_NODE_RUNFILES_HELPER']); const args = process.argv.slice(2); const some_file = runfiles.resolveWorkspaceRelative(args[0]); -``` - -NB: Bazel will error if it sees the single dollar sign $(rlocation path) in `templated_args` as it will try to -expand `$(rlocation)` since we now expand predefined & custom "make" variables such as `$(COMPILATION_MODE)`, -`$(BINDIR)` & `$(TARGET_CPU)` using `ctx.expand_make_variables`. See https://docs.bazel.build/versions/master/be/make-variables.html. - -To prevent expansion of `$(rlocation)` write it as `$$(rlocation)`. Bazel understands `$$` to be -the string literal `$` and the expansion results in `$(rlocation)` being passed as an arg instead -of being expanded. `$(rlocation)` is then evaluated by the bash node launcher script and it calls -the `rlocation` function in the runfiles.bash helper. For example, the templated arg -`$$(rlocation $(rootpath //:some_file))` is expanded by Bazel to `$(rlocation ./some_file)` which -is then converted in bash to the absolute path of `//:some_file` in runfiles by the runfiles.bash helper +{% endhighlight %} + +NB: Bazel will error if it sees the single dollar sign $(rlocation path) in templated_args as it will try to +expand $(rlocation) since we now expand predefined & custom "make" variables such as $(COMPILATION_MODE), +$(BINDIR) & $(TARGET_CPU) using ctx.expand_make_variables. See https://docs.bazel.build/versions/master/be/make-variables.html. + +To prevent expansion of $(rlocation) write it as $$(rlocation). Bazel understands $$ to be +the string literal $ and the expansion results in $(rlocation) being passed as an arg instead +of being expanded. $(rlocation) is then evaluated by the bash node launcher script and it calls +the rlocation function in the runfiles.bash helper. For example, the templated arg +$$(rlocation $(rootpath //:some_file)) is expanded by Bazel to $(rlocation ./some_file) which +is then converted in bash to the absolute path of //:some_file in runfiles by the runfiles.bash helper before being passed as an argument to the program. -NB: nodejs_binary and nodejs_test will preserve the legacy behavior of `$(rlocation)` so users don't -need to update to `$$(rlocation)`. This may be changed in the future. +NB: nodejs_binary and nodejs_test will preserve the legacy behavior of $(rlocation) so users don't +need to update to $$(rlocation). This may be changed in the future. 2. Subject to predefined variables & custom variable substitutions. @@ -729,58 +938,103 @@ Custom variables are also expanded including variables set through the Bazel CLI See https://docs.bazel.build/versions/master/be/make-variables.html#custom_variables. Predefined genrule variables are not supported in this context. + List of stringsoptional + [] +
-Defaults to `[]` ## npm_install Runs npm install during workspace setup. -This rule will set the environment variable `BAZEL_NPM_INSTALL` to '1' (unless it +This rule will set the environment variable BAZEL_NPM_INSTALL to '1' (unless it set to another value in the environment attribute). Scripts may use to this to -check if yarn is being run by the `npm_install` repository rule. - - -### Usage - -``` -npm_install(name, args, data, environment, included_files, manual_build_file_contents, package_json, package_lock_json, quiet, symlink_node_modules, timeout) -``` - - - -#### `name` -(*[name], mandatory*): A unique name for this repository. - -#### `args` -(*List of strings*): Arguments passed to npm install. +check if yarn is being run by the npm_install repository rule. + +
+npm_install(name, args, data, environment, included_files, manual_build_file_contents, package_json,
+            package_lock_json, quiet, symlink_node_modules, timeout)
+
+ +**ATTRIBUTES** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionTypeMandatoryDefault
name + A unique name for this repository. + Namerequired + +
args + Arguments passed to npm install. See npm CLI docs https://docs.npmjs.com/cli/install.html for complete list of supported arguments. - -Defaults to `[]` - -#### `data` -(*[labels]*): Data files required by this rule. + List of stringsoptional + [] +
data + Data files required by this rule. If symlink_node_modules is True, this attribute is optional since the package manager will run in your workspace folder. It is recommended, however, that all files that the -package manager depends on, such as `.rc` files or files used in `postinstall`, are added +package manager depends on, such as .rc files or files used in postinstall, are added symlink_node_modules is True so that the repository rule is rerun when any of these files change. If symlink_node_modules is False, the package manager is run in the bazel external repository so all files that the package manager depends on must be listed. - -Defaults to `[]` - -#### `environment` -(*Dictionary: String -> String*): Environment variables to set before calling the package manager. - -Defaults to `{}` - -#### `included_files` -(*List of strings*): List of file extensions to be included in the npm package targets. + List of labelsoptional + [] +
environment + Environment variables to set before calling the package manager. + Dictionary: String -> Stringoptional + {} +
included_files + List of file extensions to be included in the npm package targets. For example, [".js", ".d.ts", ".proto", ".json", ""]. @@ -791,39 +1045,71 @@ https://github.com/bazelbuild/bazel/issues/5153. If set to an empty list then all files are included in the package targets. If set to a list of extensions, only files with matching extensions are included in the package targets. An empty string in the list is a special -string that denotes that files with no extensions such as `README` should +string that denotes that files with no extensions such as README should be included in the package targets. -This attribute applies to both the coarse `@wksp//:node_modules` target -as well as the fine grained targets such as `@wksp//foo`. - -Defaults to `[]` - -#### `manual_build_file_contents` -(*String*): Experimental attribute that can be used to override the generated BUILD.bazel file and set its contents manually. +This attribute applies to both the coarse @wksp//:node_modules target +as well as the fine grained targets such as @wksp//foo. + List of stringsoptional + [] +
manual_build_file_contents + Experimental attribute that can be used to override the generated BUILD.bazel file and set its contents manually. Can be used to work-around a bazel performance issue if the -default `@wksp//:node_modules` target has too many files in it. +default @wksp//:node_modules target has too many files in it. See https://github.com/bazelbuild/bazel/issues/5153. If you are running into performance issues due to a large node_modules target it is recommended to switch to using fine grained npm dependencies. - -Defaults to `""` - -#### `package_json` -(*[label], mandatory*) - -#### `package_lock_json` -(*[label], mandatory*) - -#### `quiet` -(*Boolean*): If stdout and stderr should be printed to the terminal. - -Defaults to `True` - -#### `symlink_node_modules` -(*Boolean*): Turn symlinking of node_modules on + Stringoptional + "" +
package_json + Labelrequired + +
package_lock_json + Labelrequired + +
quiet + If stdout and stderr should be printed to the terminal. + Booleanoptional + True +
timeout + Maximum duration of the package manager execution in seconds. + Integeroptional + 3600 +
-Defaults to `True` - -#### `timeout` -(*Integer*): Maximum duration of the package manager execution in seconds. - -Defaults to `3600` ## pkg_npm @@ -851,7 +1151,7 @@ The pkg_npm rule creates a directory containing a publishable npm artifact. Example: -```python +{% highlight python %} load("@build_bazel_rules_nodejs//:index.bzl", "pkg_npm") pkg_npm( @@ -860,187 +1160,326 @@ pkg_npm( deps = [":my_typescript_lib"], substitutions = {"//internal/": "//"}, ) -``` +{% endhighlight %} -You can use a pair of `// BEGIN-INTERNAL ... // END-INTERNAL` comments to mark regions of files that should be elided during publishing. +You can use a pair of // BEGIN-INTERNAL ... // END-INTERNAL comments to mark regions of files that should be elided during publishing. For example: -```javascript +{% highlight javascript %} function doThing() { // BEGIN-INTERNAL // This is a secret internal-only comment doInternalOnlyThing(); // END-INTERNAL } -``` +{% endhighlight %} With the Bazel stamping feature, pkg_npm will replace any placeholder version in your package with the actual version control tag. See the [stamping documentation](https://github.com/bazelbuild/rules_nodejs/blob/master/docs/index.md#stamping) Usage: -`pkg_npm` yields three labels. Build the package directory using the default label: +pkg_npm yields three labels. Build the package directory using the default label: -```sh +{% highlight sh %} $ bazel build :my_package Target //:my_package up-to-date: bazel-out/fastbuild/bin/my_package $ ls -R bazel-out/fastbuild/bin/my_package -``` +{% endhighlight %} -Dry-run of publishing to npm, calling `npm pack` (it builds the package first if needed): +Dry-run of publishing to npm, calling npm pack (it builds the package first if needed): -```sh +{% highlight sh %} $ bazel run :my_package.pack INFO: Running command line: bazel-out/fastbuild/bin/my_package.pack my-package-name-1.2.3.tgz $ tar -tzf my-package-name-1.2.3.tgz -``` +{% endhighlight %} -Actually publish the package with `npm publish` (also builds first): +Actually publish the package with npm publish (also builds first): -```sh +{% highlight sh %} # Check login credentials $ bazel run @nodejs//:npm_node_repositories who # Publishes the package $ bazel run :my_package.publish -``` +{% endhighlight %} You can pass arguments to npm by escaping them from Bazel using a double-hyphen, for example: -`bazel run my_package.publish -- --tag=next` - - - -### Usage - -``` -pkg_npm(name, deps, nested_packages, node_context_data, package_name, replace_with_version, srcs, substitutions, vendor_external) -``` - - - -#### `name` -(*[name], mandatory*): A unique name for this target. - -#### `deps` -(*[labels]*): Other targets which produce files that should be included in the package, such as `rollup_bundle` - -Defaults to `[]` - -#### `nested_packages` -(*[labels]*): Other pkg_npm rules whose content is copied into this package. - -Defaults to `[]` - -#### `node_context_data` -(*[label]*): Internal use only - -Defaults to `@build_bazel_rules_nodejs//internal:node_context_data` - -#### `package_name` -(*String*): Optional package_name that this npm package may be imported as. - -Defaults to `""` - -#### `replace_with_version` -(*String*): If set this value is replaced with the version stamp data. +bazel run my_package.publish -- --tag=next + + +
+pkg_npm(name, deps, nested_packages, node_context_data, package_name, replace_with_version, srcs,
+        substitutions, vendor_external)
+
+ +**ATTRIBUTES** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionTypeMandatoryDefault
name + A unique name for this target. + Namerequired + +
deps + Other targets which produce files that should be included in the package, such as rollup_bundle + List of labelsoptional + [] +
nested_packages + Other pkg_npm rules whose content is copied into this package. + List of labelsoptional + [] +
node_context_data + Internal use only + The dependencies of this attribute must provide: NodeContextInfo + Labeloptional + @build_bazel_rules_nodejs//internal:node_context_data +
package_name + Optional package_name that this npm package may be imported as. + Stringoptional + "" +
replace_with_version + If set this value is replaced with the version stamp data. See the section on stamping in the README. - -Defaults to `"0.0.0-PLACEHOLDER"` - -#### `srcs` -(*[labels]*): Files inside this directory which are simply copied into the package. - -Defaults to `[]` - -#### `substitutions` -(*Dictionary: String -> String*): Key-value pairs which are replaced in all the files while building the package. - -Defaults to `{}` - -#### `vendor_external` -(*List of strings*): External workspaces whose contents should be vendored into this workspace. + Stringoptional + "0.0.0-PLACEHOLDER" +
srcs + Files inside this directory which are simply copied into the package. + List of labelsoptional + [] +
substitutions + Key-value pairs which are replaced in all the files while building the package. + Dictionary: String -> Stringoptional + {} +
vendor_external + External workspaces whose contents should be vendored into this workspace. Avoids 'external/foo' path segments in the resulting package. + List of stringsoptional + [] +
-Defaults to `[]` ## pkg_web Assembles a web application from source files. +
+pkg_web(name, additional_root_paths, srcs)
+
+ +**ATTRIBUTES** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionTypeMandatoryDefault
name + A unique name for this target. + Namerequired + +
additional_root_paths + Path prefixes to strip off all srcs, in addition to the current package. Longest wins. + List of stringsoptional + [] +
srcs + Files which should be copied into the package + List of labelsoptional + [] +
-### Usage - -``` -pkg_web(name, additional_root_paths, srcs) -``` - - - -#### `name` -(*[name], mandatory*): A unique name for this target. - -#### `additional_root_paths` -(*List of strings*): Path prefixes to strip off all srcs, in addition to the current package. Longest wins. - -Defaults to `[]` - -#### `srcs` -(*[labels]*): Files which should be copied into the package - -Defaults to `[]` ## yarn_install Runs yarn install during workspace setup. -This rule will set the environment variable `BAZEL_YARN_INSTALL` to '1' (unless it +This rule will set the environment variable BAZEL_YARN_INSTALL to '1' (unless it set to another value in the environment attribute). Scripts may use to this to -check if yarn is being run by the `yarn_install` repository rule. - - -### Usage - -``` -yarn_install(name, args, data, environment, included_files, manual_build_file_contents, package_json, quiet, symlink_node_modules, timeout, use_global_yarn_cache, yarn_lock) -``` - - - -#### `name` -(*[name], mandatory*): A unique name for this repository. - -#### `args` -(*List of strings*): Arguments passed to yarn install. +check if yarn is being run by the yarn_install repository rule. + +
+yarn_install(name, args, data, environment, included_files, manual_build_file_contents,
+             package_json, quiet, symlink_node_modules, timeout, use_global_yarn_cache, yarn_lock)
+
+ +**ATTRIBUTES** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionTypeMandatoryDefault
name + A unique name for this repository. + Namerequired + +
args + Arguments passed to yarn install. See yarn CLI docs https://yarnpkg.com/en/docs/cli/install for complete list of supported arguments. - -Defaults to `[]` - -#### `data` -(*[labels]*): Data files required by this rule. + List of stringsoptional + [] +
data + Data files required by this rule. If symlink_node_modules is True, this attribute is optional since the package manager will run in your workspace folder. It is recommended, however, that all files that the -package manager depends on, such as `.rc` files or files used in `postinstall`, are added +package manager depends on, such as .rc files or files used in postinstall, are added symlink_node_modules is True so that the repository rule is rerun when any of these files change. If symlink_node_modules is False, the package manager is run in the bazel external repository so all files that the package manager depends on must be listed. - -Defaults to `[]` - -#### `environment` -(*Dictionary: String -> String*): Environment variables to set before calling the package manager. - -Defaults to `{}` - -#### `included_files` -(*List of strings*): List of file extensions to be included in the npm package targets. + List of labelsoptional + [] +
environment + Environment variables to set before calling the package manager. + Dictionary: String -> Stringoptional + {} +
included_files + List of file extensions to be included in the npm package targets. For example, [".js", ".d.ts", ".proto", ".json", ""]. @@ -1051,36 +1490,61 @@ https://github.com/bazelbuild/bazel/issues/5153. If set to an empty list then all files are included in the package targets. If set to a list of extensions, only files with matching extensions are included in the package targets. An empty string in the list is a special -string that denotes that files with no extensions such as `README` should +string that denotes that files with no extensions such as README should be included in the package targets. -This attribute applies to both the coarse `@wksp//:node_modules` target -as well as the fine grained targets such as `@wksp//foo`. - -Defaults to `[]` - -#### `manual_build_file_contents` -(*String*): Experimental attribute that can be used to override the generated BUILD.bazel file and set its contents manually. +This attribute applies to both the coarse @wksp//:node_modules target +as well as the fine grained targets such as @wksp//foo. + List of stringsoptional + [] +
manual_build_file_contents + Experimental attribute that can be used to override the generated BUILD.bazel file and set its contents manually. Can be used to work-around a bazel performance issue if the -default `@wksp//:node_modules` target has too many files in it. +default @wksp//:node_modules target has too many files in it. See https://github.com/bazelbuild/bazel/issues/5153. If you are running into performance issues due to a large node_modules target it is recommended to switch to using fine grained npm dependencies. - -Defaults to `""` - -#### `package_json` -(*[label], mandatory*) - -#### `quiet` -(*Boolean*): If stdout and stderr should be printed to the terminal. - -Defaults to `True` - -#### `symlink_node_modules` -(*Boolean*): Turn symlinking of node_modules on + Stringoptional + "" +
package_json + Labelrequired + +
quiet + If stdout and stderr should be printed to the terminal. + Booleanoptional + True +
timeout + Maximum duration of the package manager execution in seconds. + Integeroptional + 3600 +
use_global_yarn_cache + Use the global yarn cache on the system. The cache lets you avoid downloading packages multiple times. However, it can introduce non-hermeticity, and the yarn cache can @@ -1111,16 +1587,31 @@ have bugs. Disabling this attribute causes every run of yarn to have a unique cache_directory. -If True, this rule will pass `--mutex network` to yarn to ensure that +If True, this rule will pass --mutex network to yarn to ensure that the global cache can be shared by parallelized yarn_install rules. -If False, this rule will pass `--cache-folder /path/to/external/repository/__yarn_cache` +If False, this rule will pass --cache-folder /path/to/external/repository/__yarn_cache to yarn so that the local cache is contained within the external repository. + Booleanoptional + True +
yarn_lock + Labelrequired + +
-Defaults to `True` - -#### `yarn_lock` -(*[label], mandatory*) ## check_bazel_version @@ -1135,37 +1626,49 @@ This should *not* be used in users WORKSPACE files. To locally pin your Bazel version, just create the .bazelversion file in your workspace. - -### Usage - -``` -check_bazel_version(minimum_bazel_version, message) -``` - - - -#### `minimum_bazel_version` - -a string indicating the minimum version - - - - -#### `message` - -optional string to print to your users, could be used to help them update - -Defaults to `""` - - +
+check_bazel_version(minimum_bazel_version, message)
+
+ +**PARAMETERS** + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
minimum_bazel_version + a string indicating the minimum version + + +
message + optional string to print to your users, could be used to help them update + + "" +
## copy_to_bin -Copies a source file to bazel-bin at the same workspace-relative path path. +Copies a source file to bazel-bin at the same workspace-relative path. -e.g. `/foo/bar/a.txt -> /foo/bar/a.txt` +e.g. /foo/bar/a.txt -> /foo/bar/a.txt This is useful to populate the output folder with all files needed at runtime, even those which aren't outputs of a Bazel rule. @@ -1175,35 +1678,50 @@ without that program needing to rely on a runfiles helper library or be aware th files are divided between the source tree and the output tree. - -### Usage - -``` -copy_to_bin(name, srcs, kwargs) -``` - - - -#### `name` - -Name of the rule. - - - - -#### `srcs` - -A List of Labels. File(s) to to copy. - - - - -#### `kwargs` - -further keyword arguments, e.g. `visibility` - - - +
+copy_to_bin(name, srcs, kwargs)
+
+ +**PARAMETERS** + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
name + Name of the rule. + + +
srcs + A List of Labels. File(s) to to copy. + + +
kwargs + further keyword arguments, e.g. visibility + + +
@@ -1215,51 +1733,69 @@ This is useful for testing, where a "snapshot" or "golden" file is checked in, so that you can code review changes to the generated output. - -### Usage - -``` -generated_file_test(name, generated, src, src_dbg, kwargs) -``` - - - -#### `name` - -Name of the rule. - - - - -#### `generated` - -a Label of the output file generated by another rule - - - - -#### `src` - -Label of the source file in the workspace - - - - -#### `src_dbg` - -if the build uses `--compilation_mode dbg` then some rules will produce different output. +
+generated_file_test(name, generated, src, src_dbg, kwargs)
+
+ +**PARAMETERS** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
name + Name of the rule. + + +
generated + a Label of the output file generated by another rule + + +
src + Label of the source file in the workspace + + +
src_dbg + if the build uses --compilation_mode dbg then some rules will produce different output. In this case you can specify what the dbg version of the output should look like - -Defaults to `None` - - - -#### `kwargs` - -extra arguments passed to the underlying nodejs_test or nodejs_binary - - - + + None +
kwargs + extra arguments passed to the underlying nodejs_test or nodejs_binary + + +
@@ -1267,75 +1803,87 @@ extra arguments passed to the underlying nodejs_test or nodejs_binary Run an arbitrary npm package binary (e.g. a program under node_modules/.bin/*) under Bazel. -It must produce outputs. If you just want to run a program with `bazel run`, use the nodejs_binary rule. +It must produce outputs. If you just want to run a program with bazel run, use the nodejs_binary rule. This is like a genrule() except that it runs our launcher script that first links the node_modules tree before running the program. Bazel always runs actions with a working directory set to your workspace root. -If your tool needs to run in a different directory, you can write a `process.chdir` helper script -and invoke it before the action with a `--require` argument, like -`args = ["--node_options=--require=./$(execpath chdir.js)"]` +If your tool needs to run in a different directory, you can write a process.chdir helper script +and invoke it before the action with a --require argument, like +args = ["--node_options=--require=./$(execpath chdir.js)"] See rules_nodejs/internal/node/test/chdir for an example. This is a great candidate to wrap with a macro, as documented: https://docs.bazel.build/versions/master/skylark/macros.html#full-example - -### Usage - -``` -npm_package_bin(tool, package, package_bin, data, outs, args, output_dir, kwargs) -``` - - - -#### `tool` - -a label for a binary to run, like `@npm//terser/bin:terser`. This is the longer form of package/package_bin. +
+npm_package_bin(tool, package, package_bin, data, outs, args, output_dir, kwargs)
+
+ +**PARAMETERS** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
tool + a label for a binary to run, like @npm//terser/bin:terser. This is the longer form of package/package_bin. Note that you can also refer to a binary in your local workspace. - -Defaults to `None` - - - -#### `package` - -an npm package whose binary to run, like "terser". Assumes your node_modules are installed in a workspace called "npm" - -Defaults to `None` - - - -#### `package_bin` - -the "bin" entry from `package` that should be run. By default package_bin is the same string as `package` - -Defaults to `None` - - - -#### `data` - -similar to [genrule.srcs](https://docs.bazel.build/versions/master/be/general.html#genrule.srcs) + + None +
package + an npm package whose binary to run, like "terser". Assumes your node_modules are installed in a workspace called "npm" + + None +
package_bin + the "bin" entry from package that should be run. By default package_bin is the same string as package + + None +
data + similar to [genrule.srcs](https://docs.bazel.build/versions/master/be/general.html#genrule.srcs) may also include targets that produce or reference npm packages which are needed by the tool - -Defaults to `[]` - - - -#### `outs` - -similar to [genrule.outs](https://docs.bazel.build/versions/master/be/general.html#genrule.outs) - -Defaults to `[]` - - - -#### `args` - -Command-line arguments to the tool. + + [] +
outs + similar to [genrule.outs](https://docs.bazel.build/versions/master/be/general.html#genrule.outs) + + [] +
args + Command-line arguments to the tool. Subject to 'Make variable' substitution. See https://docs.bazel.build/versions/master/be/make-variables.html. @@ -1361,38 +1909,44 @@ Command-line arguments to the tool. Like genrule, you may also use some syntax sugar for locations. - - `$@`: if you have only one output file, the location of the output - - `$(@D)`: The output directory. If output_dir=False and there is only one file name in outs, this expands to the directory + - $@: if you have only one output file, the location of the output + - $(@D): The output directory. If output_dir=False and there is only one file name in outs, this expands to the directory containing that file. If there are multiple files, this instead expands to the package's root directory in the genfiles tree, even if all generated files belong to the same subdirectory! If output_dir=True then this corresponds to the output directory which is the $(RULEDIR)/{target_name}. - - `$(RULEDIR)`: the root output directory of the rule, corresponding with its package + - $(RULEDIR): the root output directory of the rule, corresponding with its package (can be used with output_dir=True or False) See https://docs.bazel.build/versions/master/be/make-variables.html#predefined_genrule_variables. Custom variables are also expanded including variables set through the Bazel CLI with --define=SOME_VAR=SOME_VALUE. See https://docs.bazel.build/versions/master/be/make-variables.html#custom_variables. - -Defaults to `[]` - - - -#### `output_dir` - -set to True if you want the output to be a directory - Exactly one of `outs`, `output_dir` may be used. + + [] +
output_dir + set to True if you want the output to be a directory + Exactly one of outs, output_dir may be used. If you output a directory, there can only be one output, which will be a directory named the same as the target. - -Defaults to `False` - - - -#### `kwargs` - - - - + + False +
kwargs + + +
@@ -1403,45 +1957,56 @@ Generates a UTF-8 encoded params file from a list of arguments. Handles variable substitutions for args. - -### Usage - -``` -params_file(name, out, args, data, newline, kwargs) -``` - - - -#### `name` - -Name of the rule. - - - - -#### `out` - -Path of the output file, relative to this package. - - - - -#### `args` - -Arguments to concatenate into a params file. +
+params_file(name, out, args, data, newline, kwargs)
+
+ +**PARAMETERS** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
name + Name of the rule. + + +
out + Path of the output file, relative to this package. + + +
args + Arguments to concatenate into a params file. Subject to 'Make variable' substitution. See https://docs.bazel.build/versions/master/be/make-variables.html. 1. Subject to predefined source/output path variables substitutions. - The predefined variables `execpath`, `execpaths`, `rootpath`, `rootpaths`, `location`, and `locations` take - label parameters (e.g. `$(execpath //foo:bar)`) and substitute the file paths denoted by that label. + The predefined variables execpath, execpaths, rootpath, rootpaths, location, and locations take + label parameters (e.g. $(execpath //foo:bar)) and substitute the file paths denoted by that label. See https://docs.bazel.build/versions/master/be/make-variables.html#predefined_label_variables for more info. NB: This $(location) substition returns the manifest file path which differs from the *_binary & *_test args and genrule bazel substitions. This will be fixed in a future major release. - See docs string of `expand_location_into_runfiles` macro in `internal/common/expand_into_runfiles.bzl` + See docs string of expand_location_into_runfiles macro in internal/common/expand_into_runfiles.bzl for more info. 2. Subject to predefined variables & custom variable substitutions. @@ -1453,45 +2018,53 @@ Arguments to concatenate into a params file. See https://docs.bazel.build/versions/master/be/make-variables.html#custom_variables. Predefined genrule variables are not supported in this context. - -Defaults to `[]` - - - -#### `data` - -Data for $(location) expansions in args. - -Defaults to `[]` - - - -#### `newline` - -Line endings to use. One of ["auto", "unix", "windows"]. + + [] +
data + Data for $(location) expansions in args. + + [] +
newline + Line endings to use. One of ["auto", "unix", "windows"]. "auto" for platform-determined "unix" for LF "windows" for CRLF - -Defaults to `"auto"` - - - -#### `kwargs` - - - + + "auto" +
kwargs + + +
-[name]: https://bazel.build/docs/build-ref.html#name -[label]: https://bazel.build/docs/build-ref.html#labels -[labels]: https://bazel.build/docs/build-ref.html#labels - ## DeclarationInfo +
+DeclarationInfo(declarations, transitive_declarations, type_blacklisted_declarations)
+
+ The DeclarationInfo provider allows JS rules to communicate typing information. TypeScript's .d.ts files are used as the interop format for describing types. package.json files are included as well, as TypeScript needs to read the "typings" property. @@ -1501,28 +2074,43 @@ Do not create DeclarationInfo instances directly, instead use the declaration_in Note: historically this was a subset of the string-typed "typescript" provider. - - -#### `declarations` -A depset of typings files produced by this rule - - - -#### `transitive_declarations` -A depset of typings files produced by this rule and all its transitive dependencies. -This prevents needing an aspect in rules that consume the typings, which improves performance. - - - -#### `type_blacklisted_declarations` -A depset of .d.ts files that we should not use to infer JSCompiler types (via tsickle) - - +**FIELDS** + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
declarations + A depset of typings files produced by this rule
transitive_declarations + A depset of typings files produced by this rule and all its transitive dependencies. +This prevents needing an aspect in rules that consume the typings, which improves performance.
type_blacklisted_declarations + A depset of .d.ts files that we should not use to infer JSCompiler types (via tsickle)
## JSEcmaScriptModuleInfo +
+JSEcmaScriptModuleInfo(direct_sources, sources)
+
+ JavaScript files (and sourcemaps) that are intended to be consumed by downstream tooling. They should use modern syntax and ESModules. @@ -1530,40 +2118,70 @@ These files should typically be named "foo.mjs" Historical note: this was the typescript.es6_sources output - - -#### `direct_sources` -Depset of direct JavaScript files and sourcemaps - - - -#### `sources` -Depset of direct and transitive JavaScript files and sourcemaps - - +**FIELDS** + + + + + + + + + + + + + + + + + + +
NameDescription
direct_sources + Depset of direct JavaScript files and sourcemaps
sources + Depset of direct and transitive JavaScript files and sourcemaps
## JSModuleInfo -JavaScript files and sourcemaps. - - - -#### `direct_sources` -Depset of direct JavaScript files and sourcemaps - - - -#### `sources` -Depset of direct and transitive JavaScript files and sourcemaps +
+JSModuleInfo(direct_sources, sources)
+
+JavaScript files and sourcemaps. +**FIELDS** + + + + + + + + + + + + + + + + + + +
NameDescription
direct_sources + Depset of direct JavaScript files and sourcemaps
sources + Depset of direct and transitive JavaScript files and sourcemaps
## JSNamedModuleInfo +
+JSNamedModuleInfo(direct_sources, sources)
+
+ JavaScript files whose module name is self-contained. For example named AMD/UMD or goog.module format. @@ -1574,79 +2192,122 @@ These outputs should be named "foo.umd.js" Historical note: this was the typescript.es5_sources output. +**FIELDS** - -#### `direct_sources` -Depset of direct JavaScript files and sourcemaps - - - -#### `sources` -Depset of direct and transitive JavaScript files and sourcemaps - - + + + + + + + + + + + + + + + + + +
NameDescription
direct_sources + Depset of direct JavaScript files and sourcemaps
sources + Depset of direct and transitive JavaScript files and sourcemaps
## LinkablePackageInfo -The LinkablePackageInfo provider provides information to the linker for linking pkg_npm built packages - - - -#### `files` -Depset of files in this package (must all be contained within path) - +
+LinkablePackageInfo(files, package_name, path, _tslibrary)
+
+The LinkablePackageInfo provider provides information to the linker for linking pkg_npm built packages -#### `package_name` -The package name. +**FIELDS** + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
files + Depset of files in this package (must all be contained within path)
package_name + The package name. Should be the same as name field in the package's package.json. -In the future, the linker may validate that the names match the name in a package.json file. - - - - -#### `path` -The path to link to. +In the future, the linker may validate that the names match the name in a package.json file.
path + The path to link to. Path must be relative to execroot/wksp. It can either an output dir path such as, -'bazel-out/-/bin/path/to/package' or -'bazel-out/-/bin/external//path/to/package' +bazel-out/<platform>-<build>/bin/path/to/package or +bazel-out/<platform>-<build>/bin/external/&llt;external_wksp>/path/to/package or a source file path such as, -'path/to/package' or -'external//path/to/package' - - - - -#### `_tslibrary` -For internal use only - - +path/to/package or +external/<external_wksp>/path/to/package
_tslibrary + For internal use only
## NodeContextInfo -Provides data about the build context, like config_setting's - - +
+NodeContextInfo(stamp)
+
-#### `stamp` -If stamping is enabled +Provides data about the build context, like config_setting's +**FIELDS** + + + + + + + + + + + + + +
NameDescription
stamp + If stamping is enabled
## NodeRuntimeDepsInfo +
+NodeRuntimeDepsInfo(deps, pkgs)
+
+ Stores runtime dependencies of a nodejs_binary or nodejs_test These are files that need to be found by the node module resolver at runtime. @@ -1663,40 +2324,66 @@ tree will exist on disk, so we assume node actions/binary/test executions will do the same. +**FIELDS** - -#### `deps` -depset of runtime dependency labels - - - -#### `pkgs` -list of labels of packages that provide NpmPackageInfo - - + + + + + + + + + + + + + + + + + +
NameDescription
deps + depset of runtime dependency labels
pkgs + list of labels of packages that provide NpmPackageInfo
## NpmPackageInfo -Provides information about npm dependencies - - - -#### `direct_sources` -Depset of direct source files in this npm package - - - -#### `sources` -Depset of direct & transitive source files in this npm package and in its dependencies - - - -#### `workspace` -The workspace name that this npm package is provided from +
+NpmPackageInfo(direct_sources, sources, workspace)
+
+Provides information about npm dependencies +**FIELDS** + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
direct_sources + Depset of direct source files in this npm package
sources + Depset of direct & transitive source files in this npm package and in its dependencies
workspace + The workspace name that this npm package is provided from
@@ -1704,29 +2391,41 @@ The workspace name that this npm package is provided from Constructs a DeclarationInfo including all transitive files needed to type-check from DeclarationInfo providers in a list of deps. - -### Usage - -``` -declaration_info(declarations, deps) -``` - - - -#### `declarations` - -list of typings files - - - - -#### `deps` - -list of labels of dependencies where we should collect their DeclarationInfo to pass transitively - -Defaults to `[]` - - +
+declaration_info(declarations, deps)
+
+ +**PARAMETERS** + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
declarations + list of typings files + + +
deps + list of labels of dependencies where we should collect their DeclarationInfo to pass transitively + + [] +
@@ -1736,27 +2435,39 @@ Constructs a JSEcmaScriptModuleInfo including all transitive sources from JSEcma Returns a single JSEcmaScriptModuleInfo. - -### Usage - -``` -js_ecma_script_module_info(sources, deps) -``` - - - -#### `sources` - - - - - -#### `deps` - - -Defaults to `[]` - - +
+js_ecma_script_module_info(sources, deps)
+
+ +**PARAMETERS** + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
sources + + +
deps + + [] +
@@ -1766,27 +2477,39 @@ Constructs a JSModuleInfo including all transitive sources from JSModuleInfo pro Returns a single JSModuleInfo. - -### Usage - -``` -js_module_info(sources, deps) -``` - - - -#### `sources` - - - - - -#### `deps` - - -Defaults to `[]` - - +
+js_module_info(sources, deps)
+
+ +**PARAMETERS** + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
sources + + +
deps + + [] +
@@ -1796,27 +2519,39 @@ Constructs a JSNamedModuleInfo including all transitive sources from JSNamedModu Returns a single JSNamedModuleInfo. - -### Usage - -``` -js_named_module_info(sources, deps) -``` - - - -#### `sources` - - - - - -#### `deps` - - -Defaults to `[]` - - +
+js_named_module_info(sources, deps)
+
+ +**PARAMETERS** + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
sources + + +
deps + + [] +
@@ -1827,63 +2562,118 @@ Helper to replace ctx.actions.run This calls node programs with a node_modules directory in place - -### Usage - -``` -run_node(ctx, inputs, arguments, executable, kwargs) -``` - - - -#### `ctx` - -rule context from the calling rule implementation function - - - - -#### `inputs` - -list or depset of inputs to the action - - - - -#### `arguments` - -list or ctx.actions.Args object containing arguments to pass to the executable - - - - -#### `executable` - -stringy representation of the executable this action will run, eg eg. "my_executable" rather than ctx.executable.my_executable - - - - -#### `kwargs` - -all other args accepted by ctx.actions.run - - - +
+run_node(ctx, inputs, arguments, executable, kwargs)
+
+ +**PARAMETERS** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
ctx + rule context from the calling rule implementation function + + +
inputs + list or depset of inputs to the action + + +
arguments + list or ctx.actions.Args object containing arguments to pass to the executable + + +
executable + stringy representation of the executable this action will run, eg eg. "my_executable" rather than ctx.executable.my_executable + + +
kwargs + all other args accepted by ctx.actions.run + + +
## node_modules_aspect +
+node_modules_aspect(name)
+
+ + + +**ASPECT ATTRIBUTES** + + + + + + + + + + + + + + +
NameType
depsString
+ +**ATTRIBUTES** + + + + + + + + + + + + + + + + + + + + +
NameDescriptionTypeMandatoryDefault
name + A unique name for this target. Namerequired
-### Usage - -``` -node_modules_aspect(name) -``` - - - -#### `name` -(*[name], mandatory*): A unique name for this target. diff --git a/docs/Cypress.html b/docs/Cypress.html new file mode 100755 index 0000000000..0b87e3b488 --- /dev/null +++ b/docs/Cypress.html @@ -0,0 +1,411 @@ + + + + + + + + + + rules_nodejs - Cypress + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ +

Cypress rules for Bazel

+ +

The Cypress rules run tests under the Cypress e2e testing framework with Bazel.

+ +

Installation

+ +

Add @bazel/cypress, cypress and @cypress/browserify-preprocessor npm packages to your devDependencies in package.json.

+ +
npm install --save-dev @bazel/cypress cypress @cypress/browserify-preprocessor
+ +

or using yarn

+ +
yarn add -D @bazel/cypress cypress @cypress/browserify-preprocessor
+ +

Then, load and invoke cypress_repository within your WORKSPACE file.

+ +
# Assuming your external repository for node_modules is named @npm
+
+load("@npm//@bazel/cypress:index.bzl", "cypress_repository")
+
+# The name you pass here names the external repository you can load cypress_web_test from
+cypress_repository(name = "cypress")
+ +

macOS install requirements

+

On macOS, cypress_repository generates an external repository containing files whose names contain spaces. In order to make these files compatible with bazel you will need to add the following flag to your .bazelrc file:

+ +
# Required for cypress_repository on macOS
+build --experimental_inprocess_symlink_creation
+ +

windows install requirements

+

At this point in time, cypress_repository is incompatible with bazel sandboxing on Windows. This may change in the future, but for now using cypress on windows requires windows sandboxing be disabled (it is disabled by default)

+ +

Example use of cypress_web_test

+

This example assumes you’ve named your external repository for node_modules as npm and for cypress as cypress

+ +
load("@cypress//:index.bzl", "cypress_web_test")
+load("@npm//@bazel/typescript:index.bzl", "ts_library")
+
+# You must create a cypress plugin in order to boot a server to serve your application. It can be written as a javascript file or in typescript using ts_library or ts_project.
+ts_library(
+    name = "plugins_file",
+    testonly = True,
+    srcs = ["plugin.ts"],
+    tsconfig = ":tsconfig.json",
+    deps = [
+        "@npm//@types/node",
+        "@npm//express",
+    ],
+)
+
+# You can write your cypress tests a javascript files or in typescript using ts_library or ts_project.
+ts_library(
+    name = "hello_spec",
+    testonly = True,
+    srcs = ["hello.spec.ts"],
+    tsconfig = ":tsconfig.json",
+    deps = [
+        "@npm//cypress",
+    ],
+)
+
+cypress_web_test(
+    # The name of your test target
+    name = "test",
+    srcs = [
+        # Load javascript test files directly as sources
+        "world.spec.js",
+        # Load ts_library tests as a target to srcs
+        ":hello_spec",
+    ],
+    # A cypress config file is required
+    config_file = "cypress.json",
+    # Any runtime dependencies you need to boot your server or run your tests
+    data = [],
+    # Your cypress plugin used to configure cypress and boot your server
+    plugins_file = ":plugins_file",
+)
+ +

cypress_repository

+ +
+cypress_repository(name, cypress_bin, fail_on_error, quiet)
+
+ +

ATTRIBUTES

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionTypeMandatoryDefault
name + A unique name for this repository. + Namerequired + +
cypress_bin + bazel target of the cypress binary + Labeloptional + @npm//:node_modules/cypress/bin/cypress +
fail_on_error + If the repository rule should allow errors + Booleanoptional + True +
quiet + If stdout and stderr should be printed to the terminal + Booleanoptional + True +
+ + +
+
+ + +
+
+ +
+
+
+
+

© 2020 Google

+
+
+
+ +
+ + + + + + + + + + + + + + + diff --git a/docs/Cypress.md b/docs/Cypress.md index 26a4bdf25a..42e2224159 100755 --- a/docs/Cypress.md +++ b/docs/Cypress.md @@ -1,10 +1,11 @@ --- title: Cypress layout: default -stylesheet: docs +toc: true +nav: rule --- + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ +

Jasmine rules for Bazel

+ +

The Jasmine rules run tests under the Jasmine framework with Bazel.

+ +

Installation

+ +

Add the @bazel/jasmine npm package to your devDependencies in package.json.

+ +

jasmine_node_test

+ +

Runs tests in NodeJS using the Jasmine test runner.

+ +

Detailed XML test results are found in the standard bazel-testlogs +directory. This may be symlinked in your workspace. +See https://docs.bazel.build/versions/master/output_directories.html

+ +

To debug the test, see debugging notes in nodejs_test.

+ +
+jasmine_node_test(name, srcs, data, deps, expected_exit_code, tags, config_file, jasmine,
+                  jasmine_entry_point, kwargs)
+
+ +

PARAMETERS

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
name + Name of the resulting label + + +
srcs + JavaScript source files containing Jasmine specs + + [] +
data + Runtime dependencies which will be loaded while the test executes + + [] +
deps + Other targets which produce JavaScript, such as ts_library + + [] +
expected_exit_code + The expected exit code for the test. + + 0 +
tags + Bazel tags applied to test + + [] +
config_file + (experimental) label of a file containing Jasmine JSON config. + + Note that not all configuration options are honored, and + we expect some strange feature interations. + For example, the filter for which files are instrumented for + code coverage doesn't understand the spec_files setting in the config. + + See https://jasmine.github.io/setup/nodejs.html#configuration + + None +
jasmine + A label providing the @bazel/jasmine npm dependency. + + "//packages/jasmine" +
jasmine_entry_point + A label providing the @bazel/jasmine entry point. + + "//packages/jasmine:jasmine_runner.js" +
kwargs + Remaining arguments are passed to the test rule + + +
+ + +
+
+ + +
+
+ +
+
+
+
+

© 2020 Google

+
+
+
+ +
+ + + + + + + + + + + + + + + diff --git a/docs/Jasmine.md b/docs/Jasmine.md index 3ce8b69ce0..553ce7ad06 100755 --- a/docs/Jasmine.md +++ b/docs/Jasmine.md @@ -1,10 +1,11 @@ --- title: Jasmine layout: default -stylesheet: docs +toc: true +nav: rule --- + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ +

Karma rules for Bazel

+ +

The Karma rules run karma tests with Bazel.

+ +

Installation

+ +

Add the @bazel/karma npm package to your devDependencies in package.json.

+ +

Now add this to your WORKSPACE to install the Karma dependencies:

+ +
# Fetch transitive Bazel dependencies of @bazel/karma
+load("@npm//@bazel/karma:package.bzl", "npm_bazel_karma_dependencies")
+npm_bazel_karma_dependencies()
+ +

This installs the io_bazel_rules_webtesting repository, if you haven’t installed it earlier.

+ +

Finally, configure the rules_webtesting:

+ +
# Set up web testing, choose browsers we can test on
+load("@io_bazel_rules_webtesting//web:repositories.bzl", "web_test_repositories")
+
+web_test_repositories()
+
+load("@io_bazel_rules_webtesting//web/versioned:browsers-0.3.2.bzl", "browser_repositories")
+
+browser_repositories(
+    chromium = True,
+    firefox = True,
+)
+ +

Installing with self-managed dependencies

+ +

If you didn’t use the yarn_install or npm_install rule to create an npm workspace, you’ll have to declare a rule in your root BUILD.bazel file to execute karma:

+ +
# Create a karma rule to use in ts_web_test_suite karma
+# attribute when using self-managed dependencies
+nodejs_binary(
+    name = "karma/karma",
+    entry_point = "//:node_modules/karma/bin/karma",
+    # Point bazel to your node_modules to find the entry point
+    node_modules = ["//:node_modules"],
+)
+ +

karma_web_test

+ +

Runs unit tests in a browser with Karma.

+ +

When executed under bazel test, this uses a headless browser for speed. +This is also because bazel test allows multiple targets to be tested together, +and we don’t want to open a Chrome window on your machine for each one. Also, +under bazel test the test will execute and immediately terminate.

+ +

Running under ibazel test gives you a “watch mode” for your tests. The rule is +optimized for this case - the test runner server will stay running and just +re-serve the up-to-date JavaScript source bundle.

+ +

To debug a single test target, run it with bazel run instead. This will open a +browser window on your computer. Also you can use any other browser by opening +the URL printed when the test starts up. The test will remain running until you +cancel the bazel run command.

+ +

This rule will use your system Chrome by default. In the default case, your +environment must specify CHROME_BIN so that the rule will know which Chrome binary to run. +Other browsers and customLaunchers may be set using the a base Karma configuration +specified in the config_file attribute.

+ +
+karma_web_test(srcs, deps, data, configuration_env_vars, bootstrap, runtime_deps, static_files,
+               config_file, tags, peer_deps, kwargs)
+
+ +

PARAMETERS

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
srcs + A list of JavaScript test files + + [] +
deps + Other targets which produce JavaScript such as ts_library + + [] +
data + Runtime dependencies + + [] +
configuration_env_vars + Pass these configuration environment variables to the resulting binary. + Chooses a subset of the configuration environment variables (taken from ctx.var), which also + includes anything specified via the --define flag. + Note, this can lead to different outputs produced by this rule. + + [] +
bootstrap + JavaScript files to include *before* the module loader (require.js). + For example, you can include Reflect,js for TypeScript decorator metadata reflection, + or UMD bundles for third-party libraries. + + [] +
runtime_deps + Dependencies which should be loaded after the module loader but before the srcs and deps. + These should be a list of targets which produce JavaScript such as ts_library. + The files will be loaded in the same order they are declared by that rule. + + [] +
static_files + Arbitrary files which are available to be served on request. + Files are served at: + /base/<WORKSPACE_NAME>/<path-to-file>, e.g. + /base/npm_bazel_typescript/examples/testing/static_script.js + + [] +
config_file + User supplied Karma configuration file. Bazel will override + certain attributes of this configuration file. Attributes that are + overridden will be outputted to the test log. + + None +
tags + Standard Bazel tags, this macro adds tags for ibazel support + + [] +
peer_deps + list of peer npm deps required by karma_web_test + + ["@npm//jasmine-core", "@npm//karma", "@npm//karma-chrome-launcher", "@npm//karma-firefox-launcher", "@npm//karma-jasmine", "@npm//karma-requirejs", "@npm//karma-sourcemap-loader", "@npm//requirejs", "@npm//tmp"] +
kwargs + Passed through to karma_web_test + + +
+ +

karma_web_test_suite

+ +

Defines a test_suite of web_test targets that wrap a karma_web_test target.

+ +

This macro accepts all parameters in karma_web_test and adds additional parameters +for the suite. See karma_web_test docs for all karma_web_test.

+ +

The wrapping macro is web_test_suite which comes from rules_websting: +https://github.com/bazelbuild/rules_webtesting/blob/master/web/web.bzl.

+ +
+karma_web_test_suite(name, browsers, web_test_data, wrapped_test_tags, kwargs)
+
+ +

PARAMETERS

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
name + The base name of the test + + +
browsers + A sequence of labels specifying the browsers to use. + + None +
web_test_data + Data dependencies for the wrapper web_test targets. + + [] +
wrapped_test_tags + A list of test tag strings to use for the wrapped + karma_web_test target. + + ["manual", "noci"] +
kwargs + Arguments for the wrapped karma_web_test target. + + +
+ + +
+
+ + +
+
+ +
+
+
+
+

© 2020 Google

+
+
+
+ +
+ + + + + + + + + + + + + + + diff --git a/docs/Karma.md b/docs/Karma.md index bda55c66d8..b66626569f 100755 --- a/docs/Karma.md +++ b/docs/Karma.md @@ -1,10 +1,11 @@ --- title: Karma layout: default -stylesheet: docs +toc: true +nav: rule --- + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ +

Protractor rules for Bazel

+ +

The Protractor rules run tests under the Protractor framework with Bazel.

+ +

Installation

+ +

Add the @bazel/protractor npm package to your devDependencies in package.json.

+ +

protractor_web_test

+ +

Runs a protractor test in a browser.

+ +
+protractor_web_test(name, configuration, on_prepare, srcs, deps, data, server, tags, peer_deps,
+                    protractor_entry_point, kwargs)
+
+ +

PARAMETERS

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
name + The name of the test + + +
configuration + Protractor configuration file. + + None +
on_prepare + A file with a node.js script to run once before all tests run. + If the script exports a function which returns a promise, protractor + will wait for the promise to resolve before beginning tests. + + None +
srcs + JavaScript source files + + [] +
deps + Other targets which produce JavaScript such as ts_library + + [] +
data + Runtime dependencies + + [] +
server + Optional server executable target + + None +
tags + Standard Bazel tags, this macro adds one for ibazel + + [] +
peer_deps + List of peer npm deps required by protractor_web_test + + ["@build_bazel_rules_nodejs//packages/protractor", "@npm//protractor"] +
protractor_entry_point + A label providing the protractor entry point + Default to :node_modules/protractor/bin/protractor. + + "@npm//:node_modules/protractor/bin/protractor" +
kwargs + passed through to protractor_web_test + + +
+ +

protractor_web_test_suite

+ +

Defines a test_suite of web_test targets that wrap a protractor_web_test target.

+ +
+protractor_web_test_suite(name, browsers, web_test_data, wrapped_test_tags, kwargs)
+
+ +

PARAMETERS

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
name + The base name of the test + + +
browsers + A sequence of labels specifying the browsers to use. + + None +
web_test_data + Data dependencies for the wrapper web_test targets. + + [] +
wrapped_test_tags + A list of test tag strings to use for the wrapped + karma_web_test target. + + ["manual", "noci"] +
kwargs + Arguments for the wrapped karma_web_test target. + + +
+ + +
+
+ + +
+
+ +
+
+
+
+

© 2020 Google

+
+
+
+ +
+ + + + + + + + + + + + + + + diff --git a/docs/Protractor.md b/docs/Protractor.md index b7badf81b2..2eca7aac8d 100755 --- a/docs/Protractor.md +++ b/docs/Protractor.md @@ -1,10 +1,11 @@ --- title: Protractor layout: default -stylesheet: docs +toc: true +nav: rule --- ``` - Should be edited by modifying the docs in the source `.bzl` files, other files can be freely edited. + +Should be edited by modifying the docs in the source `.bzl` files. +If updating css, then the `scss` in `/docs/css` should be edited. +The HTML files in `/docs` are also generated and should not be edited directly, other files can be freely edited. diff --git a/docs/Rollup.html b/docs/Rollup.html new file mode 100755 index 0000000000..a7cac3316d --- /dev/null +++ b/docs/Rollup.html @@ -0,0 +1,607 @@ + + + + + + + + + + rules_nodejs - Rollup + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ +

rollup rules for Bazel

+ +

The rollup rules run the rollup JS bundler with Bazel.

+ +

Wraps the rollup CLI documented at https://rollupjs.org/guide/en/#command-line-reference

+ +

Installation

+ +

Add the @bazel/rollup npm package to your devDependencies in package.json.

+ +

Installing with self-managed dependencies

+ +

If you didn’t use the yarn_install or npm_install rule, you’ll have to declare a rule in your root BUILD.bazel file to execute rollup:

+ +
# Create a rollup rule to use in rollup_bundle#rollup_bin
+# attribute when using self-managed dependencies
+nodejs_binary(
+    name = "rollup_bin",
+    entry_point = "//:node_modules/rollup/bin/rollup",
+    # Point bazel to your node_modules to find the entry point
+    node_modules = ["//:node_modules"],
+)
+ +

rollup_bundle

+ +

Runs the Rollup.js CLI under Bazel.

+ +

See https://rollupjs.org/guide/en/#command-line-reference

+ +

Typical example:

+ +
load("@npm//@bazel/rollup:index.bzl", "rollup_bundle")
+
+rollup_bundle(
+    name = "bundle",
+    srcs = ["dependency.js"],
+    entry_point = "input.js",
+    config_file = "rollup.config.js",
+)
+ +

Note that the command-line options set by Bazel override what appears in the rollup config file. +This means that typically a single rollup.config.js can contain settings for your whole repo, +and multiple rollup_bundle rules can share the configuration.

+ +

Thus, setting options that Bazel controls will have no effect, e.g.

+ +
module.exports = {
+    output: { file: 'this_is_ignored.js' },
+}
+ +

You must determine ahead of time whether Rollup needs to produce a directory output. +This is the case if you have dynamic imports which cause code-splitting, or if you +provide multiple entry points. Use the output_dir attribute to specify that you want a +directory output. +Rollup’s CLI has the same behavior, forcing you to pick --output.file or --output.dir.

+ +

To get multiple output formats, wrap the rule with a macro or list comprehension, e.g.

+ +
[
+    rollup_bundle(
+        name = "bundle.%s" % format,
+        entry_point = "foo.js",
+        format = format,
+    )
+    for format in [
+        "cjs",
+        "umd",
+    ]
+]
+ +

This will produce one output per requested format.

+ +
+rollup_bundle(name, args, config_file, deps, entry_point, entry_points, format, node_context_data,
+              output_dir, rollup_bin, rollup_worker_bin, silent, sourcemap, srcs, supports_workers)
+
+ +

ATTRIBUTES

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionTypeMandatoryDefault
name + A unique name for this target. + Namerequired + +
args + Command line arguments to pass to rollup. Can be used to override config file settings. + +These argument passed on the command line before all arguments that are always added by the +rule such as --output.dir or --output.file, --format, --config and --preserveSymlinks and +also those that are optionally added by the rule such as --sourcemap. + +See rollup CLI docs https://rollupjs.org/guide/en/#command-line-flags for complete list of supported arguments. + List of stringsoptional + [] +
config_file + A rollup.config.js file + +Passed to the --config +See https://rollupjs.org/guide/en/#configuration-files + +If not set, a default basic Rollup config is used. + Labeloptional + //packages/rollup:rollup.config.js +
deps + Other libraries that are required by the code, or by the rollup.config.js + List of labelsoptional + [] +
entry_point + The bundle's entry point (e.g. your main.js or app.js or index.js). + +This is just a shortcut for the entry_points attribute with a single output chunk named the same as the rule. + +For example, these are equivalent: + + +
rollup_bundle(
+    name = "bundle",
+    entry_point = "index.js",
+)
+ + + +
rollup_bundle(
+    name = "bundle",
+    entry_points = {
+        "index.js": "bundle"
+    }
+)
+ + +If rollup_bundle is used on a ts_library, the rollup_bundle rule handles selecting the correct outputs from ts_library. +In this case, entry_point can be specified as the .ts file and rollup_bundle will handle the mapping to the .mjs output file. + +For example: + + +
ts_library(
+    name = "foo",
+    srcs = [
+        "foo.ts",
+        "index.ts",
+    ],
+)
+
+rollup_bundle(
+    name = "bundle",
+    deps = [ "foo" ],
+    entry_point = "index.ts",
+)
+ +
Labeloptional + None +
entry_points + The bundle's entry points (e.g. your main.js or app.js or index.js). + +Passed to the [--input option](https://github.com/rollup/rollup/blob/master/docs/999-big-list-of-options.md#input) in Rollup. + +Keys in this dictionary are labels pointing to .js entry point files. +Values are the name to be given to the corresponding output chunk. + +Either this attribute or entry_point must be specified, but not both. + Dictionary: Label -> Stringoptional + {} +
format + "Specifies the format of the generated bundle. One of the following: + +- amd: Asynchronous Module Definition, used with module loaders like RequireJS +- cjs: CommonJS, suitable for Node and other bundlers +- esm: Keep the bundle as an ES module file, suitable for other bundlers and inclusion as a
+ +
+
+ + +
+
+ +
+
+
+
+

© 2020 Google

+
+
+
+ +
+ + + + + + + + + + + + + + + diff --git a/docs/Rollup.md b/docs/Rollup.md index 98f4f98474..0a341f72f6 100755 --- a/docs/Rollup.md +++ b/docs/Rollup.md @@ -1,10 +1,11 @@ --- title: Rollup layout: default -stylesheet: docs +toc: true +nav: rule --- + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ +

Terser rules for Bazel

+ +

The Terser rules run the Terser JS minifier with Bazel.

+ +

Wraps the Terser CLI documented at https://github.com/terser-js/terser#command-line-usage

+ +

Installation

+ +

Add the @bazel/terser npm package to your devDependencies in package.json.

+ +

Installing with self-managed dependencies

+ +

If you didn’t use the yarn_install or npm_install rule, you’ll have to declare a rule in your root BUILD.bazel file to execute terser:

+ +
# Create a terser rule to use in terser_minified#terser_bin
+# attribute when using self-managed dependencies
+nodejs_binary(
+    name = "terser_bin",
+    entry_point = "//:node_modules/terser/bin/uglifyjs",
+    # Point bazel to your node_modules to find the entry point
+    node_modules = ["//:node_modules"],
+)
+ +

terser_minified

+ +

Run the terser minifier.

+ +

Typical example:

+ +
load("@npm//@bazel/terser:index.bzl", "terser_minified")
+
+terser_minified(
+    name = "out.min",
+    src = "input.js",
+    config_file = "terser_config.json",
+)
+ +

Note that the name attribute determines what the resulting files will be called. +So the example above will output out.min.js and out.min.js.map (since sourcemap defaults to true). +If the input is a directory, then the output will also be a directory, named after the name attribute.

+ +
+terser_minified(name, args, config_file, debug, sourcemap, src, terser_bin)
+
+ +

ATTRIBUTES

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionTypeMandatoryDefault
name + A unique name for this target. + Namerequired + +
args + Additional command line arguments to pass to terser. + +Terser only parses minify() args from the config file so additional arguments such as --comments may +be passed to the rule using this attribute. See https://github.com/terser/terser#command-line-usage for the +full list of terser CLI options. + List of stringsoptional + [] +
config_file + A JSON file containing Terser minify() options. + +This is the file you would pass to the --config-file argument in terser's CLI. +https://github.com/terser-js/terser#minify-options documents the content of the file. + +Bazel will make a copy of your config file, treating it as a template. + +Run bazel with --subcommands to see the path to the copied file. + +If you use the magic strings "bazel_debug" or "bazel_no_debug", these will be +replaced with true and false respecting the value of the debug attribute +or the --compilation_mode=dbg bazel flag. + +For example + + +
{
+    "compress": {
+        "arrows": "bazel_no_debug"
+    }
+}
+ + +Will disable the arrows compression setting when debugging. + +If config_file isn't supplied, Bazel will use a default config file. +
Labeloptional + //packages/terser:terser_config.default.json +
debug + Configure terser to produce more readable output. + +Instead of setting this attribute, consider using debugging compilation mode instead +bazel build --compilation_mode=dbg //my/terser:target +so that it only affects the current build. + Booleanoptional + False +
sourcemap + Whether to produce a .js.map output + Booleanoptional + True +
src + File(s) to minify. + +Can be a .js file, a rule producing .js files as its default output, or a rule producing a directory of .js files. + +Note that you can pass multiple files to terser, which it will bundle together. +If you want to do this, you can pass a filegroup here. + Labelrequired + +
terser_bin + An executable target that runs Terser + Labeloptional + //packages/terser/bin:terser +
+ + +
+
+ + +
+
+ +
+
+
+
+

© 2020 Google

+
+
+
+ +
+ + + + + + + + + + + + + + + diff --git a/docs/Terser.md b/docs/Terser.md index e75a146951..f8c4a5f20f 100755 --- a/docs/Terser.md +++ b/docs/Terser.md @@ -1,10 +1,11 @@ --- title: Terser layout: default -stylesheet: docs +toc: true +nav: rule --- + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ +

TypeScript rules for Bazel

+ +

The TypeScript rules integrate the TypeScript compiler with Bazel.

+ +

Alternatives

+ +

This package provides Bazel wrappers around the TypeScript compiler.

+ +

At a high level, there are two alternatives provided: ts_project and ts_library. +This section describes the trade-offs between these rules.

+ +

ts_project simply runs tsc --project, with Bazel knowing which outputs to expect based on the TypeScript compiler options, and with interoperability with other TypeScript rules via a Bazel Provider (DeclarationInfo) that transmits the type information. +It is intended as an easy on-boarding for existing TypeScript code and should be familiar if your background is in frontend ecosystem idioms. +Any behavior of ts_project should be reproducible outside of Bazel, with a couple of caveats noted in the rule documentation below.

+ +
+

We used to recommend using the tsc rule directly from the typescript project, like +load("@npm//typescript:index.bzl", "tsc") +However ts_project is strictly better and should be used instead.

+
+ +

ts_library is an open-sourced version of the rule we use to compile TS code at Google. +It should be familiar if your background is in Bazel idioms. +It is very complex, involving code generation of the tsconfig.json file, a custom compiler binary, and a lot of extra features. +It is also opinionated, and may not work with existing TypeScript code. For example:

+ +
    +
  • Your TS code must compile under the --declaration flag so that downstream libraries depend only on types, not implementation. This makes Bazel faster by avoiding cascading rebuilds in cases where the types aren’t changed.
  • +
  • We control the output format and module syntax so that downstream rules can rely on them.
  • +
+ +

On the other hand, ts_library is also fast and optimized. +We keep a running TypeScript compile running as a daemon, using Bazel workers. +This process avoids re-parse and re-JIT of the >1MB typescript.js and keeps cached bound ASTs for input files which saves time. +We also produce JS code which can be loaded faster (using named AMD module format) and which can be consumed by the Closure Compiler (via integration with tsickle).

+ +

Installation

+ +

Add a devDependency on @bazel/typescript

+ +
$ yarn add -D @bazel/typescript
+# or
+$ npm install --save-dev @bazel/typescript
+ +

Watch for any peerDependency warnings - we assume you have already installed the typescript package from npm.

+ +

Create a BUILD.bazel file in your workspace root. If your tsconfig.json file is in the root, use

+ +
exports_files(["tsconfig.json"], visibility = ["//visibility:public"])
+ +

otherwise create an alias:

+ +
alias(
+    name = "tsconfig.json",
+    actual = "//path/to/my:tsconfig.json",
+)
+ +

Make sure to remove the --noEmit compiler option from your tsconfig.json. This is not compatible with the ts_library rule.

+ +

Self-managed npm dependencies

+ +

We recommend you use Bazel managed dependencies but if you would like +Bazel to also install a node_modules in your workspace you can also +point the node_repositories repository rule in your WORKSPACE file to +your package.json.

+ +
node_repositories(package_json = ["//:package.json"])
+ +

You can then run yarn in your workspace with:

+ +
$ bazel run @nodejs//:yarn_node_repositories
+ +

To use your workspace node_modules folder as a dependency in ts_library and +other rules, add the following to your root BUILD.bazel file:

+ +
filegroup(
+    name = "node_modules",
+    srcs = glob(
+        include = [
+          "node_modules/**/*.js",
+          "node_modules/**/*.d.ts",
+          "node_modules/**/*.json",
+          "node_modules/.bin/*",
+        ],
+        exclude = [
+          # Files under test & docs may contain file names that
+          # are not legal Bazel labels (e.g.,
+          # node_modules/ecstatic/test/public/中文/檔案.html)
+          "node_modules/**/test/**",
+          "node_modules/**/docs/**",
+          # Files with spaces in the name are not legal Bazel labels
+          "node_modules/**/* */**",
+          "node_modules/**/* *",
+        ],
+    ),
+)
+
+# Create a tsc_wrapped compiler rule to use in the ts_library
+# compiler attribute when using self-managed dependencies
+nodejs_binary(
+    name = "@bazel/typescript/tsc_wrapped",
+    entry_point = "@npm//:node_modules/@bazel/typescript/internal/tsc_wrapped/tsc_wrapped.js",
+    # Point bazel to your node_modules to find the entry point
+    node_modules = "//:node_modules",
+)
+ +

See https://github.com/bazelbuild/rules_nodejs#dependencies for more information on +managing npm dependencies with Bazel.

+ +

Customizing the TypeScript compiler binary

+ +

An example use case is needing to increase the NodeJS heap size used for compilations.

+ +

Similar to above, you declare your own binary for running tsc_wrapped, e.g.:

+ +
nodejs_binary(
+    name = "tsc_wrapped_bin",
+    entry_point = "@npm//:node_modules/@bazel/typescript/internal/tsc_wrapped/tsc_wrapped.js",
+    templated_args = [
+        "--node_options=--max-old-space-size=2048",
+    ],
+    data = [
+        "@npm//protobufjs",
+        "@npm//source-map-support",
+        "@npm//tsutils",
+        "@npm//typescript",
+        "@npm//@bazel/typescript",
+    ],
+)
+ +

then refer to that target in the compiler attribute of your ts_library rule.

+ +

Note that nodejs_binary targets generated by npm_install/yarn_install can include data dependencies +on packages which aren’t declared as dependencies. For example, if you use [tsickle] to generate Closure Compiler-compatible JS, then it needs to be a data dependency of tsc_wrapped so that it can be loaded at runtime. + +[tsickle]: https://github.com/angular/tsickle

+ +

Usage

+ +

Compiling TypeScript: ts_library

+ +

The ts_library rule invokes the TypeScript compiler on one compilation unit, +or “library” (generally one directory of source files).

+ +

Create a BUILD file next to your sources:

+ +
package(default_visibility=["//visibility:public"])
+load("//packages/typescript:index.bzl", "ts_library")
+
+ts_library(
+    name = "my_code",
+    srcs = glob(["*.ts"]),
+    deps = ["//path/to/other:library"],
+)
+ +

If your ts_library target has npm dependencies you can specify these +with fine grained npm dependency targets created by the yarn_install or +npm_install rules:

+ +
ts_library(
+    name = "my_code",
+    srcs = glob(["*.ts"]),
+    deps = [
+      "@npm//@types/node",
+      "@npm//@types/foo",
+      "@npm//foo",
+      "//path/to/other:library",
+    ],
+)
+ +

You can also use the @npm//@types target which will include all +packages in the @types scope as dependencies.

+ +

If you are using self-managed npm dependencies, you can use the +node_modules attribute in ts_library and point it to the +//:node_modules filegroup defined in your root BUILD.bazel file. +You’ll also need to override the compiler attribute if you do this +as the Bazel-managed deps and self-managed cannot be used together +in the same rule.

+ +
ts_library(
+    name = "my_code",
+    srcs = glob(["*.ts"]),
+    deps = ["//path/to/other:library"],
+    node_modules = "//:node_modules",
+    compiler = "//:@bazel/typescript/tsc_wrapped",
+)
+ +

To build a ts_library target run:

+ +

bazel build //path/to/package:target

+ +

The resulting .d.ts file paths will be printed. Additionally, the .js +outputs from TypeScript will be written to disk, next to the .d.ts files 1.

+ +

Note that the tsconfig.json file used for compilation should be the same one +your editor references, to keep consistent settings for the TypeScript compiler. +By default, ts_library uses the tsconfig.json file in the workspace root +directory. See the notes about the tsconfig attribute in the ts_library API docs.

+ +
+

1 The +declarationDir +compiler option will be silently overwritten if present.

+
+ +

Accessing JavaScript outputs

+ +

The default output of the ts_library rule is the .d.ts files. +This is for a couple reasons:

+ +
    +
  • help ensure that downstream rules which access default outputs will not require +a cascading re-build when only the implementation changes but not the types
  • +
  • make you think about whether you want the devmode (named UMD) or prodmode outputs
  • +
+ +

You can access the JS output by adding a filegroup rule after the ts_library, +for example

+ +
ts_library(
+    name = "compile",
+    srcs = ["thing.ts"],
+)
+
+filegroup(
+    name = "thing.js",
+    srcs = ["compile"],
+    # Change to es6_sources to get the 'prodmode' JS
+    output_group = "es5_sources",
+)
+
+my_rule(
+    name = "uses_js",
+    deps = ["thing.js"],
+)
+ +

Serving TypeScript for development

+ +

There are two choices for development mode:

+ +
    +
  1. Use the ts_devserver rule to bring up our simple, fast development server. +This is intentionally very simple, to help you get started quickly. However, +since there are many development servers available, we do not want to mirror +their features in yet another server we maintain.
  2. +
  3. Teach your real frontend server to serve files from Bazel’s output directory. +This is not yet documented. Choose this option if you have an existing server +used in development mode, or if your requirements exceed what the +ts_devserver supports. Be careful that your development round-trip stays +fast (should be under two seconds).
  4. +
+ +

To use ts_devserver, you simply load the rule, and call it with deps that +point to your ts_library target(s):

+ +
load("//packages/typescript:index.bzl", "ts_devserver", "ts_library")
+
+ts_library(
+    name = "app",
+    srcs = ["app.ts"],
+)
+
+ts_devserver(
+    name = "devserver",
+    # We'll collect all the devmode JS sources from these TypeScript libraries
+    deps = [":app"],
+    # This is the path we'll request from the browser, see index.html
+    serving_path = "/bundle.js",
+    # The devserver can serve our static files too
+    static_files = ["index.html"],
+)
+ +

The index.html should be the same one you use for production, and it should +load the JavaScript bundle from the path indicated in serving_path.

+ +

If you don’t have an index.html file, a simple one will be generated by the +ts_devserver.

+ +

See examples/app in this repository for a working example. To run the +devserver, we recommend you use ibazel:

+ +
$ ibazel run examples/app:devserver
+ +

ibazel will keep the devserver program running, and provides a LiveReload +server so the browser refreshes the application automatically when each build +finishes.

+ +

Writing TypeScript code for Bazel

+ +

Bazel’s TypeScript compiler has your workspace path mapped, so you can import +from an absolute path starting from your workspace.

+ +

/WORKSPACE:

+ +
workspace(name = "myworkspace")
+ +

/some/long/path/to/deeply/nested/subdirectory.ts:

+ +
import {thing} from 'myworkspace/place';
+ +

will import from /place.ts.

+ +

Since this is an extension to the vanilla TypeScript compiler, editors which use the TypeScript language services to provide code completion and inline type checking will not be able to resolve the modules. In the above example, adding

+ +
"paths": {
+    "myworkspace/*": ["*"]
+}
+ +

to tsconfig.json will fix the imports for the common case of using absolute paths. +See path mapping for more details on the paths syntax.

+ +

Similarly, you can use path mapping to teach the editor how to resolve imports +from ts_library rules which set the module_name attribute.

+ +

Notes

+ +

If you’d like a “watch mode”, try ibazel.

+ +

At some point, we plan to release a tool similar to gazelle to generate the +BUILD files from your source code.

+ +

ts_config

+ +

Allows a tsconfig.json file to extend another file.

+ +

Normally, you just give a single tsconfig.json file as the tsconfig attribute +of a ts_library rule. However, if your tsconfig.json uses the extends +feature from TypeScript, then the Bazel implementation needs to know about that +extended configuration file as well, to pass them both to the TypeScript compiler.

+ +
+ts_config(name, deps, src)
+
+ +

ATTRIBUTES

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionTypeMandatoryDefault
name + A unique name for this target. + Namerequired + +
deps + Additional tsconfig.json files referenced via extends + List of labelsrequired + +
src + The tsconfig.json file passed to the TypeScript compiler + Labelrequired + +
+ +

ts_devserver

+ +

ts_devserver is a simple development server intended for a quick “getting started” experience.

+ +

Additional documentation at https://github.com/alexeagle/angular-bazel-example/wiki/Running-a-devserver-under-Bazel

+ +
+ts_devserver(name, additional_root_paths, bootstrap, deps, devserver, devserver_host, entry_module,
+             port, scripts, serving_path, static_files)
+
+ +

ATTRIBUTES

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionTypeMandatoryDefault
name + A unique name for this target. + Namerequired + +
additional_root_paths + Additional root paths to serve static_files from. + Paths should include the workspace name such as ["__main__/resources"] + List of stringsoptional + [] +
bootstrap + Scripts to include in the JS bundle before the module loader (require.js) + List of labelsoptional + [] +
deps + Targets that produce JavaScript, such as ts_library + List of labelsoptional + [] +
devserver + Go based devserver executable. + + With cross-platform RBE for OSX & Windows ctx.executable.devserver will be linux as --cpu and + --host_cpu must be overridden to k8. However, we still want to be able to run the devserver on the host + machine so we need to include the host devserver binary, which is ctx.executable.devserver_host, in the + runfiles. For non-RBE and for RBE with a linux host, ctx.executable.devserver & ctx.executable.devserver_host + will be the same binary. + + Defaults to precompiled go binary setup by @bazel/typescript npm package + Labeloptional + //packages/typescript/devserver:devserver +
devserver_host + Go based devserver executable for the host platform. + Defaults to precompiled go binary setup by @bazel/typescript npm package + Labeloptional + //packages/typescript/devserver:devserver_darwin_amd64 +
entry_module + The entry_module should be the AMD module name of the entry module such as "__main__/src/index". + ts_devserver concats the following snippet after the bundle to load the application: + require(["entry_module"]); + Stringoptional + "" +
port + The port that the devserver will listen on. + Integeroptional + 5432 +
scripts + User scripts to include in the JS bundle before the application sources + List of labelsoptional + [] +
serving_path + The path you can request from the client HTML which serves the JavaScript bundle. + If you don't specify one, the JavaScript can be loaded at /_/ts_scripts.js + Stringoptional + "/_/ts_scripts.js" +
static_files + Arbitrary files which to be served, such as index.html. + They are served relative to the package where this rule is declared. + List of labelsoptional + [] +
+ +

ts_library

+ +

ts_library type-checks and compiles a set of TypeScript sources to JavaScript.

+ +

It produces declarations files (.d.ts) which are used for compiling downstream +TypeScript targets and JavaScript for the browser and Closure compiler.

+ +
+ts_library(name, angular_assets, compiler, data, deps, devmode_module, devmode_target,
+           expected_diagnostics, generate_externs, internal_testing_type_check_dependencies,
+           module_name, module_root, node_modules, prodmode_module, prodmode_target, runtime,
+           runtime_deps, srcs, supports_workers, tsconfig, tsickle_typed, use_angular_plugin)
+
+ +

ATTRIBUTES

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionTypeMandatoryDefault
name + A unique name for this target. + Namerequired + +
angular_assets + Additional files the Angular compiler will need to read as inputs. + Includes .css and .html files + List of labelsoptional + [] +
compiler + Sets a different TypeScript compiler binary to use for this library. +For example, we use the vanilla TypeScript tsc.js for bootstrapping, +and Angular compilations can replace this with ngc. + +The default ts_library compiler depends on the //@bazel/typescript +target which is setup for projects that use bazel managed npm deps and +install the @bazel/typescript npm package. + Labeloptional + @build_bazel_rules_typescript//internal:tsc_wrapped_bin +
data + List of labelsoptional + [] +
deps + Compile-time dependencies, typically other ts_library targets + List of labelsoptional + [] +
devmode_module + Set the typescript module compiler option for devmode output. + +This value will override the module option in the user supplied tsconfig. + Stringoptional + "umd" +
devmode_target + Set the typescript target compiler option for devmode output. + +This value will override the target option in the user supplied tsconfig. + Stringoptional + "es2015" +
expected_diagnostics + List of stringsoptional + [] +
generate_externs + Booleanoptional + True +
internal_testing_type_check_dependencies + Testing only, whether to type check inputs that aren't srcs. + Booleanoptional + False +
module_name + Stringoptional + "" +
module_root + Stringoptional + "" +
node_modules + The npm packages which should be available during the compile. + +The default value of //typescript:typescript__typings is setup +for projects that use bazel managed npm deps. This default is in place +since ts_library will always depend on at least the typescript +default libs which are provided by //typescript:typescript__typings. + +This attribute is DEPRECATED. As of version 0.18.0 the recommended +approach to npm dependencies is to use fine grained npm dependencies +which are setup with the yarn_install or npm_install rules. + +For example, in targets that used a //:node_modules filegroup, + + +
ts_library(
+    name = "my_lib",
+    ...
+    node_modules = "//:node_modules",
+)
+ + +which specifies all files within the //:node_modules filegroup +to be inputs to the my_lib. Using fine grained npm dependencies, +my_lib is defined with only the npm dependencies that are +needed: + + +
ts_library(
+    name = "my_lib",
+    ...
+    deps = [
+        "@npm//@types/foo",
+        "@npm//@types/bar",
+        "@npm//foo",
+        "@npm//bar",
+        ...
+    ],
+)
+ + +In this case, only the listed npm packages and their +transitive deps are includes as inputs to the my_lib target +which reduces the time required to setup the runfiles for this +target (see https://github.com/bazelbuild/bazel/issues/5153). +The default typescript libs are also available via the node_modules +default in this case. + +The @npm external repository and the fine grained npm package +targets are setup using the yarn_install or npm_install rule +in your WORKSPACE file: + + +
yarn_install(
+    name = "npm",
+    package_json = "//:package.json",
+    yarn_lock = "//:yarn.lock",
+)
+ +
Labeloptional + @npm//typescript:typescript__typings +
prodmode_module + Set the typescript module compiler option for prodmode output. + +This value will override the module option in the user supplied tsconfig. + Stringoptional + "esnext" +
prodmode_target + Set the typescript target compiler option for prodmode output. + +This value will override the target option in the user supplied tsconfig. + Stringoptional + "es2015" +
runtime + Stringoptional + "browser" +
runtime_deps + The dependencies of this attribute must provide: JsInfo + List of labelsoptional + [] +
srcs + The TypeScript source files to compile. + List of labelsrequired + +
supports_workers + Intended for internal use only. + +Allows you to disable the Bazel Worker strategy for this library. +Typically used together with the "compiler" setting when using a +non-worker aware compiler binary. + Booleanoptional + True +
tsconfig + A tsconfig.json file containing settings for TypeScript compilation. +Note that some properties in the tsconfig are governed by Bazel and will be +overridden, such as target and module. + +The default value is set to //:tsconfig.json by a macro. This means you must +either: + +- Have your tsconfig.json file in the workspace root directory +- Use an alias in the root BUILD.bazel file to point to the location of tsconfig: + alias(name="tsconfig.json", actual="//path/to:tsconfig-something.json") +- Give an explicit tsconfig attribute to all ts_library targets + Labeloptional + None +
tsickle_typed + If using tsickle, instruct it to translate types to ClosureJS format + Booleanoptional + True +
use_angular_plugin + Run the Angular ngtsc compiler under ts_library + Booleanoptional + False +
+ +

ts_project

+ +

Compiles one TypeScript project using tsc --project

+ +

This is a drop-in replacement for the tsc rule automatically generated for the “typescript” +package, typically loaded from @npm//typescript:index.bzl. Unlike bare tsc, this rule understands +the Bazel interop mechanism (Providers) so that this rule works with others that produce or consume +TypeScript typings (.d.ts files).

+ +

Unlike ts_library, this rule is the thinnest possible layer of Bazel interoperability on top +of the TypeScript compiler. It shifts the burden of configuring TypeScript into the tsconfig.json file. +See https://github.com/bazelbuild/rules_nodejs/blob/master/docs/TypeScript.md#alternatives +for more details about the trade-offs between the two rules.

+ +

Some TypeScript options affect which files are emitted, and Bazel wants to know these ahead-of-time. +So several options from the tsconfig file must be mirrored as attributes to ts_project. +See https://www.typescriptlang.org/v2/en/tsconfig for a listing of the TypeScript options.

+ +

Any code that works with tsc should work with ts_project with a few caveats:

+ +
    +
  • Bazel requires that the outDir (and declarationDir) be set to +bazel-out/[target architecture]/bin/path/to/package +so we override whatever settings appear in your tsconfig.
  • +
  • Bazel expects that each output is produced by a single rule. +Thus if you have two ts_project rules with overlapping sources (the same .ts file +appears in more than one) then you get an error about conflicting .js output +files if you try to build both together. +Worse, if you build them separately then the output directory will contain whichever +one you happened to build most recently. This is highly discouraged.
  • +
+ +
+

Note: in order for TypeScript to resolve relative references to the bazel-out folder, +we recommend that the base tsconfig contain a rootDirs section that includes all +possible locations they may appear.

+ +

We hope this will not be needed in some future release of TypeScript. +Follow https://github.com/microsoft/TypeScript/issues/37257 for more info.

+ +

For example, if the base tsconfig file relative to the workspace root is +path/to/tsconfig.json then you should configure like:

+ +
+
> "compilerOptions": {
+>     "rootDirs": [
+>         ".",
+>         "../../bazel-out/darwin-fastbuild/bin/path/to",
+>         "../../bazel-out/k8-fastbuild/bin/path/to",
+>         "../../bazel-out/x64_windows-fastbuild/bin/path/to",
+>         "../../bazel-out/darwin-dbg/bin/path/to",
+>         "../../bazel-out/k8-dbg/bin/path/to",
+>         "../../bazel-out/x64_windows-dbg/bin/path/to",
+>     ]
+> }
+> 
+ +

Issues when running non-sandboxed

+ +

When using a non-sandboxed spawn strategy (which is the default on Windows), you may +observe these problems which require workarounds:

+ +

1) Bazel deletes outputs from the previous execution before running tsc. + This causes a problem with TypeScript’s incremental mode: if the .tsbuildinfo file + is not known to be an output of the rule, then Bazel will leave it in the output + directory, and when tsc runs, it may see that the outputs written by the prior + invocation are up-to-date and skip the emit of these files. This will cause Bazel + to intermittently fail with an error that some outputs were not written. + This is why we depend on composite and/or incremental attributes to be provided, + so we can tell Bazel to expect a .tsbuildinfo output to ensure it is deleted before a + subsequent compilation. + At present, we don’t do anything useful with the .tsbuildinfo output, and this rule + does not actually have incremental behavior. Deleting the file is actually + counter-productive in terms of TypeScript compile performance. + Follow https://github.com/bazelbuild/rules_nodejs/issues/1726

+ +

2) When using Project References, TypeScript will expect to verify that the outputs of referenced + projects are up-to-date with respect to their inputs. + (This is true even without using the --build option). + When using a non-sandboxed spawn strategy, tsc can read the sources from other ts_project + rules in your project, and will expect that the tsconfig.json file for those references will + indicate where the outputs were written. However the outDir is determined by this Bazel rule so + it cannot be known from reading the tsconfig.json file. + This problem is manifested as a TypeScript diagnostic like + error TS6305: Output file '/path/to/execroot/a.d.ts' has not been built from source file '/path/to/execroot/a.ts'. + As a workaround, you can give the Windows “fastbuild” output directory as the outDir in your tsconfig file. + On other platforms, the value isn’t read so it does no harm. + See https://github.com/bazelbuild/rules_nodejs/tree/stable/packages/typescript/test/ts_project as an example. + We hope this will be fixed in a future release of TypeScript; + follow https://github.com/microsoft/TypeScript/issues/37378

+ +

3) When TypeScript encounters an import statement, it adds the source file resolved by that reference + to the program. However you may have included that source file in a different project, so this causes + the problem mentioned above where a source file is in multiple programs. + (Note, if you use Project References this is not the case, TS will know the referenced + file is part of the other program.) + This will result in duplicate emit for the same file, which produces an error + since the files written to the output tree are read-only. + Workarounds include using using Project References, or simply grouping the whole compilation + into one program (if this doesn’t exceed your time budget).

+ +
+ts_project(name, tsconfig, srcs, args, deps, extends, declaration, source_map, declaration_map,
+           composite, incremental, emit_declaration_only, tsc, validate, declaration_dir, out_dir,
+           root_dir, kwargs)
+
+ +

PARAMETERS

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
name + A name for the target. + + We recommend you use the basename (no .json extension) of the tsconfig file that should be compiled. + + "tsconfig" +
tsconfig + Label of the tsconfig.json file to use for the compilation. + + By default, we add .json to the name attribute. + + None +
srcs + List of labels of TypeScript source files to be provided to the compiler. + + If absent, defaults to **/*.ts[x] (all TypeScript files in the package). + + None +
args + List of strings of additional command-line arguments to pass to tsc. + + [] +
deps + List of labels of other rules that produce TypeScript typings (.d.ts files) + + [] +
extends + List of labels of tsconfig file(s) referenced in extends section of tsconfig. + + Must include any tsconfig files "chained" by extends clauses. + + None +
declaration + if the declaration bit is set in the tsconfig. + Instructs Bazel to expect a .d.ts output for each .ts source. + + False +
source_map + if the sourceMap bit is set in the tsconfig. + Instructs Bazel to expect a .js.map output for each .ts source. + + False +
declaration_map + if the declarationMap bit is set in the tsconfig. + Instructs Bazel to expect a .d.ts.map output for each .ts source. + + False +
composite + if the composite bit is set in the tsconfig. + Instructs Bazel to expect a .tsbuildinfo output and a .d.ts output for each .ts source. + + False +
incremental + if the incremental bit is set in the tsconfig. + Instructs Bazel to expect a .tsbuildinfo output. + + False +
emit_declaration_only + if the emitDeclarationOnly bit is set in the tsconfig. + Instructs Bazel *not* to expect .js or .js.map outputs for .ts sources. + + False +
tsc + Label of the TypeScript compiler binary to run. + + For example, tsc = "@my_deps//typescript/bin:tsc" + Or you can pass a custom compiler binary instead. + + None +
validate + boolean; whether to check that the tsconfig settings match the attributes. + + True +
declaration_dir + a string specifying a subdirectory under the bazel-out folder where generated declaration + outputs are written. Equivalent to the TypeScript --declarationDir option. + By default declarations are written to the out_dir. + + None +
out_dir + a string specifying a subdirectory under the bazel-out folder where outputs are written. + Equivalent to the TypeScript --outDir option. + Note that Bazel always requires outputs be written under a subdirectory matching the input package, + so if your rule appears in path/to/my/package/BUILD.bazel and out_dir = "foo" then the .js files + will appear in bazel-out/[arch]/bin/path/to/my/package/foo/*.js. + By default the out_dir is '.', meaning the packages folder in bazel-out. + + None +
root_dir + a string specifying a subdirectory under the input package which should be consider the + root directory of all the input files. + Equivalent to the TypeScript --rootDir option. + By default it is '.', meaning the source directory where the BUILD file lives. + + None +
kwargs + passed through to underlying rule, allows eg. visibility, tags + + +
+ + +
+
+ + +
+
+ +
+
+
+
+

© 2020 Google

+
+
+
+ +
+ + + + + + + + + + + + + + + diff --git a/docs/TypeScript.md b/docs/TypeScript.md index 4654d12226..7b4296238d 100755 --- a/docs/TypeScript.md +++ b/docs/TypeScript.md @@ -1,10 +1,11 @@ --- title: TypeScript layout: default -stylesheet: docs +toc: true +nav: rule --- + + + + + + + + + - - - \ No newline at end of file + // Highlight the current page on the sidebar nav. + highlightCurrentSidebarNav(); + }); + diff --git a/docs/_includes/head.html b/docs/_includes/head.html index 4171d3d696..09ef090dc2 100644 --- a/docs/_includes/head.html +++ b/docs/_includes/head.html @@ -1,29 +1,33 @@ - - - - {{ page.title }} - {{site.github.project_title}} + + + + + - + rules_nodejs - {{ page.title }} - + + - - - - - + + - + + - - - - + + + + + + + + + + + diff --git a/docs/_includes/header.html b/docs/_includes/header.html index 685111b6d3..03779a7715 100644 --- a/docs/_includes/header.html +++ b/docs/_includes/header.html @@ -1,21 +1,24 @@ -
-
- {{ page.title }} -
- -
- -
- -
-
+
- {% include drawer.html %} \ No newline at end of file + + + + + diff --git a/docs/_includes/sidenav.html b/docs/_includes/sidenav.html new file mode 100644 index 0000000000..4d8fb385f5 --- /dev/null +++ b/docs/_includes/sidenav.html @@ -0,0 +1,39 @@ + diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html index c8dda860cb..cfa020852f 100644 --- a/docs/_layouts/default.html +++ b/docs/_layouts/default.html @@ -1,25 +1,42 @@ ---- -stylesheet: docs ---- - - {% include head.html %} - -
- {% include header.html %} + +{% include head.html %} + +{% include header.html %} -
-
- {% if page.title %} -

{{ page.title }}

- {% endif %} +
+
+ {% include sidenav.html %} + +
+
+ {{ content }} +
+
- {{ content }} -
-
- {% include footer.html %} -
+ - - \ No newline at end of file +
+ + +{% include footer.html %} + + + diff --git a/docs/_layouts/home.html b/docs/_layouts/home.html deleted file mode 100644 index 110b6375ec..0000000000 --- a/docs/_layouts/home.html +++ /dev/null @@ -1,23 +0,0 @@ ---- -stylesheet: docs -title: rules_nodejs ---- - - - {% include head.html %} - -
- {% include header.html %} - -
-
- - {{ content }} - -
-
- {% include footer.html %} -
-
- - \ No newline at end of file diff --git a/docs/changing-rules.html b/docs/changing-rules.html new file mode 100755 index 0000000000..ae796470fe --- /dev/null +++ b/docs/changing-rules.html @@ -0,0 +1,300 @@ + + + + + + + + + + rules_nodejs - Making changes to rules_nodejs + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+

Making changes to rules_nodejs

+ +

One advantage of open-source software is that you can make your own changes that suit your needs.

+ +

The packages published to npm and GitHub differ from the sources in this repo. The packages have only runtime bazel dependencies, but the sources depend on development dependencies. For example, the @bazel_skylib library is a development-time transitive dependency, while an npm package would have that dependency statically linked in.

+ +
+

This differs from much of the Bazel ecosystem, where you are expected to build the whole transitive toolchain from sources.

+
+ +

If you have a small change, it’s easiest to just patch the distributed artifacts rather than build from source. However if you’re doing active development in rules_nodejs or have a policy of not depending on release artifacts, it’s possible to depend directly on sources. This is not yet documented; file an issue on our repo if you think you need this.

+ +

Patching the npm packages

+ +

The pattern we use most commonly is to add a postinstall hook to your package.json that patches files after they’ve been fetched from npm.

+ +

See /tools/postinstall-patches.js in the Angular repo for an example.

+ +

Patching the built-in release

+ +

rules_nodejs has a distribution format which is a tgz published to GitHub, and this can make it tricky to make casual changes without forking the project and building your own release artifacts.

+ +

Bazel has a handy patching mechanism that lets you easily apply a local patch to the release artifact for built-in rules: the patches attribute to http_archive.

+ +

First, make your changes in a clone of the rules_nodejs repo. Export a patch file simply using git diff:

+ +
git diff > my.patch
+
+ +

Then copy the patch file somewhere in your repo and point to it from your WORKSPACE file:

+ +
http_archive(
+    name = "build_bazel_rules_nodejs",
+    patch_args = ["-p1"],
+    patches = ["//path/to/my.patch"],
+    sha256 = "6d4edbf28ff6720aedf5f97f9b9a7679401bf7fca9d14a0fff80f644a99992b4",
+    urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/0.32.2/rules_nodejs-0.32.2.tar.gz"],
+)
+
+ +
+
+ + +
+
+ +
+
+
+
+

© 2020 Google

+
+
+
+ +
+ + + + + + + + + + + + + + + diff --git a/docs/changing-rules.md b/docs/changing-rules.md new file mode 100644 index 0000000000..499a7a9ff3 --- /dev/null +++ b/docs/changing-rules.md @@ -0,0 +1,47 @@ +--- +title: Making changes to rules_nodejs +layout: default +toc: true +--- + +# Making changes to rules_nodejs + +One advantage of open-source software is that you can make your own changes that suit your needs. + +The packages published to npm and GitHub differ from the sources in this repo. The packages have only runtime bazel dependencies, but the sources depend on development dependencies. For example, the `@bazel_skylib` library is a development-time transitive dependency, while an npm package would have that dependency statically linked in. + +> This differs from much of the Bazel ecosystem, where you are expected to build the whole transitive toolchain from sources. + +If you have a small change, it's easiest to just patch the distributed artifacts rather than build from source. However if you're doing active development in rules_nodejs or have a policy of not depending on release artifacts, it's possible to depend directly on sources. This is not yet documented; file an issue on our repo if you think you need this. + +## Patching the npm packages + +The pattern we use most commonly is to add a `postinstall` hook to your `package.json` that patches files after they've been fetched from npm. + +See `/tools/postinstall-patches.js` in the [Angular repo] for an example. + +[Angular repo]: https://github.com/angular/angular/tree/master/tools/postinstall-patches.js + +## Patching the built-in release + +rules_nodejs has a distribution format which is a tgz published to GitHub, and this can make it tricky to make casual changes without forking the project and building your own release artifacts. + +Bazel has a handy patching mechanism that lets you easily apply a local patch to the release artifact for built-in rules: the `patches` attribute to `http_archive`. + +First, make your changes in a clone of the rules_nodejs repo. Export a patch file simply using `git diff`: + +```sh +git diff > my.patch +``` + +Then copy the patch file somewhere in your repo and point to it from your `WORKSPACE` file: + +```python +http_archive( + name = "build_bazel_rules_nodejs", + patch_args = ["-p1"], + patches = ["//path/to/my.patch"], + sha256 = "6d4edbf28ff6720aedf5f97f9b9a7679401bf7fca9d14a0fff80f644a99992b4", + urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/0.32.2/rules_nodejs-0.32.2.tar.gz"], +) +``` diff --git a/docs/css/BUILD.bazel b/docs/css/BUILD.bazel new file mode 100644 index 0000000000..89602d3b46 --- /dev/null +++ b/docs/css/BUILD.bazel @@ -0,0 +1,15 @@ +load("@io_bazel_rules_sass//:defs.bzl", "sass_binary", "sass_library") + +sass_library( + name = "scss", + srcs = glob(["_*.scss"]), +) + +sass_binary( + name = "css", + src = "main.scss", + visibility = ["//docs:__pkg__"], + deps = [ + ":scss", + ], +) diff --git a/docs/css/_be.scss b/docs/css/_be.scss new file mode 100644 index 0000000000..875c603ef2 --- /dev/null +++ b/docs/css/_be.scss @@ -0,0 +1,93 @@ +// Build Encyclopedia and Starlark Library + +pre.rule-signature { + white-space: normal; + word-wrap: break-word; + word-break: normal; +} + +colgroup { + .col-param { + width: 25%; + } + + .col-description { + width: 75%; + } +} + +$table-params-border-color: #81c784; +$table-params-head-color: #fff; +$table-params-body-bg-color: #e8f5e9; + +.table-params { + border: 1px solid $table-params-border-color; + + thead > tr > th { + color: $table-params-head-color; + border: 1px solid $table-params-border-color; + background-color: $table-params-border-color; + } + + tbody > tr > td { + background-color: $table-params-body-bg-color; + border: 1px solid $table-params-border-color; + } +} + +$table-implicit-border-color: #c0c0c0; +$table-implicit-head-color: #fff; +$table-implicit-body-bg-color: #f0f0f0; + +.table-implicit { + border: 1px solid $table-implicit-border-color; + + thead > tr > th { + color: $table-implicit-head-color; + border: 1px solid $table-implicit-border-color; + background-color: $table-implicit-border-color; + } + + tbody > tr > td { + background-color: $table-implicit-body-bg-color; + border: 1px solid $table-implicit-border-color; + } +} + + +$toc-border-color: #c8e6c9; +$toc-color: #757575; + +.toc { + border-left: 4px solid $toc-border-color; + padding-left: 18px; + margin-bottom: 20px; + + h1, + h2 { + font-size: 24px; + color: $toc-color; + margin-bottom: 12px; + } + + ul { + list-style: none; + padding-left: 0; + margin-top: 0; + + li { + line-height: 36px; + font-size: 16px; + font-weight: 400; + } + } +} + +// Command-line Reference +dt { + margin-top: .5em; +} + +dd { + margin-left: 2em; +} diff --git a/docs/css/_docs.scss b/docs/css/_docs.scss new file mode 100644 index 0000000000..ba92b4808f --- /dev/null +++ b/docs/css/_docs.scss @@ -0,0 +1,7 @@ +.gh-edit { + padding-top: 0px; +} + +.gh-edit.default-hidden { + visibility: hidden; +} diff --git a/docs/css/_footer.scss b/docs/css/_footer.scss new file mode 100644 index 0000000000..26e6319a8d --- /dev/null +++ b/docs/css/_footer.scss @@ -0,0 +1,25 @@ +// Footer styles + +$footer-background: #424242; +$footer-color: #fff; +$footer-link-color: #e0e0e0; + +.footer { + background-color: $footer-background; + color: $footer-color; + padding: 20px; + + .text-muted { + color: $footer-link-color; + } + + a { + color: $footer-link-color; + + &:hover, + &:focus { + color: $footer-color; + text-decoration: none; + } + } +} diff --git a/docs/css/_navbar.scss b/docs/css/_navbar.scss new file mode 100644 index 0000000000..42be12e0e1 --- /dev/null +++ b/docs/css/_navbar.scss @@ -0,0 +1,96 @@ +// Navbar styles +$navbar-bg-color: $bazel-green; +$navbar-hover-bg-color: $bazel-green-light; +$navbar-color: $color-on-bazel-green; +$navbar-hover-color: #444; +$navbar-input-bg-color: $bazel-green-light; +$navbar-input-focus-bg-color: $color-on-bazel-green; +$navbar-input-border-color: $bazel-green; + +.navbar-inverse { + margin-bottom: 0; + background-color: $navbar-bg-color; + border-bottom: 1px solid $navbar-bg-color; + + .navbar-brand { + .navbar-logo { + height: 22px; + } + } + + a.navbar-brand { + color: $navbar-color; + + &:focus, + &:hover { + color: $navbar-hover-color; + background-color: $navbar-bg-color; + } + } + + .navbar-nav > li > a { + color: $navbar-color; + + &:focus, + &:hover { + color: $navbar-hover-color; + background-color: $navbar-hover-bg-color; + } + + &.nav-icon { + font-size: 18px; + } + } + + .navbar-nav > li.active > a { + background-color: $navbar-hover-bg-color; + + &:focus, + &:hover { + background-color: $navbar-hover-bg-color; + } + } + + .navbar-form { + border-color: $navbar-bg-color; + + .input-sm { + margin-top: 2px; + } + + input[type="search"] { + background-color: $navbar-input-bg-color; + border-color: $navbar-input-border-color; + + &::placeholder { + color: $navbar-color; + } + + &:focus, + &:active { + background-color: $navbar-input-focus-bg-color; + } + } + } + + .navbar-toggle { + border: 1px solid $navbar-bg-color; + + &.active, + &:focus, + &:hover { + background-color: $navbar-hover-bg-color; + } + } + + .navbar-collapse { + border-color: $navbar-bg-color; + } +} + +@media (max-width: 768px) { + #cse-search-box { + margin-top: 0; + margin-bottom: 0; + } +} diff --git a/docs/css/_sidebar.scss b/docs/css/_sidebar.scss new file mode 100644 index 0000000000..1990a94774 --- /dev/null +++ b/docs/css/_sidebar.scss @@ -0,0 +1,166 @@ +$sidebar-border-color: #dee2e6; + +$sidebar-hover-border-color: #66bb6a; + +.sidebar { + height: 99.9%; + border-right: 1px solid $sidebar-border-color; + background-color: rgba(67,160,71,.03); + padding-top: 40px; + padding-left: 1.5rem; + + // override parent row padding-left. bootstrap's default is 15px. + margin-left: -15px; + + li { + font-size: $font-size-base * .95; + } + + h4 { + padding-right: 1rem; + } + + ul.sidebar-nav { + list-style-type: none; + padding: 0; + + li { + &.sidebar-nav-heading { + padding: 10px 0; + margin: 0; + display: block; + font-size: 16px; + font-weight: $font-weight-light; + } + + ul { + li { + a { + color: #495057; + } + } + } + + a { + padding: 4px 1rem 4px 0; + display: block; + color: #222; + font-weight: $font-weight-normal; + + &:focus { + text-decoration: none; + } + + &:active, + &:hover { + border-right: 4px solid $sidebar-hover-border-color; + text-decoration: none; + } + + .caret { + float: right; + margin-top: 8px; + margin-right: 0px; + } + + } + + &.active { + a { + border-right: 4px solid $sidebar-hover-border-color; + font-weight: $font-weight-bold; + } + } + } + + ul.sidebar-nav { + padding-left: 10px; + } + } + + select { + padding: 3px 4px; + border: 2px solid $sidebar-border-color; + border-radius: 3px; + width: 80%; + } +} + +.sidebar-toggle { + margin-top: 50px; +} + +@media (max-width: 991px) { + .right-sidebar { + display: none; + } +} + +@media (min-width: 992px) { + .sidebar-toggle { + display: none; + } + + .sidebar { + &.collapse { + display: block; + } + } + + .sticky-sidebar { + @supports (position: sticky) { + position: sticky; + top: 50px; // equals height of navbar. + height: 100vh; + overflow-y: auto; + } + } +} + +.right-sidebar { + border-left: 1px solid $sidebar-border-color; + padding-top: 40px; + padding-bottom: 1rem; + + .gh-links { + padding-left: 22px; + list-style-type: none; + li { + padding-bottom: .4rem; + } + } + + a { + font-weight: $font-weight-normal; + } + + .toc-h2 { + padding-left: 0; + list-style-type: none; + + ul { + padding-left: 0; + } + + li { + margin-top: .3rem; + line-height: 1.7; + font-size: $font-size-base * .95; + a { + color: #444; + } + } + } + + .toc-h3 { + padding-left: 1em; + list-style-type: none; + + li { + line-height: 1.7; + a { + color: #666; + } + } + } +} diff --git a/docs/css/_styles.scss b/docs/css/_styles.scss new file mode 100644 index 0000000000..47161b46fa --- /dev/null +++ b/docs/css/_styles.scss @@ -0,0 +1,254 @@ +// Base styles for all Bazel web assets. +// +// For consistency, this file should be identical across docs.bazel.build, +// blog.bazel.build and www.bazel.build. +// TODO(https://github.com/bazelbuild/bazel/issues/10793): Extract into single source of truth. + +// Heading sizes + +$font-size-base: 14px !default; + +$h1-font-size: $font-size-base * 2.25 !default; +$h2-font-size: $font-size-base * 2 !default; +$h3-font-size: $font-size-base * 1.5 !default; +$h4-font-size: $font-size-base * 1.35 !default; +$h5-font-size: $font-size-base * 1.15 !default; +$h6-font-size: $font-size-base !default; + +// Font weights + +$font-weight-light: 300 !default; +$font-weight-normal: 400 !default; +$font-weight-medium: 500 !default; +$font-weight-bold: 700 !default; + +$font-weight-body-text: $font-weight-normal !default; +$headings-font-weight: $font-weight-medium !default; + +// Bazel logo colors +$bazel-green: #43a047; +$bazel-green-light: #76d275; +$bazel-green-dark-left: #00701a; +$bazel-green-dark-right: #004300; +$color-on-bazel-green: #fff; + +$body-font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, +sans-serif; +$code-font-family: 'Monaco', 'Source Code Pro', monospace; + +$link-color: $bazel-green-dark-left; +$link-hover-color: lighten($link-color, 20%); +$well-color: #eee; +$code-color: #000; +$text-color: #000; + +$vpad: 0px; + +$table-bg: #fff; +$table-cell-padding: 5px; +$table-border-color: $bazel-green; +$text-muted: $color-on-bazel-green; +$line-height-base: 1.5; +$line-height-computed: 1.5; + +html { + position: relative; + min-height: 100%; + font-size: 100%; +} + +body { + padding-top: 50px; + color: $text-color; + font-family: $body-font-family; + line-height: $line-height-base; +} + +a { + color: $link-color; + font-weight: $font-weight-medium; + + &:hover, + &:focus { + color: $link-hover-color; + } + + code { + color: $link-color; + } +} + +h1, +h2, +h3, +h4, +h5, +h6 { + color: $text-color; + margin-top: 2rem; + margin-bottom: 1rem; +} + +h1 code, +h2 code, +h3 code, +h4 code, +h5 code, +h6 code { + color: $text-color; + background: transparent; +} + +h1 { + font-size: $h1-font-size; + font-weight: $font-weight-bold; +} + +h2 { + font-size: $h2-font-size; + + code { + font-size: 24px; + } +} + +h3 { + font-size: $h3-font-size; + + code { + font-size: 20px; + } +} + +h4 { + font-size: $h4-font-size; + + code { + font-size: 18px; + } +} + +h5 { + font-size: $h5-font-size; +} + +h6 { + font-size: $h6-font-size; +} + +p, +li { + font-size: $font-size-base; + line-height: $line-height-base; +} + +pre { + padding: 8px 16px; + margin: 8px 0; + font-family: $code-font-family; + background-color: $well-color; + border: 0; + font-size: 100%; + line-height: 20px; + color: $code-color; + border-radius: 6px; + box-shadow: 1px 1px 5px #aaa; +} + +code { + font-family: $code-font-family; + font-size: 13px; + background-color: $well-color; + color: $code-color; +} + + +// Imitate material design buttons +.btn-lg { + font-size: 14px; + text-transform: uppercase; +} + +$md-shadow-1: rgba(0, 0, 0, .14); +$md-shadow-2: rgba(0, 0, 0, .2); +$md-shadow-3: rgba(0, 0, 0, .12); + + +@media (min-width: 768px) { + .container { + width: 100%; + max-width: 100%; + } +} + +@media (min-width: 992px) { + .content { + max-width: 100%; + width: 100%; + } +} + +.content { + overflow: auto; + padding: 40px 10px; + p { + line-height: 22px; + margin-bottom: 1rem; + } +} + +.btn-success { + border-radius: 2px; + box-shadow: 0 2px 2px 0 $md-shadow-1, 0 3px 1px -2px $md-shadow-2, 0 1px 5px 0 $md-shadow-3; + border: 0; +} + +.well { + background-color: $well-color; + border-color: $well-color; + box-shadow: none; +} + +// Shared +.vpad { + padding-top: $vpad; +} + +.page-title-bar { + background-color: $bazel-green-light; + padding-top: 20px; + padding-bottom: 20px; + + h1, + h2, + h3, + h4, + h5, + h6 { + margin: 8px 0 4px; + color: $color-on-bazel-green; + } +} + +.gsc-control-cse { + *, + *::before, + *::after { + -webkit-box-sizing: content-box !important; + -moz-box-sizing: content-box !important; + box-sizing: content-box !important; + } +} + +// Used for the Command-line Reference flag anchors. Linkifying the flag name +// causes it to turn $link-color (green), but we turn it red here to be consistent +// with the rest of the code block. +dd > code > a, +dl > dt > code > a { + color: $code-color; +} + +dl > dt { + margin-top: 1.5rem; + margin-bottom: .5rem; +} diff --git a/docs/css/_syntax.scss b/docs/css/_syntax.scss new file mode 100644 index 0000000000..56f2c787a1 --- /dev/null +++ b/docs/css/_syntax.scss @@ -0,0 +1,89 @@ +// +// Copyright 2015 Google +// +// Generated using Base16 Builder +// (https://github.com/chriskempson/base16-builder) + +$base00: #212121; // ---- +$base01: #424242; // --- +$base02: #616161; // -- +$base03: #757575; // - +$base04: #9e9e9e; // + +$base05: #bdbdbd; // ++ +$base06: #e0e0e0; // +++ +$base07: #eee; // ++++ + +$base08: #f44336; // red +$base09: #ff9800; // orange +$base0A: #ffc107; // yellow +$base0B: #4caf50; // green +$base0C: #009688; // aqua +$base0D: #2196f3; // blue +$base0E: #9c27b0; // purple +$base0F: #795548; // brown + +.highlight .hll { background-color: $base06 } +.highlight { background: $base07; color: $base00 } +.highlight .c { color: $base04 } // Comment +.highlight .err { color: $base08 } // Error +.highlight .k { color: $base0E } // Keyword +.highlight .l { color: $base09 } // Literal +.highlight .n { color: $base00 } // Name +.highlight .o { color: $base0C } // Operator +.highlight .p { color: $base00 } // Punctuation +.highlight .cm { color: $base04 } // Comment.Multiline +.highlight .cp { color: $base04 } // Comment.Preproc +.highlight .c1 { color: $base04 } // Comment.Single +.highlight .cs { color: $base04 } // Comment.Special +.highlight .gd { color: $base08 } // Generic.Deleted +.highlight .ge { font-style: italic } // Generic.Emph +.highlight .gh { color: $base00; font-weight: bold } // Generic.Heading +.highlight .gi { color: $base0B } // Generic.Inserted +.highlight .gp { color: $base04; font-weight: bold } // Generic.Prompt +.highlight .gs { font-weight: bold } // Generic.Strong +.highlight .gu { color: $base0C; font-weight: bold } // Generic.Subheading +.highlight .kc { color: $base0E } // Keyword.Constant +.highlight .kd { color: $base0E } // Keyword.Declaration +.highlight .kn { color: $base0C } // Keyword.Namespace +.highlight .kp { color: $base0E } // Keyword.Pseudo +.highlight .kr { color: $base0E } // Keyword.Reserved +.highlight .kt { color: $base0A } // Keyword.Type +.highlight .ld { color: $base0B } // Literal.Date +.highlight .m { color: $base09 } // Literal.Number +.highlight .s { color: $base0B } // Literal.String +.highlight .na { color: $base0D } // Name.Attribute +.highlight .nb { color: $base00 } // Name.Builtin +.highlight .nc { color: $base0A } // Name.Class +.highlight .no { color: $base08 } // Name.Constant +.highlight .nd { color: $base0C } // Name.Decorator +.highlight .ni { color: $base00 } // Name.Entity +.highlight .ne { color: $base08 } // Name.Exception +.highlight .nf { color: $base0D } // Name.Function +.highlight .nl { color: $base00 } // Name.Label +.highlight .nn { color: $base0A } // Name.Namespace +.highlight .nx { color: $base0D } // Name.Other +.highlight .py { color: $base00 } // Name.Property +.highlight .nt { color: $base0C } // Name.Tag +.highlight .nv { color: $base08 } // Name.Variable +.highlight .ow { color: $base0C } // Operator.Word +.highlight .w { color: $base00 } // Text.Whitespace +.highlight .mf { color: $base09 } // Literal.Number.Float +.highlight .mh { color: $base09 } // Literal.Number.Hex +.highlight .mi { color: $base09 } // Literal.Number.Integer +.highlight .mo { color: $base09 } // Literal.Number.Oct +.highlight .sb { color: $base0B } // Literal.String.Backtick +.highlight .sc { color: $base00 } // Literal.String.Char +.highlight .sd { color: $base04 } // Literal.String.Doc +.highlight .s2 { color: $base0B } // Literal.String.Double +.highlight .se { color: $base09 } // Literal.String.Escape +.highlight .sh { color: $base0B } // Literal.String.Heredoc +.highlight .si { color: $base09 } // Literal.String.Interpol +.highlight .sx { color: $base0B } // Literal.String.Other +.highlight .sr { color: $base0B } // Literal.String.Regex +.highlight .s1 { color: $base0B } // Literal.String.Single +.highlight .ss { color: $base0B } // Literal.String.Symbol +.highlight .bp { color: $base00 } // Name.Builtin.Pseudo +.highlight .vc { color: $base08 } // Name.Variable.Class +.highlight .vg { color: $base08 } // Name.Variable.Global +.highlight .vi { color: $base08 } // Name.Variable.Instance +.highlight .il { color: $base09 } // Literal.Number.Integer.Long diff --git a/docs/css/_tables.scss b/docs/css/_tables.scss new file mode 100644 index 0000000000..fe4edd7cf0 --- /dev/null +++ b/docs/css/_tables.scss @@ -0,0 +1,63 @@ +// Bootstrap requires tables to carry a .table class in order for styling to +// be applied. However, redcarpet emits table elements without the class and +// it is not possible to customize it. +// +// Ideally, we would use a SASS directive to make the table element inherit +// the formatting defined by the bootstrap templates... but we cannot do so +// at the moment because we don't build bootstrap ourselves from its SASS +// sources. Therefore, this file just borrows the minimal amount of code +// from bootstrap 3.3.7 to render tables nicely. + +caption { + padding-top: $table-cell-padding; + padding-bottom: $table-cell-padding; + color: $text-muted; + text-align: left; +} + +th { + text-align: left; +} + +// Baseline styles + +table { + background-color: $table-bg; + width: 100%; + max-width: 100%; + margin-bottom: $line-height-computed; + // Cells + > thead, + > tbody, + > tfoot { + > tr { + > th, + > td { + padding: $table-cell-padding; + line-height: $line-height-base; + vertical-align: top; + border-top: 1px solid $table-border-color; + } + } + } + // Bottom align for column headings + > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid $table-border-color; + } + // Remove top border from thead by default + > caption + thead, + > colgroup + thead, + > thead:first-child { + > tr:first-child { + > th, + > td { + border-top: 0; + } + } + } + // Account for multiple tbody instances + > tbody + tbody { + border-top: 2px solid $table-border-color; + } +} diff --git a/docs/css/docs.css b/docs/css/docs.css deleted file mode 100644 index ab15dce0f3..0000000000 --- a/docs/css/docs.css +++ /dev/null @@ -1,212 +0,0 @@ -body { background-color: #fafafa; } - -img.responsive { max-width: 100%; height: auto; border: 1px solid #f5f5f5; } - -a { text-decoration: none; } - -pre, code { font-family: 'Liberation Mono', Consolas, Monaco, 'Andale Mono', monospace; } - -pre, pre.term { background-color: #fff; padding: 20px; overflow-x: auto; word-wrap: normal; border: 1px solid #f5f5f5; } -pre code, pre.term code { overflow-wrap: normal; white-space: pre; } - -pre.term { background-color: #424242; color: #fff; font-size: 90%; } -pre.term span.info { color: #81C784; } - -/* Override material styles */ -blockquote::before { - content: ""; -} - -/* Override material styles */ -blockquote::after { - content: ""; - margin-left: 0; -} - -blockquote { - border-left: 0.2em solid #4caf50; - padding-left: 1em; - margin-inline: 0; -} - -code { display: inline-block; font-size: 90%; white-space: pre-wrap; } - -.mdl-layout__content { display: -webkit-flex; display: -ms-flexbox; display: flex; -webkit-flex-direction: column; -ms-flex-flow: column; flex-direction: column; } - -.mdl-layout__content > *:not(.mdl-layout-spacer) { -webkit-flex: none; -ms-flex: none; flex: none; } - -footer #scroll-to-top { color: #fff; } - -p.lead { font-size: 20px; line-height: 32px; } - -img { margin: 20px 0; max-width: 100%; height: auto; } - -table { border-collapse: collapse; border-spacing: 0; background-color: #fff; table-layout: auto; } -table thead th { background-color: #fafafa; border: 1px solid #eee; color: #757575; padding: 12px 12px 12px 24px; vertical-align: top; } -table tbody td { border: 1px solid #eee; padding: 12px 12px 12px 24px; vertical-align: top; } - -table.params-table { width: 100%; } -table.params-table col.col-param { width: 25%; } -table.params-table col.col-description { width: 75%; } - -hr { margin-top: 80px; margin-bottom: 80px; } - -nav.toc { border-left: 5px solid #4caf50; padding-left: 20px; margin-bottom: 48px; } -nav.toc h1, nav.toc h2 { font-size: 15px; line-height: 16px; padding-bottom: 12px; margin-bottom: 0; font-weight: 400; color: #757575; } -nav.toc ul { list-style: none; margin-top: 0; padding-left: 0; } -nav.toc ul li { font-size: 20px; line-height: 40px; } -nav.toc ul li a { color: #4caf50; } - -.page-content { margin-left: auto; margin-right: auto; padding-top: 60px; padding-bottom: 60px; width: 760px; } -.page-content h1.page-title { font-size: 34px; font-weight: 400; line-height: 40px; margin-bottom: 30px; color: #4caf50; } -.page-content h1 { font-size: 24px; font-weight: 400; line-height: 40px; margin-bottom: 20px; color: #4caf50; } -.page-content h2 { font-size: 20px; font-weight: 400; line-height: 32px; margin-bottom: 20px; color: #4caf50; } -.page-content h3 { font-size: 18px; font-weight: 400; line-height: 32px; margin-bottom: 20px; color: #757575; } -.page-content h4 { font-size: 14px; font-weight: 400; line-height: 32px; margin-bottom: 20px; color: #757575; } - -@media (max-width: 768px) { .page-content { width: 360px; } } -@media (min-width: 768px) { .page-content { width: 760px; } } -@media (min-width: 1476px) { .page-content { width: 1160px; } } -.mdl-mini-footer { padding-left: 40px; } - -.mdl-layout__drawer { background-color: #fff; } -.mdl-layout__drawer .mdl-layout-title { border-bottom: 1px solid #e0e0e0; padding-left: 24px; } -.mdl-layout__drawer .mdl-layout-title a { text-decoration: none; color: #757575; font-weight: normal; } - -.drawer-nav ul { list-style: none; padding-left: 0; } -.drawer-nav ul li { display: block; padding: 0; } -.drawer-nav ul li ul li a { padding-left: 44px; font-weight: 400; } -.drawer-nav ul li span.drawer-nav-title { display: block; flex-shrink: 0; padding: 15px 0 15px 22px; margin: 0; font-weight: 600; color: #757575; line-height: 1em; text-decoration: none; } -.drawer-nav ul li a { display: block; flex-shrink: 0; padding: 15px 0 15px 22px; margin: 0; font-weight: 600; color: #757575; line-height: 1em; text-decoration: none; cursor: pointer; } -.drawer-nav ul li a:active, .drawer-nav ul li a:hover { background-color: #f0f0f0; } -.drawer-nav ul li.active a { color: #4caf50; font-weight: 500; } - -.highlight .hll { background-color: #e0e0e0; } - -.highlight { background: #eee; color: #212121; } - -.highlight .c { color: #757575; } - -.highlight .err { color: #f44336; } - -.highlight .k { color: #9c27b0; } - -.highlight .l { color: #ff9800; } - -.highlight .n { color: #212121; } - -.highlight .o { color: #009688; } - -.highlight .p { color: #212121; } - -.highlight .cm { color: #757575; } - -.highlight .cp { color: #757575; } - -.highlight .c1 { color: #757575; } - -.highlight .cs { color: #757575; } - -.highlight .gd { color: #f44336; } - -.highlight .ge { font-style: italic; } - -.highlight .gh { color: #212121; font-weight: bold; } - -.highlight .gi { color: #4caf50; } - -.highlight .gp { color: #757575; font-weight: bold; } - -.highlight .gs { font-weight: bold; } - -.highlight .gu { color: #009688; font-weight: bold; } - -.highlight .kc { color: #9c27b0; } - -.highlight .kd { color: #9c27b0; } - -.highlight .kn { color: #009688; } - -.highlight .kp { color: #9c27b0; } - -.highlight .kr { color: #9c27b0; } - -.highlight .kt { color: #ffc107; } - -.highlight .ld { color: #4caf50; } - -.highlight .m { color: #ff9800; } - -.highlight .s { color: #4caf50; } - -.highlight .na { color: #2196f3; } - -.highlight .nb { color: #212121; } - -.highlight .nc { color: #ffc107; } - -.highlight .no { color: #f44336; } - -.highlight .nd { color: #009688; } - -.highlight .ni { color: #212121; } - -.highlight .ne { color: #f44336; } - -.highlight .nf { color: #2196f3; } - -.highlight .nl { color: #212121; } - -.highlight .nn { color: #ffc107; } - -.highlight .nx { color: #2196f3; } - -.highlight .py { color: #212121; } - -.highlight .nt { color: #009688; } - -.highlight .nv { color: #f44336; } - -.highlight .ow { color: #009688; } - -.highlight .w { color: #212121; } - -.highlight .mf { color: #ff9800; } - -.highlight .mh { color: #ff9800; } - -.highlight .mi { color: #ff9800; } - -.highlight .mo { color: #ff9800; } - -.highlight .sb { color: #4caf50; } - -.highlight .sc { color: #212121; } - -.highlight .sd { color: #757575; } - -.highlight .s2 { color: #4caf50; } - -.highlight .se { color: #ff9800; } - -.highlight .sh { color: #4caf50; } - -.highlight .si { color: #ff9800; } - -.highlight .sx { color: #4caf50; } - -.highlight .sr { color: #4caf50; } - -.highlight .s1 { color: #4caf50; } - -.highlight .ss { color: #4caf50; } - -.highlight .bp { color: #212121; } - -.highlight .vc { color: #f44336; } - -.highlight .vg { color: #f44336; } - -.highlight .vi { color: #f44336; } - -.highlight .il { color: #ff9800; } diff --git a/docs/css/home.css b/docs/css/home.css deleted file mode 100644 index 779b275c1b..0000000000 --- a/docs/css/home.css +++ /dev/null @@ -1,173 +0,0 @@ -body { background-color: #fafafa; } - -img.responsive { max-width: 100%; height: auto; border: 1px solid #f5f5f5; } - -a { text-decoration: none; } - -pre, code { font-family: 'Liberation Mono', Consolas, Monaco, 'Andale Mono', monospace; } - -pre, pre.term { background-color: #fff; padding: 20px; overflow-x: auto; word-wrap: normal; border: 1px solid #f5f5f5; } -pre code, pre.term code { overflow-wrap: normal; white-space: pre; } - -pre.term { background-color: #424242; color: #fff; font-size: 90%; } -pre.term span.info { color: #81C784; } - -code { display: inline-block; font-size: 90%; white-space: pre-wrap; } - -.mdl-layout__content { display: -webkit-flex; display: -ms-flexbox; display: flex; -webkit-flex-direction: column; -ms-flex-flow: column; flex-direction: column; } - -.mdl-layout__content > *:not(.mdl-layout-spacer) { -webkit-flex: none; -ms-flex: none; flex: none; } - -footer #scroll-to-top { color: #fff; } - -.hero { background-color: #4caf50; color: #fff; padding-top: 40px; padding-bottom: 20px; } -.hero .mdl-cell { text-align: center; } -.hero h1 { font-size: 32px; font-weight: 300; } -.hero p.lead { font-size: 18px; font-weight: 300; } -.hero .mdl-button { margin-top: 10px; background-color: #fafafa; } - -.feature .mdl-grid { max-width: 1230px; } -.feature .mdl-cell { padding: 10px; } -.feature h1 { font-size: 28px; font-weight: 300; } - -.mdl-layout__drawer { background-color: #fff; } -.mdl-layout__drawer .mdl-layout-title { border-bottom: 1px solid #e0e0e0; padding-left: 24px; } -.mdl-layout__drawer .mdl-layout-title a { text-decoration: none; color: #757575; font-weight: normal; } - -.drawer-nav ul { list-style: none; padding-left: 0; } -.drawer-nav ul li { display: block; padding: 0; } -.drawer-nav ul li ul li a { padding-left: 44px; font-weight: 400; } -.drawer-nav ul li span.drawer-nav-title { display: block; flex-shrink: 0; padding: 15px 0 15px 22px; margin: 0; font-weight: 600; color: #757575; line-height: 1em; text-decoration: none; } -.drawer-nav ul li a { display: block; flex-shrink: 0; padding: 15px 0 15px 22px; margin: 0; font-weight: 600; color: #757575; line-height: 1em; text-decoration: none; cursor: pointer; } -.drawer-nav ul li a:active, .drawer-nav ul li a:hover { background-color: #f0f0f0; } -.drawer-nav ul li.active a { color: #4caf50; font-weight: 500; } - -.highlight .hll { background-color: #e0e0e0; } - -.highlight { background: #eee; color: #212121; } - -.highlight .c { color: #757575; } - -.highlight .err { color: #f44336; } - -.highlight .k { color: #9c27b0; } - -.highlight .l { color: #ff9800; } - -.highlight .n { color: #212121; } - -.highlight .o { color: #009688; } - -.highlight .p { color: #212121; } - -.highlight .cm { color: #757575; } - -.highlight .cp { color: #757575; } - -.highlight .c1 { color: #757575; } - -.highlight .cs { color: #757575; } - -.highlight .gd { color: #f44336; } - -.highlight .ge { font-style: italic; } - -.highlight .gh { color: #212121; font-weight: bold; } - -.highlight .gi { color: #4caf50; } - -.highlight .gp { color: #757575; font-weight: bold; } - -.highlight .gs { font-weight: bold; } - -.highlight .gu { color: #009688; font-weight: bold; } - -.highlight .kc { color: #9c27b0; } - -.highlight .kd { color: #9c27b0; } - -.highlight .kn { color: #009688; } - -.highlight .kp { color: #9c27b0; } - -.highlight .kr { color: #9c27b0; } - -.highlight .kt { color: #ffc107; } - -.highlight .ld { color: #4caf50; } - -.highlight .m { color: #ff9800; } - -.highlight .s { color: #4caf50; } - -.highlight .na { color: #2196f3; } - -.highlight .nb { color: #212121; } - -.highlight .nc { color: #ffc107; } - -.highlight .no { color: #f44336; } - -.highlight .nd { color: #009688; } - -.highlight .ni { color: #212121; } - -.highlight .ne { color: #f44336; } - -.highlight .nf { color: #2196f3; } - -.highlight .nl { color: #212121; } - -.highlight .nn { color: #ffc107; } - -.highlight .nx { color: #2196f3; } - -.highlight .py { color: #212121; } - -.highlight .nt { color: #009688; } - -.highlight .nv { color: #f44336; } - -.highlight .ow { color: #009688; } - -.highlight .w { color: #212121; } - -.highlight .mf { color: #ff9800; } - -.highlight .mh { color: #ff9800; } - -.highlight .mi { color: #ff9800; } - -.highlight .mo { color: #ff9800; } - -.highlight .sb { color: #4caf50; } - -.highlight .sc { color: #212121; } - -.highlight .sd { color: #757575; } - -.highlight .s2 { color: #4caf50; } - -.highlight .se { color: #ff9800; } - -.highlight .sh { color: #4caf50; } - -.highlight .si { color: #ff9800; } - -.highlight .sx { color: #4caf50; } - -.highlight .sr { color: #4caf50; } - -.highlight .s1 { color: #4caf50; } - -.highlight .ss { color: #4caf50; } - -.highlight .bp { color: #212121; } - -.highlight .vc { color: #f44336; } - -.highlight .vg { color: #f44336; } - -.highlight .vi { color: #f44336; } - -.highlight .il { color: #ff9800; } diff --git a/docs/css/main.css b/docs/css/main.css new file mode 100755 index 0000000000..9d735d4735 --- /dev/null +++ b/docs/css/main.css @@ -0,0 +1 @@ +html{position:relative;min-height:100%;font-size:100%}body{padding-top:50px;color:#000;font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;line-height:1.5}a{color:#00701a;font-weight:500}a:hover,a:focus{color:#00d632}a code{color:#00701a}h1,h2,h3,h4,h5,h6{color:#000;margin-top:2rem;margin-bottom:1rem}h1 code,h2 code,h3 code,h4 code,h5 code,h6 code{color:#000;background:transparent}h1{font-size:31.5px;font-weight:700}h2{font-size:28px}h2 code{font-size:24px}h3{font-size:21px}h3 code{font-size:20px}h4{font-size:18.9px}h4 code{font-size:18px}h5{font-size:16.1px}h6{font-size:14px}p,li{font-size:14px;line-height:1.5}pre{padding:8px 16px;margin:8px 0;font-family:"Monaco","Source Code Pro",monospace;background-color:#eee;border:0;font-size:100%;line-height:20px;color:#000;border-radius:6px;box-shadow:1px 1px 5px #aaa}code{font-family:"Monaco","Source Code Pro",monospace;font-size:13px;background-color:#eee;color:#000}.btn-lg{font-size:14px;text-transform:uppercase}@media(min-width: 768px){.container{width:100%;max-width:100%}}@media(min-width: 992px){.content{max-width:100%;width:100%}}.content{overflow:auto;padding:40px 10px}.content p{line-height:22px;margin-bottom:1rem}.btn-success{border-radius:2px;box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12);border:0}.well{background-color:#eee;border-color:#eee;box-shadow:none}.vpad{padding-top:0px}.page-title-bar{background-color:#76d275;padding-top:20px;padding-bottom:20px}.page-title-bar h1,.page-title-bar h2,.page-title-bar h3,.page-title-bar h4,.page-title-bar h5,.page-title-bar h6{margin:8px 0 4px;color:#fff}.gsc-control-cse *,.gsc-control-cse *::before,.gsc-control-cse *::after{-webkit-box-sizing:content-box !important;-moz-box-sizing:content-box !important;box-sizing:content-box !important}dd>code>a,dl>dt>code>a{color:#000}dl>dt{margin-top:1.5rem;margin-bottom:.5rem}.footer{background-color:#424242;color:#fff;padding:20px}.footer .text-muted{color:#e0e0e0}.footer a{color:#e0e0e0}.footer a:hover,.footer a:focus{color:#fff;text-decoration:none}.navbar-inverse{margin-bottom:0;background-color:#43a047;border-bottom:1px solid #43a047}.navbar-inverse .navbar-brand .navbar-logo{height:22px}.navbar-inverse a.navbar-brand{color:#fff}.navbar-inverse a.navbar-brand:focus,.navbar-inverse a.navbar-brand:hover{color:#444;background-color:#43a047}.navbar-inverse .navbar-nav>li>a{color:#fff}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#444;background-color:#76d275}.navbar-inverse .navbar-nav>li>a.nav-icon{font-size:18px}.navbar-inverse .navbar-nav>li.active>a{background-color:#76d275}.navbar-inverse .navbar-nav>li.active>a:focus,.navbar-inverse .navbar-nav>li.active>a:hover{background-color:#76d275}.navbar-inverse .navbar-form{border-color:#43a047}.navbar-inverse .navbar-form .input-sm{margin-top:2px}.navbar-inverse .navbar-form input[type=search]{background-color:#76d275;border-color:#43a047}.navbar-inverse .navbar-form input[type=search]::placeholder{color:#fff}.navbar-inverse .navbar-form input[type=search]:focus,.navbar-inverse .navbar-form input[type=search]:active{background-color:#fff}.navbar-inverse .navbar-toggle{border:1px solid #43a047}.navbar-inverse .navbar-toggle.active,.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#76d275}.navbar-inverse .navbar-collapse{border-color:#43a047}@media(max-width: 768px){#cse-search-box{margin-top:0;margin-bottom:0}}.sidebar{height:99.9%;border-right:1px solid #dee2e6;background-color:rgba(67,160,71,.03);padding-top:40px;padding-left:1.5rem;margin-left:-15px}.sidebar li{font-size:13.3px}.sidebar h4{padding-right:1rem}.sidebar ul.sidebar-nav{list-style-type:none;padding:0}.sidebar ul.sidebar-nav li.sidebar-nav-heading{padding:10px 0;margin:0;display:block;font-size:16px;font-weight:300}.sidebar ul.sidebar-nav li ul li a{color:#495057}.sidebar ul.sidebar-nav li a{padding:4px 1rem 4px 0;display:block;color:#222;font-weight:400}.sidebar ul.sidebar-nav li a:focus{text-decoration:none}.sidebar ul.sidebar-nav li a:active,.sidebar ul.sidebar-nav li a:hover{border-right:4px solid #66bb6a;text-decoration:none}.sidebar ul.sidebar-nav li a .caret{float:right;margin-top:8px;margin-right:0px}.sidebar ul.sidebar-nav li.active a{border-right:4px solid #66bb6a;font-weight:700}.sidebar ul.sidebar-nav ul.sidebar-nav{padding-left:10px}.sidebar select{padding:3px 4px;border:2px solid #dee2e6;border-radius:3px;width:80%}.sidebar-toggle{margin-top:50px}@media(max-width: 991px){.right-sidebar{display:none}}@media(min-width: 992px){.sidebar-toggle{display:none}.sidebar.collapse{display:block}@supports(position: sticky){.sticky-sidebar{position:sticky;top:50px;height:100vh;overflow-y:auto}}}.right-sidebar{border-left:1px solid #dee2e6;padding-top:40px;padding-bottom:1rem}.right-sidebar .gh-links{padding-left:22px;list-style-type:none}.right-sidebar .gh-links li{padding-bottom:.4rem}.right-sidebar a{font-weight:400}.right-sidebar .toc-h2{padding-left:0;list-style-type:none}.right-sidebar .toc-h2 ul{padding-left:0}.right-sidebar .toc-h2 li{margin-top:.3rem;line-height:1.7;font-size:13.3px}.right-sidebar .toc-h2 li a{color:#444}.right-sidebar .toc-h3{padding-left:1em;list-style-type:none}.right-sidebar .toc-h3 li{line-height:1.7}.right-sidebar .toc-h3 li a{color:#666}.gh-edit{padding-top:0px}.gh-edit.default-hidden{visibility:hidden}caption{padding-top:5px;padding-bottom:5px;color:#fff;text-align:left}th{text-align:left}table{background-color:#fff;width:100%;max-width:100%;margin-bottom:1.5}table>thead>tr>th,table>thead>tr>td,table>tbody>tr>th,table>tbody>tr>td,table>tfoot>tr>th,table>tfoot>tr>td{padding:5px;line-height:1.5;vertical-align:top;border-top:1px solid #43a047}table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #43a047}table>caption+thead>tr:first-child>th,table>caption+thead>tr:first-child>td,table>colgroup+thead>tr:first-child>th,table>colgroup+thead>tr:first-child>td,table>thead:first-child>tr:first-child>th,table>thead:first-child>tr:first-child>td{border-top:0}table>tbody+tbody{border-top:2px solid #43a047}pre.rule-signature{white-space:normal;word-wrap:break-word;word-break:normal}colgroup .col-param{width:25%}colgroup .col-description{width:75%}.table-params{border:1px solid #81c784}.table-params thead>tr>th{color:#fff;border:1px solid #81c784;background-color:#81c784}.table-params tbody>tr>td{background-color:#e8f5e9;border:1px solid #81c784}.table-implicit{border:1px solid silver}.table-implicit thead>tr>th{color:#fff;border:1px solid silver;background-color:silver}.table-implicit tbody>tr>td{background-color:#f0f0f0;border:1px solid silver}.toc{border-left:4px solid #c8e6c9;padding-left:18px;margin-bottom:20px}.toc h1,.toc h2{font-size:24px;color:#757575;margin-bottom:12px}.toc ul{list-style:none;padding-left:0;margin-top:0}.toc ul li{line-height:36px;font-size:16px;font-weight:400}dt{margin-top:.5em}dd{margin-left:2em}.highlight .hll{background-color:#e0e0e0}.highlight{background:#eee;color:#212121}.highlight .c{color:#9e9e9e}.highlight .err{color:#f44336}.highlight .k{color:#9c27b0}.highlight .l{color:#ff9800}.highlight .n{color:#212121}.highlight .o{color:#009688}.highlight .p{color:#212121}.highlight .cm{color:#9e9e9e}.highlight .cp{color:#9e9e9e}.highlight .c1{color:#9e9e9e}.highlight .cs{color:#9e9e9e}.highlight .gd{color:#f44336}.highlight .ge{font-style:italic}.highlight .gh{color:#212121;font-weight:bold}.highlight .gi{color:#4caf50}.highlight .gp{color:#9e9e9e;font-weight:bold}.highlight .gs{font-weight:bold}.highlight .gu{color:#009688;font-weight:bold}.highlight .kc{color:#9c27b0}.highlight .kd{color:#9c27b0}.highlight .kn{color:#009688}.highlight .kp{color:#9c27b0}.highlight .kr{color:#9c27b0}.highlight .kt{color:#ffc107}.highlight .ld{color:#4caf50}.highlight .m{color:#ff9800}.highlight .s{color:#4caf50}.highlight .na{color:#2196f3}.highlight .nb{color:#212121}.highlight .nc{color:#ffc107}.highlight .no{color:#f44336}.highlight .nd{color:#009688}.highlight .ni{color:#212121}.highlight .ne{color:#f44336}.highlight .nf{color:#2196f3}.highlight .nl{color:#212121}.highlight .nn{color:#ffc107}.highlight .nx{color:#2196f3}.highlight .py{color:#212121}.highlight .nt{color:#009688}.highlight .nv{color:#f44336}.highlight .ow{color:#009688}.highlight .w{color:#212121}.highlight .mf{color:#ff9800}.highlight .mh{color:#ff9800}.highlight .mi{color:#ff9800}.highlight .mo{color:#ff9800}.highlight .sb{color:#4caf50}.highlight .sc{color:#212121}.highlight .sd{color:#9e9e9e}.highlight .s2{color:#4caf50}.highlight .se{color:#ff9800}.highlight .sh{color:#4caf50}.highlight .si{color:#ff9800}.highlight .sx{color:#4caf50}.highlight .sr{color:#4caf50}.highlight .s1{color:#4caf50}.highlight .ss{color:#4caf50}.highlight .bp{color:#212121}.highlight .vc{color:#f44336}.highlight .vg{color:#f44336}.highlight .vi{color:#f44336}.highlight .il{color:#ff9800}/*# sourceMappingURL=main.css.map */ diff --git a/docs/css/main.scss b/docs/css/main.scss new file mode 100644 index 0000000000..dbbbc40dcf --- /dev/null +++ b/docs/css/main.scss @@ -0,0 +1,11 @@ +// these styles are based on the main bazel.build site docs, with a few tweaks +// https://github.com/bazelbuild/bazel/tree/master/site/_sass + +@import "styles"; +@import "footer"; +@import "navbar"; +@import "sidebar"; +@import "docs"; +@import "tables"; +@import "be"; +@import "syntax"; diff --git a/docs/debugging.html b/docs/debugging.html new file mode 100755 index 0000000000..c45cad6036 --- /dev/null +++ b/docs/debugging.html @@ -0,0 +1,316 @@ + + + + + + + + + + rules_nodejs - Debugging + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+

Debugging

+ +

Add the options in the Support for debugging NodeJS tests section from https://github.com/bazelbuild/rules_nodejs/blob/master/common.bazelrc to your project’s .bazelrc file to add support for debugging NodeJS programs.

+ +

Using the --config=debug command line option with bazel will set a number of flags that are specified there are useful for debugging. See the comments under Support for debugging NodeJS tests for details on the flags that are set.

+ +

Use --config=debug with bazel test as follow,

+ +
bazel test --config=debug //test:...
+
+ +

or with bazel run,

+ +
bazel run --config=debug //test:test1
+
+ +

to also turn on the NodeJS inspector agent which will break before any user code starts. You should then see,

+ +
Executing tests from //test:test1
+-----------------------------------------------------------------------------
+Debugger listening on ws://127.0.0.1:9229/3f20777a-242c-4d18-b88b-5ed4b3fed61c
+For help, see: https://nodejs.org/en/docs/inspector
+
+ +

when the test is run.

+ +

To inspect with Chrome DevTools 55+, open chrome://inspect in a Chromium-based browser and attach to the waiting process. +A Chrome DevTools window should open and you should see Debugger attached. in the console.

+ +

See https://nodejs.org/en/docs/guides/debugging-getting-started/ for more details.

+ +

Debugging with VS Code

+ +

With the above configuration you can use VS Code as your debugger. +You will first need to configure your .vscode/launch.json:

+ +
{
+      "type": "node",
+      "request": "attach",
+      "name": "Attach nodejs_binary",
+      "internalConsoleOptions": "neverOpen",
+      "sourceMapPathOverrides": {
+        "../*": "${workspaceRoot}/*",
+        "../../*": "${workspaceRoot}/*",
+        "../../../*": "${workspaceRoot}/*",
+        "../../../../*": "${workspaceRoot}/*",
+        "../../../../../*": "${workspaceRoot}/*",
+        // do as many levels here as needed for your project
+      }
+
+

We use sourceMapPathOverrides here to rewrite the source maps produced by ts_library so that breakpoints line up with the source maps. +Once configured start your process with

+
bazel run --config=debug //test:test1
+
+

Then hit F5 which will start the VS Code debugger with the Attach nodejs_binary configuration. +VS Code will immediatenly hit a breakpoint to which you can continue and debug using all the normal debug features provided.

+ +
+
+ + +
+
+ +
+
+
+
+

© 2020 Google

+
+
+
+ +
+ + + + + + + + + + + + + + + diff --git a/docs/debugging.md b/docs/debugging.md new file mode 100644 index 0000000000..0cc6490ab2 --- /dev/null +++ b/docs/debugging.md @@ -0,0 +1,67 @@ +--- +title: Debugging +layout: default +toc: true +--- + +# Debugging + +Add the options in the `Support for debugging NodeJS tests` section from https://github.com/bazelbuild/rules_nodejs/blob/master/common.bazelrc to your project's `.bazelrc` file to add support for debugging NodeJS programs. + +Using the `--config=debug` command line option with bazel will set a number of flags that are specified there are useful for debugging. See the comments under `Support for debugging NodeJS tests` for details on the flags that are set. + +Use `--config=debug` with `bazel test` as follow, + +``` +bazel test --config=debug //test:... +``` + +or with `bazel run`, + +``` +bazel run --config=debug //test:test1 +``` + +to also turn on the NodeJS inspector agent which will break before any user code starts. You should then see, + +``` +Executing tests from //test:test1 +----------------------------------------------------------------------------- +Debugger listening on ws://127.0.0.1:9229/3f20777a-242c-4d18-b88b-5ed4b3fed61c +For help, see: https://nodejs.org/en/docs/inspector +``` + +when the test is run. + +To inspect with Chrome DevTools 55+, open `chrome://inspect` in a Chromium-based browser and attach to the waiting process. +A Chrome DevTools window should open and you should see `Debugger attached.` in the console. + +See https://nodejs.org/en/docs/guides/debugging-getting-started/ for more details. + +## Debugging with VS Code + +With the above configuration you can use VS Code as your debugger. +You will first need to configure your `.vscode/launch.json`: + +``` +{ + "type": "node", + "request": "attach", + "name": "Attach nodejs_binary", + "internalConsoleOptions": "neverOpen", + "sourceMapPathOverrides": { + "../*": "${workspaceRoot}/*", + "../../*": "${workspaceRoot}/*", + "../../../*": "${workspaceRoot}/*", + "../../../../*": "${workspaceRoot}/*", + "../../../../../*": "${workspaceRoot}/*", + // do as many levels here as needed for your project + } +``` +We use `sourceMapPathOverrides` here to rewrite the source maps produced by `ts_library` so that breakpoints line up with the source maps. +Once configured start your process with +``` +bazel run --config=debug //test:test1 +``` +Then hit `F5` which will start the VS Code debugger with the `Attach nodejs_binary` configuration. +VS Code will immediatenly hit a breakpoint to which you can continue and debug using all the normal debug features provided. diff --git a/docs/dependencies.html b/docs/dependencies.html new file mode 100755 index 0000000000..684fcc9471 --- /dev/null +++ b/docs/dependencies.html @@ -0,0 +1,534 @@ + + + + + + + + + + rules_nodejs - Dependencies + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+

Dependencies

+ +

Bazel works alongside your existing package manager, either npm or yarn. +You manage your package.json file, editing by hand or by running commands like npm install or yarn add. +The package manager will also write a lock file, indicating exact versions for all transitive dependencies, which keeps your build hermetic and reproducible. +Bazel will run the package manager when the package.json or *lock.json files change, but you can also run the package manager yourself.

+ +

Bazel-managed vs self-managed dependencies

+ +

You have two options for managing your node_modules dependencies: Bazel-managed or self-managed.

+ +

With the Bazel-managed dependencies approach, Bazel is responsible for making sure that node_modules is +up to date with your package[-lock].json or yarn.lock files. This means Bazel will set it up when the +repository is first cloned, and rebuild it whenever it changes. With the yarn_install or npm_install +repository rules, Bazel will setup your node_modules for you in an external workspace named after the +repository rule. For example, a yarn_install(name = "npm", ...) will setup an external +workspace named @npm with the node_modules folder inside of it as well as generating targets for each +root npm package in node_modules for use as dependencies to other rules.

+ +

For Bazel to provide the strongest guarantees about reproducibility and the +fidelity of your build, it is recommended that you use Bazel-managed dependencies. +This approach also allows you to use the generated fine-grained npm package dependencies +which can significantly reduce the number of inputs to actions, making Bazel sand-boxing and +remote-execution faster if there are a large number of files under node_modules.

+ +
+

Note that as of Bazel 0.26, and with the recommended managed_directories attribute on the workspace rule in /WORKSPACE, +the Bazel-managed node_modules directory is placed in your workspace root in the standard location used by npm or yarn.

+
+ +

Using Bazel-managed dependencies

+ +

To have Bazel manage its own copy of node_modules, which is useful to avoid +juggling multiple toolchains, you can add one of the following to your WORKSPACE +file:

+ +

Using Yarn (preferred):

+ +
load("@build_bazel_rules_nodejs//:index.bzl", "yarn_install")
+
+yarn_install(
+    name = "npm",
+    package_json = "//:package.json",
+    yarn_lock = "//:yarn.lock",
+)
+
+ +

Using NPM:

+ +
load("@build_bazel_rules_nodejs//:index.bzl", "npm_install")
+
+npm_install(
+    name = "npm",
+    package_json = "//:package.json",
+    package_lock_json = "//:package-lock.json",
+)
+
+ +
+

If you don’t need to pass any arguments to node_repositories, + you can skip calling that function. yarn_install and npm_install will do it by default.

+
+ +

You should now add the @npm workspace to the managed_directories option in the workspace rule at the top of the file. This tells Bazel that the node_modules directory is special and is managed by the package manager. +Add the workspace rule if it isn’t already in your /WORKSPACE file.

+ +
workspace(
+    name = "my_wksp",
+    managed_directories = {"@npm": ["node_modules"]},
+)
+
+ +

As of Bazel 0.26 this feature is still experimental, so also add this line to the .bazelrc to opt-in:

+ +
common --experimental_allow_incremental_repository_updates
+
+ +

yarn_install vs. npm_install

+ +

yarn_install is the preferred rule for setting up Bazel-managed dependencies for a number of reasons:

+ +
    +
  • yarn_install will use the global yarn cache by default which will improve your build performance (this can be turned off with the use_global_yarn_cache attribute)
  • +
  • npm has a known peer dependency hoisting issue that can lead to missing peer dependencies in some cases (see https://github.com/bazelbuild/rules_nodejs/issues/416)
  • +
+ +

Fine-grained npm package dependencies

+ +

You can then reference individual npm packages in your BUILD rules via:

+ +
load("@build_bazel_rules_nodejs//:index.bzl", "nodejs_binary")
+
+nodejs_binary(
+    name = "bar",
+    data = [
+      "@npm//foo",
+      "@npm//baz",
+    ]
+    ...
+)
+
+ +

In this case, the bar nodejs_binary depends only the foo and baz npm packages +and all of their transitive deps.

+ +

For other rules such as jasmine_node_test, fine grained +npm dependencies are specified in the deps attribute:

+ +
jasmine_node_test(
+    name = "test",
+    ...
+    deps = [
+        "@npm//jasmine",
+        "@npm//foo",
+        "@npm//baz",
+        ...
+    ],
+)
+
+ +

Multiple sets of npm dependencies

+ +

If your workspace has multiple applications, each with their own package.json +and npm deps, yarn_install (or npm_install) can be called separately for +each.

+ +
workspace(
+    name = "my_wksp",
+    managed_directories = {
+        "@app1_npm": ["app1/node_modules"],
+        "@app2_npm": ["app2/node_modules"],
+    },
+)
+
+yarn_install(
+    name = "app1_npm",
+    package_json = "//app1:package.json",
+    yarn_lock = "//app1:yarn.lock",
+)
+
+yarn_install(
+    name = "app2_npm",
+    package_json = "//app2:package.json",
+    yarn_lock = "//app2:yarn.lock",
+)
+
+ +

Your application would then reference its deps as (for example) @app1_npm//lodash, or @app2_npm//jquery.

+ +

Fine-grained npm package nodejs_binary targets

+ +

If an npm package lists one or more bin entry points in its package.json, +nodejs_binary targets will be generated for these.

+ +

For example, the protractor package has two bin entries in its package.json:

+ +
  "bin": {
+    "protractor": "bin/protractor",
+    "webdriver-manager": "bin/webdriver-manager"
+  },
+
+ +

These will result in two generated nodejs_binary targets in the @npm//protractor/bin +package (if your npm deps workspace is @npm):

+ +
    +
  • @npm//protractor/bin:protractor
  • +
  • @npm//protractor/bin:webdriver-manager
  • +
+ +

These targets can be used as executables for actions in custom rules or can +be run by Bazel directly. For example, you can run protractor with the +following:

+ +
$ bazel run @npm//protractor/bin:protractor
+
+ +

Note: These targets are in the protractor/bin package so they don’t +conflict with the targets to use in deps[]. For example, @npm//protractor:protractor +is target to use in deps[] while @npm//protractor/bin:protractor is the binary target.

+ +

Coarse node_modules dependencies

+ +

Using fine grained npm dependencies is recommended to minimize +the number of inputs to your rules. However, for backward compatibility +there are also filegroups defined by yarn_install and npm_install +that include all packages under node_modules and which can be used +with the node_modules attribute of nodejs rules.

+ +
    +
  • @npm//:node_modules includes all packages under node_modules as well as the .bin folder
  • +
+ +
load("@build_bazel_rules_nodejs//:index.bzl", "nodejs_binary")
+
+nodejs_binary(
+    name = "bar",
+    node_modules = "@npm//:node_modules",
+)
+
+ +

Using self-managed dependencies

+ +

If you’d like to have Bazel use the node_modules directory you are managing, +then next you will create a BUILD.bazel file in your project root containing:

+ +
package(default_visibility = ["//visibility:public"])
+
+filegroup(
+    name = "node_modules",
+    srcs = glob(
+        include = ["node_modules/**/*"],
+        exclude = [
+          # Files under test & docs may contain file names that
+          # are not legal Bazel labels (e.g.,
+          # node_modules/ecstatic/test/public/中文/檔案.html)
+          "node_modules/test/**",
+          "node_modules/docs/**",
+          # Files with spaces are not allowed in Bazel runfiles
+          # See https://github.com/bazelbuild/bazel/issues/4327
+          "node_modules/**/* */**",
+          "node_modules/**/* *",
+        ],
+    ),
+)
+
+ +

The example in examples/user_managed_deps uses self-managed dependencies.

+ +

To use the Yarn package manager, which we recommend for its built-in +verification command, you can run:

+ +
$ bazel run @nodejs//:yarn_node_repositories
+
+ +

If you use npm instead, run:

+ +
$ bazel run @nodejs//:npm_node_repositories install
+
+ +

The @nodejs//:yarn_node_repositories and @nodejs//:npm_node_repositories targets will run yarn/npm on all of the +package.json contexts listed package_json attribute of the node_repositories +repository rule in your WORKSPACE file (node_repositories(package_json = [...])).

+ +

If there are multiple package.json contexts in this rule but you would like to +run the bazel managed yarn or npm on a single context this can be done +using the following targets:

+ +
$ bazel run @nodejs//:yarn -- <arguments passed to yarn>
+
+ +

If you use npm instead, run:

+ +
$ bazel run @nodejs//:npm -- <arguments passed to npm>
+
+ +

This will run yarn/npm in the current working directory. To add a package with the yarn add command, +for example, you would use:

+ +
$ bazel run @nodejs//:yarn -- add <package>
+
+ +

Note: the arguments passed to bazel run after -- are forwarded to the executable being run.

+ + +
+
+ + +
+
+ +
+
+
+
+

© 2020 Google

+
+
+
+ +
+ + + + + + + + + + + + + + + diff --git a/docs/dependencies.md b/docs/dependencies.md new file mode 100644 index 0000000000..582e5cb3b3 --- /dev/null +++ b/docs/dependencies.md @@ -0,0 +1,277 @@ +--- +title: Dependencies +layout: default +toc: true +--- + +# Dependencies + +Bazel works alongside your existing package manager, either npm or yarn. +You manage your `package.json` file, editing by hand or by running commands like `npm install` or `yarn add`. +The package manager will also write a lock file, indicating exact versions for all transitive dependencies, which keeps your build hermetic and reproducible. +Bazel will run the package manager when the `package.json` or `*lock.json` files change, but you can also run the package manager yourself. + +## Bazel-managed vs self-managed dependencies + +You have two options for managing your `node_modules` dependencies: Bazel-managed or self-managed. + +With the Bazel-managed dependencies approach, Bazel is responsible for making sure that `node_modules` is +up to date with your `package[-lock].json` or `yarn.lock` files. This means Bazel will set it up when the +repository is first cloned, and rebuild it whenever it changes. With the `yarn_install` or `npm_install` +repository rules, Bazel will setup your `node_modules` for you in an external workspace named after the +repository rule. For example, a `yarn_install(name = "npm", ...)` will setup an external +workspace named `@npm` with the `node_modules` folder inside of it as well as generating targets for each +root npm package in `node_modules` for use as dependencies to other rules. + +For Bazel to provide the strongest guarantees about reproducibility and the +fidelity of your build, it is recommended that you use Bazel-managed dependencies. +This approach also allows you to use the generated fine-grained npm package dependencies +which can significantly reduce the number of inputs to actions, making Bazel sand-boxing and +remote-execution faster if there are a large number of files under `node_modules`. + +> Note that as of Bazel 0.26, and with the recommended `managed_directories` attribute on the `workspace` rule in `/WORKSPACE`, +> the Bazel-managed `node_modules` directory is placed in your workspace root in the standard location used by npm or yarn. + +## Using Bazel-managed dependencies + +To have Bazel manage its own copy of `node_modules`, which is useful to avoid +juggling multiple toolchains, you can add one of the following to your `WORKSPACE` +file: + +Using Yarn (preferred): + +```python +load("@build_bazel_rules_nodejs//:index.bzl", "yarn_install") + +yarn_install( + name = "npm", + package_json = "//:package.json", + yarn_lock = "//:yarn.lock", +) +``` + +Using NPM: + +```python +load("@build_bazel_rules_nodejs//:index.bzl", "npm_install") + +npm_install( + name = "npm", + package_json = "//:package.json", + package_lock_json = "//:package-lock.json", +) +``` + +> If you don't need to pass any arguments to `node_repositories`, + you can skip calling that function. `yarn_install` and `npm_install` will do it by default. + +You should now add the `@npm` workspace to the `managed_directories` option in the `workspace` rule at the top of the file. This tells Bazel that the `node_modules` directory is special and is managed by the package manager. +Add the `workspace` rule if it isn't already in your `/WORKSPACE` file. + +```python +workspace( + name = "my_wksp", + managed_directories = {"@npm": ["node_modules"]}, +) +``` + +As of Bazel 0.26 this feature is still experimental, so also add this line to the `.bazelrc` to opt-in: + +``` +common --experimental_allow_incremental_repository_updates +``` + +### yarn_install vs. npm_install + +`yarn_install` is the preferred rule for setting up Bazel-managed dependencies for a number of reasons: + +* `yarn_install` will use the global yarn cache by default which will improve your build performance (this can be turned off with the `use_global_yarn_cache` attribute) +* npm has a known peer dependency hoisting issue that can lead to missing peer dependencies in some cases (see https://github.com/bazelbuild/rules_nodejs/issues/416) + +### Fine-grained npm package dependencies + +You can then reference individual npm packages in your `BUILD` rules via: + +```python +load("@build_bazel_rules_nodejs//:index.bzl", "nodejs_binary") + +nodejs_binary( + name = "bar", + data = [ + "@npm//foo", + "@npm//baz", + ] + ... +) +``` + +In this case, the `bar` nodejs_binary depends only the `foo` and `baz` npm packages +and all of their transitive deps. + +For other rules such as `jasmine_node_test`, fine grained +npm dependencies are specified in the `deps` attribute: + +```python +jasmine_node_test( + name = "test", + ... + deps = [ + "@npm//jasmine", + "@npm//foo", + "@npm//baz", + ... + ], +) +``` + +### Multiple sets of npm dependencies + +If your workspace has multiple applications, each with their own `package.json` +and npm deps, `yarn_install` (or `npm_install`) can be called separately for +each. + +```python +workspace( + name = "my_wksp", + managed_directories = { + "@app1_npm": ["app1/node_modules"], + "@app2_npm": ["app2/node_modules"], + }, +) + +yarn_install( + name = "app1_npm", + package_json = "//app1:package.json", + yarn_lock = "//app1:yarn.lock", +) + +yarn_install( + name = "app2_npm", + package_json = "//app2:package.json", + yarn_lock = "//app2:yarn.lock", +) +``` + +Your application would then reference its deps as (for example) `@app1_npm//lodash`, or `@app2_npm//jquery`. + +### Fine-grained npm package nodejs_binary targets + +If an npm package lists one or more `bin` entry points in its `package.json`, +`nodejs_binary` targets will be generated for these. + +For example, the `protractor` package has two bin entries in its `package.json`: + +```json + "bin": { + "protractor": "bin/protractor", + "webdriver-manager": "bin/webdriver-manager" + }, +``` + +These will result in two generated `nodejs_binary` targets in the `@npm//protractor/bin` +package (if your npm deps workspace is `@npm`): + +* `@npm//protractor/bin:protractor` +* `@npm//protractor/bin:webdriver-manager` + +These targets can be used as executables for actions in custom rules or can +be run by Bazel directly. For example, you can run protractor with the +following: + +```sh +$ bazel run @npm//protractor/bin:protractor +``` + +Note: These targets are in the `protractor/bin` package so they don't +conflict with the targets to use in deps[]. For example, `@npm//protractor:protractor` +is target to use in deps[] while `@npm//protractor/bin:protractor` is the binary target. + +### Coarse node_modules dependencies + +Using fine grained npm dependencies is recommended to minimize +the number of inputs to your rules. However, for backward compatibility +there are also filegroups defined by `yarn_install` and `npm_install` +that include all packages under `node_modules` and which can be used +with the `node_modules` attribute of nodejs rules. + +* `@npm//:node_modules` includes all packages under `node_modules` as well as the `.bin` folder + +```python +load("@build_bazel_rules_nodejs//:index.bzl", "nodejs_binary") + +nodejs_binary( + name = "bar", + node_modules = "@npm//:node_modules", +) +``` + +## Using self-managed dependencies + +If you'd like to have Bazel use the `node_modules` directory you are managing, +then next you will create a `BUILD.bazel` file in your project root containing: + +```python +package(default_visibility = ["//visibility:public"]) + +filegroup( + name = "node_modules", + srcs = glob( + include = ["node_modules/**/*"], + exclude = [ + # Files under test & docs may contain file names that + # are not legal Bazel labels (e.g., + # node_modules/ecstatic/test/public/中文/檔案.html) + "node_modules/test/**", + "node_modules/docs/**", + # Files with spaces are not allowed in Bazel runfiles + # See https://github.com/bazelbuild/bazel/issues/4327 + "node_modules/**/* */**", + "node_modules/**/* *", + ], + ), +) +``` + +The example in `examples/user_managed_deps` uses self-managed dependencies. + +To use the Yarn package manager, which we recommend for its built-in +verification command, you can run: + +```sh +$ bazel run @nodejs//:yarn_node_repositories +``` + +If you use npm instead, run: + +```sh +$ bazel run @nodejs//:npm_node_repositories install +``` + +The `@nodejs//:yarn_node_repositories` and `@nodejs//:npm_node_repositories` targets will run yarn/npm on all of the +package.json contexts listed `package_json` attribute of the `node_repositories` +repository rule in your WORKSPACE file (`node_repositories(package_json = [...])`). + +If there are multiple package.json contexts in this rule but you would like to +run the bazel managed yarn or npm on a single context this can be done +using the following targets: + +```sh +$ bazel run @nodejs//:yarn -- +``` + +If you use npm instead, run: + +```sh +$ bazel run @nodejs//:npm -- +``` + +This will run yarn/npm in the current working directory. To add a package with the `yarn add` command, +for example, you would use: + +```sh +$ bazel run @nodejs//:yarn -- add +``` + +Note: the arguments passed to `bazel run` after `--` are forwarded to the executable being run. + +[bazel instructions]: https://docs.bazel.build/versions/master/install.html diff --git a/docs/examples.html b/docs/examples.html new file mode 100755 index 0000000000..b93f27cb1d --- /dev/null +++ b/docs/examples.html @@ -0,0 +1,431 @@ + + + + + + + + + + rules_nodejs - Examples + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+

Examples

+ +

Frameworks

+ +

Angular

+ +

Bazel can run any toolchain you want, so there is more than one way to use it with Angular. +See Alex’s post Angular ❤️ Bazel update for a longer explanation.

+ +

Architect: The first approach is the simplest: use Architect (aka. Angular CLI Builders). This is the build tool inside of Angular CLI, so your existing application will continue to work the same way, and you can still get support from the Angular team. This may be a good choice if your goal is just to include an Angular app in a full-stack Bazel build that includes your backend, and making the Angular build&test faster is not important for you.

+ +

However, it has the worst performance because the level of incrementality is only as fine as how many libs your application is composed from. +Bazel can only make a build more parallel and incremental if you express a wider dependency graph to it.

+ +

Example: examples/angular_bazel_architect

+ +

Google: This toolchain is what we originally advertised as “Angular Buildtools Convergence” (ABC). It is based on Google’s internal toolchain for building Angular, and has good performance characteristics. However it is harder to migrate to, because it doesn’t have good compatibility for existing applications.

+ +

The example has its own guide: examples/angular

+ +

View Engine: If you’re stuck on the older Angular compiler/runtime before Ivy, called View Engine, then your options are more limited. We don’t support Angular 9 + View Engine + Bazel.

+ +

Example: examples/angular_view_engine

+ +

Custom: Bazel is excellent for advanced use cases where you need to customize your toolchain. +Take any off-the-shelf tools, follow their README’s to call their CLI, and assemble them together in a custom way. +This lets you take advantage of the latest JS ecosystem innovations without waiting for tooling vendors to +assemble it all together for you.

+ +

React

+ +

Similar to the explanation above for Angular, Bazel is agnostic to what tools you choose to run on your project. +However, the benefits of using Bazel are unlocked as you adopt it as your build system. +We think the following examples show a typical migration of adopting Bazel:

+ +

create-react-app: If you run create-react-app, it will install a build system called react-scripts. +As a first step into Bazel, you can simply ask Bazel to wrap the existing build system. +This guarantees compatibility with your current code, and if your objective is just to include a frontend app into +a bigger full-stack Bazel build, this might be the final step in the migration. +However it will run react-scripts as a single Bazel action, which means that you gain no incrementality benefit. +So we expect for most applications this is just a first step.

+ +

The create-react-app example +shows how this will look. We suggest reading the README in that example, and also look at the commit history to that +directory as an illustration of how we started from create-react-app and added Bazel bits.

+ +

react-scripts-like: As a next step to make our Build more incremental and performant, we can replace the react-scripts build system with Bazel, but preserve compatibility as much as possible by having Bazel run +mostly the same tools with mostly identical configuration. We continue to transpile TS to JS using Babel, for example, +but we do it in a build step before invoking Webpack, just using the Babel CLI.

+ +

This is a good middle ground to get some benefits from Bazel while staying on the same supported tools as react-scripts.

+ +

TODO(alexeagle): build an example illustrating how this looks

+ +

custom: If you really know your JS build tools, Bazel is the perfect way to assemble all the myriad individual tools +into a custom toolchain. This allows you to unlock any part of the JS ecosystem without waiting for it to be integrated +for you by maintainers of a project like create-react-app, who have a very high bar for adding features since the +maintenance and support burden falls on them. However you’ll need to understand both the tools as well as Bazel to +successfully build your own toolchain.

+ +

There is a basic example at examples/react_webpack but it needs a lot more work to show everything that is possible!

+ +

Vue

+ +

We don’t have a dedicated example yet, but Vue has been known to work. Follow https://github.com/bazelbuild/rules_nodejs/issues/1840 for an example.

+ +

Svelte

+ +

None yet, please file an issue if you need this.

+ +

Test Runners

+ +

Jest

+ +

There is a dedicated example for Jest: examples/jest

+ +

Cypress

+ +

We have done some early work to run Cypress under Bazel. Follow https://github.com/bazelbuild/rules_nodejs/issues/1904 for an example.

+ +

Mocha

+ +

Example at examples/webapp has a simple mocha_test

+ +

Karma and Protractor

+ +

See Protractor usage in examples/app

+ +

Bundlers

+ +

Webpack

+ +

See examples/react_webpack

+ +

Rollup

+ +

The example at examples/webapp uses Rollup, and produces an app with ES5 and ES2015 variants (“differential loading”) that gives faster loading in modern browsers without dropping support for legacy ones.

+ +

Parcel

+ +

The example in examples/parcel shows how to write a custom rule, it happens to use the parcel binary to build. It’s a very minimal example but might be enough to get you started.

+ +

Language tooling

+ +

LESS, Sass, Stylus

+ +

See styles directory inside the examples/app example.

+ +

TypeScript

+ +

Most of the examples show TypeScript usage. Also look in packages/typescript/test for lots of handling of edge cases.

+ +

Kotlin

+ +

The Kotlin language can compile to JS. The result has a very large stdlib JS payload, so we don’t recommend this for most uses.

+ +

Example at examples/kotlin

+ +

Google Closure Compiler

+ +

rules_closure is a whole-cloth approach to using Bazel if you’re fully bought-into the Closure ecosystem.

+ +

examples/closure shows a very simple way to call the closure compiler without jumping into that ecosystem.

+ +

Protocol Buffers and gRPC

+ +

Note: this is considered a “labs” feature in rules_nodejs, so support and stability are not great. gRPC is still a WIP.

+ +

See examples/protocol_buffers

+ +

Bazel-specific

+ +

Bazel Persistent Workers

+ +

If you want to speed up Bazel by keeping some tools running warm in the background as daemons, there’s a good readme in the examples/worker

+ +
+
+ + +
+
+ +
+
+
+
+

© 2020 Google

+
+
+
+ +
+ + + + + + + + + + + + + + + diff --git a/docs/examples.md b/docs/examples.md index f56e334d48..2e4fd2a1ef 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -1,12 +1,13 @@ --- title: Examples layout: default -stylesheet: docs +toc: true --- +# Examples -# Frameworks +## Frameworks -## Angular +### Angular Bazel can run any toolchain you want, so there is more than one way to use it with Angular. See Alex's post [Angular ❤️ Bazel update](https://dev.to/bazel/angular-bazel-leaving-angular-labs-51ja) for a longer explanation. @@ -31,7 +32,7 @@ Take any off-the-shelf tools, follow their README's to call their CLI, and assem This lets you take advantage of the latest JS ecosystem innovations without waiting for tooling vendors to assemble it all together for you. -## React +### React Similar to the explanation above for Angular, Bazel is agnostic to what tools you choose to run on your project. However, the benefits of using Bazel are unlocked as you adopt it as your build system. @@ -64,76 +65,76 @@ successfully build your own toolchain. There is a basic example at [examples/react_webpack](https://github.com/bazelbuild/rules_nodejs/tree/stable/examples/react_webpack) but it needs a lot more work to show everything that is possible! -## Vue +### Vue We don't have a dedicated example yet, but Vue has been known to work. Follow https://github.com/bazelbuild/rules_nodejs/issues/1840 for an example. -## Svelte +### Svelte None yet, please file an issue if you need this. -# Test Runners +## Test Runners -## Jest +### Jest There is a dedicated example for Jest: [examples/jest](https://github.com/bazelbuild/rules_nodejs/tree/stable/examples/jest) -## Cypress +### Cypress We have done some early work to run Cypress under Bazel. Follow https://github.com/bazelbuild/rules_nodejs/issues/1904 for an example. -## Mocha +### Mocha Example at [examples/webapp](https://github.com/bazelbuild/rules_nodejs/tree/stable/examples/webapp) has a simple `mocha_test` -## Karma and Protractor +### Karma and Protractor See Protractor usage in [examples/app](https://github.com/bazelbuild/rules_nodejs/blob/master/examples/app/) -# Bundlers +## Bundlers -## Webpack +### Webpack See [examples/react_webpack](https://github.com/bazelbuild/rules_nodejs/tree/stable/examples/react_webpack) -## Rollup +### Rollup The example at [examples/webapp](https://github.com/bazelbuild/rules_nodejs/tree/stable/examples/webapp) uses Rollup, and produces an app with ES5 and ES2015 variants ("differential loading") that gives faster loading in modern browsers without dropping support for legacy ones. -## Parcel +### Parcel The example in [examples/parcel](https://github.com/bazelbuild/rules_nodejs/tree/stable/examples/parcel) shows how to write a custom rule, it happens to use the parcel binary to build. It's a very minimal example but might be enough to get you started. -# Language tooling +## Language tooling -## LESS, Sass, Stylus +### LESS, Sass, Stylus See styles directory inside the [examples/app](https://github.com/bazelbuild/rules_nodejs/tree/stable/examples/app/styles) example. -## TypeScript +### TypeScript Most of the examples show TypeScript usage. Also look in [packages/typescript/test](https://github.com/bazelbuild/rules_nodejs/tree/stable/packages/typescript/test) for lots of handling of edge cases. -## Kotlin +### Kotlin The Kotlin language can compile to JS. The result has a very large stdlib JS payload, so we don't recommend this for most uses. Example at [examples/kotlin](https://github.com/bazelbuild/rules_nodejs/tree/stable/examples/kotlin) -## Google Closure Compiler +### Google Closure Compiler [rules_closure](https://github.com/bazelbuild/rules_closure) is a whole-cloth approach to using Bazel if you're fully bought-into the Closure ecosystem. [examples/closure](https://github.com/bazelbuild/rules_nodejs/tree/stable/examples/closure) shows a very simple way to call the closure compiler without jumping into that ecosystem. -## Protocol Buffers and gRPC +### Protocol Buffers and gRPC Note: this is considered a "labs" feature in rules_nodejs, so support and stability are not great. gRPC is still a WIP. See [examples/protocol_buffers](https://github.com/bazelbuild/rules_nodejs/tree/stable/examples/protocol_buffers) -# Bazel-specific +## Bazel-specific -## Bazel Persistent Workers +### Bazel Persistent Workers If you want to speed up Bazel by keeping some tools running warm in the background as daemons, there's a good readme in the [examples/worker](https://github.com/bazelbuild/rules_nodejs/tree/stable/examples/worker) diff --git a/docs/images/bazel-icon.png b/docs/images/bazel-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ac74e82c44669cf39254e6a6837a7d57d16f0aa7 GIT binary patch literal 4945 zcmdT|e^3|0m zf1vzoVy#s}!K76z)i@PH#;A9#^)78DN~4w$Jj7lmk)XiIuT##we!p*bnPk+-k2W)g zf9`JI_xt&^@4bD?w!{SqBSOcA5<*7Id&aVe5Ej0&gc|}MJ^2@I!^gN>YfA2Ow&l5b z8Lwm#^NY4$X6omy%E-!Gl$r73`qlr)oJ+{4?s*pT&-0tEyUis#*J_!MTw0J==i38rA-Iy8*ZMt-h6x^yQlC#dw2a8J6dNa z6{se7YA(OEq5szP=7k2*G%;{1qSAgb*)~RO9I9hn+CW*Oc(Lz#^VYOe{TG*2g+<4R z$x8Ok=B^@LNSrR@gaVJp5LZo_H9{DYbJZ(lGEX zif2#x5{Q$}u#mbq(O@F!ek<8jZs*iQ%WKF!;7}1~n#yzyuo=NSmQlw(xMkWv11Mw( zsE!h^S_I+%)ifKl1vc~~3gV){fjzXt5l;n&Wh%j&pu#fN;fsWJh&+JUnoY6zfg=UEs~X` zX_$LTE0!DrjNpw?WFrI!EtUZ37y<$Xx}$*d*w>L2D>*=%2zY3*}MIZD(^6k1*_ zX)ZO&FixGt^gLP?ydfI(7_^FQn}X3WmS@n^u`J~QC~GJLQ8lBPMEe3RoMT`rQ}1v*+#b1_^H+LWRPs|ktf(O5{Hm%oF%HY%&?)tB_AI* z&~f}qOm<^#tb1u{YI~_My3;w8jqezk^ujOx{%+6NvnL;$w)8|->X5QM_H&h$1Ic}T zePzaIG3oQY$BV08dxVMFJs~%*<8r%&M8BH2ytBLN^y!YjcIezw*@DRpU8$9}oZaMi zdv#+q*oTRMd@ zhz+r-96lF+kkPZ%XU!TWs>7T1Dk&y4YZ5J_G|wM0lxWD>u-Og}v8hKd21U#EBm(>?XI@Hba5RDd&$W9Empn-Y|uH ziRVgzqUyr9z$hqsIT2k6^-Da5ehVUnqE}KrYn;k>>t`U zp?;5;l>BBu(k;|aAr>L|b-1ftNe~`^JJ)(B6as>q<46sMoM{|TMZ!W2#I~6BSxC#D zAokgli^++_G&MDoUkmf2wOTI$Im~7WNGRGU1BC=bt}>7#wHN8ID!-P)oHue^NgAM| z0t`qe2`DBZXJ7^aI?>4J#Gs&C6m+PP(ACVKOr>0+p{|s2pb6Hr9-=g%21lw@awXJn zmtEPyWmhdzz}4)@diKO(mB786Xp;1{Rtumv7?m&p6bd00u>cefKq0{v^odG}F)%$l z;UUXlIU0uW5EMqk83a``KqJ`$8p$5U@^+*W(BG(Ky!KtcX?YdNppoPZ%G+dBgnl32 zFw2ux$Ymx?xFHoRCq`nBKgsPmLS+-N8^cG#s07p?w3^xFqE4199zqYsYi zmUa&$HFvkwy>|1{>YwCwyp-495flYGuFv%=%##@o)-!)#oJj=5b%gG{Po zI8H?bt_~NCL8BN0JZ_xED42$Ds<3-UjvyLrv-zJItZabWA(g=%3uQ1^#^d&-foGUU zNBIS>%eQriz^UOOHC^0Cb!hq0AAZ>L%9)#a>E^@V|Lg-WL-FelrcD7f-bnDvaZ1~ z>gR6FG8rTxli3v^sQxY?I_d|=DrhV+8Jrz41fZZHpdT6n`k^7neo(WXg~=Hs!d{1C zP95xiV2QfM>96H^J^04C3%;dMN{4QNE&;vCV{#^gQgDn)iTqkApkJ1f0Gl&Jd&L(C zj$jX@_ARha(nyHLlmeP)xq8g^TqbZ_3C=kUNP;~cCju!Jj$lkxb0@)@tE=tYcaVa|6xpkgU8c$Vr;Sb31+5NxO*w1J@w zENy^jV4JI8@EQW*61W>sPXWyou;@z)?gJ<(KsC5}_0RzCLZHCmD*^>5|0`^`{!sG0 z8>ID#_UP>TpRn#p?iq>XP93T(HKJM+g3C$|YEd~ZNKg)o0+hr08O-Va%A-VqHe;|3 zUl0Tf%^3Dq*|=}U#+6f2oY%nppnj0)htn=!JG?F;o+IDlFXvXW0I_C`c; + + + + + + + + + + + + diff --git a/docs/images/bazel-logo.png b/docs/images/bazel-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e43cfd0cea4e857f6fc11a5594593d6b1424358f GIT binary patch literal 12169 zcmeHtc|4Tw_xC;a?0gg|MvG5KmV~TBDy2dQDQ2WdmLb_=Mu-oILR1)~M6#6ZjhQTI z5h6wn#u6%wk!_eU_jBL0e7?`}dOgqY^?LsM`D3`vb)R#cbKckcoa4xUb4lyUkY};cn&ZBr;joXZ$2psG zu4hC2-<&f90QH@R_nX>Z!tG!3YF5Z~Bv zs%}b9kAekZ3#t1p*t4~@b>C+ZF5Azwgq+6|zTtvVmN&J-t zTpsKIUce&`rwAy{a(M^G&w zCtCvopan35hQnd!4A{wY(t!q&B|?6?F#B?JHrra?6Fs7!K@H8l|~$_uZEkPj8;mE}T)l|ik( z&iY`5>txT3n~OF9t?%FOsv!0GZ*RNA=$s~0mNqWTe_=9v4+{h1$bddy+{uX_w8;t5 zQa^T+BJeNdv>t2RzK~Qi8t9HGQ^K1~5azGsL2w_0{)KDdqtI z0l}Xs7OXqLj(~z2B9|xk0b^C+@%Y<_O;Z!}zP`RN)@~mm;Np4!QYE;iDk&3D_SulI zzU-a=fIrHMm&D(M*hN`)bRO-2e@<+P(mmvLrY(rho3FZj;gIKO9831tpx6X=gJ04YiDWK!{zeXQFbySg@V1@wX z{$pr}utLzfUOy!uH;>C?oylQ{ejuass&?z@2Dj7#|0&}`Vn0kw9Vh-J_robWF2E%2 zUzR~5asepqz?nvY9StoxDaauzYrePUf)mj?6U8+}2hxB_0Umsb;J@53@B?yXZ6olX zGbMJ{)YP1dLjd|JKpK!H1u?Avs1ddaii?maH?ZgZdA;2hx#msR_vDFy zU5X~mw;4&>BsjMVqen(YSZ*uBR6k-`WOz|Tzc+eje2cS^n^Z_&P?5u7ZyPG_?+VA$^~AVK#NOS8h~;I%J0T*jMjPt%P3M=f-@z! z>JR)HmV^(GqsNxYneAcAyY0uu#x|_%ff9}qgag>xjtB{HFW$?2M~h`sZl8qnecEa= ziow0M<1##AfSh}(L%#W+U!3CcUa;eOqQCsF(Mlv9$HS-AbHRat6^nCXaY{rUzb}Yi zx*A9fu_d31(#C7kizQ~Fe+J44yjI=7=Z*WvhbzEGq8g)VvKm~NXBlF1wp>m8ep(}^ z!h~VUg-{OXGH#=EfHkGgx;^0gMuOi2f(~4V2!JNI$c`_eQkW0Ee=He7emxu}h0*Pz z-sb)77jaIMypi|r_gsDje*4EVHTO*o4@*4csGH0%p=PrD7 z39V%xe$@exVX(bXoY7uMMt-9(Y#GdY(7z&$-ZJFf*ItIXE(Vut^-U9B63lJ=?|)(d zQ8_N4;5meFxDbfJ6Q`?^Y*h3)dv{18#swdhz5sx z?|T;@uaU<^UnW9;xz&l4rc&lG7rsH@cPyJZxxCUfH$KK>GRendKRELb&!T9CH05)< z1+uLuvE@yNLUt~G)TZP|sJoxt!j~7;{2~myT z95x9|GJwXK4Sg0AYOHPyJMlDkk4vrS=KPz3vv#6Ne5;d3!f<$zJCW$3EuC6u%IOqt z;2d~QV%JYmW>sVHnOhhIB3x>dDdSG!2wY7BF(9@KC!5;fA8I4|9R1FAp1= z9f#a(J*_Z*tn1i%0Bd|T)s%BlaL8;op}r)fxC-sXR+Xn2b-Z(Fe&BTpZ`VUi8bZ_He0yQxTCDMJ;gtCJ9G}v ze+gRNOBUGAB#q=5%NR^~Q7bTx=S)~DO^ZKHvck^Wui#s}4OA8ZcEP(cFQbb*?a9}*&He!4+?$!K?*-9cKF$qPShW3rlf8T+C3C`{{OO``fcl zjOzfNfs&qZ@AJJ{_1c4SfPD5K`Ia_U+q6?Ljk%Tq1wkojE$cy0juk%du$zbK;pXgF zZ)EKMXxj4O5YCAQFJ>#tRpGn?0$besSp#r3UH&SwUib5e-wq$2c&^;*l2DcK9Qug+ zUcuh(XAMZ9p=qbt!vS9* zF9fBIw=Lw|kjqfy=1`oDA;>fLzD$fq0Nt<@bc8b@3ux*yF&}k)(QGBn~$an zVD;!6q#P1Co&2@BX`6)RSKWdLVk|^}d!?kpB3@80k&M3gHqX>dd{E#u@rO`q-NP+WV}b+QZ&MEg}{*#s>@6YvI%ISRIIiC3bXeP>*%0{l zj9{50UK71(+lvxCNrz|md8~nJl@Lgki=mIGJqNTXSL~xnEJDKt!)dH$-6uyoE{$P` zy6m`=fD5}I3|YYY0)<#GEBe_>+6p!TraPF&74clT!@r!*A0`0C`7mknFLP;cyX9^H zqTCQsnjpxzN1zI?6Nd9w&*MeKQOMN5Xb$}d5DZ8_nMNDUF9mR`|I$(r>9;A7+U(rh zm*_OL8Hq#+Gpn2MxNg~-K8$Hct&bCU24Py?di1G1AYA>+hI`8|ePT-Lj&YRf(K*XB z`Hajv^>pDk7l=l5`3lS-O4R5pdt8mr#}K({`gr7wVU^cjK;Uy0 z_0F&%Pr13)IWn*T$7-d!0|eAUrRPE<_OmO-bpI5p@x}_B6V*YVd)J2g{VU zkD|9pLm_F`O1o8SjHI!FvbI0>klJ z^wfHjA#RxA<^J(fdAz|!h40oK*Ij1a&6b#7{L z1L5i2Z?iZp=ZUL9#Jiipa6uqU`M2*bDAes;|Kk=vL(!*#yJrP~EZu8q7P=uqa(U6+ zIrBk%hq*)6oy6|^8&*!;6mdUE+JIcwH**7DR7(F1r ztfnc5=lX3&+quY?c7=gVL9A}qVBmS0nJ^}pKXP*%qYo$iBbe$|kumbVQ?4nblz3@C z%=JUL0EQN*ytV4N+FS9roza)%dfP)q&ZF9(Ng0qY>{JZ@fX@ z_iEqiaHAJ1mp3xCt}&29dl&mbR?P zSdmkb>Mzo}u~BN#&hFrr-WD~rO^UczQUFvP{bY%b)W$sp{hJ!4siGXWm!*Bd89FVM zwSmi_1MR1|T6I^{4>^W2(ciXgo<3V2IXAe4iR~e0#%|4~#QP1B#68iLqd{Rt~Fe!lmt^>iW$!(W5T4md2aD z1!8vZR9Xz2tmMMqhN`MH`s%Qamw#{9lVRq=3hOYW1^HHu_!)d=(A?IQrMP>hpxEOB zB8qLr#n+$|r18e6Zs_dskCOHk)Ax8BEn<_n@bCT*;Yr~$ZttqY-DpL6`IQHwK5!OB z#+GL3<@K4qNk;5NN3ItmdAGFL<{H-xKs^dNGc8^(+Fy0|?b#Uu@rG(b*au04apA{X zJ$Mcv7~^V2{l6sR#v^;{Ii0R}l(4%kgQn)0Jhq3Z&G%h%n}R!E>;2wd&)K^RA)NNP=^yjL)6$e7 z;D}@Tzuhl%vsi%_otqov1xZoig!w}QUej+>|O0Ms!?>Vw5 zp6HswQZ@P^p3J|03nPE#vsL%t3lCAwQ3sXxaUIYS(Cq79l3@ea;a zD3rw2$Oo!i*oBwgfPj)7!h|W!an1cZ_=E9<#>VWMi|38q$~Lvny~-wrzyH*AJXmET zGdMyz*tqy;`(z_-GiAONTbHq+f6}akQLXiC*KrU3UGW6Z>(ey_EdcrxugSVx9;n7< z#ziGEaF05-4r&<5GYB?=gubbr96ETUQY+h|RfpXooZ~pBKAr%ctYU?KVPVi`?qP)YPVGgPcD+6xxuIO`bwxQx%mUg03xH4;VE@tf7gWA$-5W_ub0K8k zSXvk*I#LU8pNP(9OmXrbeiGHAZ=CMdnFpoxF%5IFhsVL3|5Pl0A;Hfnp-gk>I%Q zKf_1Pe%>u}ZbJXdZC<|$29ofyZzpGZfvDhqheH_gk2CW46i_JeX`1Pipu|&}y@-P2 zx%%!|oz9PLQh*?yy`?&Nin9>jN5?u{H)sy0b4bJGC8hj@eT8{Y@%?jnjC~p~YJn(t z7YO+3zs(Q?A#CcVbu-G3g2DO3i$=ZE%rNnTAY@Y_M=TB6M8!ajC~Gba1!uK6cRq4+ zBMwPjIq-ENppKM50!to&NT((6s56RBV|mK76g`HMQY7n=z+&dqj<%A2dgD9vTB_w(;KV(C9;<*pSXN50Tq{tUEn%(99elF=Y);rE%W z^9w3NTc8Lb$1-$}NHYywIAFrJC98bC(bTfYJtK7)&U~Z;9xbtLdB&A2>gL{l#%3Cc zYjB>|B;$-6ehIPOatYpc!u_Qoq{|MGl!Y#@o&84FcfCAQRKJu{|3nEPy6mEO8F0mE z@}@WE*PU@6da`v(I&WOzcIJx+Bl+_ZI@76_>9dbZp>XgADb=b0qOUd^Yq9GBE?LOx zc_qpwTy@<58LlEZf$C(p`e3$1JB>S||{iTB0#T0~D0o!;J&Ab3Hp zuhJvC-N?g)e|a*|Ul7b+V_ZZ!1g%eKXU>c}B87kw0)4o-!Bx+L`>4GN$-!DYaax(4 z-_n{Ond3|_+*fw@xMj5;qN96d zTNUW^$i6QGo0?wH2UuzGh7Fy=Ucpq#LEEv0K+QpyBSRkBy0Y!BN^{~WhjB<=U}e+% zyvJD8%{3SdA*=VV6R+FShy79NOT3k@k*vqWeKaJ{(eJJV&JYJYNs9&vc$ZPNyI18o zjaRy^eE%6-G?Tx?8fxrVb9rAgWKvWbaD7qrQ>m#do3G7c^=7G}K6Rw7OoVm22j=;x zn}=8`e4YT4i^fe!jHZvP&KzR=a@g5>3xhZ(36uI+zlTrzX(zom9VS9u8@MN=&gR~x zg7AIhaVKtL?Xd4eT+$T%D`?ni6nWEouiDyxzFTWE*ty0U(_^|ZxkqR*U}?7`l~ zK6Uh(=~vG>Qn7^hB7a_BakB1-UxrCuG!n~-NF>_nH>rR*+uW6gNDx_7zA76AWu=1Q zCL9dcA!KH{j!e^aKre_lu~^KZ2^`_XsJp%)ZRF8b4N4L{evKUru^nr7B5siu>}PwDyhP&}$qX^K zO4=pVfhGGESFegUq}t_koAVt`ODA`F?fz@z1#RNN(SLl(H`tP|p|O>vypLuvPjo9; z+<)R`CK)V5wXUK0<8zY7XX^xZe3PA+kCGqQTe2hh9ttS-~86}h=;v;OA(H%U=)?*v8(6|UZ>#Z8Y2 zY3h^o6nEjKcAX$M4YOPp1NjnH5yv2ne~pGZcJOkR=0wfD_8({1YmNBucYOr67%n1T z8uZxoZu%@WSvVzMWh2|s5;<291MYfT~Z!!~4_HJuYx^MiNU8#s&Tnz1+dh($7q|q(2e!gt> zq-e?`o-%{A_0l~rms#b(UL;ZiLXsGaex3c^$v)llnGeO$!7OSrHKTCEK@5!WHib}D zR5L1WeR(yM0-yj$_PQi@2HU#VuXrKkNziA&Xn8#)uli7M%Cz>joGXxg2qU}Ba-R5p zri;NnA&7h-|DEpXl87kQj36f0fvLqkl}DCewtSzN+G&AzMn((0Ble?H+g^4G-7O)Z zlIyLl{%G^ecn`f8(YHc~0nZRN`I4%3DUz4wpZC+;6{#zM&WF_WqYL3)Al$5q!C@ZU z+sQ|-sVcu418%&M;W;{PAjayYV;|k0;?x?8Vf7OWOa2Uwxk&RbR%Qp(uR@kuv3W$8 zP{r%9`^0M2fR5l8V%xFFUnVZ^m}Nycon)ea91rnfPD3?d;}xjL%Jz^0RkJ5P!bc$R z2BZPi(dw7Zx!&l|W)N(!An5U(J>gYHVx`OfC`r_v0IadU?Xo6nK1s-)z20wn%(f(4 z|CO6t9f}u7v;8f}&gTP#d8PQXCBCLcul)ca!dqt}b!9Z@;|#5Ia^D|0=c?amisv+A zj2!@K(Vmc+ZDGsfBSFv%jW5-U=XMIME(ZmOG|ZAN@{o3HThec|d^jFuaKH2_D8TW$ zO{>hG;vQJif$h!-(+__8F(SXnf@YLm+rf`sPEj)>tGkt82hB!Ryes$aKqZUy zF#&vZbIi8~Wu$`+kQm1ER_D0XE+*hj$9`0@B3RDFUKU|~x zIo+$@G{I$wrLOqst+WNM#G3=xFK-B2@@~pAE&4X=uPcA!sn@=TKlMRWS->BtnforV z$_sZ8m+aZupT(b;j*NDxWO<<*z~;-hhKx3J9Tn$b!t9T>0`ViW$HTMed+pc%ge;T| z^Mnok7srBLRbBp4U?9d9CcNBBSErw)RSko&qhWSu`t25_OC&sE*-9yHI^^IpQ`hcz z@SZN3xoiK^>oVzmQ69McE$#!M*6GHTtZ)T3`t;|VS%ofbOrr#9=FzyJi{=ppcitE1 z5q&|*1tSAEtw1{z{;TR60xtYeV^*S`m6bcb3H7ThygY=Wt|Zx%oCMxgSYfS9IrmR( zdxb+L^X-={b9#3)!AqN<1hK?w^rGcEn(;b|_73G)9MBG-Q69D8G)jnNZiZIy+0N_h z%%S9JR4jJ9sHpWyd<){fH^7K>rS_8wXE!ka53y!;_ zFUvQXu%q9igmxa|bPqslgLjmJG~dt5!HRS4xR zxCT*}3*2qpKCkrBAU20z;w*j7dekDpSg59vG{teBaDC-v8Z&61oes#giR*v5ptWmb zwM*yys8!BhW&L|1W6J^&?VTnO?z@c*h&G?`XePLlFjkWs1qo0sR(^JOW|y>=GNN;_ zH}K@-@9%wrW zoJa$V(qarCrNDaldIv-7l0nLmomq<&>D{f1wFrpoYn zKYH>0S;M#NoK#87Q*!&Ewq~o~BPuO_7FC4s;D$~GH7+zEai?4*cb(dF>!>Plunuti zJZ8zP>PJ7d!Lv=putv&=TY}8XP2NupZlkt2w~7CxKga|rq~8Wx23YWIu>_oMv}%dw zRF7oLme30FSMm`Nh7_2WKU=6kj$@5Z6?lo0vypyPth zgnRs6_O@B>P_~;=OCGd2i2>ywoHV5xMXvMrVQM(%#kokTL8z+?spg~9&4 znY(^4SdsjLGH_v__5)g75vrX!q6OZ8pIl#mKifQejhoZB;BmS4i@J$r<;!Zg;s_!&QqI6ETzGqg+JG0j$jD{q zf`#)Yv)@s-zWe@?wA!Q0gP$onaT0rcE26(MH_DHRMtW+Hvbb8VbWQWtRI$8la+fVx z0seFCm8q^*J088C-KEY_Z5*Dh{*WUy^XXayeUYVll~0mwwmG`k#>zJtIDMbzyrF1E z=(-e^|0+K`-q^eNlrS6FMGGLMc1TCF>pZ_>$4w27(VVTec$hJ9qs*p$nxgrAOXc%8 z{SE206*wgsceR(8lEL1i`YbC-gXI_%_&i>nY7L+`!eW0Wx1e$1z#+CJ-yu&N5C4RMf zeC5n+ryQ%$qsgrUB|9kQ!;nWiu)S%)ceKu&dKAIO?I(H+bg^Ev13fmrAx(}sjyA!J%X?=o;JlkQ( z{ay}rf2W?elyaH_S5s&NdR>YU+d(_=5QMUVe5j8O<;2H`{@g~_&q;&imMA0k8n#?4WfZOoQX_q0JsdFFa2#rbE%P18~-Nls+mM<;dU#@U~xC6fxI=mo_jBtv;9c=E1#1nJV z>AN#+p*b>YB^7pg*N&b){q~E5rj{~1SP~u_fMS12&Veorptmw`y7nK`ebzGzCCLr= z22@s1Qg4#N#76%uspd^-MS}PjkxN8pMU$(NgVP|Dwhokw0~h9#kXX=>$-gYX(Tteo z$Png9n00=oPY+;(d#2Zceq-7VXEL$%R}E!Y+s?qYVwDh)OR4C+;*i^X8KqmL9(}9V z{0mdnNeJc1Nwus*{Y187Q%*EOXQB#iOU@~|{JCgNJUKB&jFTZ-W z&SCb-G5_%kzP@UFWt*nF?%l+O?~tGNTW+i=kzh?}5BsyI)G4oS3B8&LQnq|Ld{_;2 zZe*$(3kRn|-;Z;%ql56c(kqBa_M~qAe4G$^+pv@DIoFs0ln?q{x_kn&%IzIV4xTc! zhbU{7qgTHJ3%+=;Job=jRtLy7rZkt!*gE=hV|wXd{wtR|Tz1?Nd|~;*lFfSR6OMv% zBD8PCWV%jki1f;DDsv9Oh`2!p6XiM3=M2E73UznZ){x|vP2uQ3{V~FS`CN# zW@rvPrdUeCLpwg9g7yZ0x+ud91Gbs)F;iQN7F6l{(W>0T`Vu5H z(aCp-DWKz52MCz(g-zhJHy-D80Z$9u;+Mt+zIi9*Ec3qNjIs014O%Yh`Er&-QK_r2 z9|a-*);5u;442rDN1?kO+?35%Tod{cP|v>a26O{t?FtlR;M%Ra$&_^tnS@c&uf|NdoI< + + + + + + + + + + diff --git a/docs/images/bazel-navbar.svg b/docs/images/bazel-navbar.svg new file mode 100644 index 0000000000..8a0f6db853 --- /dev/null +++ b/docs/images/bazel-navbar.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/images/bazel-og-image.png b/docs/images/bazel-og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..25b634945dd32a489d112d484f8fcc24c16460d2 GIT binary patch literal 15253 zcmeIZXH=8j);5aRP()Oui>Rnbmo8mJP(VORNB}842O*)}U zM-Y%MCG;XShJ+GI0;KTWaqo8=$2jjd_TFcl_l)ny`Qb3Rv({X5&1eo zlYA$cn3&jf9^5l#Vmf?@@sEWWcw&0)od)n9ua6eQ$Hc?Y$M1=k1Jj+S9(E3wbljde zIT$-Uc^cr^>7dHQq@t*E?~bYe1Yw%})kSRZPhziCvF?&Zj>D*0X(jXIArVq&gXIG| z*SPcIBDQ=wH942WR*$-3AJn72qU7{}bLIOMjKzem&WA6^5i*>N*3R^s4JJ<~1HnQUO#fW{pNjvX(;v(IG3ZaT0aO3=pg$}EDE_~Z z^q&r5fcAeW{-;iVNcv+C1KIycDF64K^WUSyc>0G<|NWppY|DV`iB8;j363TyT z(4S`eAHn+%lmP7hT<*Vz@<@Uf)4yvA?d}5_F4lTCMWgzHjK(cW(*kmdsrg1giPp`Z zwfpNO2qLy=cf3D@xV5SnG|2qALV05!Jc#m0+Gk@u@?yaD2$The;o@2m{U-Rv{?Mh; z8`faGExR7PF5}DRkHziv=mhv2A1hO+R$eXNWcv#Jy*w8abCfYmK0F%J9fg4ae4>lN zK;+HVrA&TH0DZ!(V%55XK{c2!+*~x^iYqQ3_@NNPhYTHuG0zl6o}=EkGk*-9fu5E7 zTwM0?^=$R*h7K%V-i(Uq9`<;H$?>;yU;Fl&Lq5n3I$E5To*tv|&|~aO2r1`K=IYPT z!v(?L+e@9}nm<{?Kn3mj{m&91fT|(7xS%l5W-ejTDq~9 zo31;g%m7oqEE+S#cnq6s2~(@{<4(ND$5_Ep&TI(qEcsDD7ol?TtphiX*=;@$D`?_5w;lV_pn^U3~4MU96l7mw_#N)H=&CRE%~l z8~~gI^SEDq>y6Tb&|?85wS23!U1cJOSwyQa1~dX8QY1{8q|NxL+u>{~>y2=x*&Djg z)KgUh?A(jj#Uy&wGkSJ&n8~ItyXdu)MVs*Mz=N)*d+9L|xKv^3Bwe zW*UHSM9IG5g70?E(n(dTlM>n=``Vu!!7pm0D({dr%DUppHRu#t$X*j-ziKK7EFLLH z{Us$4aYw;yZVS!D#T6r<=EBR&Tp($EFllm@Ya~$oZ^-$kU2I6;PEQJ-7zQLB8M2QJ zDZ6nDmk}XoUFYkD?l>ua+t#^Ic?7gy-rlvc!oA}1b8rvB%z6gG2hCd1wa+WaNJ&bQ zP#`-)%XZ_0C2s#?I3`gsp*H_z%S(u`L2BtXzyW9%3$XnpWF`Olbz$Lh%1WVR>GHC; z8e{nW2!=-i7#?poWG5jm4)J->JP4^QEPZUCe@1GWkWOHPy_UiHwC3X*J0^3Qp0Lyy- z+j)c*6P39n{W-W3pepj}v`S)yMeWo1(H;V!&#LZ}(Xh>V%)8czi1)e9Ca(n})BI*v zzhp1~D=e4*AavPK$Nk7)W=~B@;%(k&PM@v=!&d?|PD&x%X389Z^$q?mDf(d6+Hfeq zwIEh)|Cd|!>_shile2(d1i(P803OjZ5}aegZGD-ufY^B@J&NKiN^)Prv z)bcU0aK2{TYemR-8GZj^o}tw>G_F0zxYZ3}Yc$)QZ)ky zG_5U^5NWjxa5tdyy&ZOk_3rj`o=H;_xxxI1J1SG;L%QyG>S;ox$5b53|c< zTMVAIwrBI4Qv^PhOZXN^GDEld3;JO4AAT=kzCn=fKMyA`R*}A=x&Lvtki$$ap>3uP z;C!e!141zPusZzB5k#fK_ zx*|%FXKvv3RIpZ7J7bW(j&r|(kbl8A7$8JsD2|Q4YIV$Lk0UB~c>C-}AN@wR!dY!w zlN0DXp3MuVIHJu)ARM6nI}_gk^P4Sszs)aL&cSp`HTW$4$dKvyIZ|u|?{6TRsVl*1 zzdl%!QtExFtftmLiWHlmi;~>h)*8mFg1(N?)~71FNh89?*)Mz!GSQjrdUYz|ysX3X>}u4~yqTjTi3(=k_SeI)>D&=fQg=T)0Pj!>7(Fa~e$W z))gd;kNccPNRio8r4{|=zrBXs0?J?+!%F^pU|06VhOl^2@{(9qi;~bM%wSZsu$kkAlxWdk z%`5$;#bMdqM6XWA?1G9+%2JhjJk0Y8TlEG^jcdO^H)>Fz%S9kxt0z^Q5=} z777M(v{>vy1H%nM@h35uTT$#IXcK~oRpn{Bgjb1U=Iv`mf}DdBp6Yu~lfY?`B0T8m zjGizL^kps0^ZdCY8o%niM~lba6ciQoEK69Bv_D9mX$aor#-1I`Um%wyK#rhS7*13L zQ@GO+fgqKiKBE221}9^(jdq`I4U9QlR0*u;QRPElj#nD9*cESh-zK}e4spEA9SWLl z=R?)5pwYt^|Ky}J{hFcC(1Mt=9Pk{#c|IZ4Jm*XTPDY)4bIn9tKe0B_=d{X**pK3q0&y(Mf#SK7`7yMFh!yLwuTwJ>9E6inSOp$?V|X8=@fX^+V&EXQVj8z_wT`j9b?6>m*`p@`pL&DM4k^pGL%Bythr0on|_^@|Nz6(ymiRkHHb` z`}jBw%iX#Irv+AzgX#W*{jjEDO)IxXxxY3qmL>DJ{F5pvKFUT95^ z!^>;J4&ODRnPc-Od&45rWPTmj2a>UYyn;QUtpjT8N~Al0FC!)-dek)Vz_xW&qJ8??DNE6^1i3nW^L%Co&_!lt5d&1c1DDXh-S{%p{_#@ zqw6e;z(>PXd&5CRnJ928i#ugiqUJ+xY!^ao?+Pa*06!O zKWpskm#;_6-u3z;tZh$-1H?ZJI{aP|k=;)=vS1`LcSV)Hf`Y<2^YWBaO)eC1z%zH% ztSw?ymSY0scyn^>O1L^Xo4{WHR4=yxLQCf-aMwy#YFzEhBi)=UHQb}?Hcf4v8G_rb z>ZgHN1O-x+`=&y6=%Y)W|eXkV%H5co%7{NH#~&y&i}I-MN~* z>}N-w7>9RHeEK1OsFJO)LZYaOkKgCX-$2*}Xu?ycRzQEa708FWFRVsJXwVnqUZ$pt z8ehr=H8l-TfxJ^pM$X!bP_O7Qt-NjiWk2J3oXjHUe~d*pw*N*uJLt zk(D$L?%Se_AGz-NT#K!wsOxkCwmGyPu`GLy-I4Q$^5@!HnKYoJl(oyX#ymAX=7ydM zce-ra!ZP9z?QlWQO8Vwxl}GHLXnkh%vj1K-a$hmnHw(0vnH2v($cbOk&84e?RZMa$ z`C(V-_Upa8RER3fSGkk9_!Zl zPlhWBB8R(qqfKaxl)4vKtZ-za66!Y-?1%2SsO0lG$SRngmpg^43URpwj69a0`S(9h zg06!5gsH3W1m)g}K$|^4NQaQW$cAdd4v_t;MI!%HT#hrH7e9u!57Q__)_jiU#P}MA zXZH_v-32@amR+npw7B>beW%dwK6x+zOe(A_Dga7NlC$wK9wv@x(gb7~NJURI1EK6> z>PaiYuE8*Sn#V|_+ulx@m;Hkg+3;SeAPsA==W z@`2ulrS1L?mJc(B#h8m*czG@EE3AL9cXZ5woXN@+C<(NqkcKUBGq<8I&ISVbcl8|N zhhZ!(oq9=G1nMGC6hj%wzcQN}13-s0K+`vr(^r69JO^c9^Z0Q~4!_k2%;@O{ z*_Cb`G4DGjj)|Ln1Hd%doii$Ma5pp$3bXcX%U2xE%X5o*8S~>^0Sl`_0+2~?()jdl zC}+cC4>o~fXlV$`YN(->Xq521w|_b$#KeFs8Suoha6bcx`rPD7md= zof;Y%YD*sMKmXfZ5^s3R44uK}(?1pK&U6QSiIX`GRe1>kOqE^yu~J1mhzV*-cEx?F zTDT^3Q$!P8ui`oXw;%&oW3b%ym;2lC-GtNYHRPELl%sV&@%?q+kQjxUOueza%uwQ! zbR?V1jN?8 z$!u-GEKP(IL^MO2U8Wa+#>H=4`7*`=el@(Y<>coF3jd;3Dhn(HS}_nO<74W2Z0ou~ zWh}r)tw5pI_JUKLJ-Dr#z?yqoz&(;%-lV$OWjpIs+F_`?B5R4;E?^+D!;FRf!=$t= ziMxF**3AmSVVGY!yrPds&#v*Y{x)`{FVK0it6S~t?4+|r4A1TUWVGeVleKM) z!oK<)I+FrjXr zQPD2~7C+UUj!oy^Xx5ZnS!oVUK4lXp2gygUqMdR&XodZCxR4dGq_3iXyFEKo=#7%?<+%Ryznnk|xUGWG9WS zr2SJdC&jgEe$T609Sh(__!Fw&QvzJ-hET{$h=cYU(UO99sUMywg&DTS>Sy<~KaK}V z&=N@NyO+eg<*&ytzPcgT%g~tyShMX6UR35&PiTCvWi^SSb9%{NH`oBlJEy~2Tj4)< zA=W{D>hSXd+P8Bs&S=i;rQc;bC(!t@gUqKjJhfsp+qM!U3MM?c_!D?GE}0F3^hv&% zY9gB4Kz#6+Ul9vR^m_76@meTmx4m`+i3c*l$R|qvKW``L4Za7~EMDnJ=k&-ePYv$Z z&`8`u4%IBm=M?~)cCSxizU=E#dQei0M))A)n$*2#&rY(6OF|1hf=Er63^Zapqz{u( zO#j7x@W3iMp2OQ4Xazjmi&_B829^(!H=36#d@mfiqaJxi<$H3^DRYEzIOD8mDh>k; z2dm||0f@t~gGdZ$uC>bu4EtjL^%bKB?|-nIOulbFy_4G%vgV}0J3j>3O+gjr-LayP zmP4R%JRCqrQ4Q$rf)1g9n1ZoRG;@4-h3&z%$Ajx!2839sS6axP4)3SpWUp~sr1qP? zq`c|ouCiNOTj(46(~<)qcsjhe#~~f4_BM`P132#2Bk;ndnQePP4kOM(Mo-jwdiuC- z!IXWk5bpn`h2(LH~~}VhdgC z0%CqZ16l^lzB*M|U=AGe*fz-MwGbD(CGFDogmO0u$z>fktn5XjZe5G`dm%TkhnM!7 zww^T%#5Skd=v_qU4mBcAB>Q+76GXZRQVUVvE-DV@yCdDRoj}WCr*@|@K>d zAo%3b9eoviE98@Af~T@%$$EWJb*9S3svq$DgJNZllrB}s zjtkIlip?(OS*_Kra+{qg!RK~Bhp0^vM#@}}pKH+gnF{UyLc(RTr|JULlq-@#-KPLX_n=|4*%7(cal(4VMZ9WI80FfP^sqOuikTHq z=rdi@_o~(~<^}l(Q6KMHZV9wtRt`*471*tFY5mHRp2Dl9ZmmSKc;5ykjO}MAeZ3#OPc*IO@ z|B?F(4rd@yIh|?79Q6)hTlrnTL2W|pP~6lPPy5MeSN!Z>xE}IL3b`Y_EF{ysK(_#g zbDjisVw4lz)Db{K_JWen4Zh%;ni)ia%!2UuW=9ngrIi-wYU}k|F~OjhR7}!nzDuFJ z2hG2CHXRK9VO1-%4s=$<>Ib|CxS_Ql@moSt(|t9DNf###UA2HdyX3j^km1kh{F8w7 z5+T4_DrrR|q74-lJmNt+8FMTK#j?%u#9fm9$d%IhNwn(Yu3BvuFPu3_S;6cY@RpCq z5U6HfO)oMUYER|}<4YtYa4w)FU#=ifsi|@hE$a_vP_bl`VTkn_DqEIYm@Bs2DMZ`W z2;VL$2pkh8Wf^ue6SiQ4IP56!77%bd;62}PC2;hCw@`rV056D*MuCG1yi5hM8fM@f zrWKF^9%6L!fyqa>U~a!BMv4C8>8GxLjQw2p4+;4|&jOJ9|LAAawcl3Fz8Owm>4Bnl zrJ5*r4F5LNhIIG!-xwluU~kYa!uuU#_W zH;%O%Xe$|8L;woEia|Rb3T*ezXK&keZoPH9%|Uwu zIViB%us^v-^GOGnjEZ-ZR%o-`hlb6S$NQ~Sv9lQ3Tm1_&O7x3D6#M+Z=@R7eo2obvokh4mnaBRr;Rgcw_r>iyUyvANnkHo9^4U zHN8>4xY+q{gz!V7kJeV*n6?iBl5`$V+@l8_#PAq+hsA2&@ly7f>Dy4-5)<|IgZjB} z`~tG*hNVwlv6;_8bjsit9DvKQDl7AHO}{m2Z27>QGmx9s*0-p3RqXV!1eNtNv$v-HE%0ve(;{2C{uD5Oab zsr0VE>$E4m$$Fy=CA-aIXVX;<7RH2pgNEnh+|(wkL+ESh@Lf&nLXZqsBmIB@8%e9I zMzrhID19IAk%LW59~+cKBuG}jZp$>qq1p}tmUatDnuv~6lv@)FJbCxKwJQ~s*@57R zwE`Sa0JVpY+B*9b0IYJf{vaF=w|PWt-c9gGvw8rkSPq76Mvw+KL-0j<$KAF<(ji_! zN|ebl>ap@PaHC^6=R5uFGbNt1eQ2P@JTLTWf|K}|ziS~LhA)1+%4d$r!H`n>Q3swu zVHX7x8^I(Kt`c;|I;IMQ>KC}vchHklq(*V#a4vh}V1R$f-h;TU+}KQb1na=O3yIS? zSk8xmliwc>)mqYIF#!(88gV%3qMs64Hp*|KDo$c>_fCCA2z9|vg51Z$t{O-#^^0>PD{Y$&w*;yINgqFBg(Rwk&7+q{d9v8{600?vB;& z^u>74#-Zj-^oiNMRl}@<$AJ^NRc8jH)Br!{KHZc^p|JagTpvG3O{-bT6s*al6ie5x z?#`dU=^ZG*{SkY@#I~)2y`Lfbu}G;EL8p{iCWTFxQP--c^YY7BMd#qC^(wQej;g8g zhPVWGEDqPkO<0<1Qz+`|S0XpZfPLDzc-Wm&`mfMsFP<}$k8DETaHgEl-#id@TirY0 zodk81|6HgPq;7d+X&gk%9*_l^;Nmmee3?lTTy2Bb-bzqkw@UdcNw81cy7z!x2!b!} znK>f1_g7JO371q$h+o#z;Gn`L1$cjC!(IBlg(@qrdMH*fah7u0){ttkHb{Ffe5(Wc zdir)1>zf8}eJbIZs|5@0-1jx}AL!zQH807Mg6@0#4*gdx1;%AxW8bb8DRjWN;S;<>!xlvG1L3|38pdX+l4s=-`jB-7`kh7xNM8td4kCSi(3!-0c z1;O+uyI%{Z+CXuf4hOv564vW`TUg;{7B0>=wpKy*MJv%|@`Lmuk6E9EpICJ6Rq z<)5os=(q=h5UB>?boI1V&I$E;$}9a_PW04Q~n9)~?t|V<*Mv z3hCOD#`-oIbp4=t8|C6SLC&a%Sszd3m%HAC(3wEID`90YGV#l;u=~`0*Po(h^BAxp zEN^2389e(U{A9jG`5x$k$WU@DJt4(}BdaZO#C4)YrSDPlfsZFXLgPHYw*n--=-u-T z{Oqq=tk5KVF?e8+eXn4X82^OM%MW^n;oaom$sY!!2D{7mRx4@Ze*SSu$z6t_3A2t9 zx-{CT4YDk6;Xe(u~?dG+~n(xMimi{BiZi?Me8r+9)RhhdON4R%j%< z-r_M%T|&21yj^`lRfDT)zyEq4sVoHT|KRfi@uS?d!(`+0JfAF)^o>F1p20WCxPG*X zv*jBiir6-^0SbCIo|LjxAa1Qi8msW@IasarGn}eXKd4OzhX*h3e16)y+$LG?wp10P zUDTvtS^n;<(N#C-RlU^L21x1l5Cbc<_$!w#C~wcNBV3#S_fnYQ;MYW8vUb;a)|_kF z$Sx`|7uaK0CD?}B`Zpuvk|ff%{8s1L=}D54J@?#eM@PWcn+`*JE;!cZb@yS{@fFAUcdhV6sb?21W^>fgCN{09IS8wATa;rPez+ zQZTacb6IttD^{&g>s^C9a&IG9BdKtn>Ki%hNSg5F7Mr;XT)737jozs>~%F#ys#iS zhX9h742+;vR=qiz5YkY@aW9bPNF?oX2MoEI?&Rohy@nnyvbC^5CcZ7Qm z9aqTq{K#o|uON4c%bBiQu~oA$;hg7q*x9NodaT!}=nau)90#+{h`usRwW zjyIbMXZ@ZQj#0lIKXYMI*kH-9(#1n1sviGv~m77vWgI96PK+< zrFY6WChH2*2y%JlHRhaUX(J${;PJvoghe~}t6GctvN;M-t`^l1*R;{tnxM2{|IW%l zDym7BvRf5<#$2LOpmqhqlc%yJsL6G{vyHy7uFI zK356781DoTnTKj#5QFW}i^s>xu8mZ^Ezcee9>^w^SIp1nHunadft>er_vA{gIGo|^r+Wu z0$`H8V&zkXvTfhsWWPoVjoL@ZZ|j~MoE-7eJS#Zqg;g9a?39#oNmHFncF%=X;cVAV zB9|Yh-H^7|TF(LH7llXM zbFiKJITPBYn;pluq;kpGetk+n+xH|8^{iRAVDZH_OGHaI!S8d8K2u+d5Tg_LBVUD- zSHhezIY0`P*kF`{Z)WWmsI9HuftKid%oE|t0YOL1eDG)HFeWg#nR$qxs#?^gG9@F5?i7Qyy9*>6u0J$qrXiL=-?>5E~%j--Q-#))et&;jU)7^TBoFT z!P5#64T&GNIUe8J6+STqsy0-2KhQyjB&DHKdcQ)73Wb&XIEUfaNzMu%zY1oF)i{cc zCvIiRSXD=Zk@Pb=&O=>>^be@bpZR)Q-TiD!X;-6iAABOHwp97WS5a0f(y}m~bAC2H zdo?!$>%+N2k9K!CZWTOzkLSF9-K?%$>OiSXzT+ous6%C1!99=KaNpWFEx)YRJbBY8 zMS%8|9Z7N88~BS%#(u%pwyE?M?LJHx$650+?MBfn9`N)`A`* zA9gj$;>Q=eoENS$yOfUcf)feF0vuMt(c-A{)aj2ZF_ll@c`WlYf+>PhIQ0~V zsx+VRNl@`(vc%+vC`Fh-2))m*X_R>U^7Lh4%X@Cv$oQ#>1ln1Z;6Pj~#2246GMxwi zvfy80`Cv^qYz{%q~~!5i=Mkhy|n4RxAAa`N+k!n9-yU_nT ziq;>jr}&;=Fn3h_h5loNQ+rIe5?mekkQ$?DGJeY>F!LAB6E`XB)VvjHQeoQvGEN~6 zCs=p(vX~d=Wwj$C^X4Yw(Q)0e$@RX(giG&C?#I$@&TtL!dro+NyWa{{7AVq-)eVVf zqhS4_^_L(K~rZu`I4+zr^#$M-Se4xUAcCCo! z8V!+h!setgAEA})ok@}tG16E&mlj;LF)69topwLO@$FVA@^SgKHifrU(c99O5)6~Y zG!lGOBdE)K@;^M$=VvPB1+#33Z{@r@=6gB&mLobQ%p6qF{(R1E?S|&m%ZSRHM>atv z->X8G);Jrc&V8RbWL)i_^kqA0(Suq)^}|$w9EeP57tRnxfj>(^eufV-^hW{ zr}n5mq&@B#2k4v1nzek`o>6hOeZsnBD&iB_fis>%gVOLgH4!x!T$7P^-r6G=Ki_b? zcvZpNqP~4sdE982T4$2r!`7g~{gRySHxtld{IL#83c^j<%}&Alb5-PY@u!Al$A8|7 zwecqI8bPnO`r8-?B0av)YYB3%2#GC&?Bh{RCNz6xYYs|c!H89oMzvqf?VxPfE9}ES zWUSvDP&j><-_@O?>k4&e$GFb(DErzKom~sOcWSxGH7EQgAU7 z>rM1pNhwi%CST7Bc0*q4J4Z*l=Pz}nj6Z#Yb9VRSizoUCrwqbyYSNoFBY*6_k) z$#O{BP}F+7Kyb|ZU==mfWAMj=PLRo9{)lUA!F6kkWDPYgBP6oQf39t+rcL-QLfazK zJZiE%AMq`4wxX=}x_%%M0SQdCmTa7cmNa?N=V_H?ZkI0F5D0&@wU#*z=8PrpyVK+a zQoKBEJ)U@qS&#yjNA+SgSc%g%@P*!8oma>>cbT&#^X((O5;=skXCS863*HjGPrRzM zCp=iI!w$7m@j_{eX}%b=%PAhF=!G+v#iIJ%L`v;YiYngS^YQ(oZ*Ds~Xv(kKIG=hG zs`C;VWv?2g$*tDEc=}T5v&3h41k({83c(`h| zwp->9qhklO{Yrr@p3znA_4}SnEcKt|{9^W8S3p})qhUoWPlaCad7b83zyp0nAzxiy z##IgQxy#Mr4)_;okA9vaQ wt>*n12-l(ifxCwPr)`r5dSLV75EFdp%X44%bMJtAwoE!&2KS2Z+Wz&w0Ok%?FaQ7m literal 0 HcmV?d00001 diff --git a/docs/images/favicon-16x16.png b/docs/images/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..587a8aa320d619ed3c95e534f4715a62d853de37 GIT binary patch literal 553 zcmV+^0@nSBP)A$U!L_udT*W{21{gb%D2b5J$pnWk4%$IS!zk>GCXUQbj=C9K7>v=SO&t_+ zkx5%xNugR|y-Ryn`tR#Gz@67ND)0Dv-{<+>@5=`x6}=iwjAj?<0kFKbw7HRAH?#$9 zakQr`Xp0;9bz^yLY15y}emM0w^>jj+2qjmOnaZciyJoFfb>aKZ?!660gX;XP`P+m3 zpm(%)l=TEI?8^L->BO|=!fxL$2_$Y@Uw!!e!5dkY#;#bQMtR7a6)mH0t3@#p&aV8yA0@yV$17H@6Txq-bL=tV$(6@HeX2Hk-n3jcJ`Zn|?qTfe<*f;0>FOtEH}xalSa_+kB|SJuG8RkJx#Tn^RmCd r|1KpEBXc>+O|rOj zE8^-REnexiq9-eFRkn>pUkh%ZQ4Ny9>G1oKDW8DvwSkMFug?E%hTea2cgFR;PrX0 zjZKZ++>7nMP@Ae^6_2h(Uil~dVE`DvF@BrKq>@YI-ZBI9@z$^)I^(UOA-VuYaTbJG z+zN39K#S85R&g4l4Pc2IA$Wmzvc%000{}32ck=$NhvE~K8|dfr``nuW0HfDOnd171 zJ=$2@e!jiN0RZQBh?3N>bpuV)Pdf&@M6Fh*#(~p=Nct`v_@;aj&dFcYFKXHelG#H@ zQUik1!3+R^{Ba)H^dVgC3telZt`zp3?cS4%@(~9BKRtP~nok7*c zIZ^#tK|J;jN~38QPpoc<DDWS6Q7x#Zae#6VwMP9S$MG^RLe>l)hglp6SjL$E0D!NGDZ(s{ zGA!fl09J&}xIKUsqKCMBfEl94cz-kE3}SI4j}Y>>gy7!`cOw2-{G8?&A$g$jz@2|S P00000NkvXXu0mjfr7lm< literal 0 HcmV?d00001 diff --git a/docs/images/favicon.ico b/docs/images/favicon.ico old mode 100644 new mode 100755 diff --git a/docs/index.html b/docs/index.html new file mode 100755 index 0000000000..561740d018 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,438 @@ + + + + + + + + + + rules_nodejs - Home + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+

Bazel JavaScript rules

+ +

Bazel is Google’s build system. +It powers our development at large scale by caching intermediate build artifacts, +allowing build and test to be incremental and massively parallelizable. +Read more at https://bazel.build

+ +

This JavaScript support lets you build and test code that targets a JavaScript runtime, including NodeJS and browsers.

+ +

Scope of the project

+ +

This repository contains an orthogonal set of rules which covers an opinionated toolchain for JavaScript development. When requesting a new rule, describe your use case, why it’s important, and why you can’t do it with the existing rules. This is because we have limited resources to maintain additional rules.

+ +

The repository accepts contributions in terms of bug fixes or implementing new features in existing rules. If you’re planning to implement a new rule, please strongly consider opening a feature request first so the project’s maintainers can decide if it belongs to the scope of this project or not.

+ +

For rules outside of the scope of the projects we recommend hosting them in your GitHub account or the one of your organization.

+ +

Design

+ +

Most bazel rules include package management. That is, the WORKSPACE file installs your dependencies as well as the toolchain. In some environments, this is the normal workflow, for example in Java, Gradle and Maven are each both a build tool and a package manager.

+ +

In nodejs, there are a variety of package managers and build tools which can interoperate. Also, there is a well-known package installation location (node_modules directory in your project). Command-line and other tools look in this directory to find packages. So we must either download packages twice (risking version skew between them) or point all tools to Bazel’s external directory with NODE_PATH which would be very inconvenient.

+ +

Instead, our philosophy is: in the NodeJS ecosystem, Bazel is only a build tool. It is up to the user to install packages into their node_modules directory, though the build tool can verify the contents.

+ +

Hermeticity and reproducibility

+ +

Bazel generally guarantees builds are correct with respect to their inputs. For example, this means that given the same source tree, you can re-build the same artifacts as an earlier release of your program. In the nodejs rules, Bazel is not the package manager, so some responsibility falls to the developer to avoid builds that use the wrong dependencies. This problem exists with any build system in the JavaScript ecosystem.

+ +

Both NPM and Yarn have a lockfile, which ensures that dependencies only change when the lockfile changes. Users are strongly encouraged to use the locking mechanism in their package manager.

+ +

References:

+ +
    +
  • npm: https://docs.npmjs.com/files/package-lock.json
  • +
  • yarn: https://yarnpkg.com/lang/en/docs/yarn-lock/
  • +
+ +

Note that https://github.com/bazelbuild/rules_nodejs/issues/1 will take the guarantee further: by using the lockfile as an input to Bazel, the nodejs rules can verify the integrity of the dependencies. This would make it impossible for a build to be non-reproducible, so long as you have the same lockfile.

+ +

Quickstart

+ +

First we create a new workspace, which will be in a new directory. +We can use the @bazel/create npm package to do this in one command. +This is the fastest way to get started for most use cases.

+ +
+

See the installation page for details and alternative methods.

+
+ +
$ npm init @bazel my_workspace
+$ cd my_workspace
+
+ +
+

You could do the same thing with yarn:

+
$ yarn create @bazel my_workspace
+$ cd my_workspace
+
+

Both of these commands are equivalent to npx @bazel/create which downloads the latest version of the @bazel/create package from npm and runs the program it contains. +Run the tool with no arguments for command-line options and next steps.

+
+ +

Next we install some development tools. +For this example, we’ll use Babel to transpile our JavaScript, Mocha for running tests, and http-server to serve our app. +This is just an arbitrary choice, you probably already have some tools you prefer.

+ +
$ npm install @babel/core @babel/cli @babel/preset-env http-server mocha domino
+
+ +

Let’s run these tools with Bazel. There are two ways to run tools:

+ +
    +
  • Use an auto-generated Bazel rule by importing from an index.bzl file in the npm package
  • +
  • Use a custom rule in rules_nodejs or write one yourself
  • +
+ +

In this example we use the auto-generated rules. +First we need to import them, using a load statement. +So edit BUILD.bazel and add:

+ +
load("@npm//@babel/cli:index.bzl", "babel")
+load("@npm//mocha:index.bzl", "mocha_test")
+load("@npm//http-server:index.bzl", "http_server")
+
+ +
+

This shows us that rules_nodejs has told Bazel that a workspace named @npm is available +(think of the at-sign like a scoped package for Bazel). +rules_nodejs will add index.bzl files exposing all the binaries the package manager installed +(the same as the content of the node_modules/.bin folder). +The three tools we installed are in this @npm scope and each has an index file with a .bzl extension.

+
+ +

Next we teach Bazel how to transform our JavaScript inputs into transpiled outputs. +Here we assume that you have app.js and es5.babelrc in your project. See our example webapp for an example of what those files might look like. +Now we want Babel to produce app.es5.js so we add to BUILD.bazel:

+ +
babel(
+    name = "compile",
+    data = [
+        "app.js",
+        "es5.babelrc",
+        "@npm//@babel/preset-env",
+    ],
+    outs = ["app.es5.js"],
+    args = [
+        "app.js",
+        "--config-file",
+        "./$(execpath es5.babelrc)",
+        "--out-file",
+        "$(execpath app.es5.js)",
+    ],
+)
+
+ +
+

This just calls the Babel CLI, so you can see their documentation for what arguments to pass. +We use the $(execpath) helper in Bazel so we don’t need to hardcode paths to the inputs or outputs.

+
+ +

We can now build the application: npm run build

+ +

and we see the .js outputs from babel appear in the dist/bin folder.

+ +

Let’s serve the app to see how it looks, by adding to BUILD.bazel:

+ +
http_server(
+    name = "server",
+    data = [
+        "index.html",
+        "app.es5.js",
+    ],
+    args = ["."],
+)
+
+ +

Add a serve entry to the scripts in package.json:

+ +
{
+  "scripts": {
+    "serve": "ibazel run :server"
+  }
+}
+
+ +
+

ibazel is the watch mode for bazel.

+ +

Note that on Windows, you need to pass --enable_runfiles flag to Bazel. +That’s because Bazel creates a directory where inputs and outputs both appear together, for convenience.

+
+ +

Now we can serve the app: npm run serve

+ +

Finally we’ll add a test using Mocha, and the domino package so we don’t need a browser. Add to BUILD.bazel:

+ +
mocha_test(
+    name = "unit_tests",
+    args = ["*.spec.js"],
+    data = glob(["*.spec.js"]) + [
+        "@npm//domino",
+        "app.es5.js",
+    ],
+)
+
+ +

Run the tests: npm test

+ +

Next steps

+ +

Look through the /examples directory in this repo for many examples of running tools under Bazel.

+ +

You might want to look through the API docs for custom rules such as TypeScript, Rollup, and Terser which add support beyond what you get from calling the CLI of those tools.

+ +
+
+ + +
+
+ +
+
+
+
+

© 2020 Google

+
+
+
+ +
+ + + + + + + + + + + + + + + diff --git a/docs/index.md b/docs/index.md index 163a50f89b..0759c135ce 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,7 +1,7 @@ --- title: Home layout: default -stylesheet: docs +toc: true --- # Bazel JavaScript rules @@ -13,6 +13,37 @@ Read more at [https://bazel.build](https://bazel.build) This JavaScript support lets you build and test code that targets a JavaScript runtime, including NodeJS and browsers. + +## Scope of the project + +This repository contains an orthogonal set of rules which covers an opinionated toolchain for JavaScript development. When requesting a new rule, describe your use case, why it's important, and why you can't do it with the existing rules. This is because we have limited resources to maintain additional rules. + +The repository accepts contributions in terms of bug fixes or implementing new features in existing rules. If you're planning to implement a new rule, please strongly consider opening a [feature request](https://github.com/bazelbuild/rules_nodejs/issues/new) first so the project's maintainers can decide if it belongs to the scope of this project or not. + +For rules outside of the scope of the projects we recommend hosting them in your GitHub account or the one of your organization. + +## Design + +Most bazel rules include package management. That is, the `WORKSPACE` file installs your dependencies as well as the toolchain. In some environments, this is the normal workflow, for example in Java, Gradle and Maven are each both a build tool and a package manager. + +In nodejs, there are a variety of package managers and build tools which can interoperate. Also, there is a well-known package installation location (`node_modules` directory in your project). Command-line and other tools look in this directory to find packages. So we must either download packages twice (risking version skew between them) or point all tools to Bazel's `external` directory with `NODE_PATH` which would be very inconvenient. + +Instead, our philosophy is: in the NodeJS ecosystem, Bazel is only a build tool. It is up to the user to install packages into their `node_modules` directory, though the build tool can verify the contents. + +## Hermeticity and reproducibility + +Bazel generally guarantees builds are correct with respect to their inputs. For example, this means that given the same source tree, you can re-build the same artifacts as an earlier release of your program. In the nodejs rules, Bazel is not the package manager, so some responsibility falls to the developer to avoid builds that use the wrong dependencies. This problem exists with any build system in the JavaScript ecosystem. + +Both NPM and Yarn have a lockfile, which ensures that dependencies only change when the lockfile changes. Users are *strongly encouraged* to use the locking mechanism in their package manager. + +References: + +- npm: https://docs.npmjs.com/files/package-lock.json +- yarn: https://yarnpkg.com/lang/en/docs/yarn-lock/ + +Note that https://github.com/bazelbuild/rules_nodejs/issues/1 will take the guarantee further: by using the lockfile as an input to Bazel, the nodejs rules can verify the integrity of the dependencies. This would make it impossible for a build to be non-reproducible, so long as you have the same lockfile. + + ## Quickstart First we create a new workspace, which will be in a new directory. @@ -143,202 +174,3 @@ Run the tests: `npm test` Look through the `/examples` directory in this repo for many examples of running tools under Bazel. You might want to look through the API docs for custom rules such as TypeScript, Rollup, and Terser which add support beyond what you get from calling the CLI of those tools. - -### Debugging - -Add the options in the `Support for debugging NodeJS tests` section from https://github.com/bazelbuild/rules_nodejs/blob/master/common.bazelrc to your project's `.bazelrc` file to add support for debugging NodeJS programs. - -Using the `--config=debug` command line option with bazel will set a number of flags that are specified there are useful for debugging. See the comments under `Support for debugging NodeJS tests` for details on the flags that are set. - -Use `--config=debug` with `bazel test` as follow, - -``` -bazel test --config=debug //test:... -``` - -or with `bazel run`, - -``` -bazel run --config=debug //test:test1 -``` - -to also turn on the NodeJS inspector agent which will break before any user code starts. You should then see, - -``` -Executing tests from //test:test1 ------------------------------------------------------------------------------ -Debugger listening on ws://127.0.0.1:9229/3f20777a-242c-4d18-b88b-5ed4b3fed61c -For help, see: https://nodejs.org/en/docs/inspector -``` - -when the test is run. - -To inspect with Chrome DevTools 55+, open `chrome://inspect` in a Chromium-based browser and attach to the waiting process. -A Chrome DevTools window should open and you should see `Debugger attached.` in the console. - -See https://nodejs.org/en/docs/guides/debugging-getting-started/ for more details. - -### Debugging with VS Code - -With the above configuration you can use VS Code as your debugger. -You will first need to configure your `.vscode/launch.json`: - -``` -{ - "type": "node", - "request": "attach", - "name": "Attach nodejs_binary", - "internalConsoleOptions": "neverOpen", - "sourceMapPathOverrides": { - "../*": "${workspaceRoot}/*", - "../../*": "${workspaceRoot}/*", - "../../../*": "${workspaceRoot}/*", - "../../../../*": "${workspaceRoot}/*", - "../../../../../*": "${workspaceRoot}/*", - // do as many levels here as needed for your project - } -``` -We use `sourceMapPathOverrides` here to rewrite the source maps produced by `ts_library` so that breakpoints line up with the source maps. -Once configured start your process with -``` -bazel run --config=debug //test:test1 -``` -Then hit `F5` which will start the VS Code debugger with the `Attach nodejs_binary` configuration. -VS Code will immediatenly hit a breakpoint to which you can continue and debug using all the normal debug features provided. - - -### Stamping - -Bazel is generally only a build tool, and is unaware of your version control system. -However, when publishing releases, you typically want to embed version information in the resulting distribution. -Bazel supports this natively, using the following approach: - -To stamp a build, you must pass the `--stamp` argument to Bazel. - -> Previous releases of rules_nodejs stamped builds always. -> However this caused stamp-aware actions to never be remotely cached, since the volatile -> status file is passed as an input and its checksum always changes. - -Also pass the `workspace_status_command` argument to `bazel build`. -We prefer to do these with an entry in `.bazelrc`: - -```sh -# This tells Bazel how to interact with the version control system -# Enable this with --config=release -build:release --stamp --workspace_status_command=./tools/bazel_stamp_vars.sh -``` - -Then create `tools/bazel_stamp_vars.sh`. - -This is a script that prints variable/value pairs. -Make sure you set the executable bit, eg. `chmod 755 tools/bazel_stamp_vars.sh`. -For example, we could run `git describe` to get the current tag: - -```bash -#!/usr/bin/env bash -echo BUILD_SCM_VERSION $(git describe --abbrev=7 --tags HEAD) -``` - -For a more full-featured script, take a look at the [bazel_stamp_vars in Angular] - -Finally, we recommend a release script around Bazel. We typically have more than one npm package published from one Bazel workspace, so we do a `bazel query` to find them, and publish in a loop. Here is a template to get you started: - -```sh -#!/usr/bin/env bash - -set -u -e -o pipefail - -# Call the script with argument "pack" or "publish" -readonly NPM_COMMAND=${1:-publish} -# Don't rely on $PATH to have the right version -readonly BAZEL_BIN=./node_modules/.bin/bazel -# Use a new output_base so we get a clean build -# Bazel can't know if the git metadata changed -readonly TMP=$(mktemp -d -t bazel-release.XXXXXXX) -readonly BAZEL="$BAZEL_BIN --output_base=$TMP" -# Find all the npm packages in the repo -readonly PKG_NPM_LABELS=`$BAZEL query --output=label 'kind("pkg_npm", //...)'` -# Build them in one command to maximize parallelism -$BAZEL build --config=release $PKG_NPM_LABELS -# publish one package at a time to make it easier to spot any errors or warnings -for pkg in $PKG_NPM_LABELS ; do - $BAZEL run --config=release -- ${pkg}.${NPM_COMMAND} --access public --tag latest -done -``` - -> WARNING: Bazel can't track changes to git tags. That means it won't rebuild a target if only the result of the workspace_status_command has changed. So changes to the version information may not be reflected if you re-build the package or bundle, and nothing in the package or bundle has changed. - -See https://www.kchodorow.com/blog/2017/03/27/stamping-your-builds/ for more background. - -[bazel_stamp_vars in Angular]: https://github.com/angular/angular/blob/master/tools/bazel_stamp_vars.sh - -# Making changes to rules_nodejs - -One advantage of open-source software is that you can make your own changes that suit your needs. - -The packages published to npm and GitHub differ from the sources in this repo. The packages have only runtime bazel dependencies, but the sources depend on development dependencies. For example, the `@bazel_skylib` library is a development-time transitive dependency, while an npm package would have that dependency statically linked in. - -> This differs from much of the Bazel ecosystem, where you are expected to build the whole transitive toolchain from sources. - -If you have a small change, it's easiest to just patch the distributed artifacts rather than build from source. However if you're doing active development in rules_nodejs or have a policy of not depending on release artifacts, it's possible to depend directly on sources. This is not yet documented; file an issue on our repo if you think you need this. - -## Patching the npm packages - -The pattern we use most commonly is to add a `postinstall` hook to your `package.json` that patches files after they've been fetched from npm. - -See `/tools/postinstall-patches.js` in the [Angular repo] for an example. - -[Angular repo]: https://github.com/angular/angular/tree/master/tools/postinstall-patches.js - -## Patching the built-in release - -rules_nodejs has a distribution format which is a tgz published to GitHub, and this can make it tricky to make casual changes without forking the project and building your own release artifacts. - -Bazel has a handy patching mechanism that lets you easily apply a local patch to the release artifact for built-in rules: the `patches` attribute to `http_archive`. - -First, make your changes in a clone of the rules_nodejs repo. Export a patch file simply using `git diff`: - -```sh -git diff > my.patch -``` - -Then copy the patch file somewhere in your repo and point to it from your `WORKSPACE` file: - -```python -http_archive( - name = "build_bazel_rules_nodejs", - patch_args = ["-p1"], - patches = ["//path/to/my.patch"], - sha256 = "6d4edbf28ff6720aedf5f97f9b9a7679401bf7fca9d14a0fff80f644a99992b4", - urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/0.32.2/rules_nodejs-0.32.2.tar.gz"], -) -``` - -# Scope of the project - -This repository contains an orthogonal set of rules which covers an opinionated toolchain for JavaScript development. When requesting a new rule, describe your use case, why it's important, and why you can't do it with the existing rules. This is because we have limited resources to maintain additional rules. - -The repository accepts contributions in terms of bug fixes or implementing new features in existing rules. If you're planning to implement a new rule, please strongly consider opening a [feature request](https://github.com/bazelbuild/rules_nodejs/issues/new) first so the project's maintainers can decide if it belongs to the scope of this project or not. - -For rules outside of the scope of the projects we recommend hosting them in your GitHub account or the one of your organization. - -# Design - -Most bazel rules include package management. That is, the `WORKSPACE` file installs your dependencies as well as the toolchain. In some environments, this is the normal workflow, for example in Java, Gradle and Maven are each both a build tool and a package manager. - -In nodejs, there are a variety of package managers and build tools which can interoperate. Also, there is a well-known package installation location (`node_modules` directory in your project). Command-line and other tools look in this directory to find packages. So we must either download packages twice (risking version skew between them) or point all tools to Bazel's `external` directory with `NODE_PATH` which would be very inconvenient. - -Instead, our philosophy is: in the NodeJS ecosystem, Bazel is only a build tool. It is up to the user to install packages into their `node_modules` directory, though the build tool can verify the contents. - -## Hermeticity and reproducibility - -Bazel generally guarantees builds are correct with respect to their inputs. For example, this means that given the same source tree, you can re-build the same artifacts as an earlier release of your program. In the nodejs rules, Bazel is not the package manager, so some responsibility falls to the developer to avoid builds that use the wrong dependencies. This problem exists with any build system in the JavaScript ecosystem. - -Both NPM and Yarn have a lockfile, which ensures that dependencies only change when the lockfile changes. Users are *strongly encouraged* to use the locking mechanism in their package manager. - -References: - -- npm: https://docs.npmjs.com/files/package-lock.json -- yarn: https://yarnpkg.com/lang/en/docs/yarn-lock/ - -Note that https://github.com/bazelbuild/rules_nodejs/issues/1 will take the guarantee further: by using the lockfile as an input to Bazel, the nodejs rules can verify the integrity of the dependencies. This would make it impossible for a build to be non-reproducible, so long as you have the same lockfile. diff --git a/docs/install.html b/docs/install.html new file mode 100755 index 0000000000..8320d46f5c --- /dev/null +++ b/docs/install.html @@ -0,0 +1,420 @@ + + + + + + + + + + rules_nodejs - Installation + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+

Custom installation

+ +

First, you need Bazel. +We recommend using Bazelisk, which is a version-selection wrapper, similar to +the nvm tool managing your version of Node. This is available on npm. +We also recommend installing ibazel which is the “watch mode” for Bazel.

+ +
$ yarn add -D @bazel/bazelisk @bazel/ibazel
+# or
+$ npm install --save-dev @bazel/bazelisk @bazel/ibazel
+
+ +

You could install a current bazel distribution, following the [bazel instructions].

+ +

If you use Bazelisk, see this workaround to get working command-line completion.

+ +

It’s reasonable to globally-install bazelisk so you get a bazel command in your $PATH. +We don’t recommend this with ibazel as the version is frequently changing.

+ +

Next, create a WORKSPACE file in your project root (or edit the existing one) +containing:

+ +
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
+http_archive(
+    name = "build_bazel_rules_nodejs",
+    sha256 = "10fffa29f687aa4d8eb6dfe8731ab5beb63811ab00981fc84a93899641fd4af1",
+    urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/2.0.3/rules_nodejs-2.0.3.tar.gz"],
+)
+
+load("@build_bazel_rules_nodejs//:index.bzl", "node_repositories")
+
+ +

Now you can choose from a few options to finish installation.

+ +

To choose a version of Node.js:

+ +
    +
  1. (Simplest) use the version of Node.js that comes with these rules by default
  2. +
  3. Choose from one of the versions we support natively
  4. +
  5. Tell Bazel where to download a specific version you require
  6. +
  7. Check Node.js into your repository and don’t download anything
  8. +
+ +

These are described in more detail in the following sections.

+ +

Simple usage

+ +

Add this to your WORKSPACE file. It only tells Bazel how to find your +package.json file. It will use default versions of Node.js and npm.

+ +
# NOTE: this rule installs nodejs, npm, and yarn, but does NOT install
+# your npm dependencies into your node_modules folder.
+# You must still run the package manager to do this.
+node_repositories(package_json = ["//:package.json"])
+
+

Installation with a specific supported version of Node.js and Yarn

+ +

You can choose a specific version of Node.js that’s built into these rules. +You can also choose a specific version of Yarn. +Note that some of our packages have started to use features from Node 12, so you may see warnings if you use an older version.

+ +
+

Now that Node 12 is LTS (Long-term support) we encourage you to upgrade, and don’t intend to fix bugs which are only observed in Node 10 or lower.

+
+ +

The available versions are documented on the node_repositories rule in the Built-ins.

+ +

Add to WORKSPACE:

+ +
# NOTE: this rule installs nodejs, npm, and yarn, but does NOT install
+# your npm dependencies into your node_modules folder.
+# You must still run the package manager to do this.
+node_repositories(
+    package_json = ["//:package.json"],
+    node_version = "8.11.1",
+    yarn_version = "1.5.1",
+)
+
+ +

Installation with a manually specified version of NodeJS and Yarn

+ +

If you’d like to use a version of NodeJS and/or Yarn that are not currently supported here, you can manually +specify those in your WORKSPACE:

+ +
load("@build_bazel_rules_nodejs//:index.bzl", "node_repositories")
+
+# NOTE: this rule does NOT install your npm dependencies into your node_modules folder.
+# You must still run the package manager to do this.
+node_repositories(
+  node_version = "8.10.0",
+  yarn_version = "1.5.1",
+  node_repositories = {
+    "8.10.0-darwin_amd64": ("node-v8.10.0-darwin-x64.tar.gz", "node-v8.10.0-darwin-x64", "7d77bd35bc781f02ba7383779da30bd529f21849b86f14d87e097497671b0271"),
+    "8.10.0-linux_amd64": ("node-v8.10.0-linux-x64.tar.xz", "node-v8.10.0-linux-x64", "92220638d661a43bd0fee2bf478cb283ead6524f231aabccf14c549ebc2bc338"),
+    "8.10.0-windows_amd64": ("node-v8.10.0-win-x64.zip", "node-v8.10.0-win-x64", "936ada36cb6f09a5565571e15eb8006e45c5a513529c19e21d070acf0e50321b"),
+  },
+  yarn_repositories = {
+    "1.5.1": ("yarn-v1.5.1.tar.gz", "yarn-v1.5.1", "cd31657232cf48d57fdbff55f38bfa058d2fb4950450bd34af72dac796af4de1"),
+  },
+  node_urls = ["https://nodejs.org/dist/v{version}/{filename}"],
+  yarn_urls = ["https://github.com/yarnpkg/yarn/releases/download/v{version}/{filename}"],
+  package_json = ["//:package.json"])
+
+ +

Specifying node_urls and yarn_urls is optional. If omitted, the default values will be used. You may also use a custom NodeJS version and the default Yarn version or vice-versa.

+ +

Installation with local vendored versions of NodeJS and Yarn

+ +

Finally, you could check Node.js and Yarn into your repository, and not fetch +them from the internet. This is what we do internally at Google.

+ +
load("@build_bazel_rules_nodejs//:index.bzl", "node_repositories")
+
+# Point node_repositories to use locally installed versions of Node.js and Yarn.
+# The vendored_node and vendored_yarn labels point to the extracted contents of
+# https://nodejs.org/dist/v10.12.0/node-v10.12.0-linux-x64.tar.xz and
+# https://github.com/yarnpkg/yarn/releases/download/v1.10.0/yarn-v1.10.0.tar.gz
+# respectively. NOTE: node-v10.12.0-linux-x64 will only work on Linux.
+node_repositories(
+  vendored_node = "@wksp//:third_party/node-v10.12.0-linux-x64",
+  vendored_yarn = "@wksp//:third_party/yarn-v1.10.0",
+  package_json = ["//:package.json"])
+
+ +

In this case, the locally installed Node.js and Yarn are located in the wksp workspace in +the third_party/node-v10.12.0-linux-x64 and third_party/yarn-v1.10.0 folders. When using +vendored_node, you will be restricted to a single platform. vendored_yarn on the other hand, +is platform independent. See /examples/vendored_node in this repository for an example of this +in use.

+ +

NOTE: Vendored Node.js and Yarn are not compatible with Remote Bazel Execution.

+ +

Toolchains

+ +

When you add node_repositories() to your WORKSPACE file it will setup a node toolchain for all currently supported platforms, Linux, macOS and Windows. Amongst other things this adds support for cross-compilations as well as Remote Build Execution support. For more detailed information also see Bazel Toolchains.

+ +

If you have an advanced use-case you can also register your own toolchains and call node_toolchain_configure directly to manually setup a toolchain.

+ +

Cross-compilation

+ +

Toolchains allow us to support cross-compilation, e.g. building a linux binary from mac or windows. To tell Bazel to provide a toolchain for a different platform you have to pass in the --platforms flag. Currently supported values are:

+ +
    +
  • @build_bazel_rules_nodejs//toolchains/node:linux_amd64
  • +
  • @build_bazel_rules_nodejs//toolchains/node:linux_arm64
  • +
  • @build_bazel_rules_nodejs//toolchains/node:darwin_amd64
  • +
  • @build_bazel_rules_nodejs//toolchains/node:windows_amd64
  • +
+ +

So if for example you want to build a docker image from a non-linux platform you would run bazel build --platforms=@build_bazel_rules_nodejs//toolchains/node:linux_amd64 //app, which will ensure that the linux nodejs binary is downloaded and provided to the nodejs_binary target.

+ +

Note: The toolchain currently only provides a platform-specific nodejs binary. Any native modules will still be fetched/built, by npm/yarn, for your host platform, so they will not work on the target platform. Support for cross-compilation with native dependencies will follow.

+ +
+
+ + +
+
+ +
+
+
+
+

© 2020 Google

+
+
+
+ +
+ + + + + + + + + + + + + + + diff --git a/docs/install.md b/docs/install.md index 312f25a690..994bb8f4ff 100644 --- a/docs/install.md +++ b/docs/install.md @@ -1,10 +1,10 @@ --- title: Installation layout: default -stylesheet: docs +toc: true --- -## Custom installation +# Custom installation First, you need Bazel. We recommend using Bazelisk, which is a version-selection wrapper, similar to @@ -17,12 +17,12 @@ $ yarn add -D @bazel/bazelisk @bazel/ibazel $ npm install --save-dev @bazel/bazelisk @bazel/ibazel ``` -> You could install a current bazel distribution, following the [bazel instructions]. +You could install a current bazel distribution, following the [bazel instructions]. -> If you use Bazelisk, see [this workaround](https://github.com/bazelbuild/bazelisk/issues/29#issuecomment-478062147) to get working command-line completion. +If you use Bazelisk, see [this workaround](https://github.com/bazelbuild/bazelisk/issues/29#issuecomment-478062147) to get working command-line completion. -> It's reasonable to globally-install bazelisk so you get a `bazel` command in your $PATH. -> We don't recommend this with ibazel as the version is frequently changing. +It's reasonable to globally-install bazelisk so you get a `bazel` command in your $PATH. +We don't recommend this with ibazel as the version is frequently changing. Next, create a `WORKSPACE` file in your project root (or edit the existing one) containing: @@ -49,7 +49,7 @@ To choose a version of Node.js: These are described in more detail in the following sections. -### Simple usage +## Simple usage Add this to your `WORKSPACE` file. It only tells Bazel how to find your `package.json` file. It will use default versions of Node.js and npm. @@ -60,7 +60,7 @@ Add this to your `WORKSPACE` file. It only tells Bazel how to find your # You must still run the package manager to do this. node_repositories(package_json = ["//:package.json"]) ``` -### Installation with a specific supported version of Node.js and Yarn +## Installation with a specific supported version of Node.js and Yarn You can choose a specific version of Node.js that's built into these rules. You can also choose a specific version of Yarn. @@ -83,7 +83,7 @@ node_repositories( ) ``` -### Installation with a manually specified version of NodeJS and Yarn +## Installation with a manually specified version of NodeJS and Yarn If you'd like to use a version of NodeJS and/or Yarn that are not currently supported here, you can manually specify those in your `WORKSPACE`: @@ -111,7 +111,7 @@ node_repositories( Specifying `node_urls` and `yarn_urls` is optional. If omitted, the default values will be used. You may also use a custom NodeJS version and the default Yarn version or vice-versa. -### Installation with local vendored versions of NodeJS and Yarn +## Installation with local vendored versions of NodeJS and Yarn Finally, you could check Node.js and Yarn into your repository, and not fetch them from the internet. This is what we do internally at Google. @@ -138,285 +138,13 @@ in use. NOTE: Vendored Node.js and Yarn are not compatible with Remote Bazel Execution. -## Dependencies - -Bazel works alongside your existing package manager, either npm or yarn. -You manage your `package.json` file, editing by hand or by running commands like `npm install` or `yarn add`. -The package manager will also write a lock file, indicating exact versions for all transitive dependencies, which keeps your build hermetic and reproducible. -Bazel will run the package manager when the `package.json` or `*lock.json` files change, but you can also run the package manager yourself. - -### Bazel-managed vs self-managed dependencies - -You have two options for managing your `node_modules` dependencies: Bazel-managed or self-managed. - -With the Bazel-managed dependencies approach, Bazel is responsible for making sure that `node_modules` is -up to date with your `package[-lock].json` or `yarn.lock` files. This means Bazel will set it up when the -repository is first cloned, and rebuild it whenever it changes. With the `yarn_install` or `npm_install` -repository rules, Bazel will setup your `node_modules` for you in an external workspace named after the -repository rule. For example, a `yarn_install(name = "npm", ...)` will setup an external -workspace named `@npm` with the `node_modules` folder inside of it as well as generating targets for each -root npm package in `node_modules` for use as dependencies to other rules. - -For Bazel to provide the strongest guarantees about reproducibility and the -fidelity of your build, it is recommended that you use Bazel-managed dependencies. -This approach also allows you to use the generated fine-grained npm package dependencies -which can significantly reduce the number of inputs to actions, making Bazel sand-boxing and -remote-execution faster if there are a large number of files under `node_modules`. - -> Note that as of Bazel 0.26, and with the recommended `managed_directories` attribute on the `workspace` rule in `/WORKSPACE`, -> the Bazel-managed `node_modules` directory is placed in your workspace root in the standard location used by npm or yarn. - -### Using Bazel-managed dependencies - -To have Bazel manage its own copy of `node_modules`, which is useful to avoid -juggling multiple toolchains, you can add one of the following to your `WORKSPACE` -file: - -Using Yarn (preferred): - -```python -load("@build_bazel_rules_nodejs//:index.bzl", "yarn_install") - -yarn_install( - name = "npm", - package_json = "//:package.json", - yarn_lock = "//:yarn.lock", -) -``` - -Using NPM: - -```python -load("@build_bazel_rules_nodejs//:index.bzl", "npm_install") - -npm_install( - name = "npm", - package_json = "//:package.json", - package_lock_json = "//:package-lock.json", -) -``` - -> If you don't need to pass any arguments to `node_repositories`, - you can skip calling that function. `yarn_install` and `npm_install` will do it by default. - -You should now add the `@npm` workspace to the `managed_directories` option in the `workspace` rule at the top of the file. This tells Bazel that the `node_modules` directory is special and is managed by the package manager. -Add the `workspace` rule if it isn't already in your `/WORKSPACE` file. - -```python -workspace( - name = "my_wksp", - managed_directories = {"@npm": ["node_modules"]}, -) -``` - -As of Bazel 0.26 this feature is still experimental, so also add this line to the `.bazelrc` to opt-in: - -``` -common --experimental_allow_incremental_repository_updates -``` - -#### yarn_install vs. npm_install - -`yarn_install` is the preferred rule for setting up Bazel-managed dependencies for a number of reasons: - -* `yarn_install` will use the global yarn cache by default which will improve your build performance (this can be turned off with the `use_global_yarn_cache` attribute) -* npm has a known peer dependency hoisting issue that can lead to missing peer dependencies in some cases (see https://github.com/bazelbuild/rules_nodejs/issues/416) - -#### Fine-grained npm package dependencies - -You can then reference individual npm packages in your `BUILD` rules via: - -```python -load("@build_bazel_rules_nodejs//:index.bzl", "nodejs_binary") - -nodejs_binary( - name = "bar", - data = [ - "@npm//foo", - "@npm//baz", - ] - ... -) -``` - -In this case, the `bar` nodejs_binary depends only the `foo` and `baz` npm packages -and all of their transitive deps. - -For other rules such as `jasmine_node_test`, fine grained -npm dependencies are specified in the `deps` attribute: - -```python -jasmine_node_test( - name = "test", - ... - deps = [ - "@npm//jasmine", - "@npm//foo", - "@npm//baz", - ... - ], -) -``` - -#### Multiple sets of npm dependencies - -If your workspace has multiple applications, each with their own `package.json` -and npm deps, `yarn_install` (or `npm_install`) can be called separately for -each. - -```python -workspace( - name = "my_wksp", - managed_directories = { - "@app1_npm": ["app1/node_modules"], - "@app2_npm": ["app2/node_modules"], - }, -) - -yarn_install( - name = "app1_npm", - package_json = "//app1:package.json", - yarn_lock = "//app1:yarn.lock", -) - -yarn_install( - name = "app2_npm", - package_json = "//app2:package.json", - yarn_lock = "//app2:yarn.lock", -) -``` - -Your application would then reference its deps as (for example) `@app1_npm//lodash`, or `@app2_npm//jquery`. - -#### Fine-grained npm package nodejs_binary targets - -If an npm package lists one or more `bin` entry points in its `package.json`, -`nodejs_binary` targets will be generated for these. - -For example, the `protractor` package has two bin entries in its `package.json`: - -```json - "bin": { - "protractor": "bin/protractor", - "webdriver-manager": "bin/webdriver-manager" - }, -``` - -These will result in two generated `nodejs_binary` targets in the `@npm//protractor/bin` -package (if your npm deps workspace is `@npm`): - -* `@npm//protractor/bin:protractor` -* `@npm//protractor/bin:webdriver-manager` - -These targets can be used as executables for actions in custom rules or can -be run by Bazel directly. For example, you can run protractor with the -following: - -```sh -$ bazel run @npm//protractor/bin:protractor -``` - -Note: These targets are in the `protractor/bin` package so they don't -conflict with the targets to use in deps[]. For example, `@npm//protractor:protractor` -is target to use in deps[] while `@npm//protractor/bin:protractor` is the binary target. - -#### Coarse node_modules dependencies - -Using fine grained npm dependencies is recommended to minimize -the number of inputs to your rules. However, for backward compatibility -there are also filegroups defined by `yarn_install` and `npm_install` -that include all packages under `node_modules` and which can be used -with the `node_modules` attribute of nodejs rules. - -* `@npm//:node_modules` includes all packages under `node_modules` as well as the `.bin` folder - -```python -load("@build_bazel_rules_nodejs//:index.bzl", "nodejs_binary") - -nodejs_binary( - name = "bar", - node_modules = "@npm//:node_modules", -) -``` - -### Using self-managed dependencies - -If you'd like to have Bazel use the `node_modules` directory you are managing, -then next you will create a `BUILD.bazel` file in your project root containing: - -```python -package(default_visibility = ["//visibility:public"]) - -filegroup( - name = "node_modules", - srcs = glob( - include = ["node_modules/**/*"], - exclude = [ - # Files under test & docs may contain file names that - # are not legal Bazel labels (e.g., - # node_modules/ecstatic/test/public/中文/檔案.html) - "node_modules/test/**", - "node_modules/docs/**", - # Files with spaces are not allowed in Bazel runfiles - # See https://github.com/bazelbuild/bazel/issues/4327 - "node_modules/**/* */**", - "node_modules/**/* *", - ], - ), -) -``` - -The example in `examples/user_managed_deps` uses self-managed dependencies. - -To use the Yarn package manager, which we recommend for its built-in -verification command, you can run: - -```sh -$ bazel run @nodejs//:yarn_node_repositories -``` - -If you use npm instead, run: - -```sh -$ bazel run @nodejs//:npm_node_repositories install -``` - -The `@nodejs//:yarn_node_repositories` and `@nodejs//:npm_node_repositories` targets will run yarn/npm on all of the -package.json contexts listed `package_json` attribute of the `node_repositories` -repository rule in your WORKSPACE file (`node_repositories(package_json = [...])`). - -If there are multiple package.json contexts in this rule but you would like to -run the bazel managed yarn or npm on a single context this can be done -using the following targets: - -```sh -$ bazel run @nodejs//:yarn -- -``` - -If you use npm instead, run: - -```sh -$ bazel run @nodejs//:npm -- -``` - -This will run yarn/npm in the current working directory. To add a package with the `yarn add` command, -for example, you would use: - -```sh -$ bazel run @nodejs//:yarn -- add -``` - -Note: the arguments passed to `bazel run` after `--` are forwarded to the executable being run. - -[bazel instructions]: https://docs.bazel.build/versions/master/install.html - -### Toolchains +## Toolchains When you add `node_repositories()` to your `WORKSPACE` file it will setup a node toolchain for all currently supported platforms, Linux, macOS and Windows. Amongst other things this adds support for cross-compilations as well as Remote Build Execution support. For more detailed information also see [Bazel Toolchains](https://docs.bazel.build/versions/master/toolchains.html). If you have an advanced use-case you can also register your own toolchains and call `node_toolchain_configure` directly to manually setup a toolchain. -#### Cross-compilation +### Cross-compilation Toolchains allow us to support cross-compilation, e.g. building a linux binary from mac or windows. To tell Bazel to provide a toolchain for a different platform you have to pass in the `--platforms` flag. Currently supported values are: diff --git a/docs/repositories.html b/docs/repositories.html new file mode 100755 index 0000000000..110944420a --- /dev/null +++ b/docs/repositories.html @@ -0,0 +1,342 @@ + + + + + + + + + + rules_nodejs - Generated Repositories + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+

Generated Repositories

+ +

rules_nodejs produces several repositories for you to reference. +Bazel represents your workspace as one repository, and code fetched or installed from outside your workspace lives in other repositories. +These are referenced with the @repo// syntax in your BUILD files.

+ +

@nodejs

+ +

This repository is created by calling the node_repositories function in your WORKSPACE file. +It contains the node, npm, and yarn programs.

+ +

As always, bazel query is useful for learning about what targets are available.

+ +
$ bazel query @nodejs//...
+@nodejs//:node
+...
+
+ +

You don’t typically need to reference the @nodejs repository from your BUILD files because it’s used behind the scenes +to run node and fetch dependencies.

+ +

Some ways you can use this:

+ +
    +
  • Run the Bazel-managed version of node: bazel run @nodejs//:node path/to/program.js
  • +
  • Run the Bazel-managed version of npm: bazel run @nodejs//:npm
  • +
  • Run the Bazel-managed version of yarn: bazel run @nodejs//:yarn
  • +
  • Install dependencies from nested package.json file(s) which were passed to node_repositories#package.json +
      +
    • using npm: bazel run @nodejs//:npm_node_repositories install
    • +
    • using yarn: bazel run @nodejs//:yarn_node_repositories
    • +
    +
  • +
+ +

@npm

+ +

This repository is created by calling the npm_install or yarn_install function in your WORKSPACE file.

+ +

The name @npm is recommended in the simple case that you install only a single package.json file. +If you have multiple, call the npm_install or yarn_install multiple times, and give each one a unique name. +This results in multiple repositories, named whatever you chose, rather than “npm”. +The following applies to any repository created by npm_install , or yarn_install, just replace @npm with the name you chose.

+ +

Again, use bazel query @npm//... to learn about all the targets declared in this repository.

+ +

Our philosophy is to mirror the installed npm dependencies in a way that’s idiomatic to reference them in Bazel.

+ +

Commonly used ones are:

+ +
    +
  • Every file that was installed from npm: @npm//:node_modules. This target can have a very large number of files and slow down your build, however it’s a simple way to skip having to declare more fine-grained inputs to your BUILD targets.
  • +
  • If you had a dependency on the foo package, you can reference @npm//foo to get all the files. We mirror the npm dependency graph, so if foo declares a dependency on another package dep, Bazel will include that dependency when foo is used.
  • +
  • If the foo package has an executable program bar, then @npm//foo/bin:bar is a nodejs_binary that you can call with bazel run or can pass as the executable to your own rules.
  • +
  • Sometimes you need a UMD bundle, but a package doesn’t ship one. For example, the ts_devserver rule depends on third-party libraries having a named UMD entry point. The @npm//foo:foo__umd target will automatically run Browserify to convert the package’s main entry into UMD.
  • +
  • DEPRECATED: A helper to install npm packages into their own Bazel repository: @npm//:install_bazel_dependencies.bzl provides a install_bazel_dependencies function. Some npm packages ship custom bazel rules, for example, the @angular/bazel package provides rules which you should load from @npm_angular_bazel//:index.bzl. However this causes the build to always fetch npm packages even when not needed, so we plan to remove this in a future release.
  • +
+ +
+

One convenient (maybe also confusing) way to understand what BUILD files are generated is to look at our integration test at https://github.com/bazelbuild/rules_nodejs/tree/stable/internal/npm_install/test/golden - this directory looks similar to the content of an @npm repository.

+
+ +

Generated macros for npm packages with bin entries

+ +

Any installed package that has one or more bin entries in the package.json get convenient macros generated. +These are the Bazel equivalent of the ./node_modules/.bin/* files in your project which the package manager created.

+ +

For a package foo with some bin entries, we will create a .bzl file where you can load rules, at @npm//foo:index.bzl

+ +

If the foo package contains a bin entry bar, the index.bzl file will contain bar and bar_test macros. You can load these two generated rules in your BUILD file:

+ +

load("@npm//foo:index.bzl", "bar", "bar_test")

+ +

The bar macro can be called in two ways. If you pass outs or output_dir, it produces an npm_package_bin rule that invokes the tool to transform some inputs to outputs, useful as a dependency of another rule, or with bazel build. If you don’t pass outs or output_dir, then it will produce a nodejs_binary rule intended for use with bazel run. (The latter is identical to the @npm//foo/bin:bar target, just giving you a convenient way to alias it with a different label and pass it arguments).

+ +

See examples in rules_nodejs. A typical tool to use with outs is Babel, while a typical rule with no outputs is http_server.

+ +

The bar_test macro produces a nodejs_test that assumes the tool is a test runner, and produces a zero or one exit code, useful as a target with bazel test. See the examples of mocha_test in rules_nodejs.

+ +

You can also read https://dev.to/bazel/layering-in-bazel-for-web-389h to see an end-to-end example of using the generated bin macros.

+ +
+
+ + +
+
+ +
+
+
+
+

© 2020 Google

+
+
+
+ +
+ + + + + + + + + + + + + + + diff --git a/docs/repositories.md b/docs/repositories.md index fca1b59863..fd10284db5 100644 --- a/docs/repositories.md +++ b/docs/repositories.md @@ -1,8 +1,9 @@ --- title: Generated Repositories layout: default -stylesheet: docs +toc: true --- +# Generated Repositories rules_nodejs produces several repositories for you to reference. Bazel represents your workspace as one repository, and code fetched or installed from outside your workspace lives in other repositories. @@ -56,7 +57,7 @@ Commonly used ones are: > One convenient (maybe also confusing) way to understand what BUILD files are generated is to look at our integration test at https://github.com/bazelbuild/rules_nodejs/tree/stable/internal/npm_install/test/golden - this directory looks similar to the content of an `@npm` repository. -### Generated macros for npm packages with `bin` entries +## Generated macros for npm packages with `bin` entries Any installed package that has one or more `bin` entries in the package.json get convenient macros generated. These are the Bazel equivalent of the `./node_modules/.bin/*` files in your project which the package manager created. diff --git a/docs/stamping.html b/docs/stamping.html new file mode 100755 index 0000000000..be661a17b9 --- /dev/null +++ b/docs/stamping.html @@ -0,0 +1,323 @@ + + + + + + + + + + rules_nodejs - Home + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+

Stamping

+ +

Bazel is generally only a build tool, and is unaware of your version control system. +However, when publishing releases, you typically want to embed version information in the resulting distribution. +Bazel supports this natively, using the following approach:

+ +

To stamp a build, you must pass the --stamp argument to Bazel.

+ +
+

Previous releases of rules_nodejs stamped builds always. +However this caused stamp-aware actions to never be remotely cached, since the volatile +status file is passed as an input and its checksum always changes.

+
+ +

Also pass the workspace_status_command argument to bazel build. +We prefer to do these with an entry in .bazelrc:

+ +
# This tells Bazel how to interact with the version control system
+# Enable this with --config=release
+build:release --stamp --workspace_status_command=./tools/bazel_stamp_vars.sh
+
+ +

Then create tools/bazel_stamp_vars.sh.

+ +

This is a script that prints variable/value pairs. +Make sure you set the executable bit, eg. chmod 755 tools/bazel_stamp_vars.sh. +For example, we could run git describe to get the current tag:

+ +
#!/usr/bin/env bash
+echo BUILD_SCM_VERSION $(git describe --abbrev=7 --tags HEAD)
+
+ +

For a more full-featured script, take a look at the bazel_stamp_vars in Angular

+ +

Finally, we recommend a release script around Bazel. We typically have more than one npm package published from one Bazel workspace, so we do a bazel query to find them, and publish in a loop. Here is a template to get you started:

+ +
#!/usr/bin/env bash
+
+set -u -e -o pipefail
+
+# Call the script with argument "pack" or "publish"
+readonly NPM_COMMAND=${1:-publish}
+# Don't rely on $PATH to have the right version
+readonly BAZEL_BIN=./node_modules/.bin/bazel
+# Use a new output_base so we get a clean build
+# Bazel can't know if the git metadata changed
+readonly TMP=$(mktemp -d -t bazel-release.XXXXXXX)
+readonly BAZEL="$BAZEL_BIN --output_base=$TMP"
+# Find all the npm packages in the repo
+readonly PKG_NPM_LABELS=`$BAZEL query --output=label 'kind("pkg_npm", //...)'`
+# Build them in one command to maximize parallelism
+$BAZEL build --config=release $PKG_NPM_LABELS
+# publish one package at a time to make it easier to spot any errors or warnings
+for pkg in $PKG_NPM_LABELS ; do
+  $BAZEL run --config=release -- ${pkg}.${NPM_COMMAND} --access public --tag latest
+done
+
+ +
+

WARNING: Bazel can’t track changes to git tags. That means it won’t rebuild a target if only the result of the workspace_status_command has changed. So changes to the version information may not be reflected if you re-build the package or bundle, and nothing in the package or bundle has changed.

+
+ +

See https://www.kchodorow.com/blog/2017/03/27/stamping-your-builds/ for more background.

+ + +
+
+ + +
+
+ +
+
+
+
+

© 2020 Google

+
+
+
+ +
+ + + + + + + + + + + + + + + diff --git a/docs/stamping.md b/docs/stamping.md new file mode 100644 index 0000000000..24373715fb --- /dev/null +++ b/docs/stamping.md @@ -0,0 +1,70 @@ +--- +title: Home +layout: default +toc: true +--- + +# Stamping + +Bazel is generally only a build tool, and is unaware of your version control system. +However, when publishing releases, you typically want to embed version information in the resulting distribution. +Bazel supports this natively, using the following approach: + +To stamp a build, you must pass the `--stamp` argument to Bazel. + +> Previous releases of rules_nodejs stamped builds always. +> However this caused stamp-aware actions to never be remotely cached, since the volatile +> status file is passed as an input and its checksum always changes. + +Also pass the `workspace_status_command` argument to `bazel build`. +We prefer to do these with an entry in `.bazelrc`: + +```sh +# This tells Bazel how to interact with the version control system +# Enable this with --config=release +build:release --stamp --workspace_status_command=./tools/bazel_stamp_vars.sh +``` + +Then create `tools/bazel_stamp_vars.sh`. + +This is a script that prints variable/value pairs. +Make sure you set the executable bit, eg. `chmod 755 tools/bazel_stamp_vars.sh`. +For example, we could run `git describe` to get the current tag: + +```bash +#!/usr/bin/env bash +echo BUILD_SCM_VERSION $(git describe --abbrev=7 --tags HEAD) +``` + +For a more full-featured script, take a look at the [bazel_stamp_vars in Angular] + +Finally, we recommend a release script around Bazel. We typically have more than one npm package published from one Bazel workspace, so we do a `bazel query` to find them, and publish in a loop. Here is a template to get you started: + +```sh +#!/usr/bin/env bash + +set -u -e -o pipefail + +# Call the script with argument "pack" or "publish" +readonly NPM_COMMAND=${1:-publish} +# Don't rely on $PATH to have the right version +readonly BAZEL_BIN=./node_modules/.bin/bazel +# Use a new output_base so we get a clean build +# Bazel can't know if the git metadata changed +readonly TMP=$(mktemp -d -t bazel-release.XXXXXXX) +readonly BAZEL="$BAZEL_BIN --output_base=$TMP" +# Find all the npm packages in the repo +readonly PKG_NPM_LABELS=`$BAZEL query --output=label 'kind("pkg_npm", //...)'` +# Build them in one command to maximize parallelism +$BAZEL build --config=release $PKG_NPM_LABELS +# publish one package at a time to make it easier to spot any errors or warnings +for pkg in $PKG_NPM_LABELS ; do + $BAZEL run --config=release -- ${pkg}.${NPM_COMMAND} --access public --tag latest +done +``` + +> WARNING: Bazel can't track changes to git tags. That means it won't rebuild a target if only the result of the workspace_status_command has changed. So changes to the version information may not be reflected if you re-build the package or bundle, and nothing in the package or bundle has changed. + +See https://www.kchodorow.com/blog/2017/03/27/stamping-your-builds/ for more background. + +[bazel_stamp_vars in Angular]: https://github.com/angular/angular/blob/master/tools/bazel_stamp_vars.sh diff --git a/internal/common/copy_to_bin.bzl b/internal/common/copy_to_bin.bzl index 88243eb8d7..88ce33e541 100644 --- a/internal/common/copy_to_bin.bzl +++ b/internal/common/copy_to_bin.bzl @@ -38,7 +38,7 @@ _copy_to_bin = rule( ) def copy_to_bin(name, srcs, **kwargs): - """Copies a source file to bazel-bin at the same workspace-relative path path. + """Copies a source file to bazel-bin at the same workspace-relative path. e.g. `/foo/bar/a.txt -> /foo/bar/a.txt` diff --git a/internal/node/node.bzl b/internal/node/node.bzl index 56c6d3dd71..9a8f326555 100644 --- a/internal/node/node.bzl +++ b/internal/node/node.bzl @@ -368,7 +368,7 @@ The set of default environment variables is: If the entry JavaScript file belongs to the same package (as the BUILD file), you can simply reference it by its relative name to the package directory: -``` +```python nodejs_binary( name = "my_binary", ... @@ -379,7 +379,7 @@ nodejs_binary( You can specify the entry point as a typescript file so long as you also include the ts_library target in data: -``` +```python ts_library( name = "main", srcs = ["main.ts"], @@ -397,7 +397,7 @@ The rule will use the corresponding `.js` output of the ts_library rule as the e If the entry point target is a rule, it should produce a single JavaScript entry file that will be passed to the nodejs_binary rule. For example: -``` +```python filegroup( name = "entry_file", srcs = ["main.js"], @@ -411,7 +411,7 @@ nodejs_binary( The entry_point can also be a label in another workspace: -``` +```python nodejs_binary( name = "history-server", entry_point = "@npm//:node_modules/history-server/modules/cli.js", @@ -431,7 +431,7 @@ to npm dependencies is to use fine grained npm dependencies which are setup with the `yarn_install` or `npm_install` rules. For example, in targets that used a `//:node_modules` filegroup, -``` +```python nodejs_binary( name = "my_binary", ... @@ -444,7 +444,7 @@ to be inputs to the `my_binary`. Using fine grained npm dependencies, `my_binary` is defined with only the npm dependencies that are needed: -``` +```python nodejs_binary( name = "my_binary", ... @@ -474,7 +474,7 @@ yarn_install( For other rules such as `jasmine_node_test`, fine grained npm dependencies are specified in the `deps` attribute: -``` +```python jasmine_node_test( name = "my_test", ... @@ -514,7 +514,7 @@ To get from a `$(rootpath)` to the absolute path that `$$(rlocation $(location)) `$$(rlocation $(rootpath))` if you are in the `templated_args` of a `nodejs_binary` or `nodejs_test`: BUILD.bazel: -``` +```python nodejs_test( name = "my_test", data = [":bootstrap.js"], @@ -526,7 +526,7 @@ or if you're in the context of a .js script you can pass the $(rootpath) as an a and use the javascript runfiles helper to resolve to the absolute path: BUILD.bazel: -``` +```python nodejs_test( name = "my_test", data = [":some_file"], @@ -536,7 +536,7 @@ nodejs_test( ``` my_test.js -``` +```python const runfiles = require(process.env['BAZEL_NODE_RUNFILES_HELPER']); const args = process.argv.slice(2); const some_file = runfiles.resolveWorkspaceRelative(args[0]); @@ -672,7 +672,7 @@ See rules_nodejs/internal/node/test/chdir for an example. To debug a Node.js test, we recommend saving a group of flags together in a "config". Put this in your `tools/bazel.rc` so it's shared with your team: -``` +```python # Enable debugging tests with --config=debug test:debug --test_arg=--node_options=--inspect-brk --test_output=streamed --test_strategy=exclusive --test_timeout=9999 --nocache_test_results ``` diff --git a/internal/node/node_repositories.bzl b/internal/node/node_repositories.bzl index e7f11ef3b5..3d9c0a298d 100644 --- a/internal/node/node_repositories.bzl +++ b/internal/node/node_repositories.bzl @@ -27,20 +27,82 @@ load("//toolchains/node:node_toolchain_configure.bzl", "node_toolchain_configure _DOC = """To be run in user's WORKSPACE to install rules_nodejs dependencies. -This rule sets up node, npm, and yarn. +This rule sets up node, npm, and yarn. The versions of these tools can be specified in one of three ways + +### Simplest Usage -The versions of these tools can be specified in one of three ways: -- Simplest Usage: Specify no explicit versions. This will download and use the latest NodeJS & Yarn that were available when the version of rules_nodejs you're using was released. Note that you can skip calling `node_repositories` in your WORKSPACE file - if you later try to `yarn_install` or `npm_install`, we'll automatically select this simple usage for you. -- Forced version(s): + +### Forced version(s) + You can select the version of NodeJS and/or Yarn to download & use by specifying it when you call node_repositories, using a value that matches a known version (see the default values) -- Using a custom version: + +### Using a custom version + You can pass in a custom list of NodeJS and/or Yarn repositories and URLs for node_resositories to use. -- Using a local version: + +#### Custom NodeJS versions + +To specify custom NodeJS versions, use the `node_repositories` attribute + +```python +node_repositories( + node_repositories = { + "10.10.0-darwin_amd64": ("node-v10.10.0-darwin-x64.tar.gz", "node-v10.10.0-darwin-x64", "00b7a8426e076e9bf9d12ba2d571312e833fe962c70afafd10ad3682fdeeaa5e"), + "10.10.0-linux_amd64": ("node-v10.10.0-linux-x64.tar.xz", "node-v10.10.0-linux-x64", "686d2c7b7698097e67bcd68edc3d6b5d28d81f62436c7cf9e7779d134ec262a9"), + "10.10.0-windows_amd64": ("node-v10.10.0-win-x64.zip", "node-v10.10.0-win-x64", "70c46e6451798be9d052b700ce5dadccb75cf917f6bf0d6ed54344c856830cfb"), + }, +) +``` + +These can be mapped to a custom download URL, using `node_urls` + +```python +node_repositories( + node_version = "10.10.0", + node_repositories = {"10.10.0-darwin_amd64": ("node-v10.10.0-darwin-x64.tar.gz", "node-v10.10.0-darwin-x64", "00b7a8426e076e9bf9d12ba2d571312e833fe962c70afafd10ad3682fdeeaa5e")}, + node_urls = ["https://mycorpproxy/mirror/node/v{version}/{filename}"], +) +``` + +A Mac client will try to download node from `https://mycorpproxy/mirror/node/v10.10.0/node-v10.10.0-darwin-x64.tar.gz` +and expect that file to have sha256sum `00b7a8426e076e9bf9d12ba2d571312e833fe962c70afafd10ad3682fdeeaa5e` + +#### Custom Yarn versions + +To specify custom Yarn versions, use the `yarn_repositories` attribute + +```python +node_repositories( + yarn_repositories = { + "1.12.1": ("yarn-v1.12.1.tar.gz", "yarn-v1.12.1", "09bea8f4ec41e9079fa03093d3b2db7ac5c5331852236d63815f8df42b3ba88d"), + }, +) +``` + +Like `node_urls`, the `yarn_urls` attribute can be used to provide a list of custom URLs to use to download yarn + +```python +node_repositories( + yarn_repositories = { + "1.12.1": ("yarn-v1.12.1.tar.gz", "yarn-v1.12.1", "09bea8f4ec41e9079fa03093d3b2db7ac5c5331852236d63815f8df42b3ba88d"), + }, + yarn_version = "1.12.1", + yarn_urls = [ + "https://github.com/yarnpkg/yarn/releases/download/v{version}/{filename}", + ], +) +``` + +Will download yarn from https://github.com/yarnpkg/yarn/releases/download/v1.2.1/yarn-v1.12.1.tar.gz` +and expect the file to have sha256sum `09bea8f4ec41e9079fa03093d3b2db7ac5c5331852236d63815f8df42b3ba88d`. + +### Using a local version + To avoid downloads, you can check in vendored copies of NodeJS and/or Yarn and set vendored_node and or vendored_yarn to point to those before calling node_repositories. You can also point to a location where node is installed on your computer, but we don't recommend this because it leads to version skew between you, your coworkers, and your Continuous Integration environment. @@ -53,8 +115,6 @@ See the [the repositories documentation](repositories.html) for how to use the r You can optionally pass a `package_json` array to node_repositories. This lets you use Bazel's version of yarn or npm, yet always run the package manager yourself. This is an advanced scenario you can use in place of the `npm_install` or `yarn_install` rules, but we don't recommend it, and might remove it in the future. -Example: - ``` load("@build_bazel_rules_nodejs//:index.bzl", "node_repositories") node_repositories(package_json = ["//:package.json", "//subpkg:package.json"]) @@ -73,18 +133,6 @@ _ATTRS = { A dictionary mapping NodeJS versions to sets of hosts and their corresponding (filename, strip_prefix, sha256) tuples. You should list a node binary for every platform users have, likely Mac, Windows, and Linux. - -For example, - -```python -node_repositories( - node_repositories = { - "10.10.0-darwin_amd64": ("node-v10.10.0-darwin-x64.tar.gz", "node-v10.10.0-darwin-x64", "00b7a8426e076e9bf9d12ba2d571312e833fe962c70afafd10ad3682fdeeaa5e"), - "10.10.0-linux_amd64": ("node-v10.10.0-linux-x64.tar.xz", "node-v10.10.0-linux-x64", "686d2c7b7698097e67bcd68edc3d6b5d28d81f62436c7cf9e7779d134ec262a9"), - "10.10.0-windows_amd64": ("node-v10.10.0-win-x64.zip", "node-v10.10.0-win-x64", "70c46e6451798be9d052b700ce5dadccb75cf917f6bf0d6ed54344c856830cfb"), - }, -) -``` """, ), "node_urls": attr.string_list( @@ -98,19 +146,6 @@ Each entry is a template for downloading a node distribution. The `{version}` parameter is substituted with the `node_version` attribute, and `{filename}` with the matching entry from the `node_repositories` attribute. - -For example, given - -```python -node_repositories( - node_version = "10.10.0", - node_repositories = {"10.10.0-darwin_amd64": ("node-v10.10.0-darwin-x64.tar.gz", "node-v10.10.0-darwin-x64", "00b7a8426e076e9bf9d12ba2d571312e833fe962c70afafd10ad3682fdeeaa5e")}, - node_urls = ["https://mycorpproxy/mirror/node/v{version}/{filename}"], -) -``` - -A Mac client will try to download node from `https://mycorpproxy/mirror/node/v10.10.0/node-v10.10.0-darwin-x64.tar.gz` -and expect that file to have sha256sum `00b7a8426e076e9bf9d12ba2d571312e833fe962c70afafd10ad3682fdeeaa5e` """, ), "node_version": attr.string( @@ -164,16 +199,6 @@ are supported by the node version being used.""", doc = """Custom list of yarn repositories to use. Dictionary mapping Yarn versions to their corresponding (filename, strip_prefix, sha256) tuples. - -For example, - -```python -node_repositories( - yarn_repositories = { - "1.12.1": ("yarn-v1.12.1.tar.gz", "yarn-v1.12.1", "09bea8f4ec41e9079fa03093d3b2db7ac5c5331852236d63815f8df42b3ba88d"), - }, -) -``` """, ), "yarn_urls": attr.string_list( @@ -184,23 +209,6 @@ node_repositories( doc = """custom list of URLs to use to download Yarn Each entry is a template, similar to the `node_urls` attribute, using `yarn_version` and `yarn_repositories` in the substitutions. - -For example, - -```python -node_repositories( - yarn_repositories = { - "1.12.1": ("yarn-v1.12.1.tar.gz", "yarn-v1.12.1", "09bea8f4ec41e9079fa03093d3b2db7ac5c5331852236d63815f8df42b3ba88d"), - }, - yarn_version = "1.12.1", - yarn_urls = [ - "https://github.com/yarnpkg/yarn/releases/download/v{version}/{filename}", - ], -) -``` - -Will download yarn from https://github.com/yarnpkg/yarn/releases/download/v1.2.1/yarn-v1.12.1.tar.gz` -and expect the file to have sha256sum `09bea8f4ec41e9079fa03093d3b2db7ac5c5331852236d63815f8df42b3ba88d`. """, ), "yarn_version": attr.string( diff --git a/internal/providers/linkable_package_info.bzl b/internal/providers/linkable_package_info.bzl index dc821c17bf..1c659520a0 100644 --- a/internal/providers/linkable_package_info.bzl +++ b/internal/providers/linkable_package_info.bzl @@ -29,13 +29,13 @@ In the future, the linker may validate that the names match the name in a packag Path must be relative to execroot/wksp. It can either an output dir path such as, -'bazel-out/-/bin/path/to/package' or -'bazel-out/-/bin/external//path/to/package' +`bazel-out/<platform>-<build>/bin/path/to/package` or +`bazel-out/<platform>-<build>/bin/external/&llt;external_wksp>/path/to/package` or a source file path such as, -'path/to/package' or -'external//path/to/package' +`path/to/package` or +`external/<external_wksp>/path/to/package` """, "_tslibrary": "For internal use only", }, diff --git a/package.json b/package.json index 403f782f55..be8eb79766 100644 --- a/package.json +++ b/package.json @@ -128,7 +128,7 @@ "update-nodejs-versions": "node ./scripts/update-nodejs-versions.js > internal/node/node_versions.bzl", "format": "git-clang-format", "format-all": "clang-format --glob='{internal/**/,examples/**/}*.{js,ts}' -i", - "stardoc": "bazel build //docs && cp -f dist/bin/docs/*.md docs", + "stardoc": "bazel build //docs && cp -f dist/bin/docs/*.md ./docs && cp -f dist/bin/docs/docs-out/*.html ./docs && cp -f dist/bin/docs/docs-out/css/*.css ./docs/css", "version": "conventional-changelog -p angular -i CHANGELOG.md -s && node ./scripts/on-version.js && bazel build //:release && node ./scripts/on-release.js && git stage version.bzl docs/install.md packages/create/index.js README.md CHANGELOG.md e2e/*/WORKSPACE examples/*/WORKSPACE", "postinstall": "patch-package && node internal/npm_install/test/postinstall.js" }, diff --git a/packages/cypress/install.md b/packages/cypress/install.md index 2f65fa44cd..228a72d4fb 100644 --- a/packages/cypress/install.md +++ b/packages/cypress/install.md @@ -36,7 +36,7 @@ build --experimental_inprocess_symlink_creation At this point in time, `cypress_repository` is incompatible with bazel sandboxing on Windows. This may change in the future, but for now using cypress on windows requires windows sandboxing be disabled (it is disabled by default) ## Example use of cypress_web_test -This example assumes you've named your external repository for node_modules as `npm` and for cypress as `cypress` +This example assumes you've named your external repository for node_modules as `npm` and for cypress as `cypress` ```python load("@cypress//:index.bzl", "cypress_web_test") load("@npm//@bazel/typescript:index.bzl", "ts_library") @@ -80,4 +80,4 @@ cypress_web_test( # Your cypress plugin used to configure cypress and boot your server plugins_file = ":plugins_file", ) -``` \ No newline at end of file +``` diff --git a/packages/terser/terser_minified.bzl b/packages/terser/terser_minified.bzl index 98b8a9e8d8..efe4c258c4 100644 --- a/packages/terser/terser_minified.bzl +++ b/packages/terser/terser_minified.bzl @@ -50,13 +50,13 @@ https://github.com/terser-js/terser#minify-options documents the content of the Bazel will make a copy of your config file, treating it as a template. -> Run bazel with `--subcommands` to see the path to the copied file. +Run bazel with `--subcommands` to see the path to the copied file. If you use the magic strings `"bazel_debug"` or `"bazel_no_debug"`, these will be replaced with `true` and `false` respecting the value of the `debug` attribute or the `--compilation_mode=dbg` bazel flag. -For example, +For example ``` { @@ -65,6 +65,7 @@ For example, } } ``` + Will disable the `arrows` compression setting when debugging. If `config_file` isn't supplied, Bazel will use a default config file. diff --git a/packages/typescript/install.md b/packages/typescript/install.md index edf4532d62..f98fa0bff3 100644 --- a/packages/typescript/install.md +++ b/packages/typescript/install.md @@ -145,9 +145,9 @@ on packages which aren't declared as dependencies. For example, if you use [tsic  [tsickle]: https://github.com/angular/tsickle -# Usage +## Usage -## Compiling TypeScript: `ts_library` +### Compiling TypeScript: `ts_library` The `ts_library` rule invokes the TypeScript compiler on one compilation unit, or "library" (generally one directory of source files). @@ -336,7 +336,7 @@ See [path mapping] for more details on the paths syntax. Similarly, you can use path mapping to teach the editor how to resolve imports from `ts_library` rules which set the `module_name` attribute. -## Notes +### Notes If you'd like a "watch mode", try [ibazel]. @@ -346,5 +346,3 @@ BUILD files from your source code. [gazelle]: https://github.com/bazelbuild/rules_go/tree/master/go/tools/gazelle [ibazel]: https://github.com/bazelbuild/bazel-watcher [path mapping]: https://www.typescriptlang.org/docs/handbook/module-resolution.html#path-mapping - -# API documentation diff --git a/packages/typescript/test/ts_project/simple/tsconfig.json b/packages/typescript/test/ts_project/simple/tsconfig.json index e98f617914..56d9d8ed34 100644 --- a/packages/typescript/test/ts_project/simple/tsconfig.json +++ b/packages/typescript/test/ts_project/simple/tsconfig.json @@ -2,4 +2,4 @@ "compilerOptions": { "types": [] } -} \ No newline at end of file +} diff --git a/tools/stardoc/BUILD.bazel b/tools/stardoc/BUILD.bazel index 801dc3c4ef..fbc54bf2bd 100644 --- a/tools/stardoc/BUILD.bazel +++ b/tools/stardoc/BUILD.bazel @@ -1 +1,4 @@ -exports_files(glob(["templates/*.vm"])) +exports_files(glob(["templates/*.vm"] + [ + "post-process-docs.js", + "jekyll_serve_tpl.sh", +])) diff --git a/tools/stardoc/index.bzl b/tools/stardoc/index.bzl index d72a1d35f1..44c3a5993d 100644 --- a/tools/stardoc/index.bzl +++ b/tools/stardoc/index.bzl @@ -1,6 +1,9 @@ "Wrap stardoc to set our repo-wide defaults" load("@io_bazel_stardoc//stardoc:stardoc.bzl", _stardoc = "stardoc") +load("//tools/stardoc:jekyll.bzl", _rules_nodejs_docs = "rules_nodejs_docs") + +rules_nodejs_docs = _rules_nodejs_docs _PKG = "@build_bazel_rules_nodejs//tools/stardoc" diff --git a/tools/stardoc/jekyll.bzl b/tools/stardoc/jekyll.bzl new file mode 100644 index 0000000000..08d75cf838 --- /dev/null +++ b/tools/stardoc/jekyll.bzl @@ -0,0 +1,153 @@ +# Copyright 2017 The Bazel Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Rule to build a Jekyll site and perform post processing + +Infulanced by the main bazel.build Jekyll rule here: +https://github.com/bazelbuild/bazel/blob/master/scripts/docs/jekyll.bzl +""" + +load("@rules_pkg//:pkg.bzl", _pkg_tar = "pkg_tar") +load("//:index.bzl", _nodejs_binary = "nodejs_binary") + +def _jekyll_impl(ctx): + """non-hermetic rule to build a Jekyll site.""" + source = ctx.actions.declare_directory(ctx.attr.name + "-srcs") + output = ctx.actions.declare_directory(ctx.attr.name + "-out") + + ctx.actions.run_shell( + inputs = ctx.files.srcs, + outputs = [source], + command = ("mkdir -p %s\n" % (source.path)) + + "\n".join([ + "tar xf %s -C %s" % (src.path, source.path) + for src in ctx.files.srcs + ]), + ) + + ctx.actions.run( + inputs = [source], + outputs = [output], + executable = "jekyll", + use_default_shell_env = True, + arguments = ["build", "-q", "--trace", "-s", source.path, "-d", output.path], + ) + + # Create a shell script to serve the site locally + ctx.actions.expand_template( + template = ctx.file._jekyll_build_tpl, + output = ctx.outputs.executable, + substitutions = { + "%{source_dir}": source.short_path, + "%{workspace_name}": ctx.workspace_name, + }, + is_executable = True, + ) + + return DefaultInfo( + runfiles = ctx.runfiles(files = [source]), + files = depset([output]), + ) + +_jekyll = rule( + implementation = _jekyll_impl, + executable = True, + attrs = { + "srcs": attr.label_list( + allow_empty = False, + allow_files = [".tar"], + ), + "_jekyll_build_tpl": attr.label( + default = "//tools/stardoc:jekyll_serve_tpl.sh", + allow_single_file = True, + ), + }, +) + +def rules_nodejs_docs(name, layouts, includes, assets, css, readmes, docs, config, tags = []): + """Generates HTML docs for rules_nodejs via Jekyll + + Args: + name: Name for the docs + layouts: files that correspond to the Jekyll _layouts directory + includes: files that correspond to the Jekyll _includes directory + assets: files that should exist with an images directory + assets: files that should exist with an images directory + css: css file to use for the docs + readmes: dict of rules_nodejs package readme docs to their generating label + docs: set of raw markdown doc files + config: Jekyll configuration file + tags: any tags to set on the Jekyll rule + """ + + _nodejs_binary( + name = "post_process", + data = ["//tools/stardoc:post-process-docs.js"], + entry_point = "//tools/stardoc:post-process-docs.js", + ) + + [ + native.genrule( + name = "%s_md" % readme[0], + srcs = [readme[1]], + outs = [readme[0] + ".md"], + tools = [":post_process"], + cmd = "$(location :post_process) $< %s >> $@" % readme[0], + ) + for readme in readmes.items() + ] + + # Jekyll doesn't follow symlinks, so package everything up into tar files + # and allow the Jekyll rule extract them + _pkg_tar( + name = "%s_layouts" % name, + srcs = layouts, + package_dir = "_layouts", + ) + + _pkg_tar( + name = "%s_includes" % name, + srcs = includes, + package_dir = "_includes", + ) + + _pkg_tar( + name = "%s_css" % name, + srcs = [css], + package_dir = "css", + ) + + _pkg_tar( + name = "%s_assets" % name, + srcs = assets, + package_dir = "images", + ) + + _pkg_tar( + name = "%s_mds" % name, + srcs = [s + ".md" for s in readmes.keys()] + [config] + docs, + ) + + _jekyll( + name = name, + srcs = [ + ":%s_layouts" % name, + ":%s_includes" % name, + ":%s_css" % name, + ":%s_mds" % name, + ":%s_assets" % name, + ], + tags = tags, + ) diff --git a/tools/stardoc/jekyll_serve_tpl.sh b/tools/stardoc/jekyll_serve_tpl.sh new file mode 100644 index 0000000000..c7c305ed02 --- /dev/null +++ b/tools/stardoc/jekyll_serve_tpl.sh @@ -0,0 +1,9 @@ +#!/bin/sh +RUNFILES=$(cd ${JAVA_RUNFILES-$0.runfiles}/%{workspace_name} && pwd -P) +SOURCE_DIR="$RUNFILES/%{source_dir}" + +TDIR=$(mktemp -d) +RDIR=$(mktemp -d) +trap "rm -fr $RDIR $TDIR" EXIT +(cd $RDIR && \ + jekyll serve --disable-disk-cache --trace -s "$SOURCE_DIR" -d "$TDIR") diff --git a/tools/stardoc/post-process-docs.js b/tools/stardoc/post-process-docs.js new file mode 100644 index 0000000000..a6bcaeebb4 --- /dev/null +++ b/tools/stardoc/post-process-docs.js @@ -0,0 +1,33 @@ +const { readFileSync } = require('fs'); +const md = process.argv[2]; +const title = process.argv[3]; +const content = readFileSync(md, {encoding: 'utf8'}); + +// it seems more natural for devs to author with markdown, but the docs are generated into stardoc with HTML tables, +// so we have to replace a single backtick with a block, and a code fence ``` with +// the Jekyll highlighter syntax +const out = content + .replace(/(?$1`) + .replace(/```(\w*?)\n((?:(?!```)[\s\S])+)```/g, (str, lang, block) => { + // if no lang is defined, assume Python, it's likely right and the param is required + return `{% highlight ${lang ? lang.trim() : 'python'} %}\n${block}{% endhighlight %}`; + }); + +// stamp the frontmatter into the post processed stardoc HTML +const frontmatter = [ + '---', + `title: ${title}`, + 'layout: default', + 'toc: true', + 'nav: rule', + '---', + '\n' +].join('\n'); + +// write out to stdout, this script is run as part of a genrule that redirects the output the to expected file +process.stdout.write(frontmatter + out); diff --git a/tools/stardoc/templates/aspect.vm b/tools/stardoc/templates/aspect.vm index 023de1757e..3ff5bb25c1 100644 --- a/tools/stardoc/templates/aspect.vm +++ b/tools/stardoc/templates/aspect.vm @@ -1,19 +1,57 @@ #[[##]]# ${aspectName} -#[[###]]# Usage +
+${util.aspectSummary($aspectName, $aspectInfo)}
+
-``` -$aspectName(#foreach( $attr in $aspectInfo.getAttributeList() )$attr.name#if( $foreach.hasNext ), #end#end) -``` +$aspectInfo.getDocString() -#if (!$aspectInfo.getAttributeList().isEmpty()) -#foreach ($attribute in $aspectInfo.getAttributeList()) +**ASPECT ATTRIBUTES** -#[[####]]# `${attribute.name}` -(*#if ($attribute.type == "NAME")[name]#elseif( $attribute.type == "LABEL" )[label]#elseif( $attribute.type == "LABEL_LIST" )[labels]#else${util.attributeTypeString($attribute)}#end#if( $attribute.mandatory ), mandatory#end*)#if (!$attribute.docString.isEmpty()): ${attribute.docString.trim()}#end -#if( !$attribute.defaultValue.isEmpty() ) +#if (!$aspectInfo.getAttributeList().isEmpty()) + + + + + + + + + #foreach ($aspectAttribute in $aspectInfo.getAspectAttributeList()) + + + + + #end + +
NameType
${aspectAttribute}String
+#end +**ATTRIBUTES** -Defaults to `$attribute.defaultValue`#end -#end +#if (!$aspectInfo.getAttributeList().isEmpty()) + + + + + + + + + + + + #foreach ($attribute in $aspectInfo.getAttributeList()) + + + + + + + + #end + +
NameDescriptionTypeMandatoryDefault
${attribute.name} + #if(!$attribute.docString.isEmpty()) $attribute.docString.trim() #else - #end + ${util.attributeTypeString($attribute)}${util.mandatoryString($attribute)}$attribute.defaultValue
#end diff --git a/tools/stardoc/templates/func.vm b/tools/stardoc/templates/func.vm index 3f9bb6d7f6..4f17ea385d 100644 --- a/tools/stardoc/templates/func.vm +++ b/tools/stardoc/templates/func.vm @@ -2,25 +2,35 @@ $funcInfo.docString -#[[###]]# Usage +
+${util.funcSummary($funcInfo)}
+
-``` -${funcInfo.functionName}(#foreach( $param in $funcInfo.getParameterList() )$param.name#if( $foreach.hasNext ), #end#end) -``` +**PARAMETERS** #if (!$funcInfo.getParameterList().isEmpty()) -#foreach ($param in $funcInfo.getParameterList()) - -#[[####]]# `${param.name}` - -#if (!$param.docString.isEmpty()) -${param.docString.trim()} -#end - -#if(!$param.getDefaultValue().isEmpty()) -Defaults to `$param.getDefaultValue()` + + + + + + + + + + #foreach ($param in $funcInfo.getParameterList()) + + + + + + #end + +
NameDescriptionDefault
${param.name} + #if (!$param.docString.isEmpty()) + ${util.htmlEscape($param.docString.trim())} + #end + + $param.defaultValue +
#end - -#end - -#end \ No newline at end of file diff --git a/tools/stardoc/templates/header.vm b/tools/stardoc/templates/header.vm index f7221fca14..e69de29bb2 100644 --- a/tools/stardoc/templates/header.vm +++ b/tools/stardoc/templates/header.vm @@ -1,3 +0,0 @@ -[name]: https://bazel.build/docs/build-ref.html#name -[label]: https://bazel.build/docs/build-ref.html#labels -[labels]: https://bazel.build/docs/build-ref.html#labels diff --git a/tools/stardoc/templates/provider.vm b/tools/stardoc/templates/provider.vm index b64e8f87a7..3600fc3dff 100644 --- a/tools/stardoc/templates/provider.vm +++ b/tools/stardoc/templates/provider.vm @@ -1,13 +1,30 @@ #[[##]]# ${providerName} -${providerInfo.docString} - -#if (!$providerInfo.fieldInfoList.isEmpty()) -#foreach ($field in $providerInfo.fieldInfoList) +
+${util.providerSummary($providerName, $providerInfo)}
+
-#[[####]]# `${field.name}` -${field.docString} +${providerInfo.docString} -#end +**FIELDS** +#if (!$providerInfo.fieldInfoList.isEmpty()) + + + + + + + + + #foreach ($field in $providerInfo.fieldInfoList) + + + + + #end + +
NameDescription
${field.name} + #if(!$field.docString.isEmpty()) $field.docString.trim() #else - #end +
#end diff --git a/tools/stardoc/templates/rule.vm b/tools/stardoc/templates/rule.vm index c3ca11f929..c5bf69529d 100644 --- a/tools/stardoc/templates/rule.vm +++ b/tools/stardoc/templates/rule.vm @@ -2,20 +2,42 @@ $ruleInfo.docString -#[[###]]# Usage +
+${util.ruleSummary($ruleName, $ruleInfo)}
+
-``` -$ruleName(#foreach( $attr in $ruleInfo.getAttributeList() )$attr.name#if( $foreach.hasNext ), #end#end) -``` +**ATTRIBUTES** #if (!$ruleInfo.getAttributeList().isEmpty()) -#foreach ($attribute in $ruleInfo.getAttributeList()) - -#[[####]]# `${attribute.name}` -(*#if ($attribute.type == "NAME")[name]#elseif( $attribute.type == "LABEL" )[label]#elseif( $attribute.type == "LABEL_LIST" )[labels]#else${util.attributeTypeString($attribute)}#end#if( $attribute.mandatory ), mandatory#end*)#if (!$attribute.docString.isEmpty()): ${attribute.docString.trim()}#end -#if( !$attribute.defaultValue.isEmpty() ) - - -Defaults to `$attribute.defaultValue`#end -#end + + + + + + + + + + + + #foreach ($attribute in $ruleInfo.getAttributeList()) + + + + + + + + #end + +
NameDescriptionTypeMandatoryDefault
${attribute.name} + #if (!$attribute.docString.isEmpty()) + ${attribute.docString.trim()} + #end + #if (!$attribute.getProviderNameGroupList().isEmpty()) + The dependencies of this attribute must provide: ${util.attributeProviders($attribute)} + #end + ${util.attributeTypeString($attribute)}${util.mandatoryString($attribute)} + $attribute.defaultValue +
#end