| // Called from "version" npm script when running `npm version` | |
| // during release process. This script updates the docs to point to the release. | |
| // It also copies the release file to a filename matching the one we want to publish to GitHub. | |
| const crypto = require('crypto'); | |
| const fs = require('fs'); | |
| const path = require('path'); | |
| const shell = require('shelljs'); | |
| const version = require('../package.json').version; | |
| const starlarkModule = process.argv[2]; | |
| if (starlarkModule !== 'build_bazel_rules_nodejs' && starlarkModule != 'rules_nodejs') { | |
| throw new Error("first argument must be module to release (build_bazel_rules_nodejs or rules_nodejs)") | |
| } | |
| const artifactSuffix = starlarkModule == 'rules_nodejs' ? '-core' : '' | |
| const artifact = `dist/bin/release${artifactSuffix}.tar.gz`; | |
| function computeSha256(path) { | |
| const hash = crypto.createHash('sha256'); | |
| // TODO(alexeagle): consider streaming the bytes into the hash function, if this consumes too much | |
| // RAM | |
| return hash.update(fs.readFileSync(path)).digest('hex'); | |
| } | |
| const sha256 = computeSha256(artifact); | |
| if (starlarkModule == 'build_bazel_rules_nodejs') { | |
| for (const f of ['docs/install.md', 'packages/create/index.js']) { | |
| shell.sed( | |
| '-i', 'download/[0-9\.]*(-(beta|rc).[0-9]+)?/rules_nodejs-[0-9\.]*(-(beta|rc).[0-9]+)?.tar.gz', | |
| `download/${version}/rules_nodejs-${version}.tar.gz`, f); | |
| shell.sed('-i', 'sha256 = \"[0-9a-f]+\"', `sha256 = "${sha256}"`, f); | |
| } | |
| } else { | |
| shell.sed( | |
| '-i', 'download/[0-9\.]*(-(beta|rc).[0-9]+)?/rules_nodejs-core-[0-9\.]*(-(beta|rc).[0-9]+)?.tar.gz', | |
| `download/${version}/rules_nodejs-core-${version}.tar.gz`, 'repositories.bzl') | |
| shell.sed('-i', 'core_sha = \"[0-9a-f]+\"', `core_sha = "${sha256}"`, 'repositories.bzl'); | |
| } | |
| shell.cp('-f', artifact, `rules_nodejs${artifactSuffix}-${version}.tar.gz`); | |
| /** | |
| * Returns an array of all WORKSPACE the files under a directory. | |
| */ | |
| function findFiles(regex, dir) { | |
| return fs.readdirSync(dir).reduce((files, file) => { | |
| const fullPath = path.posix.join(dir, file); | |
| const isDirectory = fs.statSync(fullPath).isDirectory(); | |
| if (isDirectory) { | |
| return files.concat(findFiles(regex, fullPath)); | |
| } else if (regex.test(file)) { | |
| return files.concat(fullPath); | |
| } else { | |
| return files; | |
| } | |
| }, []); | |
| } | |
| const workspaceFiles = [ | |
| ...findFiles(/^WORKSPACE$/, 'e2e'), | |
| ...findFiles(/^WORKSPACE$/, 'examples'), | |
| ]; | |
| for (const f of workspaceFiles) { | |
| let workspaceContents = fs.readFileSync(f, {encoding: 'utf-8'}); | |
| const regex = new RegExp(`http_archive\\(\\s*name\\s*\\=\\s*"${starlarkModule}"[^)]+`); | |
| const replacement = `http_archive( | |
| name = "${starlarkModule}", | |
| sha256 = "${sha256}", | |
| urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/${version}/rules_nodejs${artifactSuffix}-${ | |
| version}.tar.gz"], | |
| `; | |
| workspaceContents = workspaceContents.replace(regex, replacement); | |
| fs.writeFileSync(f, workspaceContents); | |
| } |